登录客户的特定页面上的SetTemplate?

时间:2012-07-09 08:12:24

标签: magento

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

我希望它做的非工作示例:

<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布局系统实现,还是应该考虑另一种方法?

1 个答案:

答案 0 :(得分: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');
            }
        }
    }
}

(我从update layout programatically in magento event observer

中提取了一些提示