Magento 2:模块序列会影响布局处理XML加载顺序吗?


11

文件中的<sequence/>标签是否module.xml会影响Magento处理布局处理XML文件的顺序?我的初步研究说没有,但似乎错了,所以我在寻找的确认/证明,他们没有(其中布局处理XML文件路径生成和加载证明==源代码分)

如果序列标签不影响布局句柄XML文件的加载顺序,是否可以更改这些文件的加载顺序?

我要解决的特定问题是在容器实际添加到页面之前是否加载了以下内容

    <referenceContainer name="product.info.media">    
        <action method="unsetChild">
            <argument name="block" xsi:type="string">product.info.media.image</argument>
        </action>
    </referenceContainer>

Magento Barfs。

Answers:


17

中的顺序module.xml对产生影响app/etc/config.php。该文件在您运行时会得到更新,bin/magento module:enable Vendor_ModuleName因此,如果您添加/更改了序列,我建议禁用您的模块,然后重新启用它。更新您的module.xml文件,并清除缓存不够在这里,你需要做一个全面的disable重新enable循环得到Magento的开发过程中看到的序列变化。

config.php然后,根据Anton的注释,文件中模块的排序顺序将用于所有其他配置文件加载

该注释中的代码位置有些过时。这是序列排序的代码https://github.com/magento/magento2/blob/2.0.2/lib/internal/Magento/Framework/Module/ModuleList/Loader.php#L131

更新2:

app / etc / di.xml

<type name="Magento\Framework\View\Model\Layout\Merge">
    <arguments>
        <argument name="fileSource" xsi:type="object">Magento\Framework\View\Layout\File\Collector\Aggregated\Proxy</argument>
        <argument name="pageLayoutFileSource" xsi:type="object">pageLayoutFileCollectorAggregated</argument>
        <argument name="cache" xsi:type="object">Magento\Framework\App\Cache\Type\Layout</argument>
    </arguments>
</type>

在相同的di.xml中引用页面布局文件收集器

<virtualType name="pageLayoutFileCollectorAggregated" type="Magento\Framework\View\Layout\File\Collector\Aggregated">
    <arguments>
        <argument name="baseFiles" xsi:type="object">pageLayoutFileSourceBaseSorted</argument>
        <argument name="themeFiles" xsi:type="object">pageLayoutFileSourceThemeSorted</argument>
        <argument name="overrideBaseFiles" xsi:type="object">pageLayoutFileSourceOverrideBaseSorted</argument>
        <argument name="overrideThemeFiles" xsi:type="object">pageLayoutFileSourceOverrideThemeSorted</argument>
    </arguments>
</virtualType>

我们感兴趣的那个pageLayoutFileSourceBaseSorted仍然在同一个di.xml中

<virtualType name="pageLayoutFileSourceBaseSorted" type="Magento\Framework\View\File\Collector\Decorator\ModuleDependency">
    <arguments>
        <argument name="subject" xsi:type="object">pageLayoutFileSourceBaseFiltered</argument>
    </arguments>
</virtualType>

Magento\Framework\View\File\Collector\Decorator\ModuleDependency 进行以下排序

protected function getModulePriority($moduleName)
{
    if ($this->orderedModules === null) {
        $this->orderedModules = $this->moduleList->getNames();
    }
    $result = array_search($moduleName, $this->orderedModules);
    // Assume unknown modules have the same priority, distinctive from known modules
    if ($result === false) {
        return -1;
    }
    return $result;
}

在何处moduleList基于Magento\Framework\Module\ModuleList使用上述加载程序的方式。


2
+1提供了很好的信息,但这似乎有一个悬而未决的问题-布局句柄XML文件是否被视为配置文件,还是其他东西
艾伦·风暴

3
注释Google后代-配置加载确实遵循序列设置,但是序列未在缓存清除中设置,而是在模块启用/禁用时设置。
艾伦·风暴

1
救生员!我花了相当长的时间才发现这件事正在发生。
安东·埃弗斯,2016年

以及主题(app / design / AwesomeTheme / default / ..?)中的layout-xml怎么办?所有这些layout-xml是否在供应商和应用程序/代码位置的模块分解之后按照上述说明的顺序合并?
Klaas van der Weij
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.