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