更新:儘管createBlock
功能(在Mage_Core_Mode_Layout
),具有PARAMATERS爲一個$arguments
數組,它變成塊構造函數(在現代版本的Magento中)不通過
$block = $this->addBlock($className, $blockName);
...
public function addBlock($block, $blockName)
{
return $this->createBlock($block, $blockName);
}
...
public function createBlock($type, $name='', array $attributes = array())
{
...
$block = $this->_getBlockInstance($type, $attributes);
...
}
所以這個答案的核心是不正確的。儘管我在這裏留下了答案,因爲它包含其他有用的信息。
以下是您正在嘗試的問題。
佈局XML的每個節點都代表一行用於生成塊的PHP代碼。
當你說
<block template="simplemenu/leftMenuTemplate.phtml"
幕後發生的事情是這樣的(其中$attributes
是節點的屬性的表示)
$block = new $block($attributes);
然後,Magento的遇到你的下一行
<action method="setSimpleMenuInstanceRef"><SimpleMenuInstanceRef>4</SimpleMenuInstanceRef></action>
它被翻譯爲
$block->setSimpleMenuInstanceRef('4');
所以,你正在運行到的問題是被稱爲__construct
,_construct
和_prepareLayout
方法時,Magento的尚未處理的action
節點,所以您未設置值。
一種可能的解決方案是包括數據作爲塊的屬性(my_data_here
下文)
<block template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label" my_data_here="4">
屬性被傳遞到塊的構造方法。雖然基塊不具有__construct
,該Varien_Object
類它擴展確實
#File: lib/Varien/Object.php
public function __construct()
{
$args = func_get_args();
if (empty($args[0])) {
$args[0] = array();
}
$this->_data = $args[0];
$this->_construct();
}
此構造方法將採取的第一個構造函數參數,並將其設置爲對象的(在這種情況下,對象是我們的塊)數據陣列。這意味着您可以將該數據返回與
一個警告。
如果你想這樣做,你不能在你的塊中創建自己的構造方法,因爲這意味着Varien_Object構造函數將永遠不會被調用。這就是爲什麼你要在所有塊中使用單個下劃線構造函數(_construct)。
我寫了一篇文章,而一個覆蓋所有event lifecycle methods回來,你可能會發現它有用
不工作。至少不在塊__construct方法中。 $ this-> getData(「instance」)只返回null。如果我調用$ this-> getData(),我得到的數組只有一個值(這不是我需要的名稱/值對) – MTilsted
永遠不會使用__construct,而是使用_construct而不是 –
對不起,我使用_construct一個_到文本中很多 – MTilsted