Para seguir este manual, tendrás que conocer a fondo, el panel de administración de Prestashop, tener sólidos conocimientos del lenguaje de programación php, el sitema de Gestión de Bases de Datos MYSQL y tener algo de experiencia en el desarrollo de aplicaciones con Symphony.
Vamos a crear un módulo especial para Prestashop, con el que podremos personalizar las descripciones de las categorías, las páginas cms y añadir información adicional a los productos.
Como cualquier aplicación, seguro que se puede mejorar así que, la llamaremos la versión cero
Bájate el módulo ya hecho de aquí y lo descomprimes en el directorio modules de Prestashop
Primero añadiremos en la base de datos, en la tabla ps_hook, un nuevo registro:
- name: displayPage
- title: display Page
- description: Description module en ps_hook
- active:1
- position:1
En la línea 71 del archivo modules/acms/acms.php podemos ver
$this->registerHook('displayPage');
Creamos el módelo /modules/acms/classes/cmsmodel.php que será una clase y tendrá un método que devolverá el nombre de la vista tpl
class Cmsmodel { public function getview() { return 'view.tpl'; } }
Llamamos al modelo desde el controlador acms.php y escribimos: include(dirname(__FILE__).'/classes/cmsmodel.php');
Un método del controlador nos indica el hook donde se enganchará:
public function install() { include(dirname(__FILE__).'/sql/install.php'); return parent::install() && $this->registerHook('displayPage'); // ESTE ES EL HOOK QUE CREAMOS }
Vamos al panel de administración/Modulos/Administración de módulos y al final podemos ver el nuevo módulo y clicas en INSTALAR. Ahora clicas en CONFIGURAR y en Settings: Live Mode Enabled. Abajo a la derecha, guardas los cambios en SAVE. En el panel en diseño/posiciones desplegamos TODOS LOS MÓDULOS y podemos ver nuestro módulo en la última posición. Clicamos en él y podemos ver los hooks a los que está enganchado... los mismos que se muestran en el método install() de acms.php
Cada vez que hacemos un cambio tendremos que borrar la caché en el panel de administración en Parámetros Avanzados/Rendimiento arriba a la derecha BORRAR CACHE. Personalmente trabajo en Windows con el programa PUTTY con el que accedo al servidor linux mediante ssh y ejecuto cd /home/usuario/www/directorio_raiz_del_prestashop/var/ y borro el directorio cache: rm -r cache. Otra cosa que hago para ver errores es, en la administración, en Parámetros Avanzados/Rendimiento Modo de Depuración: SI
MOSTRAR LA VISTA TPL EN EL front
Creamos el método hookDisplayPage en modules/acms/acms.php
public function hookDisplayPage() { $this->context->smarty->assign('var' ,'valor de var'); return $this->display(__FILE__, 'vista.tpl'); /* al escribir __FILE__ el script funcionará sea cual sea la ruta absoluta de tu prestashop.*/ }
Creamos el archivo /modules/acms/views/templates/front/vista.tpl y escribimos {$var}
Editamos el archivo themes/classic/templates/catalog/_partials/category-header.tpl y al final del archivo escribimos {hook h='displayPage'} Acuérdate de borrar caché.
En el front, en la página de cualquier categoría de producto, justo debajo de la descripción de la categoría podemos ver que aparece 'valor de var'. Vamos a enredar un poco esto.
Ya sabemos como mostrar el valor de una variable en el front, que en este caso es el String 'valor de var' así que ahora, en lugar de que tenga un String como valor, la variable será igual a un objeto. En modules/acms/acms.php creamos un método:
public function getobjDatos() { $obj = new \stdClass(); $obj->prop1='valor de prop1'; $obj->prop2='valor de prop2'; return $obj; }
En hookDisplayPage()
public function hookDisplayPage() { $objDatos = $this->getobjDatos(); $this->context->smarty->assign('var' ,$objDatos); return $this->display(__FILE__, 'vista.tpl'); }
En vista.tpl:
{if isset($var)} prop1: {$var->prop1}, prop2: {$var->prop2} {else} El objeto no está definido. {/if}
Ahora podrás ver en el front, en cualquier categoría, el valor de las propiedades del objeto. Vamos a crear una propiedad del objeto en cuestión que tendrá el valor del id de la categoría.
public function getobjDatos() { $obj = new \stdClass(); $obj->idCategory=(int)Tools::getValue('id_category'); $obj->prop2='valor de prop2'; return $obj; }
En vista.tpl
{if isset($var)} idCategory: {$var->idCategory} {else} El objeto no está definido. {/if}Ahora podrás ver en el front, en cualquier categoría, su id..
En /modules/acms/classes/cmsmodel.php dejamos la clase Cmsmodel así:
class Cmsmodel { public function fmodel($objDatos){ $obj = new stdClass(); $obj->objDatos=$objDatos; return $obj; } }
En /modules/acms.php:
include(dirname(__FILE__).'/classes/cmsmodel.php'); public function getobjDatos() { $obj = new \stdClass(); $obj->idCategory=(int)Tools::getValue('id_category'); return $obj; } public function hookDisplayPage() { $objDatos = $this->getobjDatos(); $model = new Cmsmodel(); $obj = $model->fmodel($objDatos); $this->context->smarty->assign('var' ,$obj); return $this->display(__FILE__, 'vista.tpl'); }
En /modules/acms/views/templates/front/vista.tpl
{if isset($var)} idCategory: {$var->objDatos->idCategory} {else} El objeto no está definido. {/if}
Supongamos que tenemos una categoría de id=3 y otra de id=4 entonces, podremos ver idCategory: 3 e idCategory:4 respectivamente en las páginas de éstas categorias.
Vamos a crear los archivos /modules/acms/views/templates/front/cat3.tpl y cat4.tpl y escribiremos en ellos texto plano: Esto es cat3.tpl y Esto es cat4.tpl. En /modules/acms/classes/cmsmodel.php:
public function fmodel($objDatos){ $obj = new stdClass(); $obj->objDatos=$objDatos; $obj->tpl = $this->getTpl($objDatos); return $obj; } public function getTpl($objDatos){ $tpl = 'cat'.$objDatos->idCategory.'.tpl'; return $tpl; }
Ahora nuestro método hookDisplayPage en acms.php quedaría así:
public function hookDisplayPage() { $objDatos = $this->getobjDatos(); $model = new Cmsmodel(); $obj = $model->fmodel($objDatos); $this->context->smarty->assign('var' ,$obj); return $this->display(__FILE__, $obj->tpl); //mostramos una vista distinta para cada categoría. }
Haz una copia de /themes/classic/templates/catalog/_partials/category-header.php. Ahora deja el original así: {hook h='displayPage'}
Como puedes ver, ahora podrás mostrar en cada categoría lo que haya en los archivos que has creado cat3.tpl , cat4.tpl ....
En estos archivos puedes escribir {$category.description nofilter} que es lo que escribes en el editor de la descripción de la categoría y como podrás darte cuenta, podrás llamar a cualquier variable global de Prestashop que puedas necesitar
PAGINAS CMS PERSONALIZADAS
Haremos algo parecido con las páginas que puedes crear en Prestashop. En este caso el archivo que trataremos será: /themes/classic/templates/cms/page.tpl y escribimos {hook h='displayPage'} justo debajo de donde aparece {$cms.content nofilter}
El id de la página lo tienes en la url o también puedes escribir en este archivo, hacia la línea 27:
{block name='page_title'} {$cms.meta_title} id= {$cms.id} {/block}
Ahora creamos en /modules/acms/views/templates/front/ un archivo por cada página cms de la forma cms1.tpl, cms2.tpl.... etc.
En el método getobjDatos() de acms.php añadimos una nueva propiedad al objeto que tendrá el valor del id del cms: $obj->idCms=(int)Tools::getValue('id_cms');
Ahora modificamos el método getTpl($objDatos) de cmsmodel.php para que quede así:
public function getTpl($objDatos){ if($objDatos->idCategory > 0){ $tpl = 'cat'.$objDatos->idCategory .'.tpl';} else{ $tpl = 'cms'.$objDatos->idCms.'.tpl'; } return $tpl; }
Con ésto podrás imaginar que, ya no tienes límites para crear una nueva tienda online. Puedes ver un ejemplo de esto en https://inmueblesbilbao.es/content/4-registro-piso-bilbao
PÁGINA DE PRODUCTO
Podemos hacer lo mismo con los productos. Hay varios archivos que intervienen aquí. Puedes usar cualquiera de ellos, pero el que yo uso es: themes/classic/templates/catalog/product.tpl y hacia la línea 230 llamas al módulo.
{hook h='displayPage'} /div> {block name='product_accessories'}
En el método getobjDatos() de acms.php añadimos: $obj->idProduct = (int)Tools::getValue('id_product');
En cmsmodel.php
public function getTpl($objDatos){ if($objDatos->idCategory > 0){ $tpl = 'cat'.$objDatos->idCategory .'.tpl';} elseif($objDatos->idCms > 0){ $tpl = 'cms'.$objDatos->idCms.'.tpl'; }elseif($objDatos->idProduct > 0){ $tpl = 'product'.$objDatos->idProduct.'.tpl'; }else{ $tpl = 'header.tpl'; } return $tpl; }
Y ya tienes una pista de cómo puedes transformar el home de tu tienda