我有一个自定义扩展,包括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()
方法,以便将文件排序或预先添加到文件头。
答案 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