更新:尽管createBlock
函数 (in Mage_Core_Mode_Layout
) 具有$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);
...
}
所以这个答案的核心是不正确的。不过,我将答案留在这里,因为它包含其他有用的信息。
这是您尝试做的问题。
Layout XML 的每个节点都代表一行用于生成块的 PHP 代码。
当你说
<block template="simplemenu/leftMenuTemplate.phtml"
幕后发生的事情看起来像这样($attributes
节点属性的表示在哪里)
$block = new $block($attributes);
然后,Magento 遇到你的下一行
<action method="setSimpleMenuInstanceRef"><SimpleMenuInstanceRef>4</SimpleMenuInstanceRef></action>
翻译为
$block->setSimpleMenuInstanceRef('4');
因此,您遇到的问题是在调用、 和方法时__construct
,Magento 尚未处理该节点,因此您的值未设置。 _construct
_prepareLayout
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();
}
此构造函数将采用第一个构造函数参数并将其设置为对象(在这种情况下,对象是我们的块)的数据数组。这意味着您可以使用
$this->getMyDataHere();
$this->getData('my_data_here');
//...
一个警告。
如果你想这样做,你不能在你的块中创建你自己的构造函数方法,因为这意味着 Varien_Object 构造函数永远不会被调用。这就是为什么要在所有块中使用单个下划线构造函数 (_construct)。
不久前我写了一篇文章,涵盖了所有的事件生命周期方法,您可能会发现它很有用