Cette question concerne le respect des meilleures pratiques Magento2.
J'ai dû réécrire la méthode \ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMenu () afin d'ajouter des wrappers autour des éléments. Maintenant, parce que c'est une méthode protégée, je comprends que je dois utiliser la fonction de préférence:
<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />
et ajouter une classe avec mes réécritures:
<?php
namespace MyCompany\Theme\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
// my stuff
}
}
Bien que la classe par défaut ait été réécrite, à la page suivante, j'ai rechargé l'erreur suivante:
main.CRITICAL: Fichier de modèle non valide: 'html / topmenu.phtml' dans le module: nom du bloc 'MyCompany_Theme': 'catalog.topnav' [] []
Magento essaie de trouver html / topmenu.phtml sous mon extension et non sous Magento_Theme. Je comprends que c'est un comportement correct, mais je pensais aux aspects pratiques de cela. Est-ce à dire que chaque fois que nous réécrivons un bloc, nous devons également réécrire son modèle, même si nous n'avons pas nécessairement besoin de toucher à quelque chose de HTML?
Une façon de contourner cela serait de réécrire la méthode _toHtml () aussi, comme ceci:
protected function _toHtml()
{
$this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
return parent::_toHtml();
}
Maintenant, Magento examine à nouveau le module Magento_Theme pour le fichier de modèle. Mais cela ressemble à un hack pour moi.
Donc, ma question est: quelle est la recommandation dans ces situations? Devrions-nous toujours copier le modèle pertinent lors de la réécriture de la classe de bloc, ou la solution de contournement est-elle correcte? Y a-t-il une meilleure approche pour cela?
Magento_Theme::
n'avait pas été préfixé , mais ils n'ont pas github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Je me demande vraiment maintenant si c'était exprès