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èsRéponses:
Puisqu'il y a des discussions autour de la solution proposée dans la demande de tirage ( https://github.com/magento/magento2/pull/1895 ), en attendant, vous avez juste besoin de "pin" le modèle d'origine lorsque vous changez le nom de la classe de bloc d'origine:
la source
Catalog\Block\Product\View
). Je pense que la suggestion du PO est toujours la meilleure solution pour ce cas.il vous suffit d'ajouter un code dans ce fichier
avec:
et ajoutez le code ci-dessous dans le nom de fichier de votre module de remplacement:
code:
Ajouter un
Topmenu.php
fichier dans un fichier:app/code/Company_name/Override/Block/Html/Topmenu.php
vous pouvez ajouter la fonction que vous souhaitez remplacer.Merci
la source