Ejemplo de reCAPTCHA en KumbiaPHP
De KumbiaPHP Framework Wiki
Revisión del 20:43 17 jun 2010 de Soukron (discusión | contribuciones) (Corrijo otro fallo y agrego explicación!)
{{#if:
|}}
{{#if:
|}}Este Artículo cumple con todos los quererimientos de los Kumbieros. |
{{{imageright}}} |
Nota previa Este ejemplo esta sacado de la documentacion de reCAPTCHA y adaptado a un controlador/vista de KumbiaPHP de forma básica. Se puede mejorar creando un helper, pero queda fuera del ejemplo :)
Sumario
Pasos previos
- Descargar la libreria reCAPTCHA, descomprimela y copia el fichero recaptchalib.php en /app/libs de tu arbol de directorios de KumbiaPHP.
- Si no lo has hecho ya, registrate y solicita una key de API en la web de reCAPTCHA.
Pasos
- Creamos un controlador para el captcha:
<?php
// Incluimos el fichero con la libreria y nuestra API Key
require_once APP_PATH. '/libs/recaptchalib.php';
class CaptchaController extends ApplicationController {
public $publickey = "6LePF7oSAAAAALYNEfbbOfRAc9lCz3LKvoKcQkwZ";
public $privatekey = "6LePF7oSAAAAADRQBaACf7imDRSwq-kPXyZOCBCA";
public function index() {
// Generamos el reCAPTCHA
$this->Captcha = recaptcha_get_html($this->publickey);
}
public function comprobar() {
// Comprobamos que se haya rellenado el reCAPTCHA
if ($this->has_post("recaptcha_response_field")) {
// Realizamos la comprobacion
$resp = recaptcha_check_answer ($this->privatekey,
$_SERVER['REMOTE_ADDR'],
$this->post('recaptcha_challenge_field'),
$this->post('recaptcha_response_field'));
if ($resp->is_valid) {
// Aqui seguría nuestra comprobacion del resto de los
// datos del formulario
echo "You got it!"; die;
} else {
// Capturamos el error para mostrarlo
$error = $resp->error;
}
}
// Si vienen datos de formulario, los enviamos a la vista de nuevo
if ($this->has_post('Datos')) $this->Datos = $this->post('Datos');
// Generamos un nuevo reCAPTCHA con el codigo de error obtenido
$this->Captcha = recaptcha_get_html($this->publickey, $error);
// Mostramos la misma vista que en el index
$this->render('index');
}
}
?>
- Por último, creamos la vista:
<strong>Rellena el cuadro con tu nombre: </strong>
<?php
echo form_tag('captcha/comprobar');
echo input_field_tag('DatosForm.nombre');
echo $Captcha;
echo submit_tag('Enviar datos');
?>
Prueba
- Ya esta! Ahora ya puedes visitar la URL de tu controlador en http://<tuhost>/captcha y probarlo.
Explicacion
He metido los comentarios que creo necesarios, pero por si acaso, el funcionamiento es el siguiente:
- Se carga la liberia, para tener las funciones disponibles. No usamos Load::Lib() porque KumbiaPHP espera que haya una clase definida, y no es el caso de la librería reCaptcha. Si en un futuro los desarrolladores de reCaptcha proporcionan una clase, lo haremos con Load::Lib(), pero el objetivo es usar la clase tal cual nos la den.
- Generamos en index() el HTML necesario, y lo mostramos en la vista.
- El formulario nos envia a comprobar(), la cual comprueba si hemos recibido una respuesta (vía POST) del formulario.
- De haberla recibido, pedimos al API de reCapcha que nos compruebe la respuesta, El resultado lo tenemos en is_valid, y el mensaje de error (si lo hubiera) en error.
- Si la respuesta es válida, hariamos un redirect(), un route(), o grabariamos una sesion, cookie, etc. para seguir con nuestra aplicación. En caso contrario seguimos la ejecución.
- Posteriomente, si tuvieramos más datos del formulario (nombre, apellidos, telefono, mail, etc), los volvemos a cargar para que la vista los tenga. Esto lo hago porque si se rellenan 10 datos, pero falla el captcha, que el usuario no tenga que volver a rellenar todo otra vez.
- Por último, generamos otro captcha para mostrarlo como siguiente prueba y llamamos a la misma vista, para no repetir.
Espero que esté claro!
Saludos,
Soukron