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->assign(array( 'time' => time(), 'img_update_time' => Configuration::get('PS_IMG_UPDATE_TIME'), 'static_token' => Tools::getToken(false), 'token' => Tools::getToken(), 'logo_image_width' => Configuration::get('SHOP_LOGO_WIDTH'), 'logo_image_height' => Configuration::get('SHOP_LOGO_HEIGHT'), 'priceDisplayPrecision' => _PS_PRICE_DISPLAY_PRECISION_, 'content_only' => (int)Tools::getValue('content_only') )); self::$smarty->assign(array( 'HOOK_HEADER' => Module::hookExec('header'), 'HOOK_TOP' => Module::hookExec('top'), 'HOOK_CATEGORY' => Module::hookExec('category'), 'HOOK_LEFT_COLUMN' => 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->assign('css_files', $css_files); self::$smarty->assign('js_files', array_unique($js_files)); self::$smarty->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 ]