Dom Jun 03, 2007 10:15 pm
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
| Perl y Ajax |
|
|
Hola gente de la web. Necesito una sola cosita. Necesitaría que me muestre el que por favor tenga a mano un ejemplo de autocompletar, o de carga dinámica o de alguna otra cosa de Ajax en Perl, osea todo el código que se necesite para esto; por lo que tengo entendido es medio difícil y como recién empiezo en esto me justaría ver ejemplos. En Internet casi no se encuentra Perl Y Ajax, por eso si no encuentran o no tienen igual me vendría bien una explicación de cómo empezar a hacer un autocompletar o una carga dinámica de una tabla.
Por ejemplo: Tengo una BD y una tabla con algunos registros; quisiera agregarle dinámicamente sin que se recargue la pagina, otros registros a la tabla, obviamente, que se vea en HTML. Osea que a medida que vaya agregando registros mediante un botón AGREGAR me vaya llenando la BD y a su vez mostrando los datos en un <table> de HTML.
Muchas gracias de antemano |
|
|
|

Lun Jun 04, 2007 12:26 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
Luego te pongo un ejemplo, pero antes deberías mirarte el módulo CGI::Ajax.
Un ejemplo de lo que se puede hacer con él es el también módulo AEAE. |
|
Lun Jun 04, 2007 7:27 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
| Si estuve viendo lo de CGI:Ajax en Perl, ya lo realicé, ahora quiero seguir un paso más, como recién empiezo, quiero ir adelantándome de a poco, ¿que me recomiendan ustedes que saben? ya hice y entendí el ejemplo de CGI:Ajax y ya leí unos tutoriales. ¿Con qué me conviene seguir? |
|

Jue Jun 07, 2007 7:36 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
Tengo el siguiente código:
| Perl: | use CGI:: Ajax;
use CGI;
use DBI;
use HTML:: Template;
use strict;
my $q = new CGI;
my (%Variables);
my $buscando = sub {
my $buffer = $ENV{'QUERY_STRING'};
my @pairs = split( /&/, $buffer );
foreach my $pair (@pairs) {
my ( $name, $value ) = split( /=/, $pair );
$name =~ tr/+/ /;
$name =~ s/% ([a-fA-F0- 9][a-fA-F0- 9])/ pack("C", hex($ 1))/eg;
$value =~ tr/+/ /;
$value =~ s/% ([a-fA-F0- 9][a-fA-F0- 9])/ pack("C", hex($ 1))/eg;
$Variables{$name} = $value;
}
my $indice = "$Variables{'nombre'}" . "%";
my $db = "probando";
my $host = "localhost";
my $port = "3306";
my $userid = "root";
my $passwd = "zxcvbn";
my $connectionInfo = "DBI:mysql:database=$db;$host:$port";
my $columna = "*";
my $query
= "SELECT * FROM opiniones WHERE (nombre LIKE '$indice') OR (mail LIKE '$indice') OR (direccion LIKE '$indice') OR (opinion LIKE '$indice')";
my $cgi = CGI-> new;
my $dbh = DBI-> connect( $connectionInfo, $userid, $passwd )
or die print "No hay conexion con la base<br>";
my $t = HTML:: Template-> new( filename => 'db.tmpl' );
$t-> param( ROWS => $dbh-> selectall_arrayref( $query, { Slice => {} } ) );
$dbh-> disconnect;
print $cgi-> header;
print $t-> output;
};
my $Mostrar_Form = sub {
my $html = <<EOT;
<HTML>
<BODY>
<form>
<input type= "hidden" id= "item" size= "6">
<input type= "hidden" id= "namedItem" size= "6">
<input type= "text" id= "nombre" size= "6" value= 1 ><br/>
<button onclick= 'jsFunc(formDump(),["out"]);return false' > Buscar </button>
<div id= "out">
</div>
</form>
</BODY>
</HTML>
EOT
return $html;
};
my $pjx = CGI:: Ajax-> new( 'jsFunc' => $buscando );
print $pjx-> build_html( $q, $Mostrar_Form ); # fin
|
Lo que hace este código es una búsqueda en una base de datos y mostrarla en una tabla creada con un TMPL. El problema es que cuando imprimo la tabla me sale Content-Type: text/html; charset=ISO-8859-1 1 en la última fila de la primera columna. Probé también imprimiendo los resultados sin tabla ni nada, pero también me sale lo mismo. ¿Que tendría que cambiarle al código? |
|

Jue Jun 07, 2007 8:00 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
Te he editado el código un poco: he cambiado de línea el use strict; y he ajustado el ';' del documento incluido con la marca EOT, y luego he formateado todo el código con el perltidy.
Yo veo que quizás sobra la línea print $cgi->header; dentro de la subrutina busqueda(). |
|
Jue Jun 07, 2007 1:51 pm
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
| Muchas Gracias problema solucionado, había un par de cosas que estaban de más y algunas sentencias con fallas. Gracias |
|
Sab Jun 09, 2007 5:54 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
Sería interesante ver como queda el código final...
He encontrado el sitio desde donde has sacado la idea: http://www.perl.com/lpt/a/977
Fíjate que en los ejemplos que comentan, la función que es llamada por CGI::Ajax devuelve el html generado en un return, no en un print. Esa es la razón por la cual aparecía un '1' suelto: es el resultado de ejecutar el print y es la última sentencia de la función, por lo que es el valor que se devuelve. |
|
Dom Jun 10, 2007 2:14 pm
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
| Sí, es verdad. ¿Qué te parece el código? ¿Lo podré usar para hacer algunos proyectos con eso? ¿O no tiene buena performance? Gracias |
|
Dom Jun 10, 2007 4:17 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
Tiene una buena idea, que es la de las funciones AddLoadEvent y, sobre todo, en installHandlers, en Javascript. Y que me las apunto para mis proyectos, claro. La idea de agregar los eventos OnChange después y no en el diseño de la página, es muy, pero que muy bueno.
En lo demás, es un ejemplo muy bueno de cómo pasar de CGI a CGI::Ajax. |
|

