残念ながら、Magento レイアウトでは、2 つのレイアウト ハンドル間でフィルタリングする方法がありません。
私がお勧めするのは、少し異なり、より複雑ですが、必要な柔軟性が得られると思います。
これを行うには、モジュールを作成する必要があります。これを行うために必要なすべてのコードを含めています。
モジュール定義:
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 イベント オブザーバーでプログラムによってレイアウトを更新します)