Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Décrivez ici votre code ou ce que vous cherchez à faire
Je cherche à installer un Recaptcha dans un framework en MVC. Le problème c'est que ne parviens pas à envoyer à la vue le résultat de la fonction qui controle la réponse. J'ai bien suivi le tuto de grafikart sur le sujet mais celui-ci, bien qu'en pdo, ne traite pas le problème façon mvc. J'ai donc essayer de l'adapter.
J'ai mis ma variable captcha dans mon controller principal.
Voici le code de mon Sendscontroller qui intègre à la fois le contrôle du formulaire et le contrôle du recaptcha (celui correspond environ pour les élements principaux à la 16ème minute du tuto de Grafikart - là ou je bloque) :

<?php
    class SendsController extends controller{

    private $secret;    

    /**
    * Permet de tester les champs du formulaire
    **/
    function contact(){
    $this->loadmodel('Send');
        if($this->request->data){
        if($this->Send->validates($this->request->data)){
        //var_dump($_POST);
        $comments = $_POST['comments'];
        $headers = 'FROM: ' .$_POST['email'];
        mail('********@gmail.com', 'Formulaire de contact de ' .$_POST['lastname'], $comments, $headers);
        $this->Session->setFlash('Votre message a été envoyé');
        unset($this->request->data);
        }else{

                $this->Session->setFlash('Veuillez corriger vos informations','danger');

            }
        }
            //j'envoi la vérification du code de la réponse à la vue
        $d['captchas'] = $this->recaptcha();
        $this->set($d);
    }

// fonction qui va tester le code
function isValid($code){

    if(empty($code)){
        return false;
    }

    $url = "https://www.google.com/recaptcha/api/siteverify?secret={$this->secret}&response={$code}";

    if (function_exists('curl_version')) {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // Evite les problèmes, si le ser
        $response = curl_exec($curl);
    } else {
        // Si curl n'est pas dispo, un bon vieux file_get_contents
        $response = file_get_contents($url);
    }

    if (empty($response) || is_null($response)) {
        return false;
    }

    $json = json_decode($response);
    return $json->success;
    }

/* 
je demande à la fonction ivValid de retourner la réponse à partir de la variable captcha
dont la valeur est la clé secrète
*/
    function recaptcha(){

        if(!empty($_POST)){
        return  $captcha->isValid($_POST['g-recaptcha-response']);
        }
    }

}

Voici le code de la vue

<form action="<?php echo Router::url('sends/contact'); ?>" method="post">
                        <fieldset>
                        <legend class = "text-center">Demande d'information</legend>

                        <?php
                        var_dump($_POST);
                        var_dump($catpchas);
                        ?>

                            <div class="col-md-6">
                                <?php echo $this->Form->input('lastname',''); ?>
                                <?php echo $this->Form->input('firstname',''); ?>
                                <?php echo $this->Form->input('phone',''); ?>
                                <?php echo $this->Form->input('email',''); ?>
                            </div>  
                            <div class="col-md-6">  
                                <?php echo $this->Form->input('comments','',array('type'=>'textarea','class'=>"form-control",'rows'=>6)); ?><br/>

                            <div class="actions">
                            <input type="submit" class="btn btn-primary" value="Envoyer">
                            <br></br>
                            <div class="g-recaptcha" data-sitekey="*******************************"></div>
                            </div>
                            </div>
                        </fieldset>
                    </form>

Ce que je veux

Je bloque, apparemment, au niveau du renvoi à la vue de la réponse. Ci-après le code de l'erreur

Ce que j'obtiens

J'attends un booleen (true ou false) mais j'ai ceci en erreurs:

 Notice: Undefined variable: captcha in C:\wamp\www\test.dev\controller\SendsController.php on line 70
 Fatal error: Call to a member function isValid() on a non-object in C:\wamp\www\test.dev\controller\SendsController.php on line 70
 Notice: Undefined variable: catpchas in C:\wamp\www\test.dev\view\sends\contact.php on line 16

Merci pour votre aide. J'ai beaucoup cherché mais je n'y arrive pas.

