Jump to content

¿Como cargar authentication.tpl desde un módulo? (Override)


GKentaurus

Recommended Posts

Hola a todos:

He estado buscando por cielo, tierra y mar una solución al siguiente inconveniente, pero primero les haré una pequeña introducción a lo que estoy haciendo:

 

Me encuentro desarrollando un módulo para la versión de Prestashop 1.6.1.17 (Last Stable), que permita subir los productos, los clientes y las ventas procesadas y debidamente pagadas, a un sistema de Facturación Electrónica. Este sistema de facturación, al igual que por requerimientos legales de mi país (Colombia), se debe solicitar 3 cosas, que no son soportadas directamente por los formularios de registro de Prestashop:

  • Tipo de persona (Persona Natural o Persona Jurídica)
  • Tipo de Documento (Cédula de Ciudadanía, Cédula de Extranjería, etc)
  • Número de Documento

Se que ya alguno en este momento, tiene en mente "Tranquilo, en el formulario de Direcciones (Address) hay un campo para eso ;)", pero el problema es, que ese campo llamado "Identificación" no me sirve, puesto que en cada dirección, la identificación puede ser distinta, y el objetivo de una identificación es que sea único.

 

He podido adelantar absolutamente todo (incluso alterar la tabla Customer para añadir estas 3 columnas, sin la necesidad dañar absolutamente nada hasta el momento), he logrado hacer un Override de la clase Customer y del FrontController AuthController para agregar mas variables a la hora de modificar el formulario, pero mi problema viene intentando modificar este formulario:

 

post-784202-0-67927600-1505736432_thumb.jpeg

Y se que más de uno tiene en mente "Tranquilo, ve a themes/default-bootstrap/, busca el archivo authentication.tpl, modifícalo a tu gusto y ya", para lo cual les digo, tienen toda la razón... ese es el archivo. Pero mi objetivo es que ese formulario no cargue desde esa dirección, sino desde la dirección que yo establezco en mi módulo:

 

Código original de AuthController:

// Just set $this->template value here in case it's used by Ajax
$this->setTemplate(_PS_THEME_DIR_.'authentication.tpl');

Código del Override de AuthController:

// Just set $this->template value here in case it's used by Ajax
$module_dir_override_tpl = _PS_MODULE_DIR_ . 'my-module/views/templates/front/override/';
$this->context->smarty->assign('mts_dir', $module_dir_override_tpl);

$this->setTemplate($module_dir_override_tpl . 'authentication.tpl');

La diferencia fue directamente asignar a una variable el directorio de Prestashop para los módulos (cambiando las constantes definidas "_PS_THEME_DIR_" por "_PS_MODULE_DIR_"), agregándole la ruta completa del archivo.

 

Por motivos de seguridad, hice el override completo para que no salieran problemas, y solo modifiqué las líneas que les comenté (es como haber editado en el archivo original, la función mencionada)

 

Hasta ahí vamos bien, porque cuando se accede a la sección de Iniciar Sesión, todo carga como debe ser. Carga "inicialmente" esta sección .

Confirmado que el archivo carga desde modules/my-module/views/templates/front/override/authentication.tpl 

 

post-784202-0-41410100-1505737033_thumb.jpeg

 

Si le modifico un titulo o añado algo ahí, funciona de maravilla, pero el problema radica a partir de cuando doy clic en el botón "Crear cuenta":

Confirmado que el archivo carga desde themes/default-bootstrap/authentication.tpl (ya les digo por qué)

 

post-784202-0-67927600-1505736432_thumb.jpeg

 

Vuelve y aparece todo lo que está en el archivo original, y no lo que está en mi archivo modificado.

 

Después de muchas horas de darle vueltas a eso, y por querer descartar las cosas definitivamente, modifiqué el archivo

themes/default-bootstrap/authentication.tpl

por

themes/default-bootstrap/authentication2.tpl

Y cuando fui a dar clic nuevamente en Crear cuenta, sale este error:

 

post-784202-0-83018900-1505737479_thumb.jpeg

 

Me puse a buscar con un editor de código si existía algún {include} de algún TPL (template de Smarty) adicional, pero solo hay Hooks, condicionales y el formulario que necesito que cargue.

Quizás me falte revisar los Hooks, si es que es verdaderamente necesario implementar uno (ya que en sí el funcionamiento del código esta entre el BackOffice y el FrontOffice, sin ningún hook, excepto el DisplayHeader, tranquilos, no es necesario ningún otro, solo es para cargar css y js... creo)

 

¿Habrá algun JavaScript que esté cargando el formulario original desde el tema y no desde el módulo?
Me atrevo a echarle la culpa a un JS porque el error que sale es "después" de que se carga el formulario... si hubiese un error, no cargaría nada en la página... una página en blanco nada mas (o en el peor de los casos, un error 500).

 

