Imagen del tutorial crear modulo en prestashop

Construcción de módulos en Prestashop II

1 febrero, 2015 31 comentarios

En la entrada anterior del blog comenzábamos a tratar la creación de un módulo para Prestashop que se adecuara a las necesidades concretas de un cliente. En esta entrada, finalizamos la guía-tutorial.

Se comenzó un tutorial de creación de un módulo para la versión 1.6 de Prestashop que ayudara a obtener estadísticas sobre una tienda virtual y que cumpliera con el aviso legal del empleo de cookies.

En la primera parte, nos centramos en

  • La estructura de módulos en Prestashop
  • La infraestructura necesaria para crear un módulo nuevo
  • El fichero principal del módulo y los métodos cargados en él

En esta segunda parte, vamos a profundizar en nuestro ejemplo analizando:

  • El comportamiento de cada uno de los métodos que componen el fichero principal del módulo (kadum.php)
  • La codificación del fichero TPL y CSS
  • Cómo hacer la instalación y pruebas de tu módulo de Prestashop

Los temas que se tratan a continuación son:

Codificación del fichero PHP

El fichero kadum.php es el fichero principal de nuestro módulo. En su interior se define una clase, la cual tendrá una serie de métodos que se ejecutan automáticamente al acceder al back-office o al front-end de Prestashop.
A continuación se explica detalladamente el funcionamiento de cada método:

__construct

El código para el constructor, será el siguiente:

public function __construct(){
    $this->name        = 'kadum';
    $this->tab         = 'analytics_stats';
    $this->author      = 'kadum.es';
    $this->version     = '1.0.0';
    $this->ps_versions_compliancy = array('min' => '1.6', 'max' => '1.7');
    $this->bootstrap   = true;

    parent::__construct();

    $this->displayName = $this->l('Modulo de prueba');
    $this->description = $this->l('Este modulo permite incluir el codigo de Google Analytics y generar un mensaje de politicas de privacidad');

}

El atributo name debe coincidir con el nombre de la carpeta del módulo. No se pueden utilizar caracteres especiales ni espacios en blanco.
El atributo tab indica en qué categoría se incluirá el módulo en el listado de módulos del back-office. Análisis y estadística en nuestro caso.
El atributo ps_versions_compliancy con qué versión de prestashop es compatible el módulo.
Tras invocar al constructor de la clase Module, se establece el valor de diversos atributos mediante el uso del método de traducción $this->l(‘…’); De esa forma se podrán gestionar las traducciones del back-office de nuestro módulo.

 

install

Una vez que en el back-office se pulsa sobre la opción Instalar, se invoca a este método.

public function install(){
   return parent::install() &&
      $this->registerHook('footer') &&
      $this->registerHook('header');
}

Se llama al método install de la clase Module.
Se indica que nuestro módulo podrá añadir código en el portal cuando se cargue el hook head o el hook footer.
El código que se añadirá en esas posiciones se encuentra en los métodos hookDisplayHeader y hookDisplayFooter respectivamente.

 

uninstall

Una vez que en el back-office se pulsa sobre la opción Desinstalar, se invoca a este método.

public function uninstall()
{
   //Desinstalar y borrar las variables de configuración
   //almacenadas en ps_configuration y ps_configuration_lang
   return parent::uninstall() &&
      Configuration::deleteByName('kadum_codigo') &&
      Configuration::deleteByName('kadum_cookie') &&
      Configuration::deleteByName('kadum_texto') &&
      Configuration::deleteByName('kadum_posicion') &&
      Configuration::deleteByName('kadum_bgcolor') &&
      Configuration::deleteByName('kadum_transparencia') &&
      Configuration::deleteByName('kadum_color') &&
      Configuration::deleteByName('kadum_shadow');
}

Se llama al método uninstall de la clase Module.
Por otro lado, el método estático deleteByName de la clase Configuration se encarga de borrar los registros de la tabla ps_configuration y ps_configuration_lang donde se almacena la información configurable de nuestro módulo:

  • kadum_codigo. Código de Google Analytics.
  • kadum_cookie. Nombre de la cookie que gestiona las futuras visitas del usuario.
  • kadum_texto. Mensaje de aviso sobre el empleo de cookies.
  • kadum_posicion. Posición donde se mostrará el mensaje (arriba o abajo).
  • kadum_bgcolor. Color de fondo del mensaje.
  • kadum_transparencia. Transparencia a aplicar al color de fondo.
  • kadum_color. Color de la letra del mensaje.
  • kadum_shadow. Color de la sombra de la capa contenedora del mensaje.

 

getContent

Una vez que en el back-office se pulsa sobre la opción Configurar, se invoca a este método.

public function getContent(){
    $this->_html .= '<h2>'.$this->displayName.'.</h2>';

    //Si se ha pulsado el botón Guardar del formulario
    if (Tools::isSubmit('btnSubmit')){
        //comprobar datos del formulario
        $this->_postValidation();

        //Si no hay errores, se procesan los datos
        // enviados por el formulario
        if(!count($this->_errors))
            $this->_postProcess();
        //en caso contrario, se muestran los errores
        else
            foreach ($this->_errors as $error)
                $this->_html .= $this->displayError($error);
    }
    //generar el formulario
    $this->_displayForm();
    
    return $this->_html;
}

El método se encarga de invocar al método _displayForm que genera el formulario de configuración.
Si en el formulario se pulsa sobre el botón llamado btnSubmit, invoca al método _postValidation que comprueba si se rellenan diversos campos del formulario.
Si los datos enviados en el formulario son correctos, invoca al método _postProcess que se encarga de almacenar la información en la base de datos. En caso contrario, muestra esos errores.

 

_postValidation

El método se encarga de recuperar la información enviada por el formulario y comprobar  que es correcta. Si encuentra algún error, lo añade al atributo de la clase _errors para mostrarlo en getContent.

Se asume que desde el formulario de configuración se debe introducir información para el nombre de la cookie, el mensaje a mostrar, el color de fondo, el color de la letra. Además, si se introduce información para el color de fondo, letra y sombra, comprueba que se introduzcan 6 caracteres, ya que los colores se introducirán en formato hexadecimal

