Magento模块布局xml加载顺序

时间:2012-09-26 21:45:02

标签: xml magento layout module magento-layout-xml

我有一个自定义扩展,包括jQuery到布局XML,如下所示:

<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() 方法,以便将文件排序或预先添加到文件头。

3 个答案:

答案 0 :(得分:15)

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

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

尝试的另一个选择是在自定义模块布局XML中使用<update>指令,因为<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>

答案 1 :(得分: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>

答案 2 :(得分:1)

Magento在app / code / core / Mage / Core / Model / Config.php中按字母顺序从app / etc / modules加载配置文件in protected method _getDeclaredModuleFiles()

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

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