5

我有一个自定义扩展,它通过布局 XML 包含 jQuery,如下所示:

<reference name="head">
    <action method="addJs"><script>jquery/jquery-1.8.1.min.js</script></action>
</reference>

其他使用 jQuery 的扩展需要在我的模块之后加载,因此 jQuery 保持在顶部。

默认情况下,Magento 按字母顺序加载所有内容。有没有办法为扩展指定排序顺序?

一种方法是page.xml在我的主题中覆盖并手动将 jQuery 包含到头部,或者我可以将每个自定义模块设置为依赖于我想要的模块,例如:

<depends>
    <Package_JQueryLib />
</depends>

还有其他建议吗?

编辑

我在想我也可以覆盖Mage_Page_Block_Html_Head和修改该addItem()方法以包括对文件进行排序或将文件添加到头部。

4

3 回答 3

15

<depends />节点是一种有效的方法 - 它旨在提供对冲突模块 xpath 值的控制,但它也可用于影响子节点出现的顺序。

另一种选择是重写page/html_head课程,这是一段时间以来需要的东西,我想,实际上是由其他人完成的。

另一个尝试的选择是<update>在自定义模块布局 XML 中使用指令,因为 an<update />中的指令在其他指令之前处理。这意味着 jQuery 将在所有其他文件之前加载。

<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <default>
        <update handle="add_jquery_first" />
    </default>

    <add_jquery_first>
        <action method="addJs" block="head">
            <file>jquery/jquery-1.8.1.min.js</file>
        </action>
        <!-- or
        <reference name="head">
            <action method="addJs">
                <file>jquery/jquery-1.8.1.min.js</file>
            </action>
        </reference>
        -->
    </add_jquery_first>
</layout>
于 2012-09-27T02:31:08.023 回答
3

这就是我想出的: http: //pastebin.com/tMUnWBWR

现在通过布局 xml 或 addJs 方法,我可以使用 sort_order 参数来定义我想要包含我的 js 的位置。

示例布局 xml 如下所示:

<action method="addJs">
<script>js/script.js</script>
<params/>
<sort_order>0</sort_order>
</action>
于 2012-09-27T05:19:47.747 回答
1

Magento 在受保护方法 _getDeclaredModuleFiles() 中的文件 app/code/core/Mage/Core/Model/Config.php 中按字母顺序从 app/etc/modules 加载配置文件

它告诉首先加载 Mage_All.xml,然后是所有 Magento 配置文件(以 Mage_ 开头),最后按字母顺序加载自定义模块。

所以这是一个小而“肮脏”的技巧——将你的命名空间命名为 AaaPackagename。名称以数字开头也可以解决问题:1Packagename 或 000Packagename

于 2012-09-27T01:02:26.453 回答