Prestashop, crear una nueva página

En algunos proyectos con Prestashop surge la necesidad de crear una nueva página para desarrollar una funcionalidad. Es común crear nuevas páginas de formulario que se salgan del estándar, o para crear nuevas páginas en la zona de mi cuenta.

En realidad es un proceso sencillo si dejamos a un lado la lógica que se pueda necesitar para la página.

Veamos los pasos (para versiones 1.4.x):

  1. Crear el php en el directorio raiz, en nuestro caso lo llamaremos “mipagina.php”. Salvo que haya que realizar algo bastante especial basta con un require del archivo de configuración e invocar al controlador de la página, algo así:
    1. <?php
    2. require(dirname(__FILE__).'/config/config.inc.php');
    3. ControllerFactory::getController('MiPaginaController')->run();
    4. ?>
  2. Definir la página en nuestra zona Admin, para lo que tendremos que ir a Preferencias -> SEO & URLs -> Añadir Nuevo.
    Una vez en el formulario de alta seleccionamos nuestro php, título y metas:
    Crear página en prestashop
  3. Crear el controlador, “MiPaginaController.php” dado que es nuevo podemos colocarlo en el directorio de controladores “controllers”.

    Hay que tener en cuenta que el controlador tendrá gran parte de la lógica de la página, además de definir los archivos de media (css y js) extras que se cargan y el .tpl que muestra el resultado. Por ejemplo, también es el controlador el que controla si es necesario estar autenticado, por ejemplo

    Veamos un controlador con un contenido básico:

    1. <?php
    2. class MiPaginaControllerCore extends FrontController
    3. {
    4.     //definimos los archivos media que queremos cargar
    5.     public function setMedia()
    6.     {
    7.         parent::setMedia();
    8.         Tools::addCSS(_THEME_CSS_DIR_.'mipagina.css');
    9.         Tools::addJS(_THEME_JS_DIR_.'mipagina.js');
    10.     }
    11.    
    12.     public function process()
    13.     {
    14.         parent::process();
    15.        
    16.         //definimos la variable que queremos mostrar
    17.         $mivariable = "Hola Mundo";
    18.        
    19.         //declaramos las variables para smarty
    20.         self::$smarty->assign(array(
    21.             'mivariable' => $mivariable
    22.         ));
    23.     }
    24.    
    25.     public function displayContent()
    26.     {
    27.         parent::displayContent();
    28.         //definimos el tpl que muestra la página
    29.         self::$smarty->display(_PS_THEME_DIR_.'mipagina.tpl');
    30.     }
    31. }
    32. ?>
  4. Dependiendo de la lógica a implementar deberíamos definir una nueva clase, en nuestro ejemplo no es necesario.
  5. Nos faltaría crear el tpl correspondiente “mipagina.tpl” en nuestro tema y los archivos css y js de la página los requiere. Veamos el contenido del tpl para mostrar nuestra variable:
    1. <!--mostramos (o no) las breadcumbs-->
    2. {include file="$tpl_dir./breadcrumb.tpl"}
    3. <!--mostramos nuestra variable-->
    4. <p>{$mivariable}</p>

Listo, ya tenemos nuestra página en funcionamiento. Ahora ya podemos hacer maldades.

La única lógica del ejemplo es la definición de la variable, pero se puede hacer cualquier cosa, aunque deberíamos diferenciar muy bien que debe hacer el controlador y que las clases, pero eso será otro día.

nota: Si sólo queremos crear una página de contenido (texto e imágenes) no es necesario hacer todo esto, basta con utilizar la funcionalidad de “CMS” que lleva prestashop

Autor: Juan Castells

Compártelo!!