private function _postValidation(){

    //SE INDICA NOMBRE DE LA COOKIE?
    if (!Tools::getValue('kadum_cookie')){
        $this->_errors[] = $this->l('El nombre de la cookie es obligatorio.');
    }

    //SE INDICA TEXTO DEL AVISO PARA EL IDIOMA POR DEFECTO?
    if (!Tools::getValue('kadum_texto_'.(int)Configuration::get('PS_LANG_DEFAULT'))){
        $this->_errors[] = $this->l('El texto del aviso, es obligatorio.');
    }

    //SE INDICA COLOR DE FONDO CON Y TIENE 6 CARACTERES?
    if (!Tools::getValue('kadum_bgcolor')){
        $this->_errors[] = $this->l('El color de fondo es obligatorio.');
    }else{
        if(strlen(str_replace("#", "",Tools::getValue('kadum_bgcolor')))!=6){
            $this->_errors[] = $this->l('El color de fondo debe tener 6 caracteres.');
        }
    }
    //SE INDICA COLOR DE LA LETRA CON Y TIENE 6 CARACTERES?
    if (!Tools::getValue('kadum_color')){
        $this->_errors[] = $this->l('El color de la fuente es obligatorio.');
    }else{
        if(strlen(str_replace("#", "",Tools::getValue('kadum_color')))!=6){
            $this->_errors[] = $this->l('El color de la letra debe tener 6 caracteres.');
        }
    }
    //SE INDICA COLOR DE LA SOMBRA CON 6 CARACTERES?
    if(Tools::getValue('kadum_shadow') &&
        strlen(str_replace("#", "",Tools::getValue('kadum_shadow')))!=6){
        $this->_errors[] = $this->l('El color de la sombra debe 6 caracteres.');
    }
}

Se observa que para recoger la información enviada por el formulario se emplea el método:

Tools::getValue('nombre_del_campo')

Sería el equivalente a:

$_REQUEST('nombre_del_campo')

En caso de producirse un error, al atributo de nuestra clase _erros se le asigna el mensaje mediante el método de traducción:

$this->l('Mensaje');

 

_postProcess

El método se encarga guardar en las tablas ps_configuration y ps_configuration_lang la información que se empleará en la parte pública de la tienda. Este método se invoca sólo si el método anterior no informa de que se ha producido ningún error en la introducción de los datos.

private function _postProcess(){
    /******** CREAR VECTOR CON LOS MENSAJES *********/
    //obtener el texto del idioma por defecto
    $aviso_defecto = Tools::getValue('kadum_texto_'.(int)Configuration::get('PS_LANG_DEFAULT'));

    $languages     = Language::getLanguages(false);
    $languages    = $this->context->controller->getLanguages();

    //obtener todos los textos. Si alguno está vacío, se le asigna el texto por defecto
    $AVISOS    = array();
    foreach ($languages as $language){
        $aviso    = Tools::getValue('kadum_texto_'.$language['id_lang']);
        if(!empty($aviso))
            $AVISOS[$language['id_lang']]    = $aviso;
        else
            $AVISOS[$language['id_lang']]    = $aviso_defecto;
    }
    
    /************ ALMACENAR INFORMACION EN LA BASE DE DATOS ***************/
    Configuration::updateValue('kadum_codigo', Tools::getValue('kadum_codigo'));
    Configuration::updateValue('kadum_cookie', Tools::getValue('kadum_cookie'));
    Configuration::updateValue('kadum_texto', $AVISOS, true);
    Configuration::updateValue('kadum_posicion', Tools::getValue('kadum_posicion'));
    Configuration::updateValue('kadum_bgcolor', Tools::getValue('kadum_bgcolor'));
    //si no se introduce transparencia, se asigna el valor 1
    if(Tools::getValue('kadum_transparencia')=='')
        Configuration::updateValue('kadum_transparencia', 1);
    else
        Configuration::updateValue('kadum_transparencia', str_replace(",",".",Tools::getValue('kadum_transparencia')));
    Configuration::updateValue('kadum_color', Tools::getValue('kadum_color'));
    //si no se introduce color de sombra, se le asiga el mismo que el color de fondo
    if(Tools::getValue('kadum_shadow')!='')
        Configuration::updateValue('kadum_shadow', Tools::getValue('kadum_shadow'));
    else
        Configuration::updateValue('kadum_shadow', Tools::getValue('kadum_bgcolor'));
    
    /***** Informar que se ha actualizado la configuración ******/
    $this->_html .= $this->displayConfirmation($this->l('Actualizada la configuracion del modulo de prueba.'));
}

Para recuperar la información enviada por el formulario, se emplea de nuevo el método:

Tools::getValue('nombre_del_campo');

Lo primero que se lleva a cabo en el método es la obtención del aviso en el idioma por defecto y se almacena en $aviso_defecto. Posteriormente, se crea un vector AVISOS donde para cada idioma activo se guarda su aviso. Es posible que no se introduzca el aviso para algún idioma (sólo es obligatorio para el idioma por defecto), en este caso, se le asociará el mensaje de aviso por defecto.

A continuación, se almacena la información. Para guardar la información en las tablas de configuración, se hace uso del método:

Configuration::updateValue('nombre_del_campo', valor)

Para el caso del mensaje de aviso, se emplea el mismo método pero con tres parámetros de entrada, el tercer parámetro indica si se admiten caracteres html.

Configuration::updateValue('nombre_del_campo', VECTOR, true)

La función updateValue se encarga de guardar la información en la tabla ps_configuration si el segundo parámetro es un valor y en la tabla ps_configuration_lang si el segundo parámetro es un array. Por eso, previamente se genera el vector AVISOS con los mensajes correspondientes.
Por ejemplo, el código:

Configuration::updateValue('kadum_codigo', Tools::getValue('kadum_codigo'));

Creará un registro en la tabla ps_configuration donde el campo name será kadum_codigo y el campo value será el obtenido mediante Tools::getValue(‘kadum_codigo’).

Finaliza el módulo con el aviso de que la configuración se ha llevado a cabo. De nuevo con el método $this->l(‘Actualización OK’);

 

_displayForm

Este método se llama tanto si se pulsa el botón Guardar (btnSubmit) como si no.

Se encarga de la construcción del formulario propiamente dicho. En el back-end, tras pulsar el botón configurar, se mostrará el siguiente formulario:

Formulario de configuración del módulo

Formulario de configuración del módulo

 

Dicho formulario se generará usando la clase HelperForm. Por lo que la tarea se dividirá en:

  1. Crear un vector (campos) donde se definen qué campos se desean tener.
  2. Crear un vector (valores) con los valores para esos campos.
  3. Crear un objeto (helper) de la clase HelperForm y definir sus atributos por defecto.
  4. Definir al objeto helper el vector con los valores de los campos (valores).
  5. Generar el formulario con el método generateForm que recibe el vector (campos).
  6. Asignar el formulario generado al atributo de la clase _html.

