From emhn at telcel.net.ve Fri Jun 6 10:55:19 2003 From: emhn at telcel.net.ve (Ernesto Hernandez-Novich) Date: Wed Aug 4 23:59:38 2004 Subject: [l-desarrollo] =?iso-8859-1?Q?=5BP=5D_t=E9cnicas_para_programar_CGIs_=28perl?= =?iso-8859-1?Q?=29?= In-Reply-To: Message-ID: 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 colocando en el cuerpo: "UNSUBSCRIBE caracas-pm-list" para desuscribirse. "INFO caracas-pm-list" para conocer las reglas de etiqueta. ------------------------------------------------------------------------