Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Perl y Ajax
Ir a página 1, 2  Siguiente
 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto
Mensaje Dom Jun 03, 2007 10:15 pm
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Perl y Ajax Responder citando

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
Mensaje Lun Jun 04, 2007 12:26 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Lun Jun 04, 2007 7:27 am
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

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?
Mensaje Jue Jun 07, 2007 7:36 am
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

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?
Mensaje Jue Jun 07, 2007 8:00 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
Responder citando

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().
Mensaje Jue Jun 07, 2007 1:51 pm
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

Muchas Gracias problema solucionado, había un par de cosas que estaban de más y algunas sentencias con fallas. Gracias
Mensaje Sab Jun 09, 2007 5:54 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Dom Jun 10, 2007 2:14 pm
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

Sí, es verdad. ¿Qué te parece el código? ¿Lo podré usar para hacer algunos proyectos con eso? ¿O no tiene buena performance? Gracias
Mensaje Dom Jun 10, 2007 4:17 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Mie Jun 13, 2007 8:13 am
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

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?
Mensaje Mie Jun 13, 2007 10:34 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
Responder citando

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.
Mensaje Mie Jun 13, 2007 12:02 pm
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

No entendi muy bien lo que me quisistes explicar. Como es eso que tengo q englobar y probar las opciones????
Mensaje Mie Jun 13, 2007 12:06 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4092
Ubicación: Valladolid, España
Responder citando

Que en vez de generar un formulario por cada opción, hagas un solo formulario.
Mensaje Jue Jun 14, 2007 8:38 am
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

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???
Mensaje Jue Jun 14, 2007 2:36 pm
zozo666
Perlero Frecuente
Perlero Frecuente
Registrado: 26 May 2007
Mensajes: 137
Responder citando

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.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Experto Todas las horas son GMT - 6 Horas
Ir a página 1, 2  Siguiente
Página 1 de 2



Powered by phpBB © 2001, 2005 phpBB Group