1

我需要在同一页面上使用相同的自定义块 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 我可以做一个

回声 $this->getSimpleMenuInstanceRef()

这将显示配置中的值。

但是我需要我的 blocks _construct 方法中的值,这样我就可以根据它的值加载数据。但是在 _construct 中执行 $this->getSimpleMenuInstanceRef 不会返回任何内容。那么如何在我的块代码中获取值,或者我是否需要以其他方式传输值?

编辑:将 __construct 更改为 _construct 以匹配真实代码。

4

2 回答 2

4

更新:尽管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_prepareLayoutaction

一种可能的解决方案是将您的数据包含为块的属性(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)。

不久前我写了一篇文章,涵盖了所有的事件生命周期方法,您可能会发现它很有用

于 2012-05-12T19:43:33.220 回答
1

是的,你需要。尝试将块声明为:

<block instance="4" template="simplemenu/leftMenuTemplate.phtml" type="simplemenu/standard" name="leftMenu" as="leftMenu" translate="label">
    <label>Left menu header</label>
</block>

完成此操作后,您可以轻松访问“实例”变量:

protected function _construct() {
    parent::_construct();
    echo $this->getData('instance');
}
于 2012-05-12T18:38:49.650 回答