• Publicidad

Cómo obtener el valor DEFAULT de HTML::Template

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Cómo obtener el valor DEFAULT de HTML::Template

Notapor danimera » 2010-01-21 09:15 @427

Luego de resolver el problema de DEFAULT, ahora no he podido obtener ese valor desde la plantilla. Lo que deseo es procesar ese valor en Perl. Ejemplo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
<TMPL_VAR NAME="PARAM" DEFAULT="100% Telch">
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $value = $self->param('PARAM');

print $value; # 100% Telch
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Pienso que $value debería ser el valor DEFAULT que tiene la etiqueta en la plantilla pero no lo logro... ¿Alguien ha hecho algo similar o tiene idea de cómo realizarlo?
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia

Publicidad

Re: Como obtener el valor DEFAULT de HTML::Template

Notapor explorer » 2010-01-21 12:12 @550

No, el módulo no hace eso.

A la hora de la interpretación de la plantilla, HTML::Template va guardando en un array todos los elementos de la plantilla. Cuando se encuentra con una TMPL_VAR que tiene un atributo DEFAULT, primero guarda el valor por defecto y luego el valor de la variable. Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
5  HTML::Template::DEFAULT=SCALAR(0x84a0dd8)
   -> 'devil'
6  HTML::Template::VAR=SCALAR(0x8523d10)
   -> 'valor puesto por param("WHO")'
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Pero no "almacena" el valor de por defecto, como si fuera el valor de la variable. Solo lo deja en la lista de elementos de la plantilla.

A la hora de sacarlo en pantalla o fichero, llamando con output(), recorre el array, y al encontrarse con un objeto HTML::Template::DEFAULT, imprime su valor, salvo que el elemento siguiente tengo un valor definido (ver código de HTML::Template entre las líneas 2768 y 2785).

Una posible forma de hacerlo, es accediendo a ese array interno y localizar el elemento HTML::Template::DEFAULT:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl  -MHTML::Template -le '$tmpl = HTML::Template->new(filename=>"code_20732.html"); for (@{$tmpl->{parse_stack}}) { if (ref eq "HTML::Template::DEFAULT") { print $$_ }}'
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Pero, claro, este método no es estándar, es peligroso porque accedemos directamente a las estructuras internas del módulo, y por eso podría fallar en la siguiente versión del módulo.

Además, tampoco nos serviría si existiera más de una variable con valores por defecto.

En ningún momento, el valor de DEFAULT entra como valor de la variable, así que es inútil acceder a los valores puestos con param(). Si hacemos una prueba con
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl  -MHTML::Template -le '$tmpl = HTML::Template->new(filename=>"code_20732.html"); $tmpl->param(WHO=>"valor puesto desde param()"); print ${$tmpl->{param_map}{who}}'
valor puesto desde param()
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sí que vemos cómo sacar el valor de la variable. Pero, si ahora hacemos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
perl  -MHTML::Template -le '$tmpl = HTML::Template->new(filename=>"code_20732.html"); print ${$tmpl->{param_map}{who}}'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

No sale nada, porque el módulo no ha guardado el valor por defecto en él. Está vacío. El procesamiento del valor por defecto lo hará solo en el momento de la salida.

Una manera ingeniosa sería colocando un valor especial a la variable WHO. Luego, recorrer el array que guarda los elementos de la plantilla y localizarlo. Si lo encontramos, el valor por defecto será justo el valor anterior del array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -l
  2. use strict;
  3. use warnings;
  4. use diagnostics;
  5.  
  6. use HTML::Template;
  7.  
  8. my $tmpl = HTML::Template->new(filename=>"code_20732.html");        # cargamos la plantilla
  9.  
  10. $tmpl->param(WHO=>"BANDERA");                                       # le ponemos un valor ficticio
  11.  
  12. for my $i (0 .. $#{$tmpl->{parse_stack}}) {                         # recorremos toda la pila
  13.  
  14.     my $v = $tmpl->{parse_stack}[$i];                               # elemento $i-ésimo
  15.  
  16.     if (ref $v eq "HTML::Template::VAR"                             # si es una TMPL_VAR
  17.     and $$v                                                         # con un valor puesto
  18.     and $$v eq "BANDERA") {                                         # y ese valor es nuestro valor ficticio
  19.  
  20.         print ${$tmpl->{parse_stack}[$i-1]};                        # el valor por defecto está una posición antes
  21.     }
  22. }
  23.  
  24. __END__
  25. devil
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Repito que esto es lo que NO hay que hacer, porque te arriesgas a que no funcione en la siguiente versión.

Algo parecido a lo que quieres hacer se podría conseguir con el módulo HTML::Template::Set, que funciona igual que el HTML::Template, pero además incorpora la etiqueta TMPL_SET, con la que puedes dar valores a las variables de la plantilla desde la propia plantilla.

Y otra opción... es leer la plantilla e interpretarla con alguna expresión regular.

En CPAN hay más variantes de HTML::Template, con más funcionalidades.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo obtener el valor DEFAULT de HTML::Template

Notapor danimera » 2010-01-21 13:50 @618

Bueno, toca buscar otra forma de emular lo que está haciendo.

Gracias.
100% Telch - Perl Web Programming
Cali PerlMongers: http://cali.pm.org
Avatar de Usuario
danimera
Perlero frecuente
Perlero frecuente
 
Mensajes: 871
Registrado: 2005-06-23 19:02 @834
Ubicación: Colombia


Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 4 invitados

cron