Así pues, el código de este método es:

private function _displayForm(){
    /******* DEFINIR CAMPOS DEL FORMULARIO ************/
    //Se definen los input text, submit, textarea y select
    //BLOQUE 1
    $campos[0]['form'] = array(
        'legend' => array(
                      'title'=> $this->l('Google Analytics'),
                      'icon' => 'icon-cogs'
                    ),
        'description' => $this->l('Para la obtencion del codigo de seguimiento de Google Analytics. Acceda a ').'<a href="http://www.google.es/intl/es/analytics/" target="_blank">'.$this->l('esta direccion').'</a>, '.$this->l('inicie sesion, registre su dominio y obtenga el codigo.'),
        'input' => array(
                      array(
                        'type' => 'text',
                        'label'=> $this->l('Codigo'),
                        'name' => 'kadum_codigo',
                        'desc' => $this->l('ejemplo: UA-1234567-1.')
                        )
                   )
     );

    //BLOQUE 2
    $campos[1]['form'] = array(
        'tinymce' => true,
        'legend'  => array(
                       'title'=> $this->l('Gestion de las politicas de cookie'),
                       'icon' => 'icon-cogs'
                     ),
        'input' => array(
                      array(
                        'type' => 'text',
                        'label'=> $this->l('Nombre de la cookie'),
                        'name' => 'kadum_cookie',
                        'desc' => $this->l('ejemplo: MINEGOCIO.'),
                      ),
                      array(
                        'type' => 'textarea',
                        'label'=> $this->l('Descripcion'),
                        'name' => 'kadum_texto',
                        'lang' => true,
                        'class'=> 'rte',
                        'autoload_rte' => true,
                      ),
                      array(
                        'type' => 'select',
                        'label'=> $this->l('Posicion'),
                        'name' => 'kadum_posicion',
                        'options' => array(
                        'query'   => array(
                           array(
                              'id' => 0,
                              'name' => $this->l('Arriba')),
                                 array(
                                    'id' => 1,
                                    'name' => $this->l('Abajo')),
                                    ),
                              'id' => 'id',
                              'name' => 'name'
                           )
                      ),
                      array(
                        'type' => 'text',
                        'label' => $this->l('Color de fondo'),
                        'name' => 'kadum_bgcolor',
                        'desc' => $this->l('ejemplo: FF0033 sin #')
                      ),
                      array(
                        'type' => 'text',
                        'label' => $this->l('Transparencia Color de fondo'),
                        'name' => 'kadum_transparencia',
                        'desc' => $this->l('Un numero entre 0 y 1')
                      ),
                      array(
                        'type' => 'text',
                        'label' => $this->l('Color de la fuente'),
                        'name' => 'kadum_color',
                        'desc' => $this->l('ejemplo: FF0033 sin #')
                      ),
                      array(
                        'type' => 'text',
                        'label' => $this->l('Color de la sombra'),
                        'name' => 'kadum_shadow',
                        'desc' => $this->l('ejemplo: FF0033 sin #')
                      ),
            
        ),
        'submit' => array(
            'name' => 'btnSubmit',
            'title' => $this->l('Save'),
        )
    );

    /*** OBTENER VALORES PARA LOS CAMPOS DEL FORMULARIO ***********/
    $valores['kadum_codigo'] = Configuration::get('kadum_codigo');
    $valores['kadum_cookie'] = Configuration::get('kadum_cookie');
    //obtener los avisos para idiomas activos
    $this->context->controller->getLanguages();
    foreach ($this->context->controller->_languages as $language)
    {
        $aviso = Configuration::get('kadum_texto',$language['id_lang']);
        $valores['kadum_texto'][$language['id_lang']] = $aviso;
    }
    $valores['kadum_posicion']     = Configuration::get('kadum_posicion');
    $valores['kadum_bgcolor']      = Configuration::get('kadum_bgcolor');
    $valores['kadum_transparencia']= Configuration::get('kadum_transparencia');
    $valores['kadum_color']        = Configuration::get('kadum_color');
    $valores['kadum_shadow']       = Configuration::get('kadum_shadow');

    /*********** DEFINIR EL OBJETO HELPER *************/
    $helper                  = new HelperForm();
    $helper->module          = $this;
    $helper->name_controller = $this->name;
    $helper->token           = Tools::getAdminTokenLite('AdminModules');
    $helper->currentIndex    = AdminController::$currentIndex.'&configure='.$this->name;

    $helper->languages       = $this->context->controller->_languages;
    $helper->default_form_language    = $this->context->controller->default_form_language;
    $helper->allow_employee_form_lang = $this->context->controller->default_form_language;
    $helper->toolbar_scroll  = false;
    $helper->show_toolbar    = false;
    $helper->show_cancel_button        = true;
    
    /************** CREAR EL FORMULARIO ****************/
    //cargar los valores de los campos del formulario
    $helper->fields_value         = $valores;
    //Obtener el código HTML del formulario con los campos y valores definidos
    $this->_html .= $helper->generateForm($campos);

    return;
}

Nos centramos en el código para la generación del bloque 1, así como en la generación del textarea o select del bloque 2 y cómo se recupera su valor de las tablas de configuración.

La estructura del bloque 1 se define con el siguiente vector.

$campos[0]['form'] = array(
  'legend'      => array(
                        'title' => $this->l('Google Analytics'),
                        'icon' => 'icon-cogs'
                        ),
  'description' => $this->l('Para la obtencion del codigo de seguimiento de Google Analytics. Acceda a ').'<a href="http://www.google.es/intl/es/analytics/" target="_blank">'.$this->l('esta direccion').'</a>, '.$this->l('inicie sesion, registre su dominio y obtenga el codigo.'),
  'input'       => array(
                      array(
                         'type' => 'text',
                         'label' => $this->l('Codigo'),
                         'name' => 'kadum_codigo',
                         'desc' => $this->l('ejemplo: UA-1234567-1.')
                      )
                   )
);

El cual, genera el código HTML:

<div class="panel" id="fieldset_0">
    <div class="panel-heading">
        <i class="icon-cogs"></i>Google Analytics
    </div>
    <div class="alert alert-info">Para la obtencion del codigo de seguimiento de Google Analytics. Acceda a <a href="http://www.google.es/intl/es/analytics/" target="_blank">esta direccion</a>, inicie sesion, registre su dominio y obtenga el codigo.</div>
    <div class="form-wrapper">
        <div class="form-group">
            <label class="control-label col-lg-3">Codigo</label>
            <div class="col-lg-9 ">
                <input type="text"
                name="kadum_codigo"
                id="kadum_codigo"
                value=""
                class=""
                />
                <p class="help-block">ejemplo: UA-1234567-1.</p>
            </div>
        </div>
    </div><!-- /.form-wrapper -->
