Magento:如何对以编程方式添加的js文件使用removeItem

时间:2015-07-17 04:16:36

标签: php xml magento layout themes

我有一个第三方扩展,通过观察者添加JS:

<?php
class Anowave_Owl_Model_Observer extends Mage_Core_Model_Abstract
{
    public function dispatch(Varien_Event_Observer $observer)
    {
        if (Mage::app()->getLayout()->getBlock('owl') && Mage::app()->getLayout()->getBlock('owl')->getSlider())
        {
            $format = Mage::app()->getLayout()->getBlock('owl')->getFormat();

            if ($format instanceof Anowave_Owl_Block_Format)
            {
                $format->addCss()->addJs();
            }
        }

        return $this;
    }
}

其中addJs在块类中定义为:

public function addJs()
{
    $script = 'js/jquery-1.11.0.min.js';
    Mage::app()->getLayout()->getBlock('head')->addItem('skin_js', $script);
 }

我试图通过removeItem删除加载的jquery,而不是破解模块,即

   <default>
     <reference name="head">
        <action method="removeItem">
            <type>skin_js</type>
            <name>js/jquery-1.11.0.min.js</name>
        </action>
    </reference>
   </default>  

在local.xml中。但它不起作用。 (该JS文件仍然打印在头部的脚本标签中)。 即。

<script type="text/javascript" src="http://mydomain.local/skin/frontend/base/default/js/jquery-1.11.0.min.js"></script>

我知道我的语法和路径是正确的,因为我可以在同一个文件夹中卸载/删除其他JS文件(这些文件由扩展程序的布局XML指定)。 我认为local.xml是在所有其他布局注册步骤之后处理的,但我猜不是(?) 所以我不认为布局中的removeItem是一个选项。 我愿意使用

        Mage::app()->getLayout()->getBlock('head')->removeItem('skin_js', $script);

在自定义模块中,但我怎么知道以前的所有addJS()处理都已完成执行?

赞赏任何想法或解决方案!

2 个答案:

答案 0 :(得分:2)

如果此第三方扩展位于community代码池中,您可以在local代码池中重新创建此观察者的相同路径,Magento将检查本地代码池中是否存在该类先于其他任何人。

您必须创建路径app/code/local/Anowave/Owl/Model/并将Observer.php文件放在其中,以便您可以安全地修改此类以用于您的业务逻辑,而无需破解原始扩展。

答案 1 :(得分:0)