Fehler nach Magento Update auf 2.2.3

Ich bin bei mehreren Kunden mit fertigen Themes nach dem Magento Update auf 2.2.3 auf Probleme gestoßen. Während scheinbar das XML Schema (xsd) die entsprechende Vorgabe schon früher gemacht hat, wird sie jetzt erst richtig durchgesetzt. Das führt zu einem Fehler, deren Lösung Du hier findest:

Element ‚move‘: This element is not expected.

Eine XML-Definition enthält in diesem Fall das Element „<move…“. Das ist erstmal nicht schlimm und an verschiedenen Stellen erlaubt. Die XSD Datei für das Layout befindet sich hier:

vendor/magento/framework/View/Layout/etc/layout_merged.xsd

In der Datei layout_merged.xsd wird ganz oben auch die Datei elements.xsd eingebunden. Und in der steckt die Definition der Elemente.

Die Lösung vorab

In Themes von Themeforest, aber z.B. auch von Mittwald, wurde mehrfach move innerhalb des Elements container verwendet. Das ist laut elements.xsd jedoch nicht erlaubt:

<xs:complexType name="containerType">
    <xs:annotation>
        <xs:documentation>
            Container for structuring elements of a page.
        </xs:documentation>
    </xs:annotation>
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="block" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element name="container" type="containerType" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="referenceBlock" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="referenceContainer" minOccurs="0" maxOccurs="unbounded"/>
        <xs:element ref="uiComponent" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    ...

Die erlauben Elemente werden innerhalb von xs:element aufgezählt. Da fehlt jedoch move. Die erweiterte Meldung lautet deshalb:

This element is not expected. Expected is one of ( block, container, referenceBlock, referenceContainer, uiComponent ).

Die Lösung: move nicht innerhalb von container zu verwenden.

Der Lösungsweg

Und wie findest Du nun diese Lösung? Oder vielleicht ähnliche Probleme? Die Herausforderung ist hier der fehlende Bezug zu fehlerhaftem Code. Bei einem PHP Fehler kann man ungefähr die Stelle erahnen. Aber im XML? Schwieriger. Immerhin werden die einzelnen XML Dateien auch noch kombiniert.

Bei der Lösung hilft ein Blick in den Callstack:

#0 .../vendor/magento/framework/Config/Dom.php(115): Magento\Framework\Config\Dom->_initDom('<layout xmlns:x...')
#1 .../vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php(111): Magento\Framework\Config\Dom->__construct('<layout xmlns:x...', Object(Magento\Framework\App\Arguments\ValidationState), Array, NULL, '/Users/jbrinkma...', '%message%\nLine:...')
#2 .../vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php(66): Magento\Framework\ObjectManager\Factory\AbstractFactory->createObject('Magento\Framewo...', Array)
#3 .../vendor/magento/framework/ObjectManager/ObjectManager.php(56): Magento\Framework\ObjectManager\Factory\Dynamic\Developer->create('Magento\Framewo...', Array)
...

Ganz oben in der Kette steht als letztes der Aufruf von _initDom in Magento\Framework\Config\Dom. Dort kann entweder einen Breakpoint setzen (hier wird Zeile 115 genannt), oder einfach den Inhalt von $xml ausgeben.

Statt:

$this->dom = $this->_initDom($xml);

Fängst Du die ValidationException und gibst dann das XML aus:

try {
    $this->dom = $this->_initDom($xml);

} catch (\Exception $e) {
    die($xml);
}

Nun siehst Du im Browser (ggf. Quelltext anzeigen lassen) das erzeugte Layout-XML. Hier suchst Du nach „move“ (oder anderen fehlerhaften Elementen aus der Fehlermeldung). Einmal erkannt, musst Du danach noch die fehlerhaften Stellen in Deinem Theme oder Deiner Extensions suchen und korrigieren.

Unsaubere Lösung?

Ziel ist natürlich auf keinen Fall in den Core-Dateien (hier Dom.php) Änderungen zu machen. Die Dateien liegt ja ohnehin im Vendor-Verzeichnis. Mit Git wird es da ohnehin schwer. Darum wäre Exception-Handling ohnehin nur ein Hotfix. Das Beispiel oben soll nur helfen, um bei der Entwicklung die Fehlerquelle zu erkennen.

Ansprechpartner gesucht?

Nicht sicher wie die Probleme sauber gelöst werden sollen? Wie das Theme korrigiert werden kann? Gerne helfe ich ihnen bei Problemen nach dem Magento Upgrade unkompliziert weiter.

Kontaktieren Sie mich