[
Para evitar que en este foro salgan con marcas las direcciones electrónicas (las direcciones de correo incluidas), solo tienes que marcar la opción «No convertir automáticamente las URLs» que se encuentra debajo de la caja de edición.]
Creo que ya he encontrado el error...
Estás usando Template Toolkit (TT), a través del módulo
Template, en la línea 5.
En el método start(), creas un objeto Template, y en la línea 45 llamas a process().
GI::Application (C::A) requiere que lo que retorne de los métodos, es el texto que deberá aparecer como página HTML. Tú lo haces bien con el return(), esperando que
$template->process($plantilla), genere el resultado, y con el return, C::A lo tome y lo muestre en la ventana del navegador del usuario.
Y aquí está el fallo: process()
NO devuelve el código HTML de la plantilla. Solo devuelve un '1' para indicar el éxito de la llamada. Lo que realmente hace process(), es procesar la $plantilla, y
sacar el resultado directamente a la salida estándar.
Y eso es lo que ocurre: estás viendo que sale el contenido de la página primero (por efecto del process()), y luego sale la cabecera HTTP al final (porque es lo que C::A siempre hace antes de la salida del código HTML).
Así que el resultado es que estás generando la salida hacia el navegador en vez de dárselo a C::A, para que éste saque todo en el orden correcto.
Hay dos opciones básicas para resolver esto.
La primera: hacer que TT nos devuelva el resultado a una variable escalar en lugar de a la salida estándar, y eso es lo que regresaremos a C::A:
Using perl Syntax Highlighting
# Procesamos la salida de la plantilla
my $salida = '';
$template->process('formulario.html', {}, \$salida);
return $salida;
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
La segunda opción es mejor: usar
CGI::Application::Plugin::TT.
Quitas el 'use Template;' y todo el código de creación de objetos Template, y pones en su lugar 'use CGI::Application::Plugin::TT;' y más tarde, dentro de los métodos
Using perl Syntax Highlighting
return $self->tt_process('formulario.html');
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Y ya está. Es un módulo muy cómodo. Incluso si llamas a las plantillas con el mismo nombre que los
runmode, puedes simplificar la llamada a tt_process(), sin indicarle ningún argumento.