En Magento 1, pude copiar la clase abstracta en el directorio local o comunitario y Magento la usó cuando la carga automática cargaba esta clase.
¿Hay alguna solución que hacer para que Magento cargue mi clase en su lugar vendor/magento/framework/Model/AbstractModel.php
?
Las preferencias di.xml
para clases abstractas no funcionan. Solo complementos?
Solución completa: incluya las clases reemplazadas antes de que magento las cargue automáticamente. Entonces paso a paso:
En el archivo
app/etc/NonComposerComponentRegistration.php
agregar filaEn
app/etc
archivo de lugarClassReplacer.php
con el contenidoColoque en
app/code/Magento
alguna clase, que será reemplazada, por ejemploapp/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php
fuente
Si la clase abstracta tiene algún método público o protegido que desea anular, existe una forma en realidad si no puede usar complementos.
Tuve que anular el método
_processDownload
dentro\Magento\Downloadable\Controller\Download
, agregando algunos 'if-s' dentro. (Si alguien tiene idea de cómo puedo agregar algo como este método interno usando complementos, lo agradeceré). La clase es abstracta, por lo que la preferencia no funcionó. Complementos también, ya que el método está protegido. Lo que tenía que hacer era anular todas las clases desdeDownload
, usando preferencia. Estas clases:Magento\Downloadable\Controller\Download\Link
Magento\Downloadable\Controller\Download\LinkSample
Magento\Downloadable\Controller\Download\Sample
Y dentro de ellos reescribe el método de la clase padre (el que se suponía que debía anular). Entonces, el código de los métodos anulados se copió en tres lugares y fue exactamente el mismo.
No es ideal pero funciona.
fuente
Puede intentar usar el complemento Magento para mejorar la funcionalidad existente de cualquier clase abstracta, aunque el alcance de la función debe ser público. Recientemente trabajé en el mismo problema en el que necesito excluir productos que tienen un atributo personalizado asignado de la lista de productos vistos recientemente .
Usé el complemento para la función llamada getItemsCollection de la clase llamada Magento \ Reports \ Block \ Product \ AbstractProduct usando la siguiente sintaxis:
archivo: aplicación \ código \ Paquete \ Módulo \ etc \ frontend \ di.xml
archivo: aplicación \ código \ Paquete \ Módulo \ Bloque \ Visto.php
Puedes usar plugins tanto como antes como también. Espero que esto funcione para ti.
fuente