2013-12-08 77 views
2

存在着Magento:setParentBlock從一個佈局xml文件中?

public Mage_Core_Block_Abstract::setParentBlock(Mage_Core_Block_Abstract $block) 

顯然它需要一個塊對象作爲參數。我曾嘗試過:

<reference name="myBlock"> 
    <action method="setParentBlock"> 
     <block><reference name="newParent"/></block> 
    </action> 
</reference> 

但是,沒有運氣。 任何想法?
甚至有人可以通過佈局文件將塊對象傳遞給方法嗎?

回答

3

您不能從佈局XML文件中調用該方法。佈局XML文件的<action/>節點主要(見下文)用於傳遞字符串作爲參數。這意味着任何類型提示明確要求對象的方法

Mage_Core_Block_Abstract $block 

不意味着從XML中調用。這是一種用於實現系統的方法,一種佈局XML系統旨在保護您免受意外呼叫。

此外,您不能使用的方式引用你想

<reference name="newParent"/> 

<reference/>標籤只能作爲頂層佈局手柄的直接祖先有效(因使用參考任何其他行爲在另一個位置是一個意想不到實現的副作用,而且我會警惕依靠所述行爲)

最後,你可以能夠通過使用佈局的「輔助參數」功能來實現你想要的系統。

<action method="setParentBlock"> 
    <block helper="core/data/someMethod" arg1="foo" ...> 
</action> 

如果你能找到一個輔助類

Mage::helper('core/data'); 

哪裏someMethod返回你以後

Mage::helper('core/data')->someMethod(parameters,from,attributes,above); 

但改變一個塊的父中期呈現的是那種濫用塊佈局系統,我建議不要這樣做(除非沒有其他辦法可以達到你想要的)。

+0

你是絕對正確的,並且在追蹤它的工作原理後,我會說... :)。雖然,它真的是中期渲染?我不確定。奇怪的是,我無法採用已定義的佈局塊,只需通過選擇另一個父級名稱來重新定位它。這不是非常重要,但它會更加優雅。 – user76568

+0

@dror請參閱Ben的回答 - 另請參閱'unsetChild'和'setChild'。這通常是人們如何實現你剛剛在評論中描述的內容。是的,它確實是中等渲染。 –

+0

在我的特殊情況下,基本佈局中的塊沒有別名/屬性..所以我不能真正使用un/setChild .. – user76568

3

你不必擔心這所有的,因爲逆通常是關聯的構建方式,但如果你想設置一個家長,你可以使用parent塊屬性:

<block type="..." name="..." parent="parentblockname" ... /> 
+0

如果我採用這種方法,除了沒有明確的父名(但在另一位父母的內部),另一個塊已經以完全相同的方式定義,那麼結果是什麼?也許兩者都會被註冊?或者,也許只有單塊的父母會在處理你的建議後更新(我的目標是:)? – user76568

+0

不知道我跟着,但是,需要創建父塊。請記住,Magento渲染中最重要的事情是通過insert或setChild設置子級的父級,因爲這是渲染的「方向」 - 子級父級。 – benmarks

相關問題