404-Seite (no-route) Magento 2

Problemstellung in userer Internetagentur: Ein mittels Widget im Onlineshop-System Magento 2 eingebundener Seitenlink wurde nicht auf unserer no-route-Page angezeigt, obwohl im Magento-Backend in den Widgeteinstellungen so festgelegt. So ist hier Typ "Seiten-Link", Paket/Theme "Luma" und als Storeviews alle vorhandenen ("Alle Store Views" würde auch reichen!) angegeben, Sortierreigenfolge hier egal, Layoutupdates nur für "Angegebene Seite" und zwar Seite "CMS No-Route Default Page" ("CMS No Route") ging hier genau so wenig, gehen wir aber nachher näher darauf ein:

 

  Download.png

 

Auf der Startseite hingegen funktioniert alles tadellos. Schauen wir uns also einmal an, an welcher Stelle die Layoutupdates im Widget Modul berücksichtigt werden. Hier fällt uns dann gleich die Datei

 

vendor\magento\module-widget\Model\ResourceModel\Layout\Update.php

 

ins Auge, in der in Funktion fetchUpdatesByHandle() mit den ausgewählten Handles (Layoutidentifikatoren) gearbeitet wird. Hierbei fällt auf (Testausgaben!), dass die Identifikatoren / Handles hier anders heißen. So heißt das Handle für die Magento-Seite "CMS No-Route Default Page" z.B. "cms_index_defaultnoroute" und das Handle für die Magento-Seite "CMS No-Route Page" z.B. "cms_index_noroute". Und so werden diese Handles auch in der Widget-Tabelle "widget_instance_page" in Spalte eingetragen. Nur so viel vorab:  Statt "cms_index_noroute" muss es "cms_noroute_index" und statt "cms_index_defaultnoroute" muss es "cms_noroute_index_id_no-route" heißen, denn so verlangt es die Funktion getDefaultLayoutHandle() in der Datei

 

vendor\magento\framework\View\Result\Layout.php

 

bzw. die Funktion getFullActionName() in Datei

 

vendor\magento\framework\App\Request\Http.php

 

Denn hier setzt sich der Handlename der aufgerufenen Seite zusammen aus:

 

$this->getRouteName() .$this->getRouteName() .$delimiter.$this->getControllerName() .$delimiter .$this->getActionName();

 

Die Variable "$delimiter" ist hierbei der Unterstrich, "$this->getRouteName()" ergibt "cms", "$this->getControllerName()" ergibt "noroute" und $this->getActionName() ergibt "index", also zusammen "cms_noroute_index". Wird dieser String dann erfolglos gegen "cms_index_noroute" abgeglichen, wird damit das Layoutupdate nicht angewendet. Bei "cms_index_defaultnoroute" ergibt sich ein ähnliches Bild, nur dass hier noch in Funktion prepareResultPage() in

F

 

vendor\magento\module-cms\Helper\Page.php

 

bzw. weiter in Funktion addPageLayoutHandles() in Datei

 

vendor\magento\framework\View\Result\Page.php

 

die id mit Unterstrichen angehängt wird, so wird also hier das Handle "cms_index_defaultnoroute" mit "cms_noroute_index_id_no-route" verglichen - kann auch nicht funktionieren.

 

Wo kommen also diese falschen Handles her? Fündig werden wir hier in der Datei

 

vendor\magento\module-cms\etc\frontend\page_types.xml

 

welche für die Zusammenstellung der Handles verwendet wird:

 

 

<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_types.xsd">

    <type id="cms_index_defaultindex" label="CMS Home Default Page"/>

    <type id="cms_index_defaultnoroute" label="CMS No-Route Default Page"/>

    <type id="cms_index_index" label="CMS Home Page"/>

    <type id="cms_index_nocookies" label="CMS No-Cookies Page"/>

    <type id="cms_index_noroute" label="CMS No-Route Page"/>

    <type id="cms_page_view" label="CMS Pages (All)"/>

</page_types>

 

Wir müssen die richtigen Handles nun ergänzen, am besten nicht in dieser Core-Datei, sondern einfach in einer adäquaten Extension, also z.B. in Datei

 

app\code\Econcess\Fixhandle\etc\frontend\page_types.xml in dieser Form (die Default Home Page haben wir auch noch mitgenommen, da genauso falsch, aber natürlich kein Anspruch auf Vollständigkeit!):

 

<?xml version="1.0"?>

 

<page_types xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_types.xsd">

        <type id="cms_index_index_id_home" label="CMS Home Default Page econcess"/>

        <type id="cms_noroute_index_id_no-route" label="CMS No-Route Default Page econcess"/>

        <type id="cms_noroute_index" label="CMS No-Route Page econcess"/>

</page_types>

 

Damit funktionieren nun auch die Magento-Widgets auf den genannten CMS-Seiten. Getestet im Onlineshop mit Magento CE 2.2.5.