我遇到了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布局系统实现,还是应该考虑另一种方法?
答案 0 :(得分:4)
不幸的是,使用Magento布局时,无法在两个布局句柄之间进行过滤。
我建议的是略有不同和更复杂,但我相信它会为您提供所需的灵活性。
您需要创建一个模块来执行此操作。我包含了执行此操作所需的所有代码。
app/etc/Your_Module.xml
<config>
<modules>
<Your_Module>
<codePool>local</codePool>
<active>true</active>
</Your_Module>
</modules>
</config>
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');
}
}
}
}
中提取了一些提示