</div>
Bloque 1 - Formulario de configuración

Bloque 1 – Formulario de configuración

Para indicar qué valor se le asociará al input definido, llamado kadum_codigo, se emplea el código:

$valores['kadum_codigo'] = Configuration::get('kadum_codigo');

El key del vector valores debe coincidir con el name del input.
La función get se encarga de recuperar de las tablas de configuración el valor asociado al registro cuyo name coincide con el parámetro de entrada que recibe. En este caso, el parámetro será el mismo que el utilizado en el método updateValue en nuestro método _postProcess:

Configuration::updateValue('kadum_codigo', Tools::getValue('kadum_codigo'));

En el bloque 2 se muestra un textarea con tinymce y selector de idioma. El campo se define mediante el código:

array(
   'type'     => 'textarea',
   'label'    => $this->l('Descripcion'),
   'name'     => 'kadum_texto',
   'lang'     => true,
   'class'    => 'rte',
   'autoload_rte' => true,
),

Para indicar qué valor se le asignará a los textarea (hay uno para cada idioma activo), se emplea:

$this->context->controller->getLanguages();
foreach ($this->context->controller->_languages as $language)
{
   $aviso = Configuration::get('kadum_texto',$language['id_lang']);
   $valores['kadum_texto'][$language['id_lang']] = $aviso;
}

Por otro lado, el select se genera mediante el código:

array(
   'type' => 'select',
   'label'=> $this->l('Posicion'),
   'name' => 'kadum_posicion',
   'options'  => array(
      'query' => array(
         array(
            'id'   => 0,
            'name' => $this->l('Arriba')),
            array(
               'id'   => 1,
               'name' => $this->l('Abajo')),
            ),
            'id'   => 'id',
            'name' => 'name'
         )
      )

Y para preparar su valor asociado:

$valores['kadum_posicion'] = Configuration::get('kadum_posicion');

Se recuerda que en el método postProcess para guardar en la tabla ps_configuration la posición del aviso, se emplea:

Configuration::updateValue('kadum_posicion', Tools::getValue('kadum_posicion'));

Para más información sobre la definición de los campos de formulario en Prestashop, visita el siguiente enlace.

 

hookDisplayHeader

Este método se llama automáticamente en el front-end.
Se encarga de añadir la hoja de estilos arriba.css o abajo.css según la posición seleccionada en el formulario de configuración que se encuentra almacenada en la tabla ps_configuration.

public function hookDisplayHeader($params){
    $posicion  = Configuration::get('kadum_posicion');
    if(!$posicion)
        $this->context->controller->addCSS($this->_path.'css/arriba.css', 'all');
    else
        $this->context->controller->addCSS($this->_path.'css/abajo.css', 'all');
}

Una vez más, para recuperar la información guardada en la tabla ps_configuration, se utiliza la llamada:

Configuration::get('nombre_del_registro');

 

hookDisplayFooter

Este método se llama automáticamente en el front-end.
Se encarga de obtener los valores almacenados en las tablas de configuración, encapsularlos en la variable smarty e invocar al fichero kadum.tpl

public function hookDisplayFooter($params){
    global $smarty;
    if (!$this->active)
        return ;

    //obtener el nombre de la cookie almacenada en ps_configuration
    $kadum_cookie    = Configuration::get('kadum_cookie');
    //comprobar si en el navegador existe esa cookie
    if(isset($_COOKIE[$kadum_cookie]))
        $kadum_cookie_exist    = 1;
    else
        $kadum_cookie_exist    = 0;
        
    //si la cookie tiene nombre, se prepara la información para el fichero .tpl y se muestra
    if (isset($kadum_cookie) && $kadum_cookie!=''){
        //Obtener datos de las tablas de configuración y se empaquetan
        $smarty->assign(
            array(
                'kadum_codigo'   => Configuration::get('kadum_codigo'),
                'kadum_cookie'   => Configuration::get('kadum_cookie'),
                'kadum_posicion' => Configuration::get('kadum_posicion'),
                'kadum_bgcolor'  => $this->_hex2rgb(Configuration::get('kadum_bgcolor')),
                'kadum_transparencia' => Configuration::get('kadum_transparencia'),
                'kadum_color'    => Configuration::get('kadum_color'),
                'kadum_shadow'   => Configuration::get('kadum_shadow'),
                'kadum_cookie_exist' => $kadum_cookie_exist,
                'kadum_texto'    => Configuration::get('kadum_texto',$this->context->language->id)
            )
        );
        //invocar al fichero .tpl que usará la $smarty anterior
        return $this->display(__FILE__, 'kadum.tpl');
    }
}

Se observa que se genera un vector el cual se asigna a la variable global smarty.
El vector tendrá como key un nombre que se empleará como variable en el fichero kadum.tpl y el valor obtenido de la base de datos.

Por ejemplo, con la línea:

array(
   [...]
   'kadum_posicion'     => Configuration::get('kadum_posicion'),
   [...]
)

Se crea una variable a usar en el fichero kadum.tpl con el nombre kadum_posicion. De modo que en el fichero .tpl se podrá referenciar mediante la estructura:

{$kadum_posicion}

A dicha variable, se le asigna un valor obtenido de la tabla ps_configuration mediante la función get.
De nuevo, se recuerda que en el método _postProcess se guardaba la información en la tabla de configuración mediante:

Configuration::updateValue('kadum_posicion', Tools::getValue('kadum_posicion'));

Para el caso particular del color de fondo del aviso, se emplea la invocación al método _hex2rgb. Ya que en el fichero kadum.tpl no se trabajará con la notación hexadecimal, sino rgb.

Por otro lado, se observa que se empaqueta una variable llamada kadum_cookie_exist la cual indica si la cookie existe o no en el navegador. Será de gran utilidad en el fichero kadum.tpl explicado posteriormente.

 

_hex2rgb

Este método se invoca desde hookDisplayFooter. Recibe el color en formato hexadecimal y lo devuelve en formato rgb

private function _hex2rgb($param) {
    $hex = str_replace("#", "", $param);
    
    $r   = hexdec(substr($hex,0,2));
    $g   = hexdec(substr($hex,2,2));
    $b   = hexdec(substr($hex,4,2));
    return $r.','.$g.','.$b;
}

 