28 réponses


Carouge10
Réponse acceptée

oui il suffit de regarder l'erreur et chercher la la ligne indiqué ou la précédente.
Problème résolu

Suffit décrire captchas correctement et plus d'erreur...

tikoum
Auteur

Bonjour Fital, tu as raison pour captchas mais j'ai toujours les deux autres erreurs.

Bah pour ton erreur ligne 70, tu utilise $captcha dans une fonction mais tu ne le passe pas en paramètre. C'est normale d'avoir cette erreur du coup.

Corrige déjà tout tes catpchas au lieu de captchas et reposte ton code + messages d'erreurs on y verra plus clair :)

Bonjour,

La première erreur t'indique que la variable "$captcha" n'existe pas dans ton controlleur.
La deuxième erreur indique que tu ne peux pas appeler la function isValid sur un élément non objet, évidement la première erreur te signale que la variable n'existe pas.

tikoum
Auteur

J'ai remplacé "captchas" par "reply" pour limiter la confusion. Voici le code de SendsController:

<?php
    class SendsController extends controller{

    private $secret;    

    /**
    * Permet de tester les champs du formulaire
    **/
    function contact(){
    $this->loadmodel('Send');
        if($this->request->data){
        if($this->Send->validates($this->request->data)){
        //var_dump($_POST);
        $comments = $_POST['comments'];
        $headers = 'FROM: ' .$_POST['email'];
        mail('*********@gmail.com', 'Formulaire de contact de ' .$_POST['lastname'], $comments, $headers);
        $this->Session->setFlash('Votre message a été envoyé');
        unset($this->request->data);
        }else{

                $this->Session->setFlash('Veuillez corriger vos informations','danger');

            }
        }
            //j'envoi la vérification du code à la vue
        $d['reply'] = $this->recaptcha();
        $this->set($d);
    }

// fonction qui va tester le code
function isValid($code){

    if(empty($code)){
        return false;
    }

    $url = "https://www.google.com/recaptcha/api/siteverify?secret={$this->secret}&response={$code}";

    if (function_exists('curl_version')) {
        $curl = curl_init($url);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_TIMEOUT, 1);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // Evite les problèmes, si le ser
        $response = curl_exec($curl);
    } else {
        // Si curl n'est pas dispo, un bon vieux file_get_contents
        $response = file_get_contents($url);
    }

    if (empty($response) || is_null($response)) {
        return false;
    }

    $json = json_decode($response);
    return $json->success;
    }

/* 
je demande à la fonction ivValid de retourner la réponse à partir de la variable captcha
dont la valeur est la clé secrète
*/
    function recaptcha(){

        if(!empty($_POST)){
        return  $captcha->isValid($_POST['g-recaptcha-response']);
        }
    }
}

et ma vue:

<form action="<?php echo Router::url('sends/contact'); ?>" method="post">
                        <fieldset>
                        <legend class = "text-center">Demande d'information</legend>

                        <?php
                        var_dump($_POST);
                        var_dump($reply);
                        ?>

                            <div class="col-md-6">
                                <?php echo $this->Form->input('lastname',''); ?>
                                <?php echo $this->Form->input('firstname',''); ?>
                                <?php echo $this->Form->input('phone',''); ?>
                                <?php echo $this->Form->input('email',''); ?>
                            </div>  
                            <div class="col-md-6">  
                                <?php echo $this->Form->input('comments','',array('type'=>'textarea','class'=>"form-control",'rows'=>6)); ?><br/>

                            <div class="actions">
                            <input type="submit" class="btn btn-primary" value="Envoyer">
                            <br></br>
                            <div class="g-recaptcha" data-sitekey="****************************L"></div>
                            </div>
                            </div>
                        </fieldset>
                    </form>

Les messages d'erreurs:

 Notice: Undefined variable: captcha in C:\wamp\www\test.dev\controller\SendsController.php on line 70
 Fatal error: Call to a member function isValid() on a non-object in C:\wamp\www\test.dev\controller\SendsController.php on line 70
