Magento 条件 <customer_logged_out> 奇怪的行为
Magento conditional <customer_logged_out> strange behavior
如果用户没有登录,我想做的是添加一个小的js文件。
我有这种情况:
文件 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.
中添加它
可能我不理解配置 xml 文件的所有逻辑。
谁能给我解释一下这个特殊情况?
非常感谢。
customer_logged_out
当客户未登录时,为所有页面加载句柄。并且您不能一个接一个地使用 2 个布局句柄。
但是你可以通过观察者实现你所需要的。
在您的模块之一中,将此添加到 config
标签内的 config.xml
文件中
<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');
}
}
}
}
清除缓存,大功告成。
如果用户没有登录,我想做的是添加一个小的js文件。
我有这种情况:
文件 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.
中添加它可能我不理解配置 xml 文件的所有逻辑。 谁能给我解释一下这个特殊情况?
非常感谢。
customer_logged_out
当客户未登录时,为所有页面加载句柄。并且您不能一个接一个地使用 2 个布局句柄。
但是你可以通过观察者实现你所需要的。
在您的模块之一中,将此添加到 config
标签内的 config.xml
文件中
<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');
}
}
}
}
清除缓存,大功告成。