THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline

#1 Plugin ReCaptcha

(01-12-2017 11:50:45)


Bonjour,

J'ai téléchargé ce plugin ici : https://github.com/thelia-modules/ReCaptcha
J'ai suivi les instructions, cas n1.

J'ai installé et activé le module. J'ai ajouté {hook name="recaptcha.js"} dans le header.
Dans le formulaire, j'ai ajouté {hook name="recaptcha.v2.button"}

Quand je soumets le formulaire, que je coche ou pas le captcha, le formulaire est envoyé.

Dois-je intercepter l'evenement comme dans le cas n2 ?


Grrrr, formulaires, des heures pour faire un truc basique de chez basique.
Désolé, je passe mes nerfs smile



EDIT : Sur un Thelia 2.4+, à partir de la version 2.0.3 du module ReCaptcha, il est possible d'ajouter automatiquement sans coder quoi que ce soit un Captcha sur le formulaire de contact standard de Thelia.

Last edited by anti-conformiste (01-12-2017 11:51:06)

Offline

#2 Re: Plugin ReCaptcha

(04-12-2017 15:02:24)


Le truc n'est pas si basic que ça, parce que l'idée est de permettre d'ajouter un captcha à n'importe quel formulaire, existant ou pas.

Du coup, il faut un peu coder pour vérifier que le captcha est vérifié, comme indiqué à la fin du README.

Ce qu'il te faudrait, c'est un plugin Captcha "prêt à l'emploi" pour le formulaire de contact de base, c'est bien ça ?


OpenStudio Toulouse

Offline

#3 Re: Plugin ReCaptcha

(04-12-2017 20:17:04)


Oui, c'est bien ça, en effet.

Cependant, j'ai bien compris que je dois faire un dispatch du "CHECK_CAPTCHA_EVENT"
Cependant, de ce que je comprends dans la doc du lien, cela concerne uniquement le cas 2, "The new invisible captcha"

Dans le cas 1 "A standard captcha", je lis

In this case you have just to put this hook {hook name="recaptcha.v2.button"} in form where you want to use captcha

Dasn les 2 cas, j'ai videmment placé mon hook dans le header

{hook name="recaptcha.js"}

Enfin, je confirme qu'un module prêt à l'emploi, comme celui-ci semblait l'être, me conviendrait bien :-)

Offline

#4 Re: Plugin ReCaptcha

(03-01-2018 13:19:12)


Je relance le thread, je n'ai pas de solution, je ne sais pas faire fonctionner ce module.

I need Help please smile

Offline

#5 Re: Plugin ReCaptcha

(09-01-2018 16:36:42)


dans le controller de ton form avant l'envoie tu rajoutes ce test

            $checkModule = ModuleQuery::create()
                 ->findOneByCode('ReCaptcha');
                
            if($checkModule && $checkModule->getActivate()){    
                $checkCaptchaEvent = new ReCaptchaCheckEvent(); 
                $this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);
                if ($checkCaptchaEvent->isHuman() == false) { throw new \Exception('Invalid reCAPTCHA'); }
            }

Offline

#6 Re: Plugin ReCaptcha

(10-01-2018 11:44:52)


Merci, je teste ça et je fais un feed-back.

Offline

#7 Re: Plugin ReCaptcha

(10-01-2018 15:39:10)


Bonjour,
je me greffe sur la discussion qui tombe à pic puisque je me posais la même question.

J'ajoute une précision qui pourrait en aider certains :
ne pas oublier les namespaces suivant :
use Thelia\Model\ModuleQuery;
use ReCaptcha\Event\ReCaptchaCheckEvent;
use ReCaptcha\Event\ReCaptchaEvents;

A part cela, tout marche impecc' merci smile

Offline

#8 Re: Plugin ReCaptcha

(12-11-2018 10:39:12)


Bonjour,
Je m'intéresse à ce pbm pour la première fois à ce re-captcha suite à une avalanche de spam sur un site ... j'ai installé le plugin, créé la clé, j'ai bien le hook main.head-top dans mon head, j'ai ajouté le hook {hook name="recaptcha.v2.button"} dans le form (juste avant le div qui contient le submit, je ne sais pas si cela a une importance) et après je sèche ...
En fait le controller de ce formulaire est ou ? (la question est générale, là c'est mon formulaire de contact standard de Thelia mais potentiellement je vais devoir mettre ça sur les autres formulaires, celui d'inscription par ex ... )
La question suivante est "si je fais cette modif, sera-t-elle écrasée à la prochaine mise à jour de Thelia ?" car c'est l'impression que me donne les réponses ci-dessus ...
Merci d'avance !
Pierre

Offline

#9 Re: Plugin ReCaptcha

