1

我遇到了 Magento xml 布局的问题。我一直在尝试在客户登录时更改页面模板,但仅限于布局中的特定页面。我尝试<customer_logged_in>在我的 xml 中使用句柄,但我无法让它专门引用另一个句柄。

我想要它做的非工作示例:

<catalog_product_view>
    <customer_logged_in>
        <reference name="root">
            <action method="setTemplate"><template>page/3columns.html</template></action>
        </reference>
    </customer_logged_in>
    <customer_logged_out>
        <reference name="root">
            <action method="setTemplate"><template>page/2columns-left.html</template></action>
        </reference>
    </customer_logged_out>
</catalog_product_view>

这是否可以通过 XML 布局系统来完成,还是我应该考虑另一种方法?

4

1 回答 1

4

不幸的是,对于 Magento 布局,没有办法在两个布局句柄之间进行过滤。

我会推荐的是稍微不同且更复杂的,但我相信它会给你你需要的灵活性。

您将需要创建一个模块来执行此操作。我包含了执行此操作所需的所有代码。

模块定义:

app/etc/Your_Module.xml

<config>
    <modules>
        <Your_Module>
            <codePool>local</codePool>
            <active>true</active>
        </Your_Module>
    </modules>
</config>

配置 XML:

app/code/local/Your/Module/etc/config.xml

<config>
    <global>
        <modules>
            <Your_Module>
                <version>1.0</version>
            </Your_Module>
        </modules>
    </global>
    <frontend>
        <controller_action_layout_generate_blocks_after>
            <observers>
                <your_module_name>
                    <type>singleton</type>
                    <class>Your_Module/Observer</class>
                    <method> controllerActionLayoutGenerateBlocksAfter</method>
                </your_module_name>
            </observers>
        </controller_action_layout_generate_blocks_after>
    </frontend>
</config>

使它工作的代码

然后在这条路径app/code/local/Your/Module/Model/Observer.php

<?php

class Your_Module_Model_Observer
{
    public function controllerActionLayoutGenerateBlocksAfter ($observer)
    {
        $controller = $observer->getAction();

        if ($controller->getFullActionName() == 'catalog_product_view') {
            $layout = $controller->getLayout();
            $rootBlock = $layout->getBlock('root');

            if (Mage::getSingleton('customer/session')->isLoggedIn()) {
                $rootBlock->setTemplate('page/1-column.html');
            } else {
                $rootBlock->setTemplate('page/2-columns.html');
            }
        }
    }
}

(我从中获得了一些提示:在 magento 事件观察器中以编程方式更新布局

于 2013-02-15T21:00:23.013 回答