Magento条件<customer_logged_out>奇怪的行为

时间:2016-02-10 10:47:01

标签: xml magento configuration-files

如果用户 已登录,我想要添加一个小js文件。
我有这种情况:
file catalog.xml:

<layout version="0.1.0">
 <default>
  ....
 </default>
  <catalog_product_view translate="label">
    <label>Catalog Product View (Any)</label>
    <reference name="head">
      <action method="addJs">
        <script>varien/configurable.js</script>
      </action>
    </reference>
    ....
  </catalog_product_view>
</layout>

我写了一个这样的local.xml文件:

<layout version="0.1.0">
  <customer_logged_out>
    <catalog_product_view translate="label">
      <reference name="head">
        <action method="addJs">
          <script>varien/file.js</script>
        </action>
      </reference>    
    </catalog_product_view>
  </customer_logged_out>
</layout>

这不起作用,并且不添加文件 但是,如果我删除了catalog_product_view标记,它会:

<layout version="0.1.0">
  <customer_logged_out>
    <!--<catalog_product_view translate="label">-->
      <reference name="head">
        <action method="addJs">
          <script>varien/file.js</script>
        </action>
      </reference>    
    <!--</catalog_product_view>-->
  </customer_logged_out>
</layout>

我想,我没有测试过,以这种方式将文件添加到所有页面中,但我只想在catalog_product_view中添加它。

可能我不了解config xml文件的所有逻辑。 任何人都可以向我解释这个特例吗?

非常感谢。

1 个答案:

答案 0 :(得分:1)

当客户未登录时,为所有页面加载

customer_logged_out句柄。并且您不能在另一个下使用2个布局句柄。
但是你可以通过观察者实现你所需要的 在其中一个模块中,将其添加到config.xml标记

内的config文件中
<frontend>
    <events>
        <controller_action_layout_generate_blocks_after>
            <observers>
                <[module]>
                    <class>[Namespace]_[Module]_Model_Observer</class>
                    <method>addJs</method>
                </[module]>
            </observers>
        </controller_action_layout_generate_blocks_after>
    </events>
</frontend>

然后使用此内容

创建文件[Namespace]/[Module]/Model/Observer.php
<?php
class [Namespace]_[Module]_Model_Observer
{
    public function addJs($observer)
    {
        /** @var Mage_Customer_Model_Session $customerSession */
        $customerSession = Mage::getSingleton('customer/session');
        $action = $observer->getEvent()->getAction()->getFullActionName();
        if (!$customerSession->isLoggedIn() && $action == 'catalog_product_view') {
            $head = $observer->getEvent()->getLayout()->getBlock('head');
            if ($head) {
                $head->addJs('varien/file.js');
            }
        }
    }
}

清除缓存,你就完成了。