Y el otro problema que tengo (ya en menor grado) es, ¿Por qué cuando desinstalo el módulo, no quita todos los archivos correspondientes de la carpeta Override? Borrar el class_index.php de la carpeta cache se que es manual y obligatorio, pero solo el override de Customer es el que se queda ahí.

 

De antemano, gracias.

Edited by GKentaurus (see edit history)
Link to comment
Share on other sites

Me voy respondiendo a mi mismo:

 

¿Habrá algun JavaScript que esté cargando el formulario original desde el tema y no desde el módulo?

Me atrevo a echarle la culpa a un JS porque el error que sale es "después" de que se carga el formulario... si hubiese un error, no cargaría nada en la página... una página en blanco nada mas (o en el peor de los casos, un error 500).

 

Si, es el archivo themes/default_bootstrap/js/authentication.js

Está enviando por Ajax el correo electrónico para validar si el correo ya existe o no.

 

La función initContent(), processSubmitLogin() processSubmitAccount() están enviando por la información, por medio de $this->AjaxDie(Tools::jsonEncode($return)); principalmente para los errores...

Iré comentando mientras voy avanzando.

Link to comment
Share on other sites

Creo que esto es una buena noticia:

 

Encontré este código cerca de la linea 165 en AuthController:

$return = array(
    'hasError' => !empty($this->errors),
    'errors' => $this->errors,
    'page' => $this->context->smarty->fetch($this->template),
    'token' => Tools::getToken(false)
);

$this->ajaxDie(Tools::jsonEncode($return));

Bueno... $this->template debería contener el template que he colocado antes (pero no, es una mentira, y no se por qué) y contiene el original authentication.tpl.

 

Ahora, en el archivo authentication.js, ubicado en el carpeta JS del tema, encontré este script:

function submitFunction() {
    $('#create_account_error').html('').hide();
    $.ajax({
        type: 'POST',
        url: baseUri + '?rand=' + new Date().getTime(),
        async: true,
        cache: false,
        dataType: "json",
        headers: {"cache-control": "no-cache"},
        data:
            {
                controller: 'authentication',
                SubmitCreate: 1,
                ajax: true,
                email_create: $('#email_create').val(),
                back: $('input[name=back]').val(),
                token: token
            },
        success: function (jsonData) {
            console.log(jsonData);
            if (jsonData.hasError) {
                var errors = '';
                for (error in jsonData.errors)
                    //IE6 bug fix
                    if (error != 'indexOf')
                        errors += '<li>' + jsonData.errors[error] + '</li>';
                $('#create_account_error').html('<ol>' + errors + '</ol>').show();
            }
            else {
                // adding a div to display a transition
                $('#center_column').html('<div id="noSlide">' + $('#center_column').html() + '</div>');
                $('#noSlide').fadeOut('slow', function () {
                    $('#noSlide').html(jsonData.page);
                    $(this).fadeIn('slow', function () {
                        if (typeof bindUniform !== 'undefined')
                            bindUniform();
                        if (typeof bindStateInputAndUpdate !== 'undefined')
                            bindStateInputAndUpdate();
                        document.location = '#account-creation';
                    });
                });
            }
        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            error = "TECHNICAL ERROR: unable to load form.\n\nDetails:\nError thrown: " + XMLHttpRequest + "\n" + 'Text status: ' + textStatus;
            if (!!$.prototype.fancybox) {
                $.fancybox.open([
                        {
                            type: 'inline',
                            autoScale: true,
                            minHeight: 30,
                            content: "<p class='fancybox-error'>" + error + '</p>'
                        }],
                    {
                        padding: 0
                    });
            }
            else
                alert(error);
        }
    });
} 

Cuando el controller "authentication" (de acuerdo a lo que he visto, sería el mismo AuthController, pero no se por qué tienen diferente nombre) retorna o responde con un success sobre el Ajax, captura u obtiene todo el código HTML del archivo authentication.tpl por esta linea mostrada en el primer código de esta respuesta:

'page' => $this->context->smarty->fetch($this->template),

Y almacenada en jsonData.page, para ser enviado por la función de JQuery ".html()"

 

Imprimiendo con console.log(jsonData), obtengo esto:

{hasError: false, errors: Array(0), page: "<h1 class="page-heading">Crear una cuenta</h1>↵↵↵    …sup>Campo requerido</span></p>↵        </div>↵    </form>↵", token: "870c36a04fc1d9b250707cdd6c7ca583"}

En este JSON, ustedes pueden ver la llave page del array.

 

Pero me sigo preguntando... "si coloqué mi propio template, ¿Por qué el AuthController sigue usando el archivo authentication.tpl por defecto?

 

Gracias chicos,... son lo máximo...

