¿Qué son los Hook de Prestashop?

¿Qué son los Hook de Prestashop?

5/5 (4)

Descubre toda la información que necesitas saber para entender y conocer el funcionamiento de los Hook de Prestashop

Los Hooks de Prestashop es la forma que tiene el Prestashop de asociar acciones a los distintos eventos que tienen los módulos, plantillas y controladores para que todo vaya junto.

La gran mayoría de las veces los Hook se utilizan para mostrar código a un sitio específico de la página. Si has estado mirando los archivos de tu plantilla de Prestashop verás muchas veces que hay elementos que se llaman {hook h=’nombreDelHook’}. Pues eso es un hook.

Tipos de Hook

Prestashop tiene 2 tipos de hook. Los de acción y los de mostrar. Cada uno tiene funcionalidades diferentes y los más comunes que encontrarás en la mayoría de módulos son los de mostrar.

Hook de Mostrar (hookDisplay)

Sirven para que Prestashop muestre algo en un sitio específico. Se le pueden asignar variables y plantillas. Un ejemplo sería el hook displayHeader. Allí normalmente se ponen los archivos css y los js (no recomendable usar los js, pero se hace).

Entonces, cuando Prestashop encuentra el hook displayHeader busca todo lo que tiene que ir allí y lo va poniendo. Busca en los módulos y controladores qué elementos se ejecutan o insertan dentro de ese hook y lo mostrará.

Hook de Acción (hookAction)

Lo utiliza prestashop para realizar alguna acción en un momento predeterminado. Por ejemplo el hookActionCustomerAccountAdd() se ejecuta cada vez que se añade un cliente nuevo a tu Prestashop. Si quieres hacer una acción en ese momento (enviar e-mail, asignar variables al cliente…) deberías llamar ese hook y hacer las operaciones que creas.

Usar los Hooks de Prestashop

Ahora ya sabemos que hay 2 tipos de hook en Prestashop. ¿Pero cómo los usamos?

Lo primero de todo que tenemos que hacer es registrar el evento dentro del hook. Y una vez registrado decirle qué hay que hacer en ese hook. Nos basaremos siempre en módulos. Ya que las clases y controladores ya tienen las funcionalidades preparadas para que se ejecuten de forma correcta. Así que sólo miraremos el caso de los módulos que es lo más frecuente.

Registrar un Hook en Prestashop

Para registrar un hook para un módulo en concreto lo haremos en la función install() del módulo.

Para ello lo que haremos será lo siguiente:

public function install()
{
    // [...]
    $this->registerHook('displayHeader');
    $this->registerHook('displayFooter');
    // [...]
}

Con este simple código estamos registrando en el hook “displayHeader” y “displayFooter” el módulo. Ahora sólo faltará decirle qué hacer en cada uno de los hooks.

Ejecución del hook en Prestashop

Una vez ya tenemos el módulo registrado en el hook que queremos vamos a indicarle qué hacer. Vamos a coger el caso de antes. Los hook “displayHeader” y “displayFooter”.

Para iniciar la ejecución del hook es tan sencillo como dentro del módulo crear una función para cada uno de ellos. En este caso serían estas funciones:

public function hookDisplayHeader(array $params)
{
    // Tu código que quieres que se ejecute en el displayHeader
}

public function hookDisplayFooter(array $params)
{
    // Tu código que quieres que se ejecute en el displayFooter
}

Como te habrás fijado las funciones del hook empiezan en minúscula y el nombre del hook empieza en mayúscula. A diferencia del hook que empieza en minúscula:

El hook displayHeader cuando lo activas en la función se llama hookDisplayHeader().

Igual sería el hook de actionLoQueSea dónde la función sería hookActionLoQueSea().

Crear un hook personalizado en Prestashop

¿Qué pasa si queremos mostrar nuestro código en un sitio dónde no hay ningún hook que nos sirva? Es tan sencillo como crear nuestro hook personalizado y pasarle las variables que necesitemos como en un hook normal.

Para ello lo primero que tendremos que hacer es registrar el hook en el módulo como hemos explicado anteriormente y luego insertar el hook en la plantilla dónde queramos que se muestre.

Ejemplo de Crear Hook Personalizado

Queremos crear un hook que se llame displayUnderName. Este hook se mostraría debajo del nombre del producto en la página del producto.

Lo primero que haríamos sería en el archivo del módulo registrar el hook de la siguiente manera:

public function install()
{
    // [...]
    $this->registerHook('displayUnderName');
    // [...]
}

Ahora cuando instalemos el módulo se registará el nuevo hook en el sistema. ¿Pero dónde se va a mostrar?

Como hemos dicho, queremos que se muestre debajo del nombre del producto dentro de la ficha del producto. Para ello lo que haremos será abrir el directorio de nuestra plantilla y localizar el archivo product.tpl

Lo abriremos y debajo del $product->name (por ejemplo) pondremos el hook:

{hook h='displayUnderName'}

Ya tenemos registrado y se va a mostrar en la plantilla. Pero, ¿qué se mostrará?

Vamos a crear la función de display para mostrar el contenido del hook dentro del hook:

function hookDisplayUnderName($params)
{
    // tu código aquí
}

Y ya estaría. Tendremos el módulo registrado en el nuevo hook. Prestashop leerá el nuevo hook. Y cuando en la plantilla vea el {hook h=’displayUnderName’} cogerá los eventos que hemos creado para mostrarlos.

Valoración de la Información

2 comentarios

  1. Hola que tal amigo, necesito tu ayuda con respecto a los hooks, lo que pasa es que estoy desarrollando un modulo que muestre un botón y este modulo será lanzado al publico. la cuestion es que necesito que al momento de instalar este modulo, inyecte mi hook personalizado de forma que esto “{hook h=’nombreHook’} ” se haga de manera autónoma sin que yo tenga que entrar al codigo fuente de la platilla a escribirlo, por que realmente seria algo que no se podría hacer con cada una de las personas que decidan usar mi modulo.
    Espero puedas ayudarme y muchas gracias.

    1. solo para aclarar, el botón debe mostrarse en la parte del Font office justo antes de finalizar el pago del carrito de compras

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *