Diferencia entre revisiones de «Ejemplo de reCAPTCHA en KumbiaPHP v2»

De KumbiaPHP Framework Wiki
 
(No se muestran 13 ediciones intermedias de 11 usuarios)
Línea 4: Línea 4:
 
<span style="font-size:90%">Puedes tomar la información que aqui se encuentra pero no nos hacemos responsable</span>
 
<span style="font-size:90%">Puedes tomar la información que aqui se encuentra pero no nos hacemos responsable</span>
 
}}
 
}}
== Aviso ==
 
Este tutorial esta publicado ''tal cual''. En el momento de la publicación, puedo decir que el código puesto '''funciona 100%''' ya que lo he validado yo mismo.
 
 
Si durante la vida del artículo sufre modificaciones que impiden su correcto funcionamiento, no puedo hacerme responsable. Digo esto porque en algún otro tutorial hecho, he visto cambios que han hecho que dejara de funcionar.
 
 
  
 
== Pasos previos ==
 
== Pasos previos ==
Este ejemplo es la evolución del [http://wiki.kumbiaphp.com/Ejemplo_de_reCAPTCHA_en_KumbiaPHP anterior tutorial sobre reCaptcha]. Recomiendo encarecidamente leer primero el otro para entender el funcionamiento y posteriormente leer este.
+
Este ejemplo es la evolución del [http://wiki.kumbiaphp.com/Ejemplo_de_reCAPTCHA_en_KumbiaPHP anterior tutorial sobre reCaptcha]. Se recomienda leer el tutorial anterior para entender el funcionamiento básico y posteriormente leer este.
  
 
Cosas que vamos a encontrar distintas:  
 
Cosas que vamos a encontrar distintas:  
 
* Se ha creado una librería para abstraer las funciones de generar un captcha y para comprobar una contestación. Asi podremos usarla desde otros controladores.
 
* Se ha creado una librería para abstraer las funciones de generar un captcha y para comprobar una contestación. Asi podremos usarla desde otros controladores.
* Se ha creado una segunda vista, en lugar de dejar un simple ''echo'' como hice en el tutorial anterior.
+
* Se ha creado una segunda vista, en lugar de dejar un simple ''echo'' como hizo en el tutorial anterior.
 
 
  
 
== Pasos ==
 
== Pasos ==
Línea 43: Línea 37:
 
     */
 
     */
 
     private static $_privateKey = 'TU_CLAVE_PRIVADA';   
 
     private static $_privateKey = 'TU_CLAVE_PRIVADA';   
 +
    /**
 +
    * Errores del reCaptcha
 +
    */
 +
    private static $_error = NULL;
  
 
     /**
 
     /**
 
     * Genera el HTML con el código reCaptcha
 
     * Genera el HTML con el código reCaptcha
 
     *  
 
     *  
    * @param $error
 
 
     * @return string  
 
     * @return string  
 
     */
 
     */
     public static function html($error = NULL)
+
     public static function html()
 
     {
 
     {
         return recaptcha_get_html(self::$_publicKey, $error);
+
         return recaptcha_get_html(self::$_publicKey, self::$_error);
 
     }
 
     }
 
     /**
 
     /**
 
     * Valida que el código colocado sea el correcto
 
     * Valida que el código colocado sea el correcto
     * @return Response
+
     * @return boolean
 
     */
 
     */
     public static function validate()
+
     public static function isValid()
 
     {
 
     {
 
         $ret = recaptcha_check_answer (self::$_privateKey,
 
         $ret = recaptcha_check_answer (self::$_privateKey,
Línea 64: Línea 61:
 
                 $_POST['recaptcha_challenge_field'],
 
                 $_POST['recaptcha_challenge_field'],
 
                 $_POST['recaptcha_response_field']);
 
                 $_POST['recaptcha_response_field']);
 
+
        if ( $ret->is_valid ){
         return $ret;
+
            return TRUE;
 +
         }else{
 +
            self::$_error = $ret->error;
 +
            return FALSE;
 +
        }
 
     }
 
     }
 
}
 
}
Línea 75: Línea 76:
 
<?php
 
<?php
 
Load::Lib("recaptcha");
 
Load::Lib("recaptcha");
class CaptchaController extends ApplicationController
+
class CaptchaController extends AppController
 
