Etiquetas propias en productos: hook actionProductFlagsModifier
Gustavo compartió el hook que usa para añadir la etiqueta «+18» a los productos con restricción de edad, y después para mostrar en el listado el nombre del cupón que se aplica. Sirve para cualquier etiqueta propia desde un módulo, sin tocar el tema.
Para pintar una etiqueta propia en las miniaturas de producto («+18», «Envío 24 h», el nombre de un cupón) no hace falta tocar el tema ni hacer un override. Gustavo, de la comunidad, compartió el hook que usa: actionProductFlagsModifier. Otro compañero no lo conocía y comprobó que está disponible desde PrestaShop 1.7.6.
El caso
Gustavo lo usaba en un módulo de verificación de edad: cuando detecta que un producto es solo para adultos, le añade la etiqueta «+18», y esa etiqueta sale en los listados y en la ficha igual que las de «Nuevo» o «En oferta». Semanas después le dio otro uso: mostrar en la miniatura el nombre de la regla de carrito que se aplica a ese producto, para que en el listado ya se vea que tiene descuento con cupón.
Cómo funciona
Cuando PrestaShop prepara un producto para el tema, construye la lista de etiquetas (flags): nuevo, en oferta, descuento, pack, agotado… Justo antes de devolverla, llama a este hook y le pasa la lista por referencia. Lo que añadas, quites o cambies ahí es lo que el tema pinta. Lo hemos comprobado en el código de PrestaShop 9.2: el hook recibe flags y product.
El código
En el módulo, registra el hook al instalar y añade tu etiqueta cuando se cumpla tu condición:
public function install()
{
return parent::install()
&& $this->registerHook('actionProductFlagsModifier');
}
public function hookActionProductFlagsModifier(array $params)
{
$product = $params['product'];
if (!$this->esProductoParaAdultos((int) $product['id_product'])) {
return;
}
$params['flags']['mimodulo_adultos'] = [
'type' => 'mimodulo-adultos',
'label' => $this->l('+18'),
];
}No hace falta devolver nada: como flags llega por referencia, basta con modificarlo. Para quitar una etiqueta del núcleo, por ejemplo la de «Nuevo», usa unset($params['flags']['new']);.
En los temas Classic y Hummingbird, el valor de type acaba como clase CSS de la etiqueta (en Classic junto a product-flag, en Hummingbird junto a badge), así que le das estilo desde el CSS de tu módulo con un selector que valga para los dos:
.product-flags .mimodulo-adultos {
background: #000;
color: #fff;
}Lo que hay que vigilar
- Se ejecuta por cada producto de cada listado. Una categoría con 48 productos lo llama 48 veces. No hagas una consulta a la base de datos por producto: carga una vez la lista de IDs que llevan etiqueta (en una variable estática o en caché) y consulta ese array.
- Escapa el texto si viene de datos de la tienda (el nombre de un cupón, por ejemplo): Hummingbird pinta la etiqueta tal cual, sin escapar. Pásalo por
htmlspecialchars()antes de ponerlo enlabel. - Usa una clave con el nombre de tu módulo (
mimodulo_adultos) para no pisar las del núcleo ni las de otros módulos. - Detecta la condición con datos fiables. Gustavo la deducía del nombre y la descripción del producto; si puedes, guarda la marca en una característica o en un campo propio, y no dependas de que el texto diga «+18».
- Si tu tema es de terceros, comprueba que pinta las etiquetas con la variable
flagsdel producto. Si las pinta a su manera, el hook no se verá. - La ventaja frente a editar la plantilla: si desactivas o desinstalas el módulo, la etiqueta desaparece sola y el tema queda como estaba, sin restos que limpiar al actualizarlo.
Si lo que buscas son etiquetas configurables sin programar, Rekire tiene el módulo Easy Product Labels.
Esto salió en @PrestashopEsp, la mayor comunidad PrestaShop de España en Telegram. Ver la conversación