Есть ли способ установить разные темы, зависит от группы клиентов?
Вопрос
Я хочу показать разные темы, зависит от группы клиентов. Есть ли способ динамически установить разные темы?
Например: тема 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');
должен получить желаемый результат.