1

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レイアウトシステムで実現できますか、それとも別のアプローチを検討する必要がありますか?

4

1 に答える 1

4

残念ながら、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 イベント オブザーバーでプログラムによってレイアウトを更新します)

于 2013-02-15T21:00:23.013 に答える