Есть ли способ установить другую тему в зависимости от группы клиентов?

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_replaceздесь нет защиты от ошибок, поэтому я предлагаю заменить его регулярным выражением, которое заменит все не алфавитно-цифровые символы подчеркиваниями, а затем обрежет начальные и конечные подчеркивания.

Теперь вы можете установить собственную тему для любой группы клиентов через 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>
user487772
источник
4

Это скорее дополнение к ответу Тима. Вы можете создать разделы конфигурации для каждой группы клиентов и установить там значения для тем. Таким образом, вам не нужно жестко кодировать имена групп клиентов, и вам не придется менять код каждый раз, когда вы добавляете новую группу.
Вот пример того, как вы можете добавить динамические поля конфигурации . Это включает создание нового рендерера для группы разделов конфигурации.
Объединяя в наблюдателе это с тем, что предложил Тим:

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

должен получить желаемый результат.

Мариус
источник