Bonjour,

Depuis un bon moment je cherche à intégrer ReCaptcha au formulaire de contact sur mon site en utilisant certains plugins disponible sur le site de cake. Malheureusement, ils sont tous à ce jour pour des versions antérieurs à Cake 2.x. J'ai essayé de leur apporter quelques modifications pour qu'ils soient compatibles avec la version 2 mais en vain.

Exemple : http://bakery.cakephp.org/articles/tbsmcd/2011/02/05/recaptcha\_plugin\_6

Alors merci à tous ceux qui m'aideront à l'intégrer à cake.

Voici ma version modifiée : http://www.mediafire.com/?0d10g6e6c14kj71

3 réponses


Pourquoi ne pas développer le truc à partir de l'API originale de reCaptcha plutot que de chercher un plugin ?

Vaillant
Auteur

C'est de ça qu'il s'agit. je vais poster le component, le behavior et le helper ici et dites-moi si dans le code y a quelque chose qui colle pas avec la version 2.

Component

<?php
class RecaptchaComponent extends Component {
    function startup(&$controller) {
        $modelClass = $controller->modelClass;
        if (!empty($controller->params'form']'recaptcha_challenge_field']) && !empty($controller->params'form']'recaptcha_response_field'])) {
            $controller->data$modelClass]'recaptcha_challenge_field'] = $controller->params'form']'recaptcha_challenge_field'];
            $controller->data$modelClass]'recaptcha_response_field'] = $controller->params'form']'recaptcha_response_field'];
        }
        $controller->$modelClass->Behaviors->attach('RecaptchaPlugin.Validation');
    }
}

Behavior

<?php
class ValidationBehavior extends ModelBehavior {
    function beforeValidate(&$model) {
        $model->validate'recaptcha_response_field'] = array(
            'checkRecaptcha' => array(
                'rule' => array('checkRecaptcha', 'recaptcha_challenge_field'),
                'message' => 'Vous n\'avez pas correctement entré les deux mots.',
            ),
        );
    }
    function checkRecaptcha(&$model, $data, $target) {
        App::import('Vendor', 'RecaptchaPlugin.recaptchalib');
        Configure::load('RecaptchaPlugin.key');
        $privatekey = Configure::read('Recaptcha.Private');
        $resp = recaptcha_check_answer( $privatekey, $_SERVER'REMOTE_ADDR'], $model->data$model->alias]$target], $data'recaptcha_response_field']
        );
        return $resp->is_valid;
    }
}

Helper

<?php
class RecaptchaHelper extends Helper {
    public $helpers = array('Form');
    function show($theme = null) {
        if (empty($theme) || !in_array($theme, array('red', 'white', 'blackglass', 'clean'))) {
            $theme = 'red';
        }
        App::import('Vendor', 'RecaptchaPlugin.recaptchalib');
        Configure::load('RecaptchaPlugin.key');
        $publickey = Configure::read('Recaptcha.Public');
        $lang = 'fr';
        $html = '<script type="text/javascript">
                var RecaptchaOptions = {
                        custom_translations : {
                                instructions_visual : "Tapez les deux mots:",
                                instructions_audio : "Ecrivez:",
                                play_again : "Rejouer la piste audio",
                                cant_hear_this : "Télécharger la piste au format MP3",
                                visual_challenge : "Mode visuel",
                                audio_challenge : "Mode audio",
                                refresh_btn : "Obtenez deux nouveaux mots",
                                help_btn : "Aide",
                                incorrect_try_again : "Incorrecte. S\'il vous plaît essayez de nouveau.",
                        },
                        lang : "fr",
                        theme : "white"
                };
        </script>';
        if (isset($recaptcha_error)) {
            $html .= $recaptcha_error . '<br/>';
        }
        return $html .= recaptcha_get_html($publickey);
    }
    function error() {
        return $this->Form->error('recaptcha_response_field');
    }
}

Bonjour,

@Vaillant as-tu pu finalement faire fonctionner le plugin ?
Je cherche moi aussi à l'utiliser. Merci d'avance,