不幸的是,对于 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 事件观察器中以编程方式更新布局)