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

magento.stackexchange https://magento.stackexchange.com/questions/8079

  •  16-10-2019
  •  | 
  •  

Вопрос

Я хочу показать разные темы, зависит от группы клиентов. Есть ли способ динамически установить разные темы?

Например: тема A для общей группы клиентов и темы B для оптовой группы клиентов.

заранее спасибо

Это было полезно?

Решение

Быстрый и уродливый способ - проверить группу нынешнего клиента, а затем программно настроить тему:

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>

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top