Intentaré reemplazar en el override

$return = array(
    'hasError' => !empty($this->errors),
    'errors' => $this->errors,
    'page' => $this->context->smarty->fetch($this->template),
    'token' => Tools::getToken(false)
);
$this->ajaxDie(Tools::jsonEncode($return));

$this->template por la dirección de mi propia plantilla.

 

Sigan conectados en este. Pronto encontrarán mas noticias sobre este problema.

Edited by GKentaurus (see edit history)
Link to comment
Share on other sites

Buenas noticias amigos:

 

Intentaré reemplazar en el override

$return = array(
    'hasError' => !empty($this->errors),
    'errors' => $this->errors,
    'page' => $this->context->smarty->fetch($this->template),
    'token' => Tools::getToken(false)
);
$this->ajaxDie(Tools::jsonEncode($return));

$this->template por la dirección de mi propia plantilla.

 

Sigan conectados en este. Pronto encontrarán mas noticias sobre este problema.

 

Confirmado: Esta linea de código añade todo el contenido HTML del archivo authentication.tpl al formulario de registro!

 

 

Tu, pequeño pedazo de código...

Sabiendo esto, ahora si necesito hacer mas pruebas, si modificando el archivo authentication.tpl, cambia para agregar los campos que necesito.
 
Por otro lado, la pregunta que era de menor importancia, pasa a tener mayor relevancia:
¿Por qué el override de AuthController no funciona correctamente? Solo está haciendo override a lo que quiere y no a lo que necesito.
 
Sigan conectados en este. Pronto encontrarán mas noticias sobre este problema.
Edited by GKentaurus (see edit history)
Link to comment
Share on other sites

:wub:  he seguido este hilo, auto respondido :D  interesante deducciones ¿ha logrado lo que deseaba?


Cien años de soledad
Gabriel García Márquez

..José Arcadio Buendia...Cuando se hizo
experto en el uso y manejo de sus instrumentos, tuvo una noción del espacio que le permitió
navegar por mares incógnitos, visitar territorios deshabitados y trabar relación con seres
espléndidos, sin necesidad de abandonar su gabinete. Fue ésa la época en que adquirió el hábito
de hablar a solas, paseándose por la casa sin hacer caso de nadie, mientras Úrsula y los niños se
partían el espinazo en la huerta cuidando el plátano y la malanga, la yuca y el ñame, la ahuyama
y la berenjena. De pronto, sin ningún anuncio, su actividad febril se interrumpió y fue sustituida
por una especie de fascinación. Estuvo varios días como hechizado, repitiéndose a sí mismo en
voz baja un sartal de asombrosas conjeturas, sin dar crédito a su propio entendimiento. Por fin,
un martes de diciembre, a la hora del almuerzo, soltó de un golpe toda la carga de su tormento.
Los niños habían de recordar por el resto de su vida la augusta solemnidad con que su padre se
sentó a la cabecera de la mesa, temblando de fiebre, devastado por la prolongada vigilia y por el
encono de su imaginación, y les reveló su descubrimiento.
-La tierra es redonda como una naranja.
Úrsula perdió la paciencia. «Si has de volverte loco, vuélvete tú solo -gritó-. Pero no trates de
inculcar a los niños tus ideas de gitano.» José Arcadio Buendía, impasible, no se dejó amedrentar
por la desesperación de su mujer, que en un rapto de cólera le destrozó el astrolabio contra el
suelo. Construyó otro, reunió en el cuartito a los hombres del pueblo y les demostró, con teorías
que para todos resultaban incomprensibles, la posibilidad de regresar al punto de partida
navegando siempre hacia el Oriente. Toda la aldea estaba convencida de que José Arcadio
Buendía había perdido el juicio, cuando llegó Melquíades a poner las cosas en su punto. Exaltó en
público la inteligencia de aquel hombre que por pura especulación astronómica había construido
una teoría ya comprobada en la práctica, aunque desconocida hasta entonces en Macondo...

en AuthController.php puede observar en la function setMedia los archivos js que intervienen en el asunto!!

para eliminar un archivo use Tools::deleteFile  incluso puede excluir. con la misma function.

 

En su archivo utilice function setMedia para cargar js o css de su modulo.

con respecto al template  en su override adicione:

$this->setTemplate(__FILE__, 'views/templates/front/override/authentication.tpl');
si no le funca pruebe con $this->_path.'views/templates/front/override/authentication.tpl'

antes de

$return = array(
'hasError' => !empty($this->errors),
'errors' => $this->errors,
'page' => $this->context->smarty->fetch($this->template),
'token' => Tools::getToken(false)
);
$this->ajaxDie(Tools::jsonEncode($return));

:rolleyes:  unas ideas para que siga que quiero ver como termina..

 

saludos!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...