【问题标题】:Magento module layout xml load orderMagento 模块布局 xml 加载顺序
【发布时间】:2012-09-18 14:57:28
【问题描述】:

我有一个自定义扩展,它通过布局 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() 方法以包括对文件进行排序或将文件附加到头部。

【问题讨论】:

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


    【解决方案1】:

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

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

    另一个尝试的选项是在自定义模块布局 XML 中使用 &lt;update&gt; 指令,因为 &lt;update /&gt; 中的指令在其他指令之前处理。这意味着 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>
    

    【讨论】:

    • 感谢您的建议。非常感激。我已经用我想出的解决方案编辑了我的答案。它可能不是最优雅的,但它可以工作,我不必再担心 jquery。我尝试了使用 update 指令的方法,但在其他自定义扩展之后仍然包含 jquery。再次感谢,请告诉我您对我的解决方案的看法。
    • 嗯。我需要研究为什么update 不起作用。至于您的答案,您可以将其发布为您自己问题的答案,然后接受它供其他人评估:-)
    • 我发布了它:)。我认为更新方法仅适用于该特定模块布局 xml,但我可能是错的。其他模块布局 xml 仍然首先附加到页头。
    • 很好的答案本! - github.com/drewhunter/ItemPosition - 正如 Ben 在他的回答中描述的那样,使用了 page/html_head 的重写,所以它不是特别漂亮,但它可以工作
    • 德鲁,干得好。我希望我能在自己做之前找到你的解决方案:)
    【解决方案2】:

    这是我想出的: 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>
    

    【讨论】:

    • 在 Magento 1.9 中,这仅适用于我在操作中包含所有可选元素且顺序正确(类型、名称、参数、if、cond、sort_order)的情况。在这里查看我的问题:stackoverflow.com/questions/26659886/…
    • 另外,这不允许将 JS 移动到所有文件的顶部,只允许将其他相同类型的文件移动到顶部。例如,如果您有一个类型为“skin_js”的 JS 文件和另一个类型为“js”的 JS 文件,它们只会在它们的同一类型中排序。
    【解决方案3】:

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

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

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

    【讨论】:

    • 最好使用&lt;depends /&gt; 节点。
    • 谢谢你的回答谢尔盖。
    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2010-11-09
    • 2018-08-25
    • 2017-06-04
    相关资源
    最近更新 更多