Bonjour,
Voila je rencontre un petit problème avec mon code.
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>
Je bloque, apparemment, au niveau du renvoi à la vue de la réponse. Ci-après le code de l'erreur
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.
oui il suffit de regarder l'erreur et chercher la la ligne indiqué ou la précédente.
Problème résolu
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.
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
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 = '**' ;
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.
Salut,
Dans la fonction "recaptcha" on te dis que la variable "$captcha" n'existe pas.....
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.
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']);
}
}
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
Mais pourquoi vouloir mettre $captcha ?
Tout simplement :
return $this->isValid($_POST['g-recaptcha-response']);
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.
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
merci Carouge. Si tu veux on se retrouvera sur ce fil, je posterais demain pour dire où j'en suis. Bonne nuit à toi.
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 ?
ç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
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.