Magento 2: Behandelt die Modulsequenz das Layout, um die XML-Ladereihenfolge zu verarbeiten?

11

Haben die <sequence/>Tags in module.xmlDateien Einfluss auf die Reihenfolge, in der Magento XML-Dateien für das Layout verarbeitet? Meine vorläufige Untersuchung sagt nein , aber das scheint falsch zu sein, daher suche ich nach einer Bestätigung / einem Beweis dafür, dass dies nicht der Fall ist (Beweis == Quellcode-Punkte, an denen XML-Dateipfade für Layout-Handles generiert und geladen werden).

Wenn die Sequenz-Tags keinen Einfluss auf die Ladereihenfolge der Layout-Handle-XML-Dateien haben - gibt es eine Möglichkeit, die Modulreihenfolge zu ändern, in der diese Dateien geladen werden?

Ein spezifisches Problem, das ich zu lösen versuche, ist, wenn ich Folgendes geladen habe, bevor der Container tatsächlich zur Seite hinzugefügt wird

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

Magento Barfs.

Alan Storm
quelle

Antworten:

17

Die Reihenfolge in module.xmlhat einen Einfluss auf app/etc/config.php. Diese Datei wird beim Ausführen aktualisiert. Wenn Sie bin/magento module:enable Vendor_ModuleNamealso Sequenzen hinzugefügt / geändert haben, würde ich vorschlagen, Ihr Modul zu deaktivieren und es dann wieder zu aktivieren. Aktualisieren der module.xmlDatei und das Leeren des Caches nicht genug hier ist, müssen Sie eine vollständige tun disableWieder- enableZyklus Magento zu erhalten Sequenzänderungen während der Entwicklung zu sehen.

Die Sortierreihenfolge der Module in der config.phpDatei wird dann für alle anderen Konfigurationsdateien verwendet, die gemäß Antons Kommentar hier geladen werden.

Die Codepositionen in diesem Kommentar sind etwas veraltet. Dies ist der Code für die Sequenzsortierung https://github.com/magento/magento2/blob/2.0.2/lib/internal/Magento/Framework/Module/ModuleList/Loader.php#L131

Update 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>

Dies verweist auf einen Seitenlayout-Dateisammler in derselben 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>

pageLayoutFileSourceBaseSortedDerjenige , der für uns von Interesse ist, befindet sich immer noch in derselben 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 führt die folgende Sortierung durch

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;
}

wo moduleListbasiert darauf, Magento\Framework\Module\ModuleListwelcher wiederum den oben erwähnten Loader verwendet.

Kristof bei Fooman
quelle
2
+1 für gute Informationen, aber das scheint eine offene Frage zu verlassen - sind Layout handelte XML - Dateien Konfigurationsdateien betrachtet, oder sind sie etwas anderes .
Alan Storm
3
Kommentar für die Google-Nachwelt - Das Laden der Konfiguration entspricht zwar den Sequenzeinstellungen, die Sequenz wird jedoch nicht in einem Cache gelöscht, sondern in einem Modul aktiviert / deaktiviert.
Alan Storm
1
Lebensretter! Ich brauchte eine ganze Weile, bis ich bemerkte, dass dies geschah.
Anton Evers
Und was ist mit der Layout-XML im Thema (App / Design / AwesomeTheme / Standard / ..? Werden alle diese Layout-XMLs nach den Modulen in den Anbietern und App- / Code-Speicherorten in derselben Reihenfolge wie oben erläutert zusammengeführt?
Klaas van der Weij