使用setData将数据从布局传递到块控制器

The*_*iac 10 php magento

我正在尝试在我的local.xml文件中为我的自定义块设置一个变量:

<layout>
    <!-- ... -->
    <page_homepage>
        <!-- ... -->
        <reference name="root">    
            <!-- ... -->
            <block type="core/template" name="home_page_sections" template="page/homepage/sections.phtml">
                <block type="layout/carousel" name="featured_carousel">
                    <action method="setData">
                        <name>filter_attribute</name>
                        <value>is_featured_product</value>
                    </action>
                </block>
            </block>
        </reference>
    </page_homepage>
</layout>
Run Code Online (Sandbox Code Playgroud)

但是我没有在控制器的另一端获取数据:

class Foo_Layout_Block_Carousel extends Mage_Core_Block_Template
{
    public function __construct() 
    {
        parent::__construct();

        $filterAttribute = $this->getFilterAttribute(); // Nothing
        $filterAttribute = $this->getData('filter_attribute'); // Nada

        // Alright, fine, what DO I have?!
        var_dump($this->getData()); // array(0) {} ... Argh!
    }
}
Run Code Online (Sandbox Code Playgroud)

从我所有的搜索中我发现这确实应该有用,但既然没有,我有一种感觉我错过了一些明显的东西.这是我的布局模块的配置(我使用单个模块来定义主页和我需要的任何其他网站):

<?xml version="1.0"?>
<config>
    <modules>
        <Foo_Layout>
            <version>0.1.0</version>
        </Foo_Layout>
    </modules>
    <global>
        <page>
            <layouts>
                <foo_homepage translate="label">
                    <label>Homepage</label>
                    <template>page/homepage.phtml</template>
                    <layout_handle>page_homepage</layout_handle>
                </foo_homepage>
            </layouts>
        </page>
        <blocks>
            <layout>
                <class>Foo_Layout_Block</class>
            </layout>
        </blocks>
    </global>
</config>
Run Code Online (Sandbox Code Playgroud)

Ala*_*orm 29

当布局呈现代码遇到此时

<block type="layout/carousel" name="featured_carousel">
Run Code Online (Sandbox Code Playgroud)

立即实例化块.这意味着块的 __construct方法被调用之前setData被调用的方法.因此,在构造时,没有设置数据,这就是您调用var_dump返回空数组的原因.

此外,创建后立即将块添加到布局中

#File: app/code/core/Mage/Core/Model/Layout.php
...
$block->setLayout($this);
...
Run Code Online (Sandbox Code Playgroud)

发生这种情况时,_prepareLayout会调用块的方法.

#File: app/code/core/Mage/Core/Block/Abstract.php
public function setLayout(Mage_Core_Model_Layout $layout)
{
    $this->_layout = $layout;
    Mage::dispatchEvent('core_block_abstract_prepare_layout_before', array('block' => $this));
    $this->_prepareLayout();
    Mage::dispatchEvent('core_block_abstract_prepare_layout_after', array('block' => $this));
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

因此,这意味着布局更新xml中的任何数据集仍然不可用,即使在_prepareLayout.一旦系统完成创建块,它就会移动到下一个XML节点.

<action method="setData">
    <name>filter_attribute</name>
    <value>is_featured_product</value>
</action>
Run Code Online (Sandbox Code Playgroud)

并调用该setData方法.现在你的块有它的数据集.

尝试_beforeToHtml在块上定义方法并在那里检查数据.(假设正在渲染您的块)