tikoum
Auteur

Bonjour Krysenn

J'ai placé la variable $captcha dans mon controlleur principal (parce que j'avais justement toujours la même erreur et d'ailleurs rien n'y a fait).
Cette variable contient le code secret qui est donné par google.
Je l'ai enregistré de la façon suivante :

public $captcha = '**' ;

tikoum
Auteur

Je crois que le problème vient du fait que la variable commence par une valeur numérique et qui, ainsi, ne pourrait devenir un objet.

tikoum
Auteur

Sympa, plus personne !!!!

Salut,
Dans la fonction "recaptcha" on te dis que la variable "$captcha" n'existe pas.....

tikoum
Auteur

bah oui j'ai compris Carouge. Comme je l'ai expliqué la variable que j'ai initialisé commence par une valeur numérique et je crois que c'est cela le problème. Si tu sais comment régler ce problème, j'ai vraiment beaucoup chercher.

J'insiste.... car tu ne peux initialisé une variable qui n'existe pas.
C'est un peu comme si je te mettais en plein milieu d'un champ et que je te demandais de rentrer dans la maison juste devant toi.

Indice : Lis bien le "return" de la fonction "recaptcha".

tikoum
Auteur

Désolé de ne pas avoir répondu vite mais j'analisais ta réponse. Vraiment je ne vois pas, j'ai essayé ceci, mais bon... (il n'y a pas la variable qui passe en paramètre.

function recaptcha(){

    if(!empty($_POST)){
    return->$this->isValid($_POST['g-recaptcha-response']);
    }
    }
tikoum
Auteur

pardon
function recaptcha(){

    if(!empty($_POST)){
    return $this->$captcha->isValid($_POST['g-recaptcha-response']);
    }
}
mais maintenant cette erreur
Parse error: syntax error, unexpected '$captcha' (T_VARIABLE), expecting function (T_FUNCTION) in C:\wamp\www\test.dev\controller\SendsController.php on line 4
tikoum
Auteur

Ca fait 4 js que je bosse dessus, aidez moi.

Mais pourquoi vouloir mettre $captcha ?

Tout simplement :

return $this->isValid($_POST['g-recaptcha-response']);
tikoum
Auteur

Ca me parait évident, c'est pour demander à la fonction isValid de tester la valeur secrète. Je retape mon code et je dis ds 5 mns parce que j'avais essayer autre chose.

tikoum
Auteur

Il y a du mieux, c'est à dire que je chope le booleen mais il est toujours à false alors qu'il devrait être à true quand je valide le captcha et envoi le formulaire.
J'ai passé en paramètre de la fonction recaptcha le code secret:
function recaptcha($captcha='*****')

pour le reste il te faut debugguer ligne par ligne et comparer au résultat que tu attends afin de déterminer d'où viens l'erreur

tikoum
Auteur

merci Carouge. Si tu veux on se retrouvera sur ce fil, je posterais demain pour dire où j'en suis. Bonne nuit à toi.

Merci, également.

tikoum
Auteur

Bon, ça marche en ligne mais pas en local, alors on dira, sous toute réserve, que ça marche. Merci Carouge.

Mais pourquoi cela ne marche pas en ligne. Quel erreur est rétourné ? Que dises les logs ?

tikoum
Auteur

ça marche en ligne, et ça ne marche pas en local.
franchement je sais pas, j'ai pourtant le même code. Quand je clique sur ma page de contact, j'ai cette erreur :

 Notice: Undefined variable: reply in C:\wamp\www\test.dev\view\sends\contact.php on line 16

Bizarre

D'accord,
Peux-tu me donner les lignes 14-15-16 de ta vue ?

tikoum
Auteur

<?php
var_dump($_POST);
var_dump($reply);
?>

                    J'ai réessayé ça fonctionne.
tikoum
Auteur

Yes,
La résolution de mon prochain problème sera de faire des sous catégories. Je me suis cogner la tête tout le mois de juillet sans y arriver. Mais j'ai compris le principe. Je posterais un sujet dessus prochainement. Bien à toi.