(12-11-2018 11:34:10)


Si tu  modifie directement le template "default", les modifs seront écrasées à la prochaine mise à jour.


OpenStudio Toulouse

Offline

#10 Re: Plugin ReCaptcha

(12-11-2018 14:04:23)


Bonjour,

Non non, bien sûr je travaille sur un jeu de template séparé que j'ai dupliqué à partir du jeu "default" ... mais les controleurs sont où dans le jeu "default" par exemple ? A priori ça n'est pas dans la page contact.html ... j'avais l'impression que ces controleurs étaient en dehors du dossier des templates ...

Pierre.

Offline

#11 Re: Plugin ReCaptcha

(12-11-2018 14:10:19)


Pourquoi tu voudrais modifier un contrôleur ?


OpenStudio Toulouse

Offline

#12 Re: Plugin ReCaptcha

(12-11-2018 14:17:43)


Bonjour,
Si je pouvais éviter ce serait zen :-) Mais je lis juste ce fil et la réponse #5 dis qu'il faut ajouter 8 lignes de code au controller ...
En tous cas je constate que ça ne marche de simplement installer le plugin recaptcha et mettre les hooks, ce que semblent confirmer les réponses #5 et #7 de ce fil ... ou alors j'ai vraiment rien compris :-(
Pierre.

PS: pour être clair j'ai utilisé ce plugin:  https://github.com/thelia-modules/ReCaptcha  (le même que celui du créateur du fil à priori).

Last edited by pierrot (12-11-2018 14:21:21)

Offline

#13 Re: Plugin ReCaptcha

(13-11-2018 15:10:49)


Bonjour,
Un petit up sur ce fil, je ne sais pas si Roadster31 a vu ma réponse à sa question ...
Pierre

Offline

#14 Re: Plugin ReCaptcha

(13-11-2018 16:34:20)


Salut PIERROT,

Je confirme que c'est bien cette version que j'ai testé et qu'elle n'est pas fonctionnelle 'en l'état'.

Je n'utilise plus ce module du coup, mais la réponse d'ALBERTTYTY semble donner la solution : que se passe-t-il si tu ajoutes les namespaces qu'il évoque dans l'initialisation du controleur ?

Offline

#15 Re: Plugin ReCaptcha

(13-11-2018 17:01:38)


Slt,
Merci de vous intéresser à ma question :-) On revient à ma question précédente ... je le trouve ou ce controleur ? avec sa question annexe ... ce genre de modif résiste-t-elle à des mises à jour de Thelia ?
Pierre

Offline

#16 Re: Plugin ReCaptcha

(15-11-2018 09:40:46)


pierrot wrote:

Slt,
Merci de vous intéresser à ma question :-) On revient à ma question précédente ... je le trouve ou ce controleur ? avec sa question annexe ... ce genre de modif résiste-t-elle à des mises à jour de Thelia ?
Pierre


Le controlleur se trouve dans le module local/modules/ReCaptcha/Controller/ConfigurationController.php
C'est dans ce fichier que ALBERTTYTY propose d'ajouter (réponse #7 de ce topic) les lignes suivantes je pense :

use Thelia\Model\ModuleQuery;
use ReCaptcha\Event\ReCaptchaCheckEvent;
use ReCaptcha\Event\ReCaptchaEvents;

A tester.

La modification ne sera pas impactée par une MAJ future de Thélia, tu ne bidouilles pas le core, juste un module qui à priori, n'est plus maintenu.
Si la modif fonctionne, crée une copie du module pour être sûr d'avoir une sauvegarde.

Offline

#17 Re: Plugin ReCaptcha

(15-11-2018 10:15:10)


Sur Github, un module n'est jamais abandonné smile

Il est possible de le forker pour intégrer un correctif, et même de proposer une pull request, qui sera certainement acceptée par l'équipe.

Voilà un moyen simple de contribuer.


OpenStudio Toulouse

Offline

#18 Re: Plugin ReCaptcha

(15-11-2018 11:37:19)


Bonjour,

Merci pour ces indications.

J'ai rajouté les lignes suggérées dans le controleur mentionné, mais bon ça ne semble pas fonctionner, j'ai bien le captcha mais je peux toujours soumettre sans cocher le captcha ... je suppose qu'il faudrait aussi ajouter les lignes du message #5, mais là aussi j'ai un doute sur l'endroit ou ajouter ça ... le même fichier ? mais ou ? ... je ne suis malheureusement pas très Symfony :-(

Pierre

Offline

#19 Re: Plugin ReCaptcha

(15-11-2018 14:03:21)


Bonjour,

J'utilise ce module et il fonctionne tres bien
comme j'indique dans mon post #5
il faut rajouter dans le controler de TON formulaire ou le controler du formulaire que tu veux utiliser

            $checkModule = ModuleQuery::create()
                 ->findOneByCode('ReCaptcha');
                
            if($checkModule && $checkModule->getActivate()){    
                $checkCaptchaEvent = new ReCaptchaCheckEvent(); 
                $this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);
                if ($checkCaptchaEvent->isHuman() == false) { throw new \Exception('Invalid reCAPTCHA'); }
            }

