[l-desarrollo] [P] técnicas para programar CGIs (perl)

Ernesto Hernandez-Novich emhn at telcel.net.ve
Fri Jun 6 10:55:19 CDT 2003


On Wed, 4 Jun 2003, Juan Luis Zamora wrote:
> Estoy haciendo un proyecto personal el cual incluye un perl-CGI, y estoy
> trancando en como hacer para que dada una página de resultados generadas
> por el mismo CGI, vaya a otra o regrese a la inicial en base a algún input
> del usuario.
[...]
> Hasta la pagina2 todo funciona bien, la cosa es que quisiera de ahí
> colocar otro submit button y quizá otro textfield para quizá colocar un
> email address y de ahi enviar el resultado vía smtp, pero al ejecutar ese
> submit en página2 me parece comenzará {I} de nuevo, inicializando el
> objeto CGI.
>
> Así que pensé (erroneamente) que si declarara otro objeto CGI y
> hacer:
>
> unless ($query2->param) {
> 	{I}($query2,$query)
> } else {
> 	pagina3($query2)
> }
>
> pero de alguna manera si no declaraba el nuevo query object vacio (my
> $query2 = new CGI({}), siempre se iba a pagina3 de una, sin pasar por (I).
>
> En fin queria pedirles alguna sugerencia en alguna técnica de programación
> de CGIs para saber como hacer eso de una manera mas elegante ya que
> obviamente ignoro como pasan las cosas cuando ocurre un 'submit'.

Particularmente implemento esto con una tabla de despacho donde asocio
los nombres de rutinas a los posibles valores que tendrá el campo oculto
'destino' que viene de la forma.

%pagina {
  'Principal' => \&pinta_pagina_principal,
  'Primera'   => \&pinta_primera_pagina,
    ...
  'Ultima'    => \&pinta_ultima_pagina,
};
$destino = $q->param('destino');
if (defined($pagina{$destino})) {
  $pagina{$destino}->();    # Ejecutar función vía referencia.
} else {
  no_existe_la_pagina();
}

Usar campos ocultos es _mucho_ más robusto y profesional que utilizar
cookies para guardar la información persistente entre pantallas, además
de permitir que sean protegidas sobre SSL en caso de ser crítica la
privacidad.

El punto es, ¿cómo implementar el campo 'destino' de manera que sea
oculto, pero que pueda estar asociado a botones diferentes? Fácil: una
forma HTML puede tener todos los botones que uno quiera, siempre y
cuando se les cambie el nombre a cada uno, por tanto puedes hacer

print $q->submit(-name => 'destino', -value => 'Principal')

para crear un botón que cuando sea oprimido asocie el valor 'Principal'
al parámetro 'destino'. Con medio dedo de frente se intuye la necesidad
de escribir una función

sub topage { print $q->submit(-name => 'destino', -value => shift) }

y luego en tu programa principal haces cosas como

topage('Principal');
topage('Primera');
topage('Ultima');

y tienes tres botones, cada uno de los cuales al ser oprimido asocia
valores diferentes al parámetro 'destino', haciendo que el bloque de
código inicialmente propuesto actúe como deseas.

Si necesitas que algunos campos de información sean transferidos entre
pantallas, tienes que asegurarte que una vez tomados son preservados
como campos hidden de manera que se trasladen entre invocación e
invocación.
-- 
Ernesto Hernández-Novich - Running Linux 2.4.19 i686 - Unix: Live free or die!
Geek by nature, Linux by choice, Debian of course.
If you can't apt-get it, it isn't useful or doesn't exist.
GPG Key Fingerprint = 438C 49A2 A8C7 E7D7 1500 C507 96D6 A3D6 2F4C 85E3
¿Sabe leer? Elimine mi firma de sus respuestas; sé quién soy ;)

------------------------------------------------------------------------
Enviar e-mail a <majordomo at pm.org> colocando en el cuerpo:
"UNSUBSCRIBE caracas-pm-list" para desuscribirse.
"INFO caracas-pm-list" para conocer las reglas de etiqueta.
------------------------------------------------------------------------



More information about the caracas-pm mailing list