2013-01-23 53 views
40

我是一個前端開發Magento的,已經建立了不少我自己的主題,我想了解Magento的XML塊定位更好...Magento的XML未落工作

我通常使用local.xml文件來操縱一切,我可以如下定義塊:

<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> 

這將創建主頁(cms_index_index)上的塊,因爲該塊root下創建一個水平,我通常會添加以下內容:

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

...至1column.phtml(或2columns-left/right.phtml,3columns.phtml等)。通過用cms_index_index代替適當的頁面標籤,可將塊放在任何頁面上。

我看到的東西像整個核心XML文件以下,並在教程:

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

content是塊是Magento的一般頁面結構的一部分,從我的理解,before="content"應該將它在那裏你可以期待,而不需要使用getChildHtml('exampleBlock'),到目前爲止這麼好...然而,在幾乎沒有任何工作可以爲我工作之前/之後,我經常發現自己使用getChildHtml方法作爲備份,但這並不總是理想的,並意味着編輯更多.phtml文件超過必要的。

我已經試過:出現

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

沒什麼......

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

還是什麼都沒有....我也知道使用before="-"after="-"放置之前的一切東西之內這是父母。我偶爾會有一些運氣,但通常會感到困惑和沮喪。

我已經搜遍了'magento xml之前/之後不工作',並開始懷疑它只是我這發生...任何人都可以解釋我什麼時候可以和不能使用之前/之後定位塊?上述例子有什麼問題?

我在Magento 1.7.0.2(最近在張貼時間)

這樣做的主要動機是爲了減少核心一個.phtml文件,我只是需要編輯添加getChildHtml()數量,因此如果有另一種(XML)方式來解決這個問題,我會很有興趣知道......

+0

所有緩存都關閉:/ –

回答

81

beforeafter屬性只有在兩種情況之一的工作:

  1. 當你插入一個core/text_list
  2. 當你的模板塊調用getChildHtml不帶任何參數

當你說

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

你告訴Magento的

嘿Magento的,把example_blockroot塊內。

當您將多個不同的塊放置在父項中時,這些塊具有隱式順序。對於模板塊,這個順序並不重要,因爲這些塊被顯式渲染。

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

但是,有兩種情況下訂單很重要。首先,如果你從一個模板調用

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

,然後Magento的將呈現所有子塊,爲了。其次,有一種稱爲「文本列表」的特殊類型的塊(core/text_list/Mage_Core_Block_Text_List)。這些塊會自動渲染他們所有的孩子,依次排列。該content塊是這個

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

一個例子就是爲什麼你可以插入塊content,他們自動呈現。

因此,在上例中,您將塊插入root塊。 root塊是一個模板塊,其phtml模板使用帶顯式參數的getChildHtml調用。因此,beforeafter屬性不會做你(包括我在內的許多其他人)希望他們做的。

+4

感謝您使這個很好,清楚,我明白現在好多了:) –

+0

謝謝...很好的解釋 –

+0

非常好的解釋謝謝 –