Precisely control modules loading sequence in Magento

Magento 以 alphabetical 顺序加载 app/etc/modules 里的模块。一般来说,我喜欢在我的模块.xml 前加一个 z,保证我的模块是最后加载的,因为我的模块或许需要去更改原有的布局,那当然得在原有的布局已经生成后才去更改。

我发现不少人跟我有同样想法——喜欢把他们发布的模块.xml 前加 z,有时还加 zz,甚至 zzz。这样就难为我啦,我倾向于去掉这些强加的 z,毕竟是我在统一调配模块。

如果我发布我的模块,我倒不喜欢加 z,因为我不喜欢被人加,己所不欲勿施于人。而且,既然是独立发布的模块,应该尽量做到环境无关化。我不可能知道用户已经装有什么模块、将来还会装什么模块,我尽我本分,不管别的模块能否做到环境无关化。

言归正传。今天我把 jQuery 和一些常用的 jQuery plugins 打了包,放进我的 Msdk (Magento Software Development Kit) 模块。目前 layout 的 msdk.xml 是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
<default>
<reference name="head">
<!-- add jQuery and plugins -->
<action method="addJs">
<script>jquery/jquery-1.4.2.noConflict.min.js</script>
</action>
<action method="addJs">
<script>jquery/jquery.textareaCounter.plugin.js</script>
</action>
<action method="addJs">
<script>jquery/jquery.corner.js</script>
</action>
<action method="addJs">
<script>jquery/jquery.transform-0.6.2.min.js</script>
</action>
</reference>
</default>
</layout>

接着又发现我其他用到 jQuery 的模块无法使用 jQuery,因为它们按 alphabetical 顺序加载在 msdk 模块之前。这让我头痛。Add block 时有 before, after 参数可以控制插入顺序,addJs 没有优先参数,而我又不愿意修改 app/etc/modules 下各个 xml 文件名去控制模块加载顺序(除非我自个儿用 msdk)。

继续琢磨,磨出一个两全其美的办法:参考 Magento 的 Eav 模块,在用到 msdk 的模块加载时使用 <depends>。

<config>
<modules>
<Mage_Eav>
<active>true</active>
<codePool>core</codePool>
<depends>
<Mage_Core />
</depends>
</Mage_Eav>
</modules>
</config>

我早注意到 <depends> 这个 tag,以前觉得它可有可无(我是拿它跟 yum dependency 机制作比较,Magento depends 无法自动解决依赖,所以觉得它可有可无),没想有这等妙用。

Leave a Reply

Your email address will not be published. Required fields are marked *