我需要在同一页面上使用相同的自定义块2次,但从数据库加载不同的值。
所以我需要将配置值(此处称为SimpleMenuInstanceRef)从我的page.xml文件传输到块/模型,以便每个块知道要从数据库加载哪些数据。
我正在使用这个块:
<block template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label">
<label>Left menu header</label>
<action method="setSimpleMenuInstanceRef"><SimpleMenuInstanceRef>4</SimpleMenuInstanceRef></action>
</block>
这种方式有效。在我的leftMenuTemplate.phtml中,我可以做一个
echo $ this-&gt; getSimpleMenuInstanceRef()
这将显示配置中的值。
但我需要我的块_construct方法中的值,所以我可以根据其值加载数据。但是在_construct中执行$ this-&gt; getSimpleMenuInstanceRef不会返回任何内容。那么如何在块代码中获取值,还是需要以其他方式传递值?
编辑:将__construct更改为_construct以匹配实际代码。
答案 0 :(得分:4)
更新:尽管createBlock
函数(在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);
...
}
所以这个答案的核心是不正确的。我在这里留下了答案,因为它包含其他有用的信息。
以下是您尝试做的问题。
布局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尚未处理{{1 }} node,所以你的值没有设置。
一种可能的解决方案是将您的数据作为广告素材的属性(下面为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的文章,你可能觉得它很有用
答案 1 :(得分:1)
是的,你需要。尝试将块声明为:
<block instance="4" template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label">
<label>Left menu header</label>
</block>
完成此操作后,您可以轻松访问'instance'var:
protected function _construct() {
parent::_construct();
echo $this->getData('instance');
}