重新排序Magento JavaScript包含(addJs)

时间:2011-09-06 08:33:52

标签: javascript magento

我会保持这个简单....在我的产品页面上我需要删除prototype.js文件并将其替换为最新版本的原型。到目前为止,使用local.xml我已成功使用它替换它:

<action method="removeItem"><type>js</type><name>prototype/prototype.js</name></action>
<action method="addJs"><script>prototype/prototype-new.js</script></action>

问题是现在原型被加载到其他所有阻止它工作的包含之下。

有没有办法设置JavaScript的顺序包括使用local.xml而不必再删除和添加每个文件?

7 个答案:

答案 0 :(得分:44)

你可以使用params元素,其中包含“data-group”HTML属性,Magento会在没有设置“params”的任何项目之后设置带有“params”的项目。您可以在主题中使用local.xml来确保这些元素的顺序(我建议让Magento首先添加其标准文件):

<action method="addJs">
    <script>prototype/javascript0.js</script>
    <params><![CDATA[data-group="js002"]]></params>
    <!-- creates first group js002 -->
</action>
<action method="addJs">
    <script>prototype/javascript1.js</script>
    <params><![CDATA[data-group="js002"]]></params>
    <!-- appends to created group js002, after javascript0 -->
</action>
<action method="addJs">
    <script>prototype/javascript2.js</script>
    <params><![CDATA[data-group="js001"]]></params>
    <!-- creates first group js001 -->
</action>
<action method="addJs">
    <script>prototype/javascript3.js</script>
    <params><![CDATA[data-group="js001"]]></params>
    <!-- appends to created group js001, after javascript2 -->
</action>
<action method="addJs">
    <script>prototype/javascript4.js</script>
    <params><![CDATA[data-group="js002"]]></params>
    <!-- appends to created group js002, after javascript1 -->
</action>
<action method="addJs">
    <script>prototype/javascript5.js</script>
    <!-- no params supplied, will be rendered before any groups -->
</action>

设置“params”的元素的顺序仅由执行操作的顺序决定。项目按“params”的值进行分组,因此一旦组“js001”由第一个动作(javascript2.js)定义,具有相同组名的连续动作将附加到该组,等等。

在上面的示例中,渲染顺序为:

  • prototype / javascript5.js(没有参数,首先出现)
  • prototype / javascript0.js(首次创建了params group“js002”)
  • prototype / javascript1.js(首先创建了params group“js002”)
  • prototype / javascript4.js(首先创建了params group“js002”)
  • prototype / javascript2.js(第二个创建的params组“js001”)
  • prototype / javascript3.js(第二个创建的params组“js001”)

使用addItem addJs,addCss等添加的项目以相同的方式进行威胁,但它们的类型不同(并且将相应地进行超级分组)类型(请参阅下面的顺序),超级组中的每个组在内部排序为上面解释过:

  • JS​​
  • skin_js
  • js_css
  • skin_css

答案 1 :(得分:1)

Mage_Page_Block_Html_Head $ _data;保存这些项目的数组,所以我猜你可以为自己的利益过滤它。默认方法不允许定义添加项的顺序。

答案 2 :(得分:1)

我意识到这篇文章很老了,但我在研究这个问题时偶然发现了它,所以我想为什么不这样做。

不确定这是否是最优雅的解决方案,但它对我们来说效果非常好。

我基本上在我的local.xml中创建了一个新块,如下所示: <block type="core/template" name="prehead" template="page/html/prehead/main.phtml" />

然后修改我的主要布局(1column.phtml和朋友)来包含这个: <head> <?php echo $this->getBlockHtml('prehead') ?> <?php echo $this->getChildHtml('head') ?> </head>

main.phtml中,我添加了我想首先加载的JS

<script type='text/javascript' src='<?php echo $this->getSkinUrl('js/require.js', array('_secure'=>true)); ?>'></script> <script type='text/javascript' src='<?php echo $this->getSkinUrl('js/main.js', array('_secure'=>true)); ?>'></script>

这对我们来说也很方便,因为它仍然允许我们通过在local.xml中执行类似的操作来改变main.js,具体取决于我们所在的页面:

<checkout_onestep_index translate="label"> <label>One Step Checkout</label> <block type="core/template" name="prehead" template="page/html/prehead/checkout.phtml" /> </checkout_onestep_index>

希望它可以帮助碰巧偶然发现的人。

-Ken

答案 3 :(得分:0)

由于magento系统最后加载了 local.xml ,所以最后提到的xml被合并了。这可能是您的新原型加载到其他脚本之下的原因。

或者,您可以覆盖 Mage_Page_Block_Html_Head :: getCssJsHtml()方法并使用它。

感谢

答案 4 :(得分:0)

好的,这是我的解决方案。 首先将app \ code \ core \ Mage \ Page \ Block \ Html \ head.php复制到app \ code \ local \ Mage \ Page \ Block \ Html \ head.php

然后将此函数添加到文件中:

public function replaceItem($type, $name, $replace)
{
    $newArray = array();

    foreach($this->_data['items'] as $key => $value) {
        if($key == $type.'/'.$name) {
            $newArray[$type . '/'. $replace] = array(
            'type'   => $type,
            'name'   => $replace,
            'params' => $value['params'],
            'if'     => $value['if'],
            'cond'   => $value['cond']);
        } else {
            $newArray[$key] = $value;
        }
    }
    $this->_data['items'] = $newArray;
    return $this;
}

现在,您的.XML布局文件中包含如下所示的行:

<action method="replaceItem"><type>js</type><name>prototype/prototype.js</name><replace>onestepcheckout/prototype/prototype.js</replace></action>

参数与removeItem完全相同但现在替换文件将被注入到与原始文件相同位置的列表中。它还将继承相同的参数,if和cond值。请仔细使用此代码,因为我刚刚编写并完成了基本测试!

答案 5 :(得分:0)

我认为Barny Shergold的解决方案是最正确的,但关于避免更改核心文件的评论是正确的。为了充分利用这两个方面,您可以在扩展Mage_Page_Block_Html_Head类的模块中实现Barny的解决方案,如下所示:

Yourcompany / Layouthelper的/ etc / config.xml中

<?xml version="1.0"?>
<config>
    <modules>
        <Yourcompany_Layouthelper>
            <version>0.0.1</version>
        </Yourcompany_Layouthelper>
    </modules>
    <global>
        <blocks>
            <page>
                <rewrite>
                    <html_head>Yourcompany_Layouthelper_Block_Html_Head</html_head>
                </rewrite>
            </page>
        </blocks>
    </global>
</config>

Yourcompany / Layouthelper /砌块/ HTML / Head.php

class Yourcompany_Layouthelper_Block_Html_Head extends Mage_Page_Block_Html_Head {

    public function replaceItem($type, $name, $replace) {
        $newArray = array();

        foreach($this->_data['items'] as $key => $value) {
            if($key == $type.'/'.$name) {
                $newArray[$type . '/'. $replace] = array(
                'type'   => $type,
                'name'   => $replace,
                'params' => $value['params'],
                'if'     => $value['if'],
                'cond'   => $value['cond']);
            } else {
                $newArray[$key] = $value;
            }
        }
        $this->_data['items'] = $newArray;
        return $this;
    }
}

答案 6 :(得分:0)

jquery与magento中的Prototype冲突:

最简单的解决方案是在主jquery文件的末尾添加。

jQuery.noConflict();

或者创建自定义js文件并添加此行,并在主js之后包含此文件。