crear un nuevo hook

7

Click here to load reader

Upload: wuari

Post on 18-Apr-2015

43 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: Crear Un Nuevo Hook

Crear un Nuevo Hook

Si estáis modificando un Theme de Prestashop y necesitáis que uno o más módulos se puedan localizar en un nuevo espacio que hayáis creado necesitaremos generar nuevos hooks. O lo que es lo mismo, necesitamos indicarle a nuestra Base de Datos y programa que existe un nuevo espacio donde pueden ir colocados los módulos de nuestra tienda. En esta mini-guía os mostraré un poco como hacerlo.

1. – Crear el nuevo Hook en nuestra Base de Datos Lo primero que debemos hacer es crear una nueva entrada para nuestro hook en la base de datos. Para ello, gastaremos la siguiente sentencia SQL: INSERT INTO `ps_hook` (`name`, `title`, `description`) VALUES (‘NuevoHook’, ‘Mi Nuevo Hook’, ‘Este es el nuevo hook que estamos creando para la mini guia’); *Nota: El prefijo gastado para la tabla es el básico que Prestashop. Modificadlo si fuera necesario. La información del hook se puede cambiar también conforme os venga mejor a vosotros. 2.- Especificar nuestro nuevo Hook en el código de prestashop Hay que modificar el archivo /clases/FrontController.php. Buscaremos esta parte de código y añadiremos lo que está en rojo: self::$smarty->assign(array( ‘HOOK_HEADER’ => Module::hookExec(‘header’), ‘HOOK_TOP’ => Module::hookExec(‘top’), ‘HOOK_NUEVOHOOK’ => Module::hookExec(‘NuevoHook’), ‘HOOK_LEFT_COLUMN’ => Module::hookExec(‘leftColumn’) )); Hay que tener en cuenta que ‘HOOK_NUEVOHOOK’ será el nombre que después gastaremos en nuestros archivos .tpl. Da igual el nombre que le pongamos a esta, tan solo debe estar formado por ‘HOOK_+loquequieras’. Si quieres mantener la misma coherencia del resto de hooks, deberías ponerle el mismo nombre de la BD pero todo en mayúsculas. Ahora, eso si, el nombre dentro de la función debe ser exactamente el mismo que le hayáis puesto en la BD. Eso es, en mi caso Module::hookExec(‘NuevoHokk’). Repito: {$HOOK_NUEVOHOOK} es el formato exacto que utilizarás en los .tpl para incluir el contenido del nuevo hook donde corresponda, y NO TIENE PORQUE ser igual que el nombre en la tabla ps_hooks (‘NuevoHook’), pero por homogeneidad y legibilidad recomiendo usar el mismo nombre pero en mayúsculas. 3.- Añadir la posibilidad de “engancharse” al nuevo Hook al módulo que queramos. Para el ejemplo, modificaremos el módulo de Idiomas. Para que el módulo de idiomas pueda utilizar el nuevo hook debemos darle la funcionalidad. Para ello debemos modificar el código del archivo /modules/blocklanguages/blocklanguages.php. Buscamos la siguiente función: function hookTop($params)

Page 2: Crear Un Nuevo Hook