Codificación del fichero tpl y css

El fichero kadum.tpl está almacenado dentro de la carpeta modules/kadum/views/templates/front y se encarga de la generación del código HTML, CSS y javascript para mostrar el mensaje de aviso sobre las políticas de cookie así como del código de seguimiento de Google Analytics.

El código de seguimiento, texto del mensaje de aviso, color de fondo, opacidad, color de letra, color de la sombra y posición se almacenan en las tablas de configuración de Prestashop mediante el método _postProcess. Dicha información es recuperada y empaquetada en el método _hookDisplayFooter y se usa en el fichero kadum.tpl mediante la sintaxis {$nombre_variable}. Para profundizar en la sintaxis de las smarty, visita la página oficial.

 

{* Si el usuario tiene una cookie con el nombre definido, no mostramos aviso.
En caso contrario, se mostrará el aviso mientras no navegue por nuestra tienda *}
{if $kadum_cookie_exist==0}
    <script>
    function checkNavegacion(){
        //Obtener la URL actual.
        var url_actual        = document.URL;
        url_actual            = url_actual.replace("www.","");
        var aux_dominio    = url_actual.split('.');
        
        //Repetimos la operación para la URL desde donde llega el usuario
        var url_anterior    = document.referrer;
        url_anterior        = url_anterior.replace("www.","");
        var aux_dominio2    = url_anterior.split('.');

        if(url_anterior != ''){
            //Mostramos el aviso si coinciden las URL
            if(url_actual == url_anterior){
                $('#kadum_cookie').css('display','block');
            }else{
                if(aux_dominio[0]    == aux_dominio2[0]){
                    crearCookie();
                    $('#kadum_cookie').css('display','none');
                    return 1;
                }else{
                    $('#kadum_cookie').css('display','block');
                }
            }
        }else{
            $('#kadum_cookie').css('display','block');
        }
        return 0;
    }
    
    //Crear la cookie con el nombre indicado
    function crearCookie(){
        var days        = 365000;
        var value    = 1;
        var date     = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires     = "; expires=" + date.toGMTString();
        document.cookie = "{$kadum_cookie} = "+ value +" "+ expires + "; path=/;";
    }

    //Compruebar si existe la cookie
    function checkCookie()
    {
        var c_name    = "{$kadum_cookie}";
        var c_value    = document.cookie;
        var c_start    = c_value.indexOf(" " + c_name + "=");
        if (c_start == -1) {
            c_start    = c_value.indexOf(c_name + "=");
        }
        if (c_start == -1) {
            c_value    = false;
        } else {
            c_start    = c_value.indexOf("=", c_start) + 1;
            var c_end    = c_value.indexOf(";", c_start);
            if (c_end == -1){
                c_end    = c_value.length;
            }
            c_value    = unescape(c_value.substring(c_start,c_end));
        }
        return c_value;
    }

    //Cuando el document esté cargado
    $(document).ready(function(){
        //comprobar si existe la cookie
        var valor    = checkCookie();
        //si no existe, comprobar si se navega mediantes los enlaces
        if(!valor)
            valor    = checkNavegacion();
        //aqui se añadiría la opción de controlar si se realiza scroll
            
    });

    
</script>

<style>
    .informacion{
        background: rgba({$kadum_bgcolor},{$kadum_transparencia});
        color: #{$kadum_color};
        box-shadow: 0px 0 5px 0 #{$kadum_shadow};
    }
    .informacion a{
        color: #{$kadum_color} !important;
    }
</style>

<div class="informacion" id="kadum_cookie" >
    {$kadum_texto}
</div>
{/if}

{* si existe el código de seguimiento de google analytics, se añade *}
{if $kadum_codigo != ''}
{literal}
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', {/literal}'{$kadum_codigo}'{literal}, 'auto');
  ga('send', 'pageview');
</script>
{/literal}
{/if}

Se observa que el fichero .tpl se divide en dos condiciones principalmente:

{if $kadum_cookie_exist==0}
   //NO EXISTE LA COOKIE
{/if}

{if $kadum_codigo != ''}
   //EXISTE EL CODIGO DE SEGUIMIENTO DE GOOGLE ANALYTICS
{/if}

Dentro de la primera condición, se añade un código javascript con varias funciones:

<script>
function checkNavegacion(){
[...]
crearCookie();
[...]
}

function crearCookie(){
[...]
document.cookie = "{$kadum_cookie} = "+ value +" "+ expires + "; path=/;";
}

function checkCookie()
{
var c_name    = "{$kadum_cookie}";
[...]
}

$(document).ready(function(){
//comprobar si existe la cookie
var valor    = checkCookie();
//si no existe, comprobar si se navega mediantes los enlaces
if(!valor)
valor    = checkNavegacion();
});

La función checkNavegacion, mediante la url actual (document.URL) y la url anterior (document.referrer), obtiene el dominio de sendas direcciones. Si el dominio es el mismo, implica que se ha estado navegando por la página web, en cuyo caso, se crea la cookie y se oculta el aviso.
A continuación, hay dos funciones típicas en el manejo de cookies en javascript: crearCookie y checkCookie. Que se encargan de crear una cookie o comprobar su existencia. En sendas funciones se hace uso de la variable smarty {$kadum_cookie}.

Tras el código javascript, se añaden unos estilos en línea. Donde se define el color de fondo del aviso y su opacidad, el color de la letra y el color de la sombra. Ya que son características variables, no se pueden añadir a los ficheros .css

Para más información de cómo crear la capa transparente mediante CSS, visita nuestro tips & tricks.

<style>
.informacion{
   background: rgba({$kadum_bgcolor},{$kadum_transparencia});
   color: #{$kadum_color};
   box-shadow: 0px 0 5px 0 #{$kadum_shadow};
}
.informacion a{
   color: #{$kadum_color} !important;
}
</style>

Por último, se añade la capa que contendrá el aviso.

<div class="informacion" id="kadum_cookie" >
   {$kadum_texto}
</div>

En el segundo condicional, simplemente se añade el código javascript para poder realizar el seguimiento de la tienda mediante Google Analytics. Para más información, visita el siguiente enlace.

En el código destaca el empleo de la palabra reservada {literal}{/literal} con el que se consigue que el código no se interprete, sino que se añada tal cual.

¿Qué sucedería si no se añade dicho código entre las etiquetas {literal}?
Es decir, en lugar de:

