2012-03-03 31 views
8

Gặp sự cố khi đặt mẫu khối trong bố cục xml của Magento. Tôi đang cố gắng đặt mẫu của một khối con, không phải toàn bộ bố cục trang (hầu như tất cả tài liệu ở đó giải thích cách đặt mẫu bố cục).Đặt mẫu khối Magento trong bố cục xml

Bối cảnh: Tôi đang cập nhật xử lý bố cục trong hành động tùy chỉnh của mình, sử dụng thẻ <update /> trong bố cục của mô-đun xml.

Về cơ bản, tôi muốn sử dụng lại bố cục và các khối của hành động xem sản phẩm được tích hợp sẵn, nhưng cung cấp các mẫu tùy chỉnh cho một vài khối. (Không chỉ ghi đè, những mẫu này cần phải là các mẫu hoàn toàn mới chỉ được kích hoạt trên hành động tùy chỉnh của tôi và chúng có thể được ghi đè).

My layout html:

<?xml version="1.0"?> 
<layout version="0.1.0"> 
<mymodule_product_index> 
    <update handle="catalog_product_view" /> 
    <reference name="content"> 
     <block type="catalog/product_view" 
     name="product.info" output="toHtml" template="mymodule/product.phtml" /> 
     </reference> 

    <reference name="product.info.bundle"> 
     <action method="setTemplate"><template>mymodule/customtemplate.phtml</template></action> 
    </reference> 
</mymodule_product_index> 
</layout> 

Các setTemplate trên product.info.bundle không bao giờ làm việc; nó dường như không ảnh hưởng đến bố cục. Tôi đã thử gói <reference> trong các nút khác <reference> từ các khối chính không có hiệu lực. Có thể thay thế các mẫu khối theo cách này không? Tôi cảm thấy rằng vấn đề của tôi bắt nguồn từ thực tế tôi đang sử dụng một số <update />.

Bằng cách này, tôi biết bố trí xml của tôi đang được nạp và không có lỗi, phần còn lại của tập tin đang làm việc tốt, bộ nhớ đệm bị vô hiệu hóa, đã xóa bộ nhớ cache dù sao, vv

+1

Bạn có biết ý nghĩa của việc thực hiện/cập nhật thẻ không? Thẻ cập nhật, lấy xử lý cập nhật và hợp nhất nó chứa với layout.xml hiện tại –

+0

Kiểm tra liên kết này [Magento Layout XML's] (http://magebase.com/magento-tutorials/demystifying-magentos-layout- xml-part-1 /) –

+0

@ OğuzÇelikdemir Vâng đó là lý do tại sao tôi đang sử dụng thẻ ''; Tôi muốn có một bố trí hiện có và tái sử dụng nó. Tôi đã sử dụng trang bạn tham chiếu khá rộng rãi; đó là một tài nguyên tuyệt vời ... mặc dù các ví dụ 'setTemplate' duy nhất thay đổi bố cục, không phải là một mẫu khối. –

Trả lời

18

cách tiếp cận của bạn là gần như chính xác.
Hai điều:
1. Đặt một mẫu mới thay vì instantiating một khối mới
Thay vì chỉ định một mẫu khác nhau để khối product.info, bạn đang tạo một trường hợp mới có cùng tên, thay thế các trường hợp ban đầu và sau đó mẫu mới được đặt trên đó. Thay vì sử dụng này:

<mymodule_product_index> 
    <update handle="catalog_product_view" /> 
    <reference name="product.info"> 
     <action method="setTemplate"> 
      <template>mymodule/product.phtml</template> 
     </action> 
    </reference> 
</mymodule_product_index> 

Điều đó sẽ chăm sóc của xem sản phẩm mẫu trong một cách sạch sẽ.

2. Xử lý trật tự xử lý
Nếu bạn nhìn vào nơi quan điểm khối product.info.bundle cho các sản phẩm đóng gói được khai báo, bạn sẽ thấy nó xảy ra trong file bundle.xml, trong một tay cầm cập nhật bố trí gọi <PRODUCT_TYPE_bundle>.

Mã của bạn đang tham chiếu khối từ thanh điều khiển bố cục <[route]_[controller]_[action]>, tức là <mymodule_product_index>.

Điều cần lưu ý ở đây là thứ tự xử lý của bố cục xử lý. Gần đó là:

  1. <default>
  2. <[route]_[controller]_[action]>
  3. <custom_handles>

Các <PRODUCT_TYPE_bundle> xử lý thuộc loại thứ ba của tay cầm bố trí, có nghĩa là nó được xử lý sau khi <mymodule_product_index> xử lý.
Về bản chất, bạn đang tham chiếu đến khối product.info.bundle trước khi nó được khai báo.

Để khắc phục điều này, bạn cũng sẽ cần phải sử dụng mã số <PRODUCT_TYPE_bundle>. Tất nhiên điều này sẽ ảnh hưởng đến mỗi hiển thị sản phẩm đi kèm. Sử dụng XML bố cục chỉ có không có cách nào sạch sẽ xung quanh đó.

Dưới đây là một số đề xuất về cách giải quyết vấn đề đó.

Bạn có thể tạo một tuyến đường riêng trong mô-đun của mình để hiển thị các sản phẩm đi kèm, và sau đó bao gồm cả xử lý <PRODUCT_TYPE_bundle> sử dụng chỉ thị update cho trang đó.

Trong bộ điều khiển tác vụ tùy chỉnh của bạn, bạn có thể thêm một xử lý cập nhật bố cục khác được xử lý sau<PRODUCT_TYPE_bundle>.

Bạn có thể sử dụng trình quan sát sự kiện để đặt mẫu trên khối product.info.bundle nếu nó được khởi tạo. Một khả năng sẽ là sự kiện controller_action_layout_generate_blocks_after.

Bạn có ý tưởng, có nhiều cách để giải quyết vấn đề này, nhưng chúng yêu cầu PHP.

+0

Cảm ơn sự hiểu biết của bạn, nó rất hữu ích. Tôi đã làm cho nó hoạt động bằng cách sử dụng phương pháp quan sát sự kiện của bạn. –

Các vấn đề liên quan