从page.xml中的<block>获取值</b​​lock>

时间:2012-05-12 18:33:16

标签: magento

我需要在同一页面上使用相同的自定义块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以匹配实际代码。

2 个答案:

答案 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');
}