15 respuestas a “Prestashop, crear una nueva página”

  1. Buenas tardes, primero agradecer el material me a sido de gran ayuda y me ha funcionado muy bien, solo tengo un error o problema que no he podido resolver y quisiera saber si me puede ayudar, al crear la nueva página al acceder a ella se oculta el contenido de las categorias de los pruductos de la tienda (la que aparece en la columna izquierda de la página) uso el theme “theme323” por que pasa esto se debe agregar algo a l controlador para que mueste este contenido.

    WEB: http://www.editoreshache.com
    nueva página: http://www.editoreshache.com/videos-impuesto-diferido

    Gracias,

    • Hola
      Si estás usando la versión 1.4 (para la que es éste tutorial) no deberías tener problema en ver la columna izquierda o derecha, ya que en esta versión aun no se podía definir que columnas se mostraban por página… y no creo que tengas restricciones de posiciones por módulos.
      Será algo particular del tema. No puedo entrar a la página de ejmplo para echarle un vistazo (está protegida) Si me envías un privado por el formulario de contacto podemos seguir tratando el asunto y me pasas la información que necesito.

  2. Juan dice:

    Amigo estoy probando tu codigo pero al momento de verlo en la web me sale el siguiente mensaje.

    Notice: Undefined index: mivariable in /var/www/html/catalogotaski/cache/smarty/compile/e6/cb/f7/e6cbf75943a02de230a0b60130534a62a3d68628.file.chorizos.tpl.php on line 39Notice: Trying to get property of non-object in /var/www/html/catalogotaski/cache/smarty/compile/e6/cb/f7/e6cbf75943a02de230a0b60130534a62a3d68628.file.chorizos.tpl.php on line 39

    A que crees que se deba?

    • admin dice:

      Hola Juan.

      Mira a ver si pudiera deberse a que en el código de ejemplo del controlador sobraba un espacio al pasar la palabra a smarty:

      self::$smarty->assign(array(
      'mivariable' => $mivariable
      ));

      Lo he rectificado en la entrada.

      Si sigues teniendo problema dime la versión con la que estás trabajando

    • Juan dice:

      Hola gracias por tu ayuda si esa era el problema habia un espacio en ‘mivariable’, quisiera ver si me puedes ayudar con otro tema lo que pasa es que en el controlador tengo una consulta sql de esta forma:

      public function saldos()
      {
      parent::saldos();

      $cart2=4;
      $id_category2=11;

      //EJECUTAR SENTENCIA SQL QUE PERMITE VERIFICAR LOS MONTOS CONSUMIDOS
      $sql =”SELECT C.name As categoria,
      D.sv_monto As Monto_Maximo,
      SUM(A.quantity) As Cantidad_Productos,
      SUM(A.quantity * B.price) as valor_compra,
      (D.sv_monto – SUM(A.quantity * B.price)) AS Saldo,
      A.id_cart,
      A.id_product,
      A.id_address_delivery,
      A.date_add,
      B.id_category_default,
      B.price
      FROM ps_cart_product as A, ps_product as B, ps_category_lang as C, sv_address_categories as D
      WHERE (A.id_product = B.id_product)
      and (B.id_category_default = C.id_category
      and C.id_lang = 2)
      and (D.sv_categories_id = C.id_category
      and B.id_category_default = D.sv_categories_id)
      and A.id_cart = ‘.$cart2’
      and D.sv_address_id = ‘$id_category2’
      GROUP BY C.name
      ;”;

      $query = mysql_query($sql);

      // Imprimir los resultados en HTML
      $x=0;
      while ($row = mysql_fetch_array($query)) {
      $saldos[$x]=array($col[‘categoria’], $col[‘Monto_Maximo’], $col[‘Cantidad_Productos’], $col[‘valor_compra’], $col[‘Saldo’]);
      $x++;
      }

      self::$smarty->assign(array(‘saldos’ => $saldos));

      // Cerrar la conexión
      mysql_close();
      }

      Pero con esta consulta me sale el error que te indique antes, me puedes ayudar para lograr mostrar los datos de la consulta?.

      Gracias.

      • admin dice:

        Hola Juan,

        En un primer vistazo veo que en tu consulta hay una tabla “sv_address_categories” que no existe en prestashop, si es una tabla que te has creado por algún tema específico es muy complicado que pueda ayudarte ya que se sale del estándar y tendría que conocer específicamente todo lo que se ha modificado en tu proyecto.
        De todos modos te aconsejo que cuando hagas consutlas de este tipo con un phpMyAdmin o similar pruebes a ejecutar la consulta porque nmuchas veces pensamos que es correcta pero puede dar errores de sintaxis.

        • Juan dice:

          Hola, gracias por responder,

          Efectivamente se ha creado tablas nuevas para lograr poner funciones que eran necesarias para el sistema, ademas de otras que no logro solucionar.

          El problema radica en que yo no hice el sistema y no se a que fondo esta modificado, ademas he intentado hacer con consultas simples a la base de datos pero en estos momentos me sale el siguiente error:

          Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /var/www/html/catalogotaski/controllers/front/Prueba2Controller.php on line 39 Notice: Undefined variable: yo in /var/www/html/catalogotaski/controllers/front/Prueba2Controller.php on line 47

          Te pongo el código que estoy utilizando:

          execute($sql);

          $x=0;
          while($row=mysql_fetch_array($query))
          {
          $yo[$x]=array($col[‘id_address’], $col[‘alias’]);
          $x++;
          }
          //declaramos las variables para smarty
          self::$smarty->assign(array(
          ‘yo’ => $yo
          ));
          }
          public function displayContent()
          {
          parent::displayContent();
          self::$smarty->display(_PS_THEME_DIR_.’chorizos.tpl’);
          }
          }

          Y en el tpl tengo esto:

          {capture name=path}{l s=’Prueba’}{/capture}
          {include file=”$tpl_dir./breadcrumb.tpl”}
          {l s=’Prueba’}

          MONTOS

          {foreach key=key name=outer item=dato from=$yo}

          {foreach key=key item=item from=$dato}
          {$dato}
          {/foreach}

          {/foreach}

          Tal vez sabes a que se deba?, me podrías ayudar?.

          gracias.

          • Juan dice:

            Perdon el codigo del php no se copio completo:

            Prueba2Controller.php
            execute($sql);

            $x=0;
            while($row=mysql_fetch_array($query))
            {
            $yo[$x]=array($col[‘id_address’], $col[‘alias’]);
            $x++;
            }
            //declaramos las variables para smarty
            self::$smarty->assign(array(
            ‘yo’ => $yo
            ));
            }
            public function displayContent()
            {
            parent::displayContent();
            //definimos el tpl que muestra la página
            self::$smarty->display(_PS_THEME_DIR_.’chorizos.tpl’);
            }
            }

            Ojala me puedas ayudar.

            Gracias.

          • admin dice:

            Los errores que te dan: “mysql_fetch_array() expects parameter 1 to be resource, boolean given” y “Notice: Undefined variable: yo” tienen ambos que ver con el resultado de la consulta sql, que no te está llegando informada, por tanto debe tener algún error o no estar devolviendo resultados.

            Si como dices se han creado tablas y funciones me es imposible ayudarte sin hacer un análisis previo completo y estudiar todo el código y conocer un poco más el proyecto. Escríbeme si quieres un correo y lo comentamos.

  3. Raul dice:

    He seguido tu guia para crear una página, pero tengo el siguiente error:

    Warning: require_once(C:\Users\raul\MOWES II -PORTABLE\www\prestashop_ver1451\config/../classes/ControllerPaginaImagenes.php): failed to open stream: No such file or directory in C:\Users\raul\MOWES II -PORTABLE\www\prestashop_ver1451\config\autoload.php on line 41 Fatal error: require_once(): Failed opening required ‘C:\Users\raul\MOWES II -PORTABLE\www\prestashop_ver1451\config/../classes/ControllerPaginaImagenes.php’ (include_path=’.;C:\Users\raul\MOWES II -PORTABLE\php5′) in C:\Users\raul\MOWES II -PORTABLE\www\prestashop_ver1451\config\autoload.php on line 41

    ¿Puedes ayudarme?

    PD: Mi version de prestashop es 1.4.5.1 asi que debería funcionar

    • admin dice:

      Hola Raul.

      Tendría que ver el código de la página y del controlador para ver que puede estar pasando.

      No es normal que el autoload intente buscar el controlador en el directorio de clases. De qué clase extiende la clase del controlador? Viendo el error es posible que la hayas definido así?
      class ControllerPaginaImagenesCore extends ControllerPaginaImagenes
      en vez de así:
      class PaginaImagenesControllerCore extends FrontController

      Sin ver el código ya te digo que no se me ocurre otra cosa. Si lo prefieres me envías un correo (juan@) y lo miramos

  4. Rafael dice:

    Me aparece este error:
    Fatal error: Class ‘PruebaController’ not found in /home/content/11/8789611/html/tienda/classes/controller/Controller.php on line 128

Deja un comentario

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