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