{if $kadum_codigo != ''}
{literal}
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', {/literal}'{$kadum_codigo}'{literal}, 'auto');
  ga('send', 'pageview');
</script>
{/literal}
{/if}

Se dejara:

{if $kadum_codigo != ''}
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', '{$kadum_codigo}', 'auto');
  ga('send', 'pageview');
</script>
{/if}

Activando la visualización de los errores en Prestashop en el fichero /config/defines.inc.php se obtendría el error:
Fatal error: Uncaught –> Smarty Compiler: Syntax error in template “C:\wamp\www\prestashop\modules\kadum\views\templates\front\kadum.tpl” on line 125 “(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){” – Unexpected “[“, expected one of: “}” <– thrown in C:\wamp\www\prestashop\tools\smarty\sysplugins\smarty_internal_templatecompilerbase.php on line 125

El error se produce porque las llaves del código javascript interfieren en el delimitador de las smarty. Concretamente {i[ produce el error.
Para solucionar dicha interferencia, es por lo que se añade {literal}. Opción más elegante que dejar un salto de línea (intro) entre (function(i,s,o,g,r,a,m){ y i[‘GoogleAnalyticsObject’]:

(function(i,s,o,g,r,a,m){ /* INTRO */
            i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

  ga('create', '{$kadum_codigo}', 'auto');
  ga('send', 'pageview');

 

Ficheros .css

Dentro de las etiquetas <head> se cargará el fichero abajo.css o arriba.css tal y como indica el método _hookDisplayHeader definido anteriormente.
Los ficheros .css podrían omitirse y añadir su contenido como estilos en línea dentro de kadum.tpl tal y como se ha hecho con las características background, color o box-shadow.
Sin embargo, nos ha parecido más interesante ver cómo se añade nuestro fichero css al módulo

El código del fichero arriba.css es:

.informacion{
   /* para mostrar el aviso en la parte superior */
   top:0px;
   width: 100%;
   left:0px;
   position:absolute;
   position: fixed;
   z-index: 9999;
   font-size: 14px;
   line-height: 14px;
   font-family: arial;
   text-align:center;
   display:none;
}
.informacion p{
   padding:5px 0 5px 0;
}
.informacion h2{
   padding:0;
   font-size:20px;
}
.informacion a{
   font-weight:bold;
   text-decoration:underline;
}
.informacion a:hover{
   text-decoration:none;
}

Y del fichero abajo.css:

.informacion{
   /* para mostrar el aviso en la parte inferior */
   bottom:0px;
   width: 100%;
   left:0px;
   position:absolute;
   position: fixed;
   z-index: 9999;
   font-size: 14px;
   line-height: 14px;
   font-family: arial;
   text-align:center;
   display:none;
}
.informacion p{
   padding:5px 0 5px 0;
}
.informacion h2{
   padding:0;
   font-size:20px;
}
.informacion a{
   font-weight:bold;
   text-decoration:underline;
}
.informacion a:hover{
   text-decoration:none;
}

Se observa que aunque el código HTML del módulo se añade en el hook footer, en función del fichero .css que se carga en el <head> se mostrará el aviso en la parte superior (top: 0px) o inferior (bottom: 0px).

 

Instalación y pruebas

Una vez que tenemos el módulo creado, se procede a su instalación. Aquí podrás descargar los archivos para probar el módulo directamente, en cuyo caso, se deberá guardar la carpeta kadum dentro de /modules/.

Se debe acceder al apartado de gestión de nuestra tienda Prestashop.
En el apartado módulos, se busca el módulo Prueba directamente o se accede a la categoría Análisis y estadística.

Listado de módulos

Listado de módulos

Se pulsa sobre el botón Instalar.
Puesto que no se trata de un módulo que se distribuye mediante el marketplace oficial, aparecerá el mensaje (Está tratando de instalar un módulo que no puede ser identificado como seguro por Prestashop) informando al respecto.

Módulo identificado como no seguro por Prestashop

Módulo identificado como no seguro por Prestashop

Se debe pulsar sobre Seguir con la instalación.
Se accederá al formulario de configuración donde se podrá rellenar el código de seguimiento de Google Analytics y configurar el mensaje de aviso sobre el uso de Cookies.

Configuración del módulo

Configuración del módulo

Tras pulsar Guardar, si la información introducida es correcta, aparecerá un mensaje informando sobre la actualización del módulo.
La información introducida en el formulario se almacena en las tablas ps_configuration  y ps_configuration_lang.

Tablas ps_configuration y ps_configuration_lang

Tablas ps_configuration y ps_configuration_lang

Si se accede a la tienda de Prestashop, se mostrará el aviso de la Política de Cookies. Si el pulsa sobre algún enlace, se asume que se acepta el aviso y no se volverá a mostrar más.

Aviso de cookie en la parte superior

Aviso de cookie en la parte superior

Si te parece interesante el artículo y deseas recibir futuros tutoriales, te pedimos que te hagas seguidor de nuestro Facebook pulsando sobre la parte izquierda (el icono de la  F) del siguiente botón. También podrás descargar una versión del módulo donde también se controla que el usuario de la tienda acepta las Políticas de cookie si realiza scroll.


Por favor, pulsa el botón Me gusta de facebook para hacerte seguidor de KadumWeb y poder acceder a los archivos descargables

Gracias por hacerte seguidor, pulsa aquí para acceder a los archivos descargables. Descomprime el archivo con la clave: kadummoduloPS




 

 

 

 

 

 

Volver al blog

Comentarios (31)

Wilmer dijo:

Muy bueno el tutorial, pero en que momento del install guarda los registros kadum_codigo, etc en la tabla ps_configuration?

    4dm1nk4duM dijo:

    Muchas gracias por tu comentario.

    Los datos se guardan dentro del método _postProcess.

    El método install, sólo se encarga de la instalación del módulo.
    Una vez instalado, se puede acceder a su configuración (en el listado de módulos de tu prestashop).
    En ese momento, se ejecuta el método _displayForm que muestra el formulario.
    Tras rellenar los campos del formulario y pulsar el botón Guardar, se envían los datos kadum_codigo, kadum_cookie… y son capturados por el método _postProcess.
    Dentro de ese método, mediante las llamadas:
    Configuration::updateValue(‘kadum_codigo’, Tools::getValue(‘kadum_codigo’));
    se insertan o actualizan los campos del formulario en la tabla ps_configuration

    El método que se encarga de llamar a _displayForm o _postProcess es getContent.

      Wilmer dijo:

      Gracias por responder, 4dm1nk4duM, no precisamente me refiero a cuando se realiza el update, mi consulta es que cuando instalo un nuevo módulo no encuentro la parte donde se realiza en INSERT INTO ps_configuration VALUES (null,null,’registro_nuevo_modulo’,null,null). Que será ejecutado al convocar el método install

Jose dijo:

Wilmer, creo que cuando se instala un módulo en prestashop (al menos desde la versión 1.5) no se hace una inserción en la tabla ps_configuration, sino que se refleja en la tabla ps_module. En la tabla ps_configuration se almacenan los valores de configuración de los módulos, mientras que en la tabla ps_module se almacena la relación de módulos insertados.

Cuando se ejecuta el método install de nuestra clase, puesto que extiende a la clase Module (Class kadum extends Module) aparece la sentencia parent::instal(), es decir, se llama al método install de la clase Module ubicada en la carpeta /classes/modules
En ese fichero se encuenta la inserción del módulo en la base de datos, pero como digo, en la tabla ps_module

// Install module and retrieve the installation id
$result = Db::getInstance()->insert($this->table, array('name' => $this->name, 'active' => 1, 'version' => $this->version));

No sé si esto resuelve tu duda con la instalación de un nuevo módulo en prestashop.

    Wilmer dijo:

    Estoy muy de acuerdo contigo, sin embargo estoy estancado con un problema: voy desarrollando un módulo de una nueva forma de pago que se extiende de la clase “PaymentModule” y esta se extiende de la clase “Module”.
    Necesito Agregar nuevos parámetros en “ps_configuration” pero no logro realiza esta configuración.

      Jose dijo:

      ¿Cuando instales el módulo en prestashop quieres añadir algún campo con su valor por defecto en la tabla ps_configuration?

        Wilmer dijo:

        Exacto

Jose dijo:

Cuando queremos que un módulo de prestashop haga inserciones en la tabla ps_configuration, tenemos que usar el método estático updateValue de la clase Configuration.
Configuration::updateValue('campo-personalizdo', valor);

El método updateValue, se encuentra en el fichero:
prestashop/classes/Configuration.php

En el código de ese método se comprueba si el campo-personalizado está introducido ya en la tabla ps_configuration (línea 320). Si ya existe, actualiza el valor, si no existe, lo inserta (línea 348).

if (Configuration::hasKey($key, $lang, $id_shop_group, $id_shop))
//UPDATE
else
//INSERT

Por lo tanto, si en el proceso de instalación del módulo en prestashop quieres añadir campos a la tabla ps_configuration, podrías usar:

public function install(){
return Configuration::updateValue('tu-campo', valor) &&
Configuration::updateValue('otro-campo', valor2) &&
parent::install() &&
$this->registerHook('footer') &&
$this->registerHook('header');
}

Espero haber resuelto tu duda y que puedas crear correctamente el módulo para la nueva forma de pago en Prestashop.

Jimmy dijo:

Excelente tutorial, me ha servido mucho, sin embargo creé un modulo y lo traté de instalar en un Prestashop que tengo en un servidor pero me sale este error “No tiene los permisos para actualizar el módulo. Por favor, asegurese que ha iniciado sesión en su cuenta de PrestaShop Addons con la que compró el módulo.”, pero lo instalé en un PS que tengo local y funcionó perfecto, alguna idea a que se puede deber esto??

    Jose dijo:

    Hola Jimmy. Muchas gracias por tu comentario.
    En algunas ocasiones, al instalar un módulo de Prestashop, he visto un mensaje de error que es similar al que comentas:
    Necesita iniciar sesión en su cuenta de PrestaShop Addons para actualizar los modulo-prueba módule. Haga clic aquí para iniciar sesión“.
    Te sugiero que compruebes los permisos que tiene la carpeta de tu módulo en el servidor, dentro de modules/
    Para que se pueda realizar la instalación del módulo, lo recomendable es que la carpeta del módulo y su contenido, tegan los permisos 755 (rwx r-x r-x)
    Espero que esto resuelva tu duda con la instalación.

      Jimmy dijo:

      el directorio “modules” ya tenia los permisos en 755, sin embargo con el fin de descartar como prueba lo puse en 777, volví a intentar y nada, exactamente el mismo mensaje, ya no se que hacer.

        Jose dijo:

        Voy a intentar reproducir tu error. Necesitaría saber qué versión de Prestashop utilizas. El nombre de la clase y los valores de $this->name en el constructor.

Jimmy dijo:

mira el modulo que creé lo puedes descargar desde la siguiente página http://teintegramos.com/modulo/ (twitterTI.zip) y el Prestashop que utilizo es 1.6.1.0 enserio te agradecería por que ya no se que más hacer

    Jose dijo:

    Hola de nuevo, Jimmy:
    Creo el problema de instalación del módulo se debe a que tu servidor de producción debe de ser Linux. Linux discrimina entre mayúsuculas y minúsculas para los nombres de los archivos. Windows no lo hace. Intenta, por tanto, lo siguiente:

    • Borra la carpeta del módulo que tienes en el servidor.
    • Por otro lado, en el fichero php del módulo, cambia el nombre de la clase y el valor de $this->name, déjalo todo en minúscula. De esa forma, el nombre de la clase coincide con el nombre del fichero php.
    • Por último, borra el fichero config_es.xml para que Prestashop lo regenere con el nuevo nombre.
    • Sube la carpeta con los cambios.
    • Cruza los dedos :)
    • Intenta instalarlo.

    Espero que te solucione el problema de la instalación del módulo.

      Jimmy dijo:

      Hola, si era eso, el nombre de la clase, lo puse todo en minúscula y ya funciona, mil gracias!!!!!

Jimmy dijo:

Hola, otra ves yo molestando, estoy desarrollando un nuevo modulo, pero en este voy a cargar imagenes, la función que da directamente PHP es copy($_FILES['foto']['tmp_name'],$ruta), pero nos se como obtener el objeto $_FILE en el ambiente de Prestashop, he hecho lo siguiente pero no funciona copy(Tools::getValue($_FILES['fileImagenTI1'.$id]['tmp_name']),$ruta), hay alguna función de Tools:: que me permita obtener el objeto?? muchas gracias de antemano

    Jose dijo:

    Hola Jimmy:
    Cuando he tenido que capturar imágenes en un módulo de Prestashop he usado las variables $_FILES.
    Creo que en Prestashop no existe un método en la clase Tools para obtener los valores de $_FILES. El método Tools::getValue se emplea para $_POST y $_GET, no para $_FILES. Por lo que no nos resulta útil para campos type=”file”

    Así que, para copiar imágenes enviadas por un módulo en prestashop, utilizo:
    copy($_FILES['kadum_foto']['tmp_name'], $ruta)

    Repasando diversos módulos de Prestashop que trabajan con imágenes, también usan directamente $_FILES['campo']
    Un saludo

Fabio dijo:

Hola! Una cosa, he hecho el módulo, y he cambiado algunos valores para personalizarlo. Logro instalarlo, pero una vez configurado no se muestra en el front del prestashop. ¿Es esto normal?

    Laura dijo:

    Hola Fabio:
    Creo que te puedo ayudar con un par de consejos a la hora de crear un módulo en prestashop.

    Lo primero que te recomendaría es activar el aviso de errores en prestashop. Para ello, en el fichero config/defines.inc.php modifica:
    define('_PS_MODE_DEV_', false);
    a:
    define('_PS_MODE_DEV_', true);
    Analiza el resultado.

    Por otro lado, si has modificado el hook donde se va mostrar/cargar el módulo, verifica que se esté cargando.

    Espero que te sea de ayuda y gracias por leer nuestros artículos sobre desallorro web.

      Fabio dijo:

      Hola Laura!

      Ante todo darte las gracias por responderme, y también por los buenos contenidos que compartiis con nosotros. Yo hace poco que os leo pero ya os tengo en mi feed ;)

      Por otro lado volviendo al tema del error, he activado el Debug pero no veo ningún error en pantalla. No he modificado el Hook de prestashop, de hecho es un entorno de prueba con un prestashop recién instalado y sin modificar, se instaló con el contenido de prueba y el módulo de cookies que hemos programado. Te dejo el enlace del módulo por si pudieras hecharle un ojo. Me interesaría comprender el fallo porque no lo veo XDDD

      Muchas gracias de antemano!

Laura dijo:

Hola Fabio:
Repasando el código del módulo de prestashop que nos has pasado, hemos visto que la estructura de carpetas del módulo no es correcta.
El fichero .tpl lo tienes dentro de:
/view/template/front/archivo.tpl
Debería ir en:
/views/templates/front/archivo.tpl

Para solucionarlo, tendrías que desinstalar y eliminar el módulo.
Hacer el cambio. Volver a generar el archivo zip y proceder a instalarlo.

Esperamos que puedas construir satisfactoriamente tu módulo en prestashop ;)

Nota: Hemos eliminado tu enlace al Drive.

    Fabio dijo:

    Muuuuchas gracias Laura! Resulta que era una tontería al final jejeje. Os juro que lo remiré 999 veces y no me dí cuenta!!

    Gracias una vez más por el tiempo invertido en mí directamente, y por el tiempo que dedicáis a darnos buenos contenidos! :D

      Laura dijo:

      No hay de qué :)

LibertoBrand dijo:

Buenas tardes,
Primero felicitarte ya que es de los pocos tutoriales que he encontrado que merecen la pena, dicho esto te comento una duda:

Como puedo añadir un fichero .tpl en la funcion getContent para que salga por ejemplo un tutorial de como instalar y configurar dicho modulo, enlaces a zonas de mi web, etc..etc..

He visto algo la web de prestashop de module generator pero la verda que no se interpretar muy bien el codigo ya que PHP y smarty es mi asigantura pendiente:

public function getContent()
{
/**
* If values have been submitted in the form, process.
*/
if (((bool)Tools::isSubmit(‘submitBuhocModule’)) == true) {
$this->postProcess();
}

$this->context->smarty->assign(‘module_dir’, $this->_path);

$output = $this->context->smarty->fetch($this->local_path.’views/templates/admin/configure.tpl’);

return $output.$this->renderForm();
}
Gracias
cuando acabe el modulo lo subiere para compartirlo con todos..

Jose dijo:

Hola LibertoBrand, ante todo muchas gracias por tus felicitaciones.

Hay varias opciones. Te comento paso a paso la siguiente:
Para añadir un fichero .tpl en el método getContent del módulo tendrías que:
1. Crear el fichero tpl. Una ubicación siguiendo con la estructura de este tutorial podría ser: kadum/views/templates/admin/_configure.tpl

2. En el método getContent, has de llamar al método createTemplate del objeto smarty y al método fetch. Opcionalmente se puede usar el método assign para enviar variables desde php a la plantilla tpl.

Un posible código podría ser:
public function getContet(){
//Definir la ruta del fichero tpl
$ruta_tpl = _PS_MODULE_DIR_ .'kadum/views/templates/admin/_configure.tpl';

//Crear la plantilla
$tpl = $this->context->smarty->createTemplate($ruta_tpl);

//Pasar variables a la plantilla
$tpl->assign(
array(
'kadum_variable1' => 'VALOR FIJO',
'kadum_variable2' => Configuration::get('kadum_codigo'),
'kadum_variablen' => Configuration::get('kadum_codigo')
)
);
//Obtener la plantilla propiamente dicha
$this->_html .= $tpl->fetch();

//se puede concatenar mas informacion al atributo _html
// o tener en cuenta Tools::isSubmit('btnSubmit')...

return $this->_html;
}

Espero que te sea de ayuda :)

En la página oficial de smarty, se explican detalladamente los métodos de smarty:

  1. createTemplate
  2. fetch
  3. assign
Luisa dijo:

Gracias por el tutorial, me sacaste de varias dudas. Esta muy bien explicado

    Laura dijo:

    Gracias a ti

Sonnnia dijo:

Me ha encantado el tutorial! De los pocos que he encontrado (por no decir el único). MUY BIEN EXPLICADO TODO.

Enhorabuena y ojalá sigáis publicando más tutoriales como este sobre programación para Prestashop.

    Laura dijo:

    Gracias Sonnia.
    Precisamente la intención de este tutorial fue complementar la información que en internet se encuentra sobre Prestashop en español.
    Tus palabras de agradecimiento, nos motivan para pensar en nuevos tutoriales de Prestashop.
    Saludos.

Lucas dijo:

Genial la explicación!, podrían actualizarla para PS 1.7? ya que no funciona en el front-office.

Saludos!

    Laura dijo:

    Hola, Lucas:
    Estamos limpiando los flecos de un tutorial sobre ajax a petición de unos amigos. En cuanto dé la luz, comenzamos con el nuevo tutorial para la construcción de módulos en la versión de prestashop 1.7.
    Muchas gracias por la sugerencia

Leave a Reply to Jimmy Cancelar