Mie Jun 13, 2007 8:13 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
Tengo un problemilla con algo muy parecido.
O sea la cosa es así, tengo un sub mostrar_cosas que lo que hago dentro de este es hacer un SELECT y pasar los valores a un TMPL.
| Perl: | sub Mostrar_Form {
my $db= "probar";
my $host= "localhost";
my $port= "-";
my $userid= "-t";
my $passwd= "-";
my $connectionInfo= "DBI:mysql:database=$db;$host:$port";
my $dbh = DBI-> connect($connectionInfo, $userid, $passwd) or die print "No hay conexion con la base<br>";
my $t = HTML:: Template-> new(filename => 'listarautos.tmpl');
my $table_data = $dbh-> prepare('SELECT descripcion,idAuto FROM rubros WHERE marca="0"');
$table_data-> execute;
my $arrayref = $table_data-> fetchall_arrayref({});
$t-> param(ROWS => $arrayref);
$dbh-> disconnect;
my $html = $t-> output;
return $html;
};
|
Lo mando a este TMPL
| HTML: | <TMPL_LOOP ROWS>
<form>
<p>
<input type="hidden" id="item" size="6">
<input type="hidden" id="namedItem" size="6">
<input type="hidden" id="mirar" size="6" value=<TMPL_VAR NAME=idRubro>>
<a href="#" onclick='jsFunc(formDump(),["out"]);return false' > <TMPL_VAR NAME=Nombre> </a></p>
</form>
</TMPL_LOOP ROWS>
<div id="out">
</div> |
lo que hace esto es tirame la lista del SELECT que hice anteriormente, y tranformarme los datos que saque en botones para despues hacer con AJAX esto:
| Perl: | my $pjx = CGI:: Ajax-> new( 'jsFunc' => \&buscando );
print $pjx-> build_html($q, \&Mostrar_Form, {-type=> 'text/html'}); |
| Perl: |
sub buscando {
my $buffer = $ENV{'QUERY_STRING'};
my @pairs = split(/&/, $buffer);
foreach my $pair (@pairs) {
my ($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/% ([a-fA-F0- 9][a-fA-F0- 9])/ pack("C", hex($ 1))/eg;
$value =~ tr/+/ /;
$value =~ s/% ([a-fA-F0- 9][a-fA-F0- 9])/ pack("C", hex($ 1))/eg;
$Variables{$name} = $value;
}
my $indice = "$Variables{'marca'}";
my $db= "clasificados";
my $host= "localhost";
my $port= "3306";
my $userid= "root";
my $passwd= "zxcvbn";
my $connectionInfo= "DBI:mysql:database=$db;$host:$port";
my $columna= "*";
my $query = "SELECT Nombre FROM rubros WHERE parent='$indice'";
my $cgi = CGI-> new;
my $dbh = DBI-> connect($connectionInfo, $userid, $passwd) or die print "No hay conexion con la base<br>";
my $t = HTML:: Template-> new(filename => 'db.tmpl');
$t-> param(ROWS => $dbh-> selectall_arrayref($query, { Slice => {} }));
$dbh-> disconnect;
my $html = $t-> output;
return $html; |
my $t = HTML::Template->new(filename => 'db.tmpl'); en esta linea comunico con el db.tmpl e imrpmimo en el <div id="out">
</div>
El problema es que si tengo más de uno seleccionado no funcionan estas sentencias, pero si tengo solamente una seleccionada, funciona bien y me muestra todos los autos, de la marca que quiero. ¿Cómo soluciono esto? ¿En dónde está el problema? |
|

Mie Jun 13, 2007 10:34 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
| Quizás la solución pase por englobar todos los campos de los formularios en uno solo, a expensas de tener que generar un nombre distinto para cada uno de ellos. De esa manera puedes saber qué opciones están activadas. |
|
Mie Jun 13, 2007 12:02 pm
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
| No entendi muy bien lo que me quisistes explicar. Como es eso que tengo q englobar y probar las opciones???? |
|
Mie Jun 13, 2007 12:06 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
|
|
|
|
|
| Que en vez de generar un formulario por cada opción, hagas un solo formulario. |
|
Jue Jun 14, 2007 8:38 am
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
| mmm no ya probe pero nada, quiero hacer que me pase los datos bien, pero solamente me pasa el primero que apreto, los pasa, pero solo el primero. Que sera??? |
|
Jue Jun 14, 2007 2:36 pm
|
 |
zozo666
Perlero Frecuente

|
Registrado: 26 May 2007
Mensajes: 137
|
|
|
|
|
| Hola, ya encontre la forma de llamar a lo que quiero hacer, se llama SELECTS Dependientes, tengo que hacer que al apretar un vinculo, me tire los vinculos dependientes de ese que aprete. Tienen alguna forma para hacerlo con el modulo CGI::Ajax. Muchas GRacias. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|