【问题标题】:conditionally add blocks in magento layout有条件地在 magento 布局中添加块
【发布时间】:2011-10-30 17:02:51
【问题描述】:

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

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

【问题讨论】:

    标签: php xml templates layout magento


    【解决方案1】:

    以下帖子将详细介绍您需要的功能:http://www.magentocommerce.com/boards/viewthread/83244/#t219147

    在布局文件中使用 customer_logged_in 或 customer_logged_out 块来添加或删除元素,这些块被最后调用。

    无需添加额外的扩展或代码,这是 Magento 标准内置的。

    希望这对我有用。 Magento 版本:1.6+

    【讨论】:

      【解决方案2】:

      使用customer_logged_incustomer_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>
      

      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());
      }
      

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

      <layout>
          <customer_group_General>
              <reference name="content">
                  <!-- Add some blocks -->
              </reference>
          </customer_group_General>
      </layout>
      

      此外,此方法不允许您直接指定每页的块,但您可以解决此问题。这是一个仅为产品页面创建新位置的示例,在所有其他页面上,更新应该没有效果并且正常失败。

      <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>
      

      【讨论】:

      • 在定位特定页面时可以使用这些句柄吗? vs 用于当客户属于特定组时的每个页面?
      • 我想我知道该怎么做,请查看更新后的答案。
      • 使用自定义助手作为 的参数将是一个更好的解决方案。它将防止您的观察者在每次页面加载时触发,而是将逻辑移动到需要它的特定位置。
      • @Lee,将您的想法作为另一个答案发布,也许人们会更喜欢它。
      • @LeeSaferite 我很想看看是怎么做到的。
      猜你喜欢
      • 1970-01-01
      • 2011-08-13
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      相关资源
      最近更新 更多