Jump to content

Hacer override a plantillas twig del backend


Prestafan33

Recommended Posts

Necesito modificar la plantilla del listado de productos del backend de Prestashop (src\PrestaShopBundle\Resources\views\Admin\Product\list.html.twig).

He estado buscando información y he leído que la forma correcta de hacer esto es crear un módulo y copiar los archivos a modificar dentro del directorio de vistas del propio módulo (en este caso, views/PrestaShop/Admin/Product/list.html.twig), pudiendo luego hacer cambios en su contenido.

Lo que no sé es cómo tengo que hacer después para indicar desde el módulo que quiero que se utilicen esas plantillas modificadas en vez de las originales de Prestashop. ¿Hay que utilizar algún hook para indicar que se deben cargar, o cómo se tendría que hacer?

He intentado localizar información, pero sólo he encontrado un par de tutoriales donde hablan de dónde ubicar las plantillas modificadas, pero no de cómo hacer que se usen. ¿Alguien sabe por dónde van los tiros?.

Gracias de antemano por cualquier pista.

Link to comment
Share on other sites

Me respondo a mí mismo: He hecho varias pruebas y, efectivamente, esto funciona así como comentaba en mi primer mensaje sin más, tan raro como suena.

Es decir, si se quieren modificar los archivos de las plantillas del backend, basta con copiarlos en la ruta correcta dentro del directorio de un módulo y activar ese módulo (y borrar la caché). De ese modo se activarán los archivos modificados en vez de los originales de Prestashop.

Este método tan extraño me plantea varias cuestiones:

1.- ¿Cómo sé si un archivo ya está siendo modificado por otro módulo? No hay un sitio específico donde mirar, como el directorio /override o la ruta de tu tema. Habría que ir mirando, módulo a módulo, dentro de cada uno, si contienen copias de los archivos de las plantillas. Si se tienen activados 30 módulos, habría que comprobarlos todos. Poco viable.

2.- Cuando varios módulos modifican un mismo archivo....¿cuál tiene preferencia y en qué orden se aplican? Mientras que los archivos modificados EXTIENDAN al original no habría problema, pero ¿y si lo que hacen es sustituir el contenido del original? No sé cuál es el que se va a utilizar al final, y cuál va a quedar anulado.

O hay algo que se me escapa, o es un método de extensión de plantillas poco pensado y que puede tener numerosos inconvenientes (más que el "override" tradicional que se usaba hasta ahora). ¿Alguien tiene algo más de información sobre el tema?

Link to comment
Share on other sites

Muy buenas.

Hace un par de meses realizando un módulo me surgieron las mismas dudas, lo primero que se me ocurrió es crear dos módulos que hiciera un “override” del mismo fichero.

Intentando resolver tu segundo punto, obtuve trabajando con la versión 1.7.5.1:

  • Al realizarlo sobre el fichero /clases/Product.php, prestashop me permite instalar los dos módulos, pero si detecta sobrecarga del mismo método o definición de la misma propiedad, el segundo módulo instalado me aparece desactivado y al intentar activarlo me avisa del problema, impidiendo que se pueda activar.
  • Al realizarlo sobre el mismo fichero pero modificando diferentes métodos en cada módulo, me permite activar ambos módulos.
  • Al realizarlo sobre el fichero /src/PrestaShopBundle/Resources/views/Admin/Product/ProductPage/Panels/pricing.html.twig, prestashop parece que no los gestiona bien. Me permite activar los dos módulos, pero solo me reconoce el “override” del primer módulo instalado. Aunque tenga el primer módulo desactivado y el segundo activado, continúa tomado el del primero, pero si elimino el “override” del primer módulo ya toma el del segundo. Como es lógico borrando la cache con cada prueba que fui haciendo.
  • Si dejo un solo módulo con el “override” al fichero .twig, esté el módulo activado o desactivado se realiza el override.

Esto es lo que me sucedió a mí, puede que algo hiciera mal. Espero que alguien pueda aportar algo más al tema.

Link to comment
Share on other sites

Muchas gracias, por los aportes, Juanjomg.

Cuento mi experiencia, por si sirve de ayuda: En mi caso me pidieron que añadiera una columna al panel de administración de productos donde apareciera el precio con descuento y con impuestos incluidos (en el panel de Prestashop aparece por defecto el precio con y sin impuestos, pero nada más).

Lo que hice fue copiar en un módulo creado para la ocasión las plantillas twig ubicadas en /src/Prestashopbundle/Resource/views/Admin/Product/CatalogPage/Lists/list.html.twig y product_table.html.twig.

A continuación introduje unos hooks personalizados, en donde quería que apareciera mi columna, una para mostrar la cabecera, otra para meter un select de filtrado y otra para mostrar los valores. Usando esos hooks cargué unas plantillas de vistas con el contenido para cada una de esas secciones.

Finalmente, usé el hook "actionAdminProductsListingFieldsModifier" para hacer las modificaciones pertinentes en las consultas para obtener de la base de datos los campos que necesitaba. Como los descuentos no se almacenan tal cual en la base de datos, sino que dependen de fechas, porcentajes, valores e impuestos, lo que hice fue añadir esos campos en la consulta y luego operar con ellos para calcular en cada caso el precio con descuento. Aunque eso en el caso de las plantillas da igual.

