有条件地添加magento布局中的块

vei*_*lig 6 php xml layout templates magento

有没有办法根据当前客户是否属于某个组来有条件地在我的magento布局中添加一个块?

或者这会在控制器中更好地处理?

clo*_*eek 16

使用类似的东西会很好customer_logged_in,customer_logged_out但遗憾的是还不存在......

让我们复制相同的技术.首先,你需要在配置中创建一个模块:

<frontend>
    <events>
        <controller_action_layout_load_before>
            <observers>
                <customer_group_observer>
                    <class>CUSTOM_MODULE/observer</class>
                    <method>beforeLoadLayout</method>
                </customer_group_observer>
            </observers>
        </controller_action_layout_load_before>
    </events>
</frontend>
Run Code Online (Sandbox Code Playgroud)

CUSTOM_MODULE_Model_Observer类中添加此方法:

public function beforeLoadLayout($observer)
{
    $groupId = Mage::getSingleton('customer/session')->getCustomerGroupId();
    $group = Mage::getModel('customer/group')->load($groupId);

    $observer->getEvent()->getLayout()->getUpdate()
       ->addHandle('customer_group_'.$group->getCode());
}
Run Code Online (Sandbox Code Playgroud)

现在,在布局文件中,您可以使用客户组.

<layout>
    <customer_group_General>
        <reference name="content">
            <!-- Add some blocks -->
        </reference>
    </customer_group_General>
</layout>
Run Code Online (Sandbox Code Playgroud)

此外,此方法不允许您直接指定每页的块,但您可以解决此问题.以下是仅为产品页面创建新位置的示例,在所有其他页面上,更新应该无效且优雅地失败.

<layout>
    <catalog_product_view>
        <reference name="content">
            <block type="core/text_list" name="group_container" />
        </reference>
    </catalog_product_view>

    <customer_group_General>
        <reference name="group_container">
            <!-- Add some blocks -->
        </reference>
    </customer_group_General>
</layout>
Run Code Online (Sandbox Code Playgroud)

  • 使用自定义帮助程序作为&lt;action&gt;的参数将是一个更好的解决方案。这样可以防止您的观察者在每次页面加载时触发,而是将逻辑移至所需的特定位置。 (2认同)
  • @Lee,将您的想法发布为另一个答案,也许人们会喜欢它。 (2认同)