顧客グループによって異なるテーマを設定する方法はありますか?


8

顧客グループに応じて異なるテーマを表示したいのですが、異なるテーマを動的に設定する方法はありますか?

例:一般顧客グループのテーマAおよび卸売顧客グループのテーマB。

前もって感謝します

回答:


17

すばやく醜い方法は、現在の顧客のグループを確認してから、プログラムでテーマを設定することです。

Mage::getDesign()->setArea('frontend')
    ->setPackageName('your_package')
    ->setTheme('your_theme');

ただし、このソリューションでは、ある程度の柔軟性が欠けています。

より洗練された方法は、顧客グループのレイアウトハンデルを作成し、そこにカスタムテーマを設定することです。このソリューションは、Atwix によるこの記事に触発されました。

したがって、最初にcontroller_action_layout_load_beforeイベントを観察する必要があります。

<events>
    <controller_action_layout_load_before>
        <observers>
            <customer_group_handle>
                <class>module/observer</class>
                <method>addCustomerGroupHandle</method>
            </customer_group_handle>
        </observers>
    </controller_action_layout_load_before>
</events>

次に、オブザーバークラスでaddCustomerGroupHandleメソッドを実装します。

public function addCustomerGroupHandle(Varien_Event_Observer $observer)
{
    if (Mage::helper('customer')->isLoggedIn()) {
        /** @var $update Mage_Core_Model_Layout_Update */
        $update = $observer->getEvent()->getLayout()->getUpdate();
        $groupId = Mage::helper('customer')->getCustomer()->getGroupId();
        $groupName = Mage::getModel('customer/group')->load($groupId)->getCode();
        $update->addHandle('customer_group_' . str_replace(' ', '_', strtolower($groupName)));
    }

    return $this;
}

注:str_replacehereは完全なものではないため、英数字以外のすべての文字をアンダースコアに置き換え、先頭と末尾のアンダースコアを削除する正規表現に置き換えることをお勧めします。

これで、xmlを介して任意の顧客グループにカスタムテーマを設定できるようになりました。

<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <customer_group_wholesale>
        <reference name=”root”>
            <action method=”setTheme”><theme>modern</theme></action>
        </reference>
    </customer_group_wholesale>
</layout>

4

これはティムの答えへの追加です。各顧客グループの構成セクションを作成し、そこにテーマの値を設定できます。これにより、顧客グループ名をハードコードする必要がなくなり、新しいグループを追加するたびにコードを変更する必要がなくなります。
動的構成フィールドを追加する方法の例を次に示します。これには、構成セクショングループの新しいレンダラーの作成が含まれます。
オブザーバーでこれをTimが提案したものと組み合わせる:

Mage::getDesign()->setArea('frontend')
    ->setPackageName('your_package')
    ->setTheme('your_theme');

希望する結果が得られるはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.