• Publicidad

Perljax con Cgi Application

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Perljax con Cgi Application

Notapor AkonD » 2007-10-19 15:42 @696

Hola amigos perleros, hace tiempo que no trasteaba por estos foros ni con Perl, el otro día entre en la página y le eche un ojo al tutorial ese de CGI::Application muy bueno :).

Estaba pasando a CGI::Application un proyecto que tengo a medio hacer que usa perljax y he tenido problemas porque no funciona el Ajax: se comporta de manera extraña, no devuelve el resultado a veces sí y otras no.

Os dejo el código que uso:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#el setup de cgi application
sub setup {
    my $self = shift;
    $self->start_mode('index');
    $self->run_modes(
        'index' => 'index',
        'regform' => 'regform',
        'loginform' => 'loginform',
        'loginprocess' => 'loginprocess',
        'logout' => 'logout',
        'perljax_verificar_pass' => 'perljax_verificar_pass',
        'perljax_verificar_user' => 'perljax_verificar_user',
    );
}

#funcion que muestra el formulario de registro
sub regform {
    my $self = shift;
    my $query = $self->query;
    my $html = $self->param('html');

    my $path = $self->param('path');
    my $captcha = Authen::Captcha->new(
        data_folder => "${path}captcha",
        output_folder => "${path}img"
    );

    my $md5sum = $captcha->generate_code(5);

    my $url = $self->param('url');
    my $perljax = CGI::Ajax->new(
        'perljax_user' => "${url}?rm=perljax_verificar_user",
        'perljax_pass' => "${url}?rm=perljax_verificar_pass"
    );
    $perljax->JSDEBUG(2);
    $perljax->DEBUG(1);

    my $return = "";
    $return .= $query->start_html(
        -title => 'Registro Usuarios - GaNJa',
        -keywords => 'marihuana cannabis thc',
        -description => 'Registros de usuarios en GaNJa.',
        -style=> { -src=> [ $self->param('css') ] }
    );
    $return .= $html->header( $self->param('session')->param('profile') );
    $return .= $html->regform( $self->param('session')->param('profile'), $md5sum );
    $return .= $html->footer();
    return $perljax->build_html($self, $return);
}

#funciones perljax
sub perljax_verificar_user {
my $user = shift;
    if ((length($user) < 5) or ($user =~ m/\W/)) {
        return "El nombre de usuario debe contener entre 5 y 12 caracteres (alfa-numericos o guion)";
    }
    #elsif comprobar si el usuario existe {}
    else { return ""; }
}
sub perljax_verificar_pass {
    my ($pass, $cpass) = @_;
    if ((length($pass) < 5) or ($pass =~ m/\W/)) {
        return "La contraseña debe contener entre 5 y 12 caracteres (alfa-numericos o guion)";
    }
    elsif ($pass ne $cpass) { return "Las contraseñas no coinciden"; }
    else { return ""; }
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

El código HTML que ejecuta las funciones Ajax y el div del resultado;
Sintáxis: [ Descargar ] [ Ocultar ]
  1. <form method="post" action="$url" enctype="application/x-www-form-urlencoded"> 
  2.  
  3. <input type="hidden" name="rm" value="regprocess"> 
  4. <input type="text" name="user" size="12" maxlength="12" onKeyUp="perljax_user( ['user'], ['error_user'] );"> Nombre de usuario<br><br> 
  5.  
  6. <input type="password" name="pass" size="12" maxlength="12"> Contrase&ntilde;a<br><br> 
  7.  
  8. <input type="password" name="cpass" size="12" maxlength="12" onKeyUp="perljax_pass( ['pass', 'cpass'], ['error_pass'] );"> Repite contrase&ntilde;a<br><br> 
  9. <!-- El Formulario sigue pero no lo pego todo --> 
  10. <!-- Los divs del resultado; --> 
  11. <div id="error_user"></div> 
  12. <br> 
  13. <div id="error_pass"></div> 
  14. </div> 


Estoy casi seguro de que el problema está en el if de las funciones perljax; ¿puede ser? porque viendo el debug de la aplicación ¡no falla nada!

Saludos y gracias,
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Publicidad

Notapor explorer » 2007-10-19 18:10 @798

Pero... CGI::Ajax se debe ocupar del CGI en cuanto es llamado por una de las funciones que son registradas en el JavaScript. Veo que creas el objeto CGI::Ajax dentro de una función. ¿Esa función es llamada tanto por el CGI principal como por las funciones Ajax?
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

Notapor kidd » 2007-10-20 09:26 @434

Hola,

Yo personalmente uso CGI::Ajax cuando tengo que hacer cosas rápidas y sencillas, en este caso que necesito tener un poco de más control entonces uso el Prototype de JavaScript que es un Framework que te hace la vida sencilla, tiene excelente documentación, y todo es crossbrowser.

Saludos
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor AkonD » 2007-10-21 10:39 @485

Las funciones ajax van asociadas a una url ?rm=perljax_verificar_pass como si tratara de un script aparte que devuelve el resultado

Por tanto el httprequest lo que hace es llamar a esa url que es un RunMode de la aplicación.
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Notapor AkonD » 2007-10-21 11:13 @509

¡Ya sé dónde está el problema y la solución! jeje

Al llamar la funciones perljax desde el RunMode de cgi application no funciona no sé por qué pero no rula.

Lo que he hecho es separar las funciones perljax en archivos .cgi y entonces perljax llama ese cgi desde la aplicación principal.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $perljax = CGI::Ajax->new(
        'perljax_user' => "${url}perljax_verificar_user.cgi",
        'perljax_pass' => "${url}perljax_verificar_pass.cgi"
);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y el archivo perljax_verificar_user.cgi que es un simple cgi
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use CGI;
use CGI::Carp qw(fatalsToBrowser);

my $q = new CGI;

my $user = $q->param('rg_user');

print $q->header();
print $q->start_html();

if ((length($user) < 5) or ($user =~ m/\W/)) {
    print "El nombre de usuario debe contener entre 5 y 12 caracteres (alfa-numericos o guion)";
}
#elsif comprobar si el usuario existe {}
else { print ""; }

print $q->end_html();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos
AkonD
Perlero nuevo
Perlero nuevo
 
Mensajes: 50
Registrado: 2005-10-06 06:36 @316
Ubicación: España

Notapor explorer » 2007-10-21 20:30 @896

Pues a eso me refería...

Con CGI::Ajax se crea un cgi que hace dos cosas: crea la página principal HTML+JavaScript Y ejecuta las funciones asociadas a los eventos Ajax. Esas funciones pueden estar en el mismo código, o como has indicado ahora, en códigos aparte.

Para ello, CGI::Ajax toma el control cuando es llamado por el servidor web para actuar de una manera o de otra.

El problema que veo es que CGI::Application toma también control cuando es llamado, por lo que quizás afecta al funcionamiento de CGI::Ajax.

Quizás, se podría intentar probar de la siguiente manera: colocando la creación del objeto CGI::Ajax lo más pronto posible.
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 Módulos

¿Quién está conectado?

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

cron