ainsi que les namespaces dans l'entete du controler de TON formulaire ou le controler du formulaire que tu veux utiliser

use Thelia\Model\ModuleQuery;
use ReCaptcha\Event\ReCaptchaCheckEvent;
use ReCaptcha\Event\ReCaptchaEvents;

Il ne faut rien toucher au module ReCaptcha

Last edited by zzuutt (15-11-2018 14:14:15)

Offline

#20 Re: Plugin ReCaptcha

(15-11-2018 14:29:16)


Bonjour,

C'est super sympa de me donner des indications, ça me permet de constater que même si je ne suis pas du tout un connaisseur de Symfony et même si je fais pas mal de PHP, je me pose les bonnes questions et cette dernière réponse me le confirme, j'avais l'impression en suivant les instructions d'ANTI-CONFORMISTE de faire une chose bizarre, par ex. mettre

use ReCaptcha\Event\ReCaptchaEvents;

dans le controller de ReCaptcha me semblait étonnant.

Si je comprends bien le dernier message ces lignes ainsi que les autres vont en fait dans le controleur de chaque formulaire ayant besoin de ReCaptcha et l'on retourne à ma première question qui était de savoir ou était ce contrôleur :-) Après l'info supplémentaire que je viens de glaner c'est qu'il y aurait un contrôleur par formulaire (j'ai pensé à un moment au cours de la lecture de ce fil qu'il y avait quelque part un moteur de traitement des formulaires en un point central), donc ma question reste valide, mais je peux la reformuler sur un exemple:

Ou par exemple trouverai-je le contrôleur qui correspond au formulaire de contact de base de Thelia, celui qui est dans la template par défaut contact.html ?
Et y-a-t-il un moyen de rendre cette modif pérenne au mises à jour de Thelia (car j'ai peur que le contrôleur de ce formulaire standard dans Thelia doit dans le core non ?)

Merci d'avance
Pierre.

Offline

#21 Re: Plugin ReCaptcha

(15-11-2018 15:06:38)


le controler du formulaire contact se trouve dans le module Front\Controller\ContactController.php

tu peux modifier directement dedans mais a la prochaine mise à jour ce sera effacé

le mieux est de créer un module qui fait exactement la même chose que le module Front et de definir une autre route par exemple
<form id="form-contact" action="{url path="/contact-captcha"}" method="post">

Offline

#22 Re: Plugin ReCaptcha

(15-11-2018 16:01:21)


zzuutt wrote:

Bonjour,
il faut rajouter dans le controler de TON formulaire ou le controler du formulaire que tu veux utiliser
Il ne faut rien toucher au module ReCaptcha

Merci pour la précision zzuutt, j'ai répondu trop vite. C'est évidemment lui qui intercepte.
Désolé PIERROT pour cette confusion. Je confirme que cette solution fonctionne.

Last edited by anti-conformiste (15-11-2018 16:05:34)

Offline

#23 Re: Plugin ReCaptcha

(15-11-2018 17:00:13)


Merci à vous 2, toutes les infos et itérations sont bonnes à prendre ... :-) je teste ça et je reviens sur ce fil pour confirmer que ça marche, cela pourra servir à d'autres.
Pierre

Offline

#24 Re: Plugin ReCaptcha

(17-11-2018 13:05:38)


Bonjour,

Bon je dois être une vraie burne, marche pas ici ... J'ai tenté d'insérer ce code un peu partout dans ce fichier Front\Controller\ContactController.php et je n'arrive pas à avoir un comportement qui me paraisse correct. Dans mon esprit je pensais que le bouton "envoyer" serait caché tant que le captcha n'est pas validé, là je peux cliquer "envoyer" sans avoir coché le captcha, et je me retrouve sur l'écran "ooops" ce qui me semble pas très ergonomique ...
En fait je dois mettre le code exactement ou ? j'ai mis les "use" après la ligne 30 "use Thelia\Model\ConfigQuery;" l'autre bloc j'ai essayé 2-3 endroits avec des effets variables allant de la page blanche aux écrans "ooops" donc je me dis que ça ne doit pas être au bon endroit.

Pierre

Offline

#25 Re: Plugin ReCaptcha

(19-11-2018 17:09:07)


Bonjour,

ContactController.php

