2011-01-10 56 views
8

在模塊中我寫的Magento座Injction我想用用mymodule.xml此塊之後插入自己的塊:通過module.xml文件

<block type="catalog/product_view_media" name="product.info.media" as="media" template="catalog/product/view/media.phtml"/> 

這是嵌套在

<reference name="content"> 
    <block type="catalog/product_view" name="product.info" template="catalog/product/view.phtml"> 

如可以在應用程序/設計/前端/鹼/默認/佈局/的catalog.xml可以看出

我已經嘗試了許多變體,如:

<reference name="content"> 
    <reference name="product.info"> 
     <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
    </reference> 
</reference> 

,只是

<reference name="product.info"> 
    <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
</reference> 

<reference name="product.info"> 
    <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
</reference> 

,但我似乎無法找到正確的組合。 呈現我的塊中只有一個是:

<reference name="content"> 
    <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
</reference> 

但顯然它不是放在哪裏我想它被放置。

+5

下面的答案,但我也想說這是一個很好的問題,並且比大多數無法回答的問題要好得多「它不起作用?!?!???」我們在這些部分獲得的佈局問題。 – 2011-01-10 22:13:53

+1

謝謝@Alan 你的回答非常明確,但是改變`catalog/product/view.phtml`,雖然如果我只是一個網站所有者,這可能是一個好主意,但對我來說,作爲一個擴展開發者感覺不對。 如果你在另一個需要做同樣事情的另一個擴展(在`catalog/product_view_media`塊下添加你自己的塊)?這不會使我們的擴展互斥嗎?這個問題沒有解決辦法嗎?也許getChildHtml應該被覆蓋一些如何允許額外的塊被添加或預置到現有的基於佈局或配置? – epeleg 2011-01-11 09:15:08

+0

1.如果你正在創建一個重新分發和廣泛使用的模塊,那麼是的,改變一個現有的模板文件將是一個糟糕的形式(並且不適用於Magento版本)。不幸的是,我還沒有看到添加/改變佈局的可重新分配模塊的**好**解決方案。這完全取決於誰將會使用你的模塊。由於佈局的高度可定製性,您總是會受到您的模塊最終用戶所做或可能做的事情的支配。 – 2011-01-11 10:58:16

回答

18

如果您查看page.xml中的內容塊聲明,您將看到以下內容。

<block type="core/text_list" name="content" as="content" translate="label"> 

默認情況下,命名爲內容的塊是core/text_list,轉化爲一個Mage_Core_Block_Text_List

core/text_list塊的用途很簡單。他們自動渲染插入到他們的任何塊。這就是爲什麼你可以成功地將內容插入內容的原因。 你想插入到

<block type="catalog/product_view" name="product.info" template="mymodule/folder/class.phtml" ... 

塊是catalog/product_view,轉化爲一個Mage_Catalog_Block_Product_View,最終從Mage_Core_Block_Template繼承。這使它成爲一個模板塊。模板塊不要自動渲染他們的孩子。模板塊將呈現phtml文件。如果phtml包含

$this->getChildHtml('block_name'); 

一個電話,然後與該特定名稱的塊將被渲染。如果phtml文件包含

$this->getChildHtml(); //no arguments 

然後所有通話孩子塊將被渲染。

所以,當你說

<reference name="product.info"> 
    <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"></block> 
</reference> 

插入mymodule/folder_class類型的塊到product.info塊。但是,因爲product.info是模板塊而不是文本列表塊,所以它不顯示您插入的塊。你需要一個自定義的模板catalog/product/view.phtml添加到您的主題(通過複製基本模板),然後在view.phtml底部,添加

<?php echo $this->getChildHtml('mymodule.folder.class');?> 
0

如果你想在catalog/product/view action加塊,我相信您應該像這樣放置,否則請將catalog_product_view替換爲期望的操作,或者將default替換爲任何操作。

<layout version="0.1.0"> 
    <catalog_product_view> 
     <reference name="content"> 
      <block type="mymodule/folder_class" after="media" name="mymodule.folder.class" template="mymodule/folder/class.phtml" as="mymodule_folder_class"> 
      </block> 
     </reference> 
    </catalog_product_view> 
</layout>