我想根据客户群显示不同的主题,是否有办法动态设置不同的主题?
例如:主题A适用于一般客户组,主题B适用于批发客户组。
提前致谢
我想根据客户群显示不同的主题,是否有办法动态设置不同的主题?
例如:主题A适用于一般客户组,主题B适用于批发客户组。
提前致谢
Answers:
快速且丑陋的方法是检查当前客户的组,然后以编程方式设置主题:
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');
应该会得到您想要的结果。