Perl en Español

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

Perljax con Cgi Application

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Módulos
Mensaje Vie Oct 19, 2007 2:42 pm
AkonD
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Oct 2005
Mensajes: 50
Ubicación: España
Perljax con Cgi Application Responder citando

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 Smile.

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:
Perl:
#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 ""; }
}

El código HTML que ejecuta las funciones Ajax y el div del resultado;
HTML:
<form method="post" action="$url" enctype="application/x-www-form-urlencoded">

<input type="hidden" name="rm" value="regprocess">
<input type="text" name="user" size="12" maxlength="12" onKeyUp="perljax_user( ['user'], ['error_user'] );"> Nombre de usuario<br><br>

<input type="password" name="pass" size="12" maxlength="12"> Contrase&ntilde;a<br><br>

<input type="password" name="cpass" size="12" maxlength="12" onKeyUp="perljax_pass( ['pass', 'cpass'], ['error_pass'] );"> Repite contrase&ntilde;a<br><br>
<!-- El Formulario sigue pero no lo pego todo -->
<!-- Los divs del resultado; -->
<div id="error_user"></div>
<br>
<div id="error_pass"></div>
</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,
Mensaje Vie Oct 19, 2007 5:10 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
Responder citando

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?
Mensaje Sab Oct 20, 2007 8:26 am
kidd
Creador de Perl en Español
Creador de Perl en Español
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
Responder citando

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
Mensaje Dom Oct 21, 2007 9:39 am
AkonD
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Oct 2005
Mensajes: 50
Ubicación: España
Responder citando

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.
Mensaje Dom Oct 21, 2007 10:13 am
AkonD
Perlero Nuevo
Perlero Nuevo
Registrado: 06 Oct 2005
Mensajes: 50
Ubicación: España
Responder citando

¡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.

Perl:
my $perljax = CGI::Ajax->new(
        'perljax_user' => "${url}perljax_verificar_user.cgi",
        'perljax_pass' => "${url}perljax_verificar_pass.cgi"
);


Y el archivo perljax_verificar_user.cgi que es un simple cgi
Perl:
#!/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();


Saludos
Mensaje Dom Oct 21, 2007 7:30 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
Responder citando

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.
Publicar nuevo tema   Responder al tema    Foros de discusión -> Módulos Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group