2013-01-23 29 views
40

Tôi là người dùng Magento front-end, đã xây dựng khá nhiều chủ đề của riêng mình và tôi muốn hiểu định dạng khối XML của Magento tốt hơn ...Magento XML sử dụng trước/sau để đặt khối hầu như không bao giờ hoạt động

tôi thường sử dụng một tập tin local.xml để thao tác tất cả mọi thứ, tôi có thể xác định một khối như sau:

<cms_index_index> 
    <reference name="root"> 
     <block type="core/template" name="example_block" as="exampleBlock" template="page/html/example-block.phtml"/> 
    </reference> 
</cms_index_index> 

Điều này sẽ tạo ra một khối trên trang chủ (cms_index_index) và kể từ khi khối được tạo ra một cấp dưới root, tôi thường sẽ gọi khối bằng cách thêm:

<?php echo $this->getChildHtml('exampleBlock') ?> 

... đến 1column.phtml (hoặc 2columns-left/right.phtml, 3columns.phtml v.v.). Khối có thể được đặt trên bất kỳ trang nào bằng cách thay thế cms_index_index cho thẻ trang thích hợp.

tôi xem công cụ như sau suốt các tập tin XML lõi, và trong hướng dẫn:

<reference name="root"> 
    <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/> 
</reference> 

content là một khối là một phần của cấu trúc trang chung magento và, từ những gì tôi hiểu, before="content" nên đặt nó nơi bạn mong đợi, mà không cần phải sử dụng getChildHtml('exampleBlock'), cho đến nay rất tốt ... tuy nhiên, trước/sau khi hầu như không bao giờ có vẻ làm việc cho tôi, và tôi thường xuyên tìm thấy bản thân mình để phương pháp getChildHtml như sao lưu, mà không phải luôn luôn lý tưởng và có nghĩa là chỉnh sửa nhiều tệp .phtml hơn mức cần thiết.

Tôi đã thử:

<reference name="root"> 
    <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/> 
</reference> 

Không có gì xuất hiện ...

<reference name="root"> 
    <block type="core/template" name="example_block" after="header" template="page/html/example-block.phtml"/> 
</reference> 

Vẫn không có gì .... Tôi cũng ý thức được sử dụng before="-" hoặc after="-" để đặt một cái gì đó trước khi tất cả mọi thứ trong vòng đó là khối cha. Tôi thỉnh thoảng có một số may mắn với điều đó, nhưng nói chung chỉ bị lẫn lộn và thất vọng.

Tôi đã googled tất cả các nơi cho 'magento xml trước/sau khi không làm việc' và bắt đầu tự hỏi nếu nó chỉ cho tôi điều này xảy ra ... bất cứ ai có thể giải thích khi tôi có thể và không thể sử dụng trước/sau vị trí khối? Có gì sai với các ví dụ trên?

Tôi đang ở magento 1.7.0.2 (mới nhất có sẵn tại thời điểm niêm yết)

Động lực chính của việc này là để giảm số lượng các tập tin lõi .phtml tôi cần phải chỉnh sửa chỉ để thêm một getChildHtml(), vì vậy nếu có cách khác (XML) để giải quyết vấn đề này, tôi muốn biết ...

+0

tất cả bộ nhớ cache bị tắt:/ –

Trả lời

81

Các beforeafter thuộc tính chỉ có tác dụng theo một trong hai trường hợp:

  1. Khi bạn chèn vào một khối core/text_list
  2. Khi khối mẫu của bạn gọi getChildHtml mà không cần bất kỳ thông số

Khi bạn nói

<reference name="root"> 
    <block type="core/template" name="example_block" before="content" template="page/html/example-block.phtml"/> 
</reference> 

bạn đang nói với Magento

Chào Magento, đặt example_block bên trong khối root.

Khi bạn đặt một số khối khác nhau bên trong một cấp độ gốc, các khối đó có thứ tự ngầm. Đối với các khối mẫu, thứ tự này không quan trọng, vì các khối đó đang được hiển thị rõ ràng.

<?php echo $this->getChildHtml('example_block') ?> 

Tuy nhiên, có hai trường hợp đặt hàng quan trọng. Thứ nhất, nếu bạn gọi

<?php echo $this->getChildHtml() ?> 

từ một mẫu, sau đó sẽ làm cho Magento tất cả các khối đứa trẻ, theo thứ tự.

Thứ hai, có một loại khối đặc biệt được gọi là "danh sách văn bản" (core/text_list/Mage_Core_Block_Text_List). Các khối này tự động hiển thị tất cả các con của chúng một lần nữa theo thứ tự. Khối content là một ví dụ của việc này

<block type="core/text_list" name="content"/> 

Đó là lý do tại sao bạn có thể chèn khối vào content và họ làm tự động.

Vì vậy, trong ví dụ trên, bạn đang chèn khối vào khối root. Khối root là một khối mẫu có mẫu phtml sử dụng các cuộc gọi getChildHtml có thông số rõ ràng. Do đó, các thuộc tính beforeafter không làm những gì bạn (và nhiều thuộc tính khác, kể cả tôi) muốn họ làm.

+4

cảm ơn bạn đã làm điều đó tốt đẹp và rõ ràng, tôi hiểu rõ hơn bây giờ :) –

+0

cảm ơn ... lời giải thích tuyệt vời –

+0

lời giải thích rất tốt đẹp cảm ơn –

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