Combinaciones en los listados Prestashop

Colaboro regularmente con diversas tiendas y otros freelance prestashop que me encargan tareas complejas de programación. Esta tienda vende artículos de lujo a un buen precio

He usado el módulo de prestochangeo product list attributes en varias tiendas, y es un gran módulo. Aunque como todos los módulos comerciales esta pensado para encajar en un amplio rango de posibilidades, y eso hace que se pueda mejorar el rendimiento, a parte de que el trabajo de maquetación puede resultar importante.

Maquetación

Con bastante trabajo de maquetación se puede evitar sobrecargar un listado minimalista con un montón de selectores que rompen el estilo de la tienda.

No es fácil, pero con trabajo puro de maquetación y algo de javascript podemos ocultar la configuración de forma que se lance para aquellos productos que tienen combinaciones al añadirlo al carrito.

luxuryoutlel

A parte de que usamos el botón de precio para añadirlo al carrito (con un agradable efecto hover con una transición). Todo esto hace que los listados queden muy limpios.

luxuryoutlel_add_cart

Rendimiento

Para el tema del rendimiento no hay nada como usar la cache smarty, al fin y al cabo no hace falta que tire de la base de datos cada vez que se carga la página.

prestashop_smarty_cache

La idea es que la página generada se guarda y reutiliza siguiendo una determinada política de cacheo (cada idioma, cada moneda, grupo de clientes, cada día..). Por supuesto se puede (y debe) vaciar la cache si se ha cambiado algún característica (precio de producto) que afecte al resultado.

Así que configurando una cache para el módulo el rendimiento aumenta una barbaridad (sobretodo para productos con muchas combinaciones). También se añadió compresión gzip para los datos Json ya que los datos que se cargaban via ajax eran grandes.

Hay que tener en cuenta que la primera carga de la página es normal, las siguientes tiran de la página estática creada en la cache de smarty.

En este caso particular (muchas combinaciones) la primera carga era inviable en algunos listados, por lo que analizando el código enseguida se ve que el nudo esta en la carga de precios de cada combinación.

Se aplicó en este caso otra estrategia de cacheo. Esta estrategia consiste en guardar antes esos precios (que cuesta tanto calcular) en una tabla índice y rehacer el índice cuando se cambian precios (en este caso no había precios distintos por grupo de clientes, por lo que cualquier usuario veía los mismos precios). Posteriormente el código del módulo tira de esta tabla auxiliar para evitar llamar al cálculo del precio

 

El código para reindexar es un poco farragoso porque es conveniente crear los inserts en una sentencia grande (700 cada vez p.ej)

Pero de esta forma tenemos que en unos cuantos minutos desde el backoffice se reindexan los precios. Y lo que es mas importante, se puede programar una tarea cron para que haga este pesada tarea por la noche.

attributelist_cache_indexed

attributelist_reindex

Al final se consiguió el objetivo de carga rápida de todos los atributos para poder configurar el producto en los listados.

luxuryoutlet_rend