• Publicidad

Ejemplo de AJAX en Perl

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Ejemplo de AJAX en Perl

Notapor Negrazo » 2012-10-11 22:19 @972

Hola, Perleros de todo el mundo.

Tengo un programa en el que mis usuarios seleccionan de 3 scrolling_lists los campos siguientes de una aplicación:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
Carrera Universitaria(BIOLOGIA,HISTORIA,MATEMATICAS,IDIOMAS)
Grado(Primero,Segundo,Tercero,.....,Noveno)
Grupo(A,B,C,D)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


Basándome en los dos primeros (Carrera y Grado), yo necesito desplegar en la misma pantalla, las Materias relativas a ese par de argumentos, esto es algo como:

Select materia from materias where carrera='$carrera' and grado='$grado' order by materia

El resultado debería ser un cuarto scrolling_list en el cual se muestren las Materias de esa Carrera y de ese Grado unicamente.

Actualmente el proceso lo tengo dividido en dos pantallas. En la primera pido Carrera y Grado, le doy Submit y en la segunda ya proceso mi query con los dos argumentos recibidos, pero lo quiero optimizar en un solo paso.

¿Alguien tiene algún ejemplo de algo parecido a esto?, pues en la Web solo he hallado ejemplos muy sencillos en los cuales se captura un campo de entrada y con este se hacen varias cosas, pero no he podido encontrar algo ni remotamente parecido a lo que busco.

Estoy utilizando o tratando mejor dicho, el módulo CGI::Ajax.

Ojalá alguien pueda ayudarme en este problemita.

Gracias desde Guadalajara, México.
Negrazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 100
Registrado: 2006-12-28 12:51 @577
Ubicación: Guadalajara, Mexico

Publicidad

Re: Ejemplo de AJAX en Perl

Notapor explorer » 2012-10-11 22:25 @976

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: Ejemplo de AJAX en Perl

Notapor Negrazo » 2012-10-12 13:59 @624

explorer: muchas gracias por tu ayuda. Eso es lo que andaba buscando; ya lo probé y funciona de maravilla. Ahora déjame adaptarlo a un tercer scrolling_list y luego te platico cómo me fue.

Este fin de semana trabajaré duro en esta tarea y me tomaré 2 o 3 tequilas a tu salud.

Recibe un gran saludo desde Guadalajara, México.
Negrazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 100
Registrado: 2006-12-28 12:51 @577
Ubicación: Guadalajara, Mexico

Re: Ejemplo de AJAX en Perl

Notapor Negrazo » 2012-10-17 18:34 @815

Estimados amigos:

Llevo varios días tratando de implementar Ajax en un script de Perl y no he tenido éxito.

El asunto es este:

En la primera pantalla, pido un Código de Alumno, el cual después de ser tecleado, me sirve para obtener el Nivel (Carrera) y el Grado del Alumno del archivo de Alumnos.

Los datos son obtenidos con éxito y los despliego, así como sus referencias y sus des-referencias y todo se ve bien.

Con estos dos campos, voy a leer del archivo Materias, las materias que corresponden a ese Nivel y Grado, para que el usuario seleccione una, que se pasará al siguiente script.

Mas sin embargo, estos campos ($nivel, $grado y $grupo) los intento pasar a la rutina que muestra el HTML y pues no he podido.

Este script me sirve para la captura de faltas por alumno de cada una de las materias que cursa.

Aquí pego el código del script capt_faltas.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #! /usr/bin/perl  -w
  2.  
  3. use CGI;
  4. use CGI::Ajax;
  5. use DBI;
  6. use CGI::Session;
  7.  
  8. #use CGI::Carp qw(fatalsToBrowser);
  9. use CGI qw(param uploadInfo);
  10. use Encode;
  11.  
  12. print "Content-type: text/html;charset=UTF-8\n\n";
  13.  
  14. my $cgi       = new CGI;
  15. my $CGISESSID = $cgi->param('CGISESSID');
  16. my $nivel     = "";
  17. my $grado     = "";
  18. my $grupo     = "";
  19. my $refniv    = "";
  20. my $refgra    = "";
  21. my $refgru    = "";
  22. my $session   = CGI::Session->load( "driver:File", $CGISESSID, { 'Directory' => '/tmp/' } )
  23.     or die CGI::Session->errstr;
  24.  
  25. my $pjx = new CGI::Ajax( 'js_func' => \&perl_func, 'skip_header' => 1, );
  26. print $pjx->build_html( $cgi, \&Show_HTML );
  27.  
  28. sub perl_func {
  29.     my $input = shift;
  30.  
  31.     # Configurar el acceso a la DB
  32.     my $con = DBI->connect( 'DBI:mysql:database=victoria;host=localhost', 'root', 'root' )
  33.         or die('Cannot connect to DB');
  34.     my $sth = $con->prepare("SELECT nivel,grado,grupo FROM alumnos where codigo = ? ");
  35.     $sth->execute($input) or die "Error al leer Alumnos...!";
  36.  
  37.     my $stream_select = "<select name='sel_alumnos'>";
  38.     my @doc           = $sth->fetchrow_array;
  39.     $nivel = $doc[0];
  40.     $grado = $doc[1];
  41.     $grupo = $doc[2];
  42.     print $nivel . "<BR>";
  43.     print $grado . "<BR>";
  44.     print $grupo . "<BR>";
  45.     print "<BR>";
  46.     $refniv = \$nivel;
  47.     $refgra = \$grado;
  48.     $refgru = \$grupo;
  49.     print $refniv . "<BR>";
  50.     print $refgra . "<BR>";
  51.     print $refgru . "<BR>";
  52.     print "<BR>";
  53.     print $$refniv . "<BR>";
  54.     print $$refgra . "<BR>";
  55.     print $$refgru . "<BR>";
  56.  
  57.     my $sql1 = qq< SELECT  clave,descripcion FROM materias where nivel = ? and grado = ? order by sortgral >;
  58.     my $dbh1 = DBI->connect( 'dbi:mysql:victoria:localhost', 'root', 'root' );
  59.     my $sth1 = $dbh1->prepare($sql1);
  60.     $sth1->execute( $nivel, $grado );
  61.  
  62.     while ( @doc1 = $sth1->fetchrow_array ) {
  63.         my $clave  = $doc1[0];
  64.         my $desc   = $doc1[1];
  65.         my $clave1 = encode( "UTF-8", $clave );
  66.         my $desc1  = encode( "UTF-8", $desc );
  67.  
  68.         $stream_select .= "<option value=\"$clave1 . $desc1\">$clave1 . $desc1</option>\n";
  69.  
  70.     }
  71.     $stream_select .= "</select>";
  72.     return ($stream_select);
  73. }
  74.  
  75. sub Show_HTML {
  76.     my $html = <<EOHTML;
  77.      <HTML>
  78.      <BODY>
  79.      <FORM>
  80.      <p align='center'><img src='logo1.GIF' border='0' name='banner' ></p><BR>
  81.      <H2 align='center'><B>Modulo de Calificaciones</B></H2>
  82.      <H3 align='left' ><B>Faltas</B></H3>
  83.       <B>Codigo del Alumno:</B>
  84.         <input type="text" name="val1" id="val1"
  85.          onkeyup="js_func( ['val1'],  ['mate'] )">
  86.       <br>
  87.      <B>Seleccione la materia :<div id="mate"></div></B><br>
  88.       <a href="capt1_faltas2bis.pl?CGISESSID=$CGISESSID&grupo=$$refgru&nivel=$ref$niv&grado=$$refgra">Continuar</a>
  89.      <input type="button" name="back" value="Atras" onClick="history.go(-1)">
  90.      <input type="hidden" name="nivel" value= $nivel>
  91.      <input type="hidden" name="grado" value= $grado>
  92.      <input type="hidden" name="grupo" value= $grupo>
  93.      </FORM>
  94.      </BODY>
  95.      </HTML>
  96. EOHTML
  97.     return $html;
  98. }
