Hooks en PrestaShop 9: cómo funcionan, cuáles usar y cómo crear los tuyos
Los hooks son la forma limpia de extender PrestaShop sin tocar el núcleo. Te explicamos los dos tipos, cómo registrarlos bien y los fallos silenciosos más habituales.
Un hook es un punto de enganche que PrestaShop deja en su código para que un módulo pueda añadir contenido o reaccionar a un evento sin modificar el núcleo. Es la pieza que hace posible que una tienda tenga cien módulos y siga actualizándose. Si desarrollas para PrestaShop, entender bien los hooks te ahorra la mitad de los problemas.
Dos familias: display y action
- Hooks de visualización (
display*): devuelven HTML que se pinta en un sitio concreto de la página. Por ejemplodisplayProductAdditionalInfoen la ficha odisplayFooteren el pie. - Hooks de acción (
action*): no pintan nada; se ejecutan cuando ocurre algo.actionValidateOrderal crearse un pedido,actionObjectProductUpdateAfteral guardar un producto.
Además hay hooks que devuelven datos para que el núcleo los combine, como paymentOptions, donde cada módulo de pago entrega sus PaymentOption.
Registrar un hook correctamente
El registro se hace en la instalación del módulo y queda guardado en la tabla hook_module:
public function install()
{
return parent::install()
&& $this->registerHook('displayProductAdditionalInfo')
&& $this->registerHook('actionValidateOrder');
}
public function hookDisplayProductAdditionalInfo(array $params)
{
$this->context->smarty->assign(['product' => $params['product']]);
return $this->fetch('module:' . $this->name . '/views/templates/hook/info.tpl');
}
El método se llama hook + el nombre del hook con la primera letra en mayúscula. PrestaShop no distingue mayúsculas en el nombre del hook, pero el método PHP sí tiene que existir.
install() no se vuelve a ejecutar. Hay que hacerlo en un script de upgrade/.Posiciones y excepciones
Cuando varios módulos cuelgan del mismo hook, se ejecutan por el orden de la columna position. Se cambia en Diseño > Posiciones, donde también puedes excluir páginas concretas para un módulo. Si un bloque aparece donde no debe, mira primero ahí antes de tocar código.
Crear tus propios hooks
Un tema o un módulo puede llamar a un hook que no existe en el núcleo: {hook h='displayMiTiendaCabecera'} en Smarty o Hook::exec('displayMiTiendaCabecera') en PHP. La primera vez que un módulo lo registra, PrestaShop lo crea en la tabla hook. Es la forma más limpia de ofrecer puntos de extensión en tus propios desarrollos, y la que usamos, por ejemplo, para que cada sección de una portada sea editable por separado.
Por qué un módulo «no pinta nada»
- El módulo está instalado pero no registrado en ese hook (mira Posiciones).
- El tema no llama a ese hook. Un hook de Classic puede no existir en Hummingbird, o estar en otra zona.
- Hay una excepción de página configurada.
- El módulo está desactivado para esa tienda: en PrestaShop «activo» depende de la fila en
module_shop, no solo de la columnaactive. - La plantilla del módulo está sobrescrita en el tema y esa copia está vacía o desactualizada.
Buenas prácticas
- Devuelve cadenas vacías en los hooks de visualización cuando no hay nada que mostrar: no metas contenedores vacíos que rompen la maquetación.
- En hooks de acción, no lances excepciones sin control: un error ahí puede bloquear el guardado de un pedido.
- Cachea en los hooks que se ejecutan en todas las páginas (
displayHeader,displayTop): se multiplican por cada visita.
Los hooks bien usados hacen que un módulo sobreviva a actualizaciones de PrestaShop y a cambios de tema. Cuando alguien te proponga un override para algo que se puede hacer con un hook, desconfía.