Dans Magento 1, je pouvais copier la classe abstraite dans un répertoire local ou communautaire et Magento l'a utilisé lors du chargement automatique de cette classe.
Y a-t-il une solution à faire pour que Magento charge ma classe à la place vendor/magento/framework/Model/AbstractModel.php
?
Les préférences dans di.xml
les classes abstraites ne fonctionnent pas. Plugins uniquement?
Solution complète: incluez les classes remplacées avant que magento ne les charge automatiquement. Donc, étape par étape:
Dans le fichier,
app/etc/NonComposerComponentRegistration.php
ajouter une ligneEn
app/etc
fichier lieuClassReplacer.php
avec le contenuPlace à
app/code/Magento
une classe, qui sera remplacée, par exempleapp/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php
la source
Si la classe abstraite a une méthode publique ou protégée que vous souhaitez remplacer, il existe en fait un moyen si vous ne pouvez pas utiliser de plugins.
J'ai dû remplacer la méthode à l'
_processDownload
intérieur\Magento\Downloadable\Controller\Download
, en ajoutant des «si-s» à l'intérieur. (Si quelqu'un a une idée de comment ajouter quelque chose comme ça à l'intérieur de la méthode en utilisant des plugins, je serai reconnaissant). La classe est abstraite, donc la préférence n'a pas fonctionné. Plugins aussi, car la méthode est protégée. La chose que je devais faire était de remplacer toutes les classes à partir deDownload
, en utilisant la préférence. Ces cours:Magento\Downloadable\Controller\Download\Link
Magento\Downloadable\Controller\Download\LinkSample
Magento\Downloadable\Controller\Download\Sample
Et à l'intérieur, réécrivez la méthode de la classe parente (celle que je devais remplacer). Donc, en fait, le code des méthodes remplacées a été copié à trois endroits et était exactement le même.
Ce n'est pas idéal mais ça marche.
la source
Vous pouvez essayer d'utiliser Magento Plugin pour améliorer les fonctionnalités existantes de n'importe quelle classe abstraite, bien que la portée de la fonction devrait être publique. Récemment, j'ai travaillé sur le même problème où je dois exclure des produits ayant un attribut personnalisé attribué de la liste des produits récemment consultés .
J'ai utilisé le plugin pour la fonction nommée getItemsCollection de la classe nommée Magento \ Reports \ Block \ Product \ AbstractProduct en utilisant la syntaxe suivante:
fichier: app \ code \ Package \ Module \ etc \ frontend \ di.xml
fichier: app \ code \ Package \ Module \ Block \ Views.php
Vous pouvez également utiliser des plugins avant et avant. J'espère que ce travail pour vous.
la source