Vie Oct 19, 2007 2:42 pm
|
 |
AkonD
Perlero Nuevo

|
Registrado: 06 Oct 2005
Mensajes: 50
Ubicación: España
|
|
| Perljax con Cgi Application |
|
|
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: | 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 ña <br><br>
<input type="password" name="cpass" size="12" maxlength="12" onKeyUp="perljax_pass( ['pass', 'cpass'], ['error_pass'] );"> Repite contrase ñ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, |
|
|
|

Vie Oct 19, 2007 5:10 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
|
|
|
|
|
| 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? |
|
Sab Oct 20, 2007 8:26 am
|
 |
kidd
Creador de Perl en Español

|
Registrado: 15 Oct 2003
Mensajes: 1389
Ubicación: México
|
|
|
|
|
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 |
|
Dom Oct 21, 2007 9:39 am
|
 |
AkonD
Perlero Nuevo

|
Registrado: 06 Oct 2005
Mensajes: 50
Ubicación: España
|
|
|
|
|
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. |
|

Dom Oct 21, 2007 10:13 am
|
 |
AkonD
Perlero Nuevo

|
Registrado: 06 Oct 2005
Mensajes: 50
Ubicación: España
|
|
|
|
|
¡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 |
|

Dom Oct 21, 2007 7:30 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4100
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|