Sind wir gezwungen, eine Vorlage in Magento2 neu zu schreiben, wenn wir einen Block neu schreiben?


8

Bei dieser Frage geht es darum, die Best Practices von Magento2 zu befolgen.

Ich musste die Methode \ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMenu () neu schreiben, um einige Wrapper um Elemente hinzuzufügen. Da es sich um eine geschützte Methode handelt, muss ich meines Erachtens die Voreinstellungsfunktion verwenden:

<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />

und füge eine Klasse mit meinen Umschreibungen hinzu:

<?php

namespace MyCompany\Theme\Block\Html;

class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
    protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
    {
        // my stuff
    }
}

Obwohl die Standardklasse neu geschrieben wurde, wurde beim erneuten Laden der nächsten Seite der folgende Fehler angezeigt:

main.CRITICAL: Ungültige Vorlagendatei: 'html / topmenu.phtml' im Modul: 'MyCompany_Theme' Blockname: 'catalog.topnav' [] []

Magento versucht, html / topmenu.phtml unter meiner Erweiterung und nicht unter Magento_Theme zu finden. Ich verstehe, dass dies korrektes Verhalten ist, aber ich habe über praktische Aspekte nachgedacht. Bedeutet dies, dass wir beim Umschreiben eines Blocks auch dessen Vorlage neu schreiben müssen, auch wenn wir nicht unbedingt etwas HTML-bezogenes berühren müssen?

Eine Möglichkeit, dies zu umgehen, besteht darin, die Methode _toHtml () wie folgt neu zu schreiben:

protected function _toHtml()
{
    $this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
    return parent::_toHtml();
}

Jetzt sucht Magento erneut im Magento_Theme-Modul nach der Vorlagendatei. Aber das sieht für mich nach einem Hack aus.

Meine Frage lautet also: Was ist eine Empfehlung in diesen Situationen? Sollten wir beim Umschreiben der Blockklasse immer die relevante Vorlage kopieren, oder ist die Problemumgehung in Ordnung? Gibt es dafür einen besseren Ansatz?



1
interessant. Die Vorlage könnte immer noch aus dem Originalmodul geladen werden, wenn ihr ein Präfix vorangestellt worden wäre Magento_Theme::, aber sie haben nicht github.com/magento/magento2/blob/develop/app/code/Magento/Theme/…. Ich frage mich jetzt wirklich, ob dies der Fall ist absichtlich
David Verholen

@ RaphaelatDigitalPianism Danke. Der Thread, den Sie verlinkt haben, handelt von Plugins. Mein Szenario ist anders.
Mstojanov

Ja, das habe ich gefunden, als ich verstanden habe, was dein Problem war. Auf jeden Fall nicht richtig klingt für mich nach einem Fehler
Raphael bei Digital Pianism

Ich habe auf GitHub ein Problem erstellt, das dieses Problem behebt : github.com/magento/magento2/issues/4564, das auf eine Antwort des Entwicklerteams wartet und eine PR erstellt, wenn es sich um einen Fehler handelt.
Raphael bei Digital Pianism

Antworten:


4

Da in der Pull-Anfrage ( https://github.com/magento/magento2/pull/1895 ) Diskussionen über die vorgeschlagene Lösung geführt werden , müssen Sie beim Ändern des ursprünglichen Blockklassennamens nur die Originalvorlage "anheften":

<referenceBlock name="catalog.topnav" class="***" template="Magento_Theme::html/topmenu.phtml"/>

Dies ist ein guter Vorschlag, obwohl er für bestimmte Blöcke bestenfalls unpraktisch wäre, da er in so vielen Layouts verwendet wird ( Catalog\Block\Product\View). Ich denke, der Vorschlag des OP ist immer noch die beste Lösung für diesen Fall.
Erfan

3

Sie müssen nur einen Code in diese Datei einfügen

app/design/frontend/chop/misty/Magento_Theme/layout/default.xml

mit:

<referenceBlock name="catalog.topnav" class="Company_name\Override\Block\Html\Topmenu" template="Magento_Theme::html/topmenu.phtml"/>

und fügen Sie den folgenden Code in den Dateinamen Ihres Override-Moduls ein:

app/code/Aims/Override/etc/di.xml

Code:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Magento\Theme\Block\Html\Topmenu" type="Company_name\Override\Block\Html\Topmenu" />
    <preference for="Magento\Paypal\Model\Config" type="Company_name\Override\Model\Paypal\Config" />
</config>

In Topmenu.phpDatei in Datei: app/code/Company_name/Override/Block/Html/Topmenu.php Sie können hinzufügen , was Funktion , die Sie außer Kraft setzen möchten.

Vielen Dank

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.