Una práctica común cuando desarrollamos un theme en prestashop, es la de tratar de implementar mejoras que nos permitan cambiar el comportamiento de algunas acciones – generalmente solicitadas por el cliente – tales como nuevos campos o pestañas para los productos, meter precios especiales con los impuestos incluídos y muchas cosas que seguro a alguno se le está ocurriendo.

Para conseguir esto, el que más o el que menos, tira de modificación de clases y controladores, lo cuál nos acaba llenando de satisfacción, de haber saltado la valla que nos ponía el cliente. Miramos y probamos una y otra vez nuestra obra orgullosos y satisfechos. Ya es el momento de llamar al cliente y entregarle el trabajo, de colocárselo en producción y de cobrarlo (esto último es importante). Ya sus empleados se encargarán de meterle productos y de actualizar cuando haya una nueva versión disponible … y he aquí donde nos llama el cliente nervioso, que las implementaciones no están, que no funcionan y que no sabe que ha pasado, que ellos no han tocado nada.

A partir de aquí hay dos tipos de reacciones: Los que no saben que puede estar pasando y los que si lo saben. Unos le dan mil vueltas y buscan lo que está motivando el que haya dejado de funcionar y otros que ya saben por donde van los tiros, los de la buena memoria y los que vuelven a pensar que con WordPress hubiera sido más fácil.

Para evitar todos estos males, hay una forma de hacer estas modificaciones y es la forma correcta sino te quieres meter a realizar un módulo.

Entre las carpetas de prestashop tenemos una llamada «Override«. Esta carpeta está destinada a ubicar las modificaciones o extensiones de las clases y los controladores de prestashop, y pongo un ejemplo.

Imaginemos que queremos crear un Hook llamado «category» por lo que procedemos en primera instancia a crear este en la base de datos.

1
INSERT INTO `ps_hook` (`name`, `title`, `description`) VALUES ('category', 'Categoría', 'Nos permite insertar un módulo en el listado de categorías');

Y ahora buscamos la clase en la que se generan, que está ubicada en la carpeta classes y se llama FrontController.php. En este controlador buscamos la función displayHeader(). Pués bien. Copiamos toda esa función y creamos un nuevo documento en la carpeta OverrideClasses y lo llamamos FrontController.php. Esto provocará que prestashop anteponga el contenido de esta función al de la propia clase nativa. Para el ejemplo, la nueva clase quedaría así.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php  class FrontController extends FrontControllerCore  {    public function displayHeader()    {      global $css_files, $js_files;      if (!self::$initialized) $this----->init();

// P3P Policies (http://www.w3.org/TR/2002/REC-P3P-20020416/#compact_policies)
header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"');

/* Hooks are volontary out the initialize array (need those variables already assigned) */
self::$smarty-&gt;assign(array(
'time' =&gt; time(),
'img_update_time' =&gt; Configuration::get('PS_IMG_UPDATE_TIME'),
'static_token' =&gt; Tools::getToken(false),
'token' =&gt; Tools::getToken(),
'logo_image_width' =&gt; Configuration::get('SHOP_LOGO_WIDTH'),
'logo_image_height' =&gt; Configuration::get('SHOP_LOGO_HEIGHT'),
'priceDisplayPrecision' =&gt; _PS_PRICE_DISPLAY_PRECISION_,
'content_only' =&gt; (int)Tools::getValue('content_only')
));
self::$smarty-&gt;assign(array(
'HOOK_HEADER' =&gt; Module::hookExec('header'),
'HOOK_TOP' =&gt; Module::hookExec('top'),
'HOOK_CATEGORY' =&gt; Module::hookExec('category'),
'HOOK_LEFT_COLUMN' =&gt; Module::hookExec('leftColumn')
));

if ((Configuration::get('PS_CSS_THEME_CACHE') OR Configuration::get('PS_JS_THEME_CACHE')) AND is_writable(_PS_THEME_DIR_.'cache'))
{
// 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-&gt;assign('css_files', $css_files);
self::$smarty-&gt;assign('js_files', array_unique($js_files));
self::$smarty-&gt;display(_PS_THEME_DIR_.'header.tpl');
}
}

De esta forma disponemos de un nuevo Hook para nuestro theme sin miedo a que una actualización provoque un infarto al cliente y horas no remuneradas para nosotros. Este método es extensible al resto de las clases y controladores.

[ leído en www.jose-aguilar.com ]