有什么方法可以根据客户群设置不同的主题?


8

我想根据客户群显示不同的主题,是否有办法动态设置不同的主题?

例如:主题A适用于一般客户组,主题B适用于批发客户组。

提前致谢

Answers:


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>

4

这更多是蒂姆答案的补充。您可以为每个客户组创建配置部分,并在其中设置主题的值。这样,您不必对客户组名称进行硬编码,并且每次添加新组时都不必更改代码。
这是如何添加动态配置字段的示例。它涉及为配置节组创建一个新的渲染器。
结合观察者的观点和蒂姆的建议:

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

应该会得到您想要的结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.