Estoy atascado en anular bloques de modelo y controladores centrales en Magento2. ¿Alguien puede ayudarme en esto?
Tomemos la barra de herramientas de lista como ejemplo donde necesito agregar una nueva opción de ordenación llamada ordenar por la más popular . ¿Cómo lo agrego? Supongo que para esto necesitamos agregar la opción en el nivel de bloque y la condición en el List.php
nivel de colección.
Respuestas:
Magento2 dio muy buen concepto llamado Plugin
podemos hacer lo que sea después y antes de la función central y también tenemos una llamada más que hará tanto antes como después, a continuación se muestra un código que cubrirá toda la información
Cree un archivo di.xml en Mymodule / etc / di.xml
en esto tomé un ejemplo de modelo de producto y bloque de vista de producto
Utilicé alrededor del bloque de Vista del producto que es cualquier función, use el prefijo alrededor y luego me aseguro de que haya 2 parámetros, primero el objeto que está usando el segundo cierre que retiene la información de devolución anterior
En el modelo que utilicé antes y después de eso es
de esta manera podemos retener el código anterior, de modo que si mañana se actualiza el código principal de Magento tendremos tanto el código nuevo actualizado como nuestra lógica personalizada si anulamos directamente y luego perdemos el nuevo código actualizado de esa función o archivo :-)
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html
fuente
Finalmente lo tengo !!!!
Sigo los pasos a continuación para anular el bloque, el controlador y el modelo. Tomé un ejemplo del modelo del producto y el bloque de vista del producto y ver el controlador / acción
Cree un archivo llamado di.xml en su /etc/di.xml
Luego creé el archivo de modelo en /Model/Product.php
Luego creé el archivo Block en /Block/Product/View.php
Ahora cree el controlador de vista de producto /Controller/Product/View.php
Esta trabajando bien para mi :-)
fuente
Hay dos pasos para anular el archivo de bloque, modelo y controlador
1) Añadir preferencia en di.xml
2) Cree un archivo de bloque, modelo y controlador en su módulo
1) Crear un archivo di.xml en la carpeta
Prince/Helloworld/etc
2) Crear ListProduct.php en la carpeta
Prince/Helloworld/Block/Rewrite/Product
1) Agregue preferencia en di.xml en
Prince/Helloworld/etc
2) Crear archivo de modelo Product.php en la carpeta
Prince/Helloworld/Model/Rewrite/Catalog
1) Agregue preferencia en di.xml en
Prince/Helloworld/etc
2) Crear View.php en la carpeta
Prince/Helloworld/Controller/Rewrite/Product
Puede anular otros bloques, modelos y controladores con el mismo enfoque.
fuente
Pequeña corrección pero muy útil, no necesitamos crear un número n de archivos para cada función en concepto de complemento. Para un módulo, un archivo de complemento es suficiente para que pueda extender todos los módulos, todos los modelos y bloques y el controlador de Magento completo.
y en el plugin php file
Rocas Magento2
fuente
Uncaught Error: Call to undefined method Magento\\Backend\\Model\\View\\Result\\Redirect\\Interceptor::getEntityId()
Aquí\Clousure $proceed
conseguir obejct deMagento\\Backend\\Model\\View\\Result\\Redirect\\Interceptor
Puede extender directamente la clase de bloque o controlador de magento en su bloque o controlador personalizado. Por ejemplo, al extender el modelo de factura PDF en mi módulo personalizado para cambiar el logotipo de la factura, PDF generar de la misma manera que puede anular el bloque o el controlador. para crear un archivo di.xml y no es necesario establecer preferencias.
}
fuente
di.xml
. Me falta esta parte bastante esencial en su respuesta ...Desarrollador / Helloworld / Registration.php
Desarrollador / Helloworld / etc / module.xml
Desarrollador / Helloworld / etc / di.xml
fuente
Una clase de acción puede reescribirse de la misma manera que en Magento 1. En Magento 1 teníamos
before
atributos alrededor de las etiquetas<routers>..<args><modules><... before="Mage_Catalog">Namespace_MyModule ..
En
[module path]/etc/[nothing|adminhtml|frontend]/routes.xml
:Y la clase de acción
\Namespace\MyModule\Controller\[same path of action as in core module]\SameActionName.php
dondeclass SameActionName.php extends \Magento\Catalog\...\SameActionName
Este es el módulo Magento_Catalog, archivo que
Magento\Catalog\etc\adminhtml\routes.xml
registra una nueva ruta en admin:http://devdocs.magento.com/guides/v2.1/extension-dev-guide/routing.html
No creo que las preferencias o complementos en las clases de Acción sean una buena idea por las mejores prácticas de Magento. Y puede haber más.
fuente
Para anular directamente una clase, debe usar las preferencias. Ver más sobre documentos de desarrollo: https://devdocs.magento.com/guides/v2.0/extension-dev-guide/build/di-xml-file.html#abstraction-implementation-mappings
Durante la mayor parte del tiempo utilizamos interceptores (complementos) porque esta es la mejor práctica para reescribir o agregar parte de sus modificaciones. Ver documentos de desarrollo: https://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html
Al mantener su ejemplo de clasificación de elementos de la lista agregando el nuevo orden de clasificación 'Más popular' que le estoy proporcionando La mejor manera de modificar el resultado.
Cree un módulo personalizado y cree la configuración
app/code/Arsal/SortOption/etc/module.xml
:Ahora registre su módulo
app/code/Arsal/SortOption/registration.php
:Ahora crea di.xml
app/code/Arsal/SortOption/etc/di.xml
:Ahora cree una clase de bloque
Arsal\SortOption\Block\Product\ProductListToolbar.php
:Esto agregará la opción de orden personalizado para ordenar la lista de orden. }
fuente