{ global $smarty; $languages = Language::getLanguages(); [...] } Justo debajo de esa función, debéis añadir una nueva función, pero ésta hará referencia al nuevo hook (aquí si es importante que el nombre sea literalmente el que se haya escrito en la tabla de hooks (NuevoHook en este caso) function hookNuevoHook($params) { return $this->hookTop( $params ); } De esta forma, le daremos la funcionalidad necesaria para que el BO de Prestashop nos deje mover el módulo al que le acabamos de dar funcionalidad al hook que hemos creado. *Nota: Aunque para ejemplarizar hemos utilizado “function hookTop(…” del módulo de Idiomas, hay que tener en cuenta que se puede hacer exactamente lo mismo con cualquier módulo. Lo único es que dentro de la función nueva para nuestro hook debemos utilizar otra que ya exista en el archivo que estamos modificando, da igual que sea hookTop, que cualquier otra. Espero que os haya sido de ayuda al minitutorial. Si tenéis alguna pregunta, podéis utilizar el contacto de mi web y tran pronto como me fuera posible os contestaría.

Page 3: Crear Un Nuevo Hook

OTRA FORMA DE CREAR UN NUEVO HOOK

1. Hacer el insert que indica el manual de desarrollo: Quote

INSERT INTO `ps_hook` (`name`, `title`, `description`) VALUES ('nombreDeMiHook', 'Nombre en el backoffice', 'Descripcion del hook para tenerlo documentado'); 2. En el fichero $webroot/classes/FrontController.php buscar 'HOOK', verás algo similar a:

Quote

self::$smarty->assign(array( 'HOOK_HEADER' => Module::hookExec('header'), 'HOOK_TOP' => Module::hookExec('top'), 'HOOK_LEFT_COLUMN' => Module::hookExec('leftColumn') ));

if ((Configuration::get('PS_CSS_THEME_CACHE') OR Configuration::get('PS_JS_THEME_CACHE')) AND is_writabl { // CSS compressor management if (Configuration::get('PS_CSS_THEME_CACHE')) Tools::cccCss();

//JS compressor management if (Configuration::get('PS_JS_THEME_CACHE')) Tools::cccJs(); }

self::$smarty->assign('css_files', $css_files); self::$smarty->assign('js_files', array_unique($js_files)); self::$smarty->display(_PS_THEME_DIR_.'header.tpl'); }

public function displayFooter() {

if (!self::$initialized) $this->init();

self::$smarty->assign(array( 'HOOK_RIGHT_COLUMN' => Module::hookExec('rightColumn', array('cart' => self::$cart)), 'HOOK_FOOTER' => Module::hookExec('footer'), 'content_only' => (int)(Tools::getValue('content_only'))));

Page 4: Crear Un Nuevo Hook

Hay dos bloques donde aparecen HOOK's, que se refieren parte inferior y parte superior de la página. En el bloque donde sea más adecuado tu hook, has de incluir en el array tu propio hook, por ejemplo:

Quote

self::$smarty->assign(array( 'HOOK_HEADER' => Module::hookExec('header'), 'HOOK_TOP' => Module::hookExec('top'), 'HOOK_NOMBREDEMIHOOK' => Module::hookExec('nombreDeMiHook'), 'HOOK_LEFT_COLUMN' => Module::hookExec('leftColumn') ));

Atención: {$HOOK_NOMBREDEMIHOOK} es el que utilizarás en los .tpl para incluir el contenido de tu hook donde corresponda, y NO TIENE PORQUE ser igual que el nombre en la tabla ps_hooks ('nombreDeMiHook'), pero por homogeneidoad y legibilidad recomiendo usar el mismo nombre pero en mayúsculas.

Con eso ya tenéis un nuevo hook funcionando correctamente en PS1.4.

2. HACER QUE UN (cualquier) MODULO UTILICE EL HOOK RECIEN CREADO (o cualquier otro que queráis)

Los modulos se desarrollan para enlazar a uno o varios hooks, según lo que el programador haya pensado para su utilización, por lo que en el php del módulo deberéis buscar 'function hook' y encontraréis el primer hook al que el módulo se enlaza, por ejemplo:

Quote

function hookHome($params) { global $cookie;

Justo debajo de esa función, añadid una nueva funcion de enlace, pero esta vez será a vuestro nuevo hook (aquí si es importante que el nombre sea literalmente el que hayáis escrito en la tabla de hooks (nombreDeMiHook en este caso)

Quote

function hooknombreDeMiHook($params) { return $this->hookHome( $params ); }

Page 5: Crear Un Nuevo Hook

El nombre de tu función de enlace es 'hook'+elnombredetuhook, y el $this->hookHome ha de ser, lógicamente, el nombre de la función de enlace original del módulo (hookHome en el ejemplo).

Luego recordar forzar la compilación y vaciar todas las cachés (navegador y smarty, etc y memcache, el que lo utilice) porque es posible volverse loco al ver que no aparece lo que debe aparecer en la página y no sabes por qué.

Darle las gracias a Tecniloco y a Ryouji por la info, yo solo la he comprobado, rejuntado, explicado y si hay algún error, es culpa mía :-)

Espero que os sirva la aportación, porque es algo bastante básico que hace falta y no está bien explicado en ningún sitio.