El caso es que funcionar, funciona correctamente. Pero claro, como bien ha dicho @Juanjomg, para poder meter los hooks personalizados dentro de esas dos vistas he tenido que copiarlas completas, tal cual están, dentro de mi módulo, ya que los bloques que necesito modificar abarcan todo el contenido. Con lo cual  ahora si otro módulo intenta modificarlas no sé qué pasará (según ha comentado él, parece que no se aplicarían las modificaciones del nuevo módulo,  mal asunto). Y, por otra parte, si se actualiza la versión de Prestashop y se introducen cambios en esas plantillas, en mi caso seguiría operando con versiones desactualizadas,  lo cual es un segundo mal asunto, aunque esto ya pasaba también con el override tradicional.

Por otro lado, en mi caso si se desactiva el módulo sí que desaparece la columna personalizada, por lo que creía que se dejaba de ejecutar el override de las plantillas. Sin embargo, a raíz de lo comentado por Juanjomg he hecho la prueba y he visto que no es así, lo que ocurre en mi caso es que al haber hecho las modificaciones introduciendo hooks personalizados, los que se dejan de ejecutar son los métodos del módulo anclados a los hooks, pero las plantillas que se siguen usando son las del módulo, a pesar de que éste esté desactivado (esto es una chapuza muuuuu gorda).

En resumen: el sistema de overrides de las plantillas de twig, tal como se ha implementado, es bastante ilógico y una chapuza bastante importante. En primer lugar hay que replicar los archivos de las plantillas dentro de la estructura de un módulo para poder modificarlas, en lugar de tener una ubicación única para hacerlo (esto resulta bastante ilógico), el que se usen o no las plantillas modificadas depende de que no haya otro módulo anterior que ya contenga sus propias copias (esto ya es chapucero), y finalmente al desactivar el módulo no se desactivan las vistas personalizadas que pueda contener (esto directamente es un horror).

Es decir, que o bien lo estamos haciendo mal y hay otra forma de hacer las cosas más lógica (creo que no, porque en la documentación oficial hablan de hacerlo como nosotros), o la implementación del sistema de override de las plantillas de twig es directamente una chapuza impresionantes que va a ocasionar más de uno y más de dos quebraderos de cabeza a los desarrolladores.

Edited by Prestafan33 (see edit history)
Link to comment
Share on other sites

No recuerdo donde saque un modulo que modificaba el listado de productos 

Si lo desactivo , desaparece las 2 columnas añadidas por el modulo.

El autor es Robin Podesva 

El modulo no es de pago, pero no recuerdo donde estaba y de donde lo baje y cambie, es para mostrar los proveedores y fabricantes de los productos.

Obviamente si alguno cree que debo quitarlo que avise

Compatible con 1.7.6.x

No usa override

 

adminmodifications.zip

Edited by gusman126 (see edit history)
Link to comment
Share on other sites

  • 2 weeks later...

Gracias, @gusman126

Ese módulo ya lo había visto (de hecho, fue uno de los que partí para hacer lograr añadir una columna adicional en el listado de productos).

Lo que hace ese módulo es añadir unos hooks personalizados dentro de la tabla de productos. Luego, en esos hooks se añaden las vistas para que cargue el contenido de las columnas personalizadas. Si se desactiva el módulo las columnas desaparecen, pero es porque se dejan de cargar las vistas en los hooks personalizados, las plantillas modificadas siguen activas, lo que pasa es que como se ha desactivado el módulo no se ejecuta nada en esos hooks. Ése es precisamente el problema del que hablo: aunque el módulo esté desactivado, se sigue haciendo override de las plantillas de administración que contiene. Esto entiendo que no debería ser así, si un módulo está haciendo override de una plantilla sólo por el hecho de estar instalado en la tienda, aún estando desactivado, si no lo sabes o no te acuerdas o intentas modificar la plantilla desde otro, te puedes volver loco hasta que lo descubras. O si actualizas Prestashop, trae una versión nueva de una plantilla, pero en tu tienda sigue activa la vieja porque está haciendo override un módulo que puede no estar ya en uso y ni siquiera activo...

Edited by Prestafan33 (see edit history)
  • Like 1
Link to comment
Share on other sites

  • 1 year later...
En 17/3/2020 a las 5:04 PM, Prestafan33 dijo:

Gracias, @gusman126

Ese módulo ya lo había visto (de hecho, fue uno de los que partí para hacer lograr añadir una columna adicional en el listado de productos).

Lo que hace ese módulo es añadir unos hooks personalizados dentro de la tabla de productos. Luego, en esos hooks se añaden las vistas para que cargue el contenido de las columnas personalizadas. Si se desactiva el módulo las columnas desaparecen, pero es porque se dejan de cargar las vistas en los hooks personalizados, las plantillas modificadas siguen activas, lo que pasa es que como se ha desactivado el módulo no se ejecuta nada en esos hooks. Ése es precisamente el problema del que hablo: aunque el módulo esté desactivado, se sigue haciendo override de las plantillas de administración que contiene. Esto entiendo que no debería ser así, si un módulo está haciendo override de una plantilla sólo por el hecho de estar instalado en la tienda, aún estando desactivado, si no lo sabes o no te acuerdas o intentas modificar la plantilla desde otro, te puedes volver loco hasta que lo descubras. O si actualizas Prestashop, trae una versión nueva de una plantilla, pero en tu tienda sigue activa la vieja porque está haciendo override un módulo que puede no estar ya en uso y ni siquiera activo...

Encontraste alguna solución?

quiero hacer un override de listado de productos en el pedido y solo veo esta solución

 

EDITO: Sigue haciendo lo mismo, incluso teniendo el modulo desactivado sobreescribe la puta plantilla

Edited by gusman126 (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...