<?php
/*************************************************************************************/
/*                                                                                   */
/*      Thelia	                                                                     */
/*                                                                                   */
/*      Copyright (c) OpenStudio                                                     */
/*      email : info@thelia.net                                                      */
/*      web : http://www.thelia.net                                                  */
/*                                                                                   */
/*      This program is free software; you can redistribute it and/or modify         */
/*      it under the terms of the GNU General Public License as published by         */
/*      the Free Software Foundation; either version 3 of the License                */
/*                                                                                   */
/*      This program is distributed in the hope that it will be useful,              */
/*      but WITHOUT ANY WARRANTY; without even the implied warranty of               */
/*      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                */
/*      GNU General Public License for more details.                                 */
/*                                                                                   */
/*      You should have received a copy of the GNU General Public License            */
/*	    along with this program. If not, see <http://www.gnu.org/licenses/>.         */
/*                                                                                   */
/*************************************************************************************/

namespace Front\Controller;

use Thelia\Controller\Front\BaseFrontController;
use Thelia\Form\ContactForm;
use Thelia\Form\Definition\FrontForm;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Log\Tlog;
use Thelia\Model\ConfigQuery;
use Thelia\Model\ModuleQuery;
use ReCaptcha\Event\ReCaptchaCheckEvent;
use ReCaptcha\Event\ReCaptchaEvents;

/**
 * Class ContactController
 * @package Thelia\Controller\Front
 * @author Manuel Raynaud <manu@raynaud.io>
 */
class ContactController extends BaseFrontController
{
    /**
     * send contact message
     */
    public function sendAction()
    {
        $contactForm = $this->createForm(FrontForm::CONTACT);

        try {
            $form = $this->validateForm($contactForm);
            
            $checkModule = ModuleQuery::create()
                 ->findOneByCode('ReCaptcha');
                
            if($checkModule && $checkModule->getActivate()){    
                $checkCaptchaEvent = new ReCaptchaCheckEvent(); 
                $this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);
                if ($checkCaptchaEvent->isHuman() == false) { throw new \Exception('Invalid reCAPTCHA'); }
            }            
            
            $message = \Swift_Message::newInstance($form->get('subject')->getData())
                ->addFrom(ConfigQuery::getStoreEmail(), $form->get('name')->getData())
                ->addReplyTo($form->get('email')->getData(), $form->get('name')->getData())
                ->addTo(ConfigQuery::getStoreEmail(), ConfigQuery::getStoreName())
                ->setBody($form->get('message')->getData())
            ;

            $this->getMailer()->send($message);

            if ($contactForm->hasSuccessUrl()) {
                return $this->generateSuccessRedirect($contactForm);
            }

            return $this->generateRedirectFromRoute('contact.success');

        } catch (FormValidationException $e) {
            $error_message = $e->getMessage();
        } catch (\Exception $ex) {
            // Any other error
            $error_message = $ex->getMessage();
        }

        Tlog::getInstance()->error(sprintf('Error during sending contact mail : %s', $error_message));

        $contactForm->setErrorMessage($error_message);

        $this->getParserContext()
            ->addForm($contactForm)
            ->setGeneralError($error_message)
        ;

        // Redirect to error URL if defined
        if ($contactForm->hasErrorUrl()) {
            return $this->generateErrorRedirect($contactForm);
        }
    }
}

contact.html

.....
                        {form_field field="message"}
                            <div class="form-group group-message{if $error} has-error{/if}">
                                <label class="control-label" for="{$label_attr.for}">{$label}{if $required} <span class="required">*</span>{/if}</label>
                                <div class="control-input">
                                    <textarea name="{$name}" id="{$label_attr.for}" placeholder="{intl l="Placeholder contact message"}" rows="6" class="form-control"{if $required} aria-required="true" required{/if}>{$value}</textarea>
                                    {if $error }
                                        <span class="help-block">{$message}</span>
                                        {assign var="error_focus" value="true"}
                                    {/if}
                                </div>
                            </div><!--/.form-group-->
                        {/form_field}
                        
                        {hook name="recaptcha.v2.button"}
                        
                    </div>
                    
                </fieldset>

                {hook name="contact.form-bottom"}

                <div class="form-group group-btn">
                    <div class="control-btn">
                        <button type="submit" class="btn btn-primary" {hook name="recaptcha.invisible.button"}><i class="fa fa-chevron-right"></i> {intl l="Send"}</button>
                    </div>
                </div><!--/.form-group-->
.....

si tu cliques sur envoie sans cocher recaptcha
ton formulaire se raffichera avec une erreur "Invalid reCAPTCHA" retournée par le controler

if ($checkCaptchaEvent->isHuman() == false) { throw new \Exception('Invalid reCAPTCHA'); }