Dentro de las tiendas online con Prestashop encontramos una necesidad común en varias de las webs de nuestros clientes: «Quiero que los productos más vendidos que aparecen en la barra lateral coincidan con los que aparecen en la página de Lista de productos más vendidos» En realidad es una petición bastante lógica pero Prestashop no estaba pensado así, por lo que tendremos que hacer algunos ajustes.
El bloque lateral se gestiona con el módulo blockbestsellers. La página de productos más vendidos se gestiona mediante la plantilla, dentro del tema que tengas activado, que se corresponde con el fichero best-sales.tpl.
El módulo tiene su propia consulta en un fichero php, mientras que la página se alimenta de un controlador de frontoffice. Aquí está la principal diferencia y esto nos da la pista de qué debemos cambiar para que coincidan.
No quiero hacer este post demasiado técnico, si sabes un poco de PHP te será sencillo modificarlo, nos vamos a centrar en conseguir que salga el mismo número de productos, por ejemplo 10. Si tenemos una tienda online con muchos productos, tampoco queremos que el usuario se pierda viendo productos y productos en páginas numeradas, con 10 productos bastará.
Dentro de la carpeta controllers de Prestashop, tenemos el fichero BestSalesController.php. En él tenemos definida una variable
$nbProducts =(int)(ProductSale::getNbSales());
Si la cambiamos y ponemos un número fijo, ese será el número de productos que nos enseñe.
$nbProducts = 10;//(int)(ProductSale::getNbSales());
Debajo de la asignación de esta variable se ejecuta la llamada que hace la consulta de esos productos más vendidos, si queremos que coincidan con los productos que salen en la consulta que realiza el módulo (por recordar, los que se ven en el lateral en función de cómo tengas los hooks de tu theme) tenemos que eliminar el orden, por defecto está ordenando los productos más vendidos pero teniendo en cuenta el stock, si cambiamos el último parámetro a null le anulamos el orden:
self::$smarty->assign(array( ‘products’ => ProductSale::getBestSales((int)(self::$cookie->id_lang), (int)($this->p) – 1, (int)($this->n), $this->orderBy, null), ‘add_prod_display’ => Configuration::get(‘PS_ATTRIBUTE_CATEGORY_DISPLAY’), ‘nbProducts’ => $nbProducts, ‘homeSize’ => Image::getSize(‘home’) ));
Espero que este truco te sea de utilidad.