{
 
{
 
         public function index()
 
         public function index()
 
         {               
 
         {               
 
// Si vienen datos de formulario, los enviamos a la vista de nuevo
 
// Si vienen datos de formulario, los enviamos a la vista de nuevo
if ($this->has_post('Datos')) $this->Datos = $this->post('Datos');
+
if (Input::hasPost('Datos')) $this->Datos = Input::post('Datos');
  
 
// Comprobamos que se haya rellenado el reCAPTCHA
 
// Comprobamos que se haya rellenado el reCAPTCHA
                 if ($this->has_post("recaptcha_response_field"))
+
                 if (Input::hasPost("recaptcha_response_field"))
 
                 {
 
                 {
 
// Realizamos la comprobacion
 
// Realizamos la comprobacion
                         $ret = reCaptcha::validate();
+
                         if (reCaptcha::isValid() {
                        if ($ret->is_valid) {
+
$this->Datos = Input::post('Datos');
$this->Datos = $this->post('Datos');
+
View::select("validado");
$this->render("validado");
 
 
}
 
}
// Enviamos el error a la vista
 
$this->previousError = $ret->error;
 
 
                 }
 
                 }
 
         }
 
         }
Línea 103: Línea 101:
 
<strong>Rellena el cuadro con tu nombre: </strong>
 
<strong>Rellena el cuadro con tu nombre: </strong>
 
<?php  
 
<?php  
echo form_tag('captcha/');
+
echo Form::open();
echo input_field_tag('Datos.nombre');
+
echo Form::text('Datos.nombre');
  
// Cargamos la librería y le pedimos un código html
+
echo reCaptcha::html();
Load::Lib("recaptcha");
 
echo reCaptcha::html($previousError);
 
  
echo submit_tag('Enviar datos');
+
echo Form::submit('Enviar datos');
 +
 
 +
        echo Form::close();
 
?>
 
?>
 
</source>
 
</source>
  
  
Y por último, para de paso mostrar el método ''render'' de KumbiaPHP, creamos la vista que se mostrará en cuanto validemos correctamente el captcha.  
+
Y por último, para de paso mostrar el método ''View::select()'' de KumbiaPHP, creamos la vista que se mostrará en cuanto validemos correctamente el captcha.  
  
 
La vista es ''app/views/captcha/validado.phtml'':
 
La vista es ''app/views/captcha/validado.phtml'':
Línea 122: Línea 120:
 
</source>
 
</source>
  
 +
 +
== Aplicando estilos ==
 +
Para poder cambiar el css del captcha debemos agregar el siguiente código a nuestra app.
 +
<source lang=javascript>
 +
<script>
 +
  var RecaptchaOptions = {
 +
  theme : 'clean'  // [ red, white, blackglass, clean, custom ]
 +
  };
 +
</script>
 +
</source>
 +
A continuación agregar el siguiente código a nuestra app.
 +
<source lang=css>
 +
<style>
 +
.recaptchatable .recaptcha_image_cell, #recaptcha_table
 +
{
 +
    background-color: #FFFFFF !important; /* reCaptcha widget background color */
 +
}
 +
#recaptcha_table
 +
{
 +
    border-color: #DFDFDF !important; /* reCaptcha widget border color */
 +
}
 +
#recaptcha_response_field
 +
{
 +
    border: 1px solid #CCCCCC !important; /* Text input field border color */
 +
    background-color:#FFFFFF !important; /* Text input field background color */
 +
}
 +
</style>
 +
</source>
 +
Para mas información al respecto [http://wiki.recaptcha.net/ wiki de reCaptcha]
 +
 +
 +
== Aplicando el cambio de idioma ==
 +
Para poder cambiar el idioma del captcha podemos establecer el párametro lang utilizado en la API, de la siguiente manera.
 +
<source lang=javascript>
 +
<script>
 +
var RecaptchaOptions = {
 +
    lang: 'es'
 +
};
 +
</script>
 +
</source>
 +
Lo anterior traducira el captcha a español.
 +
 +
También podemos establecer nuestros propios textos a utilizar, agregando el siguiente codigo a nuestra app.
 +
<source lang=javascript>
 +
<script>
 +
var RecaptchaOptions = {
 +
    custom_translations : {
 +
    instructions_visual :  'Escriba las dos palabras:',
 +
    instructions_audio :  'Escribir lo que escucha:',
 +
    play_again :          'Volver a reproducir el audio.',
 +
    cant_hear_this :      'Descarga el audio en formato MP3.',
 +
    visual_challenge :    'Modo Visual',
 +
    audio_challenge :      'Escuchar la clave de seguridad.',
 +
    refresh_btn :          'Volver a generar una clave de seguridad.',
 +
    help_btn :            'Ayuda',
 +
    incorrect_try_again :  'Incorrecto. Por favor, inténtelo de nuevo.'
 +
},
 +
    theme : 'clean'
 +
};
 +
</script>
 +
</source>
  
 
== Prueba ==
 
== Prueba ==

Revisión actual del 09:31 27 may 2015

{{#if:Import.png |}} {{#if: |}}



Pasos previos[editar]

Este ejemplo es la evolución del anterior tutorial sobre reCaptcha. Se recomienda leer el tutorial anterior para entender el funcionamiento básico y posteriormente leer este.

Cosas que vamos a encontrar distintas:

  • Se ha creado una librería para abstraer las funciones de generar un captcha y para comprobar una contestación. Asi podremos usarla desde otros controladores.
  • Se ha creado una segunda vista, en lugar de dejar un simple echo como hizo en el tutorial anterior.

Pasos[editar]

En el anterior tutorial sobre reCaptcha hacíamos toda la logica del reCaptcha en el controlador, lo cual, si solo era un único controlador no pasaba nada, pero de necesitarlo en más controladores, teníamos problemas.

Esta vez vamos a crear una librería que se encargue de todo: almacenar las keys, generar el HTML y validar la entrada del usuario. Dicho de otra forma, hemos creado una segunda capa de abstracción entre nuestra aplicación y reCaptcha: la primera es el propio API de reCaptcha y la segunda nuestra librería.

Creamos la libreria, app/libs/recaptcha.php:

<?php 
// Incluimos el fichero con la librería
require_once APP_PATH. '/libs/recaptchalib.php';
/**
 * Clase para consumir el servicio anti-spam reCaptcha
 * @author Soukron 
 */
class reCaptcha
{
    /**
     * Clave Publica reCaptcha
     * @var string
     */
    private static $_publicKey  = 'TU_CLAVE_PUBLICA';
    /**
     * Clave Privada reCaptcha
     */
    private static $_privateKey = 'TU_CLAVE_PRIVADA';   
    /**
     * Errores del reCaptcha
     */
    private static $_error = NULL; 

    /**
     * Genera el HTML con el código reCaptcha
     * 
     * @return string 
     */
    public static function html()
    {
        return recaptcha_get_html(self::$_publicKey, self::$_error);
    }
    /**
     * Valida que el código colocado sea el correcto
     * @return boolean
     */
    public static function isValid()
    {
        $ret = recaptcha_check_answer (self::$_privateKey,
                $_SERVER['REMOTE_ADDR'],
                $_POST['recaptcha_challenge_field'],
                $_POST['recaptcha_response_field']);
        if ( $ret->is_valid ){
            return TRUE;
        }else{
            self::$_error = $ret->error;
            return FALSE;
        }
    }
}


Con lo que nuestro controlador se simplifica de la siguiente forma app/controllers/captcha_controller.php:

<?php
Load::Lib("recaptcha");
class CaptchaController extends AppController
{
        public function index()
        {              
		// Si vienen datos de formulario, los enviamos a la vista de nuevo
		if (Input::hasPost('Datos')) $this->Datos = Input::post('Datos');

		// Comprobamos que se haya rellenado el reCAPTCHA
                if (Input::hasPost("recaptcha_response_field"))
                {
			// Realizamos la comprobacion
                        if (reCaptcha::isValid() {
				$this->Datos = Input::post('Datos');
				View::select("validado");
			}
                }
        }
}


En la vista, usaremos el otro método de la librería. La vista queda como sigue, app/views/captcha/index.phtml:

<strong>Rellena el cuadro con tu nombre: </strong>
<?php 
	echo Form::open();
	echo Form::text('Datos.nombre');

	echo reCaptcha::html();	

	echo Form::submit('Enviar datos');

        echo Form::close();
?>


Y por último, para de paso mostrar el método View::select() de KumbiaPHP, creamos la vista que se mostrará en cuanto validemos correctamente el captcha.

La vista es app/views/captcha/validado.phtml:

<strong>Hola <?php echo $Datos['nombre']; ?>, tu formulario ha sido enviado!</strong>


Aplicando estilos[editar]

Para poder cambiar el css del captcha debemos agregar el siguiente código a nuestra app.

<script>
  var RecaptchaOptions = {
   theme : 'clean'  // [ red, white, blackglass, clean, custom ]
  };
</script>

A continuación agregar el siguiente código a nuestra app.

<style>
.recaptchatable .recaptcha_image_cell, #recaptcha_table
{
    background-color: #FFFFFF !important; /* reCaptcha widget background color */
}
#recaptcha_table
{
    border-color: #DFDFDF !important; /* reCaptcha widget border color */
}
#recaptcha_response_field
{
    border: 1px solid #CCCCCC !important; /* Text input field border color */
    background-color:#FFFFFF !important; /* Text input field background color */
}
</style>

Para mas información al respecto wiki de reCaptcha


Aplicando el cambio de idioma[editar]

Para poder cambiar el idioma del captcha podemos establecer el párametro lang utilizado en la API, de la siguiente manera.

<script>
var RecaptchaOptions = {
    lang: 'es'
};
</script>

Lo anterior traducira el captcha a español.

También podemos establecer nuestros propios textos a utilizar, agregando el siguiente codigo a nuestra app.

<script>
var RecaptchaOptions = {
    custom_translations : {
    	instructions_visual :  'Escriba las dos palabras:',
    	instructions_audio :   'Escribir lo que escucha:',
    	play_again :           'Volver a reproducir el audio.',
    	cant_hear_this :       'Descarga el audio en formato MP3.',
    	visual_challenge :     'Modo Visual',
    	audio_challenge :      'Escuchar la clave de seguridad.',
    	refresh_btn :          'Volver a generar una clave de seguridad.',
    	help_btn :             'Ayuda',
    	incorrect_try_again :  'Incorrecto. Por favor, inténtelo de nuevo.'
	},
    theme : 'clean'
};
</script>

Prueba[editar]

Ya esta! Como en el anterior tutorial, puedes visitar la URL de tu controlador en http://<tuhost>/captcha y probarlo.


Espero que esté claro! Si no, podeis escribirme o localizarme en el IRC.


Saludos,

Soukron