Coloreado en 0.007 segundos, usando GeSHi 1.0.8.4

Quiero aclarar que el campo CGISESSID, que viene como parámetro de un paso atrás, sí me lo envía al paso siguiente, pero los campos que obtengo en una subrutina de la base de datos, no.

Yo ya estoy ciclado en el problema y no le veo solución alguna, ojalá alguien con mente más fresca me pueda ayudar a encontrar el(los) error(es).

Gracias de antemano.
Última edición por explorer el 2012-10-17 21:50 @951, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
Negrazo
Perlero nuevo
Perlero nuevo
 
Mensajes: 100
Registrado: 2006-12-28 12:51 @577
Ubicación: Guadalajara, Mexico

Re: Ejemplo de AJAX en Perl

Notapor explorer » 2012-10-17 22:47 @990

Ten en cuenta una cosa: las líneas 90 a 92 no las puede rellenar Perl, porque... Show_HTML es llamada solo cuando se llama por primera vez al CGI (la primera vez o cada vez que recargamos la página), y en esos momentos, Perl no sabe los valores de esas variables (son inicializadas dentro de la subrutina perl_func(), que solo es llamada desde el código JavaScript de la página HTML).

Así que mientras esté funcionando el proceso Ajax, el intercambio de información entre el programa Perl y la página HTML es a través del js_func(), llamando a perl_func(), y devolviendo el resultado solo en el campo 'mate'.

Lo que puedes hacer es declarar js_func() para que guarde los resultado devueltos por perl_func() en varios <div>. Y en perl_func, devolver varios valores escalares con los resultados.

Algo así (no probado):

En el código HTML:
Sintáxis: [ Descargar ] [ Ocultar ]
Using javascript Syntax Highlighting
  1.          onkeyup="js_func( ['val1'],  ['mate', 'nivel', 'grado', 'grupo'] )">
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1.      <div id="nivel"></div>
  2.      <div id="grado"></div>
  3.      <div id="grupo"></div>
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

En el código Perl:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     return $stream_select, $nivel, $grado, $grupo;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

De esta manera, en cada invocación Ajax, el navegador recibe cuatro valores y los coloca cada uno en su elemento correspondiente.

Ahora bien... estás obteniendo los resultados en tres <div>... y seguro que no quieres eso... lo querrás seguir teniendo en tres campos <input>, para enviarlos con el formulario cuando el usuario pulse Continuar.

Solución: En perl_func() crea el código HTML que contenga esos valores.
Sintáxis: [ Descargar ] [ Ocultar ]
Using javascript Syntax Highlighting
  1.          onkeyup="js_func( ['val1'],  ['mate', 'resultado'] )">
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using html4strict Syntax Highlighting
  1.       <div id="resultado"></div>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     return $stream_select,
  2.         qq(<a href="capt1_faltas2bis.pl?CGISESSID=$CGISESSID&grupo=$grupo&nivel=$nivel&grado=$grado">Continuar</a>);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Ahora, lo que estamos generando en cada Ajax, es el enlace Continuar, con los valores reales de $nivel, $grupo y $grado.

Pero (esto no ha terminado): un enlace <a> no se "lleva" los valores de un formulario consigo mismo, así que el valor del <select> se pierde. Es mejor que el enlace Continuar se convierta en un <input type="submit">, y la URL generada por perl_func(), sea el 'action' en el <form>.

Ale, a trabajar...
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


Volver a Intermedio

¿Quién está conectado?

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

cron