2012-03-03 59 views
8

在Magento的佈局xml中設置塊模板時遇到困難。我試圖設置一個子塊的模板,而不是整個頁面佈局(幾乎所有的文檔都解釋瞭如何設置佈局的模板)。在佈局xml中設置Magento塊模板

背景:我更新佈局手柄在我的自定義操作,用我的模塊的佈局XML的<update />標籤。

從本質上講,我想重用的佈局和內置的產品視圖操作塊,但對於幾個街區提供自定義模板。 (不只是覆蓋,這些需要成爲全新的模板,這些模板只能在我的自定義操作中觸發,並且可以自行覆蓋)。

我的佈局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> 

setTemplateproduct.info.bundle永遠不會奏效;它似乎不會影響佈局。我試過從父塊中將<reference>包裝在其他<reference>節點中,沒有任何效果。是否有可能以這種方式替換塊模板?我覺得我的問題源於我使用<update />的事實。

順便說一句,我知道我的佈局XML被加載並沒有錯誤,該文件的其餘部分工作正常,禁用緩存,已清除緩存反正等

+1

你知道什麼意思/做更新標籤嗎?更新標記,將更新句柄併合併爲包含當前layout.xml – 2012-03-03 11:01:22

+0

檢查此鏈接[Magento Layout XML's](http://magebase.com/magento-tutorials/demystifying-magentos-layout- xml-part-1 /) – 2012-03-03 11:08:13

+0

@OğuzÇelikdemir是的,這就是爲什麼我使用''標籤;我希望採用現有的佈局並重用它。我已經使用了你廣泛引用的頁面;這是一個很好的資源......雖然唯一的'setTemplate'例子改變了佈局,而不是塊模板。 – 2012-03-03 19:05:07

回答

18

你的做法幾乎是正確。
兩件事情:
1.設置一個新的模板,而不是實例化一個新的塊
而不只是分配一個不同的模板爲product.info塊,你正在創建一個同名的新實例,取代了原有的實例,然後新的模板被設置。而是使用此:

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

這應該照顧的產品視圖模板的清潔方式。

2.手柄處理順序
如果你看一下捆綁的產品視圖塊product.info.bundle聲明在那裏,你會看到它發生在bundle.xml文件,名爲<PRODUCT_TYPE_bundle>佈局更新處理。

您的代碼引用了<[route]_[controller]_[action]>佈局句柄中的塊,即<mymodule_product_index>

這裏要注意的是處理訂單佈局句柄。 大致是:

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

<PRODUCT_TYPE_bundle>手柄屬於第三類型的佈局手柄,這意味着它在<mymodule_product_index>手柄後處理。
實際上,在聲明它之前,您正在引用塊product.info.bundle

要解決此問題,您還需要使用<PRODUCT_TYPE_bundle>手柄。當然這會影響每一個捆綁產品的展示。使用佈局XML只有沒有乾淨的方法。

這裏有幾條建議如何解決這個問題。

您可以在模塊中創建單獨的路徑以顯示捆綁的產品,然後使用該頁面的update指令包含<PRODUCT_TYPE_bundle>句柄。

在您的自定義操作的控制器,你可以添加一個<PRODUCT_TYPE_bundle>後處理另一個佈局更新處理。

如果實例化了您可以使用事件觀察器在product.info.bundle塊上設置模板。一種可能性是事件controller_action_layout_generate_blocks_after

你明白了,有很多方法可以解決這個問題,但他們需要PHP。

+0

感謝您的洞察力,這非常有幫助。我使用你的事件觀察器方法得到了它的工作。 – 2012-03-06 04:43:18