THELIA Forum

Welcome to the THELIA support and discusssion forum

Offline

#26 Re: Plugin ReCaptcha

(20-11-2018 17:59:51)


Bonjour,

Ok grand merci de continuer à me répondre. Bon finalement j'en étais à peu près là, je constate juste que mon controler est un peu différent du votre (qu'un seul catch par ex.).
En fait je m'attendais à un comportement différent, il me semble que souvent cela cache le bouton "envoyer" quand on n'a pas le captcha valide, là c'est un peu bizarre on se retrouve sur l'écran générique d'erreur de Thelia (Oooops) avec retour à l'admin possible ce que l'internaute moyen ne vas pas forcément comprendre.

Serait-il possible d'avoir une page d'erreur de la même façon que l'on a une template contact-success.html, genre une template contact-error.html ... Il faudrait modifier le

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

ou autre chose dans le controler pour avoir ce comportement ?

Pierre.

Offline

#27 Re: Plugin ReCaptcha

(21-11-2018 08:26:35)


Bonjour,

Le retour au formulaire avec le message d'erreur me semble assez explicite
goug.jpg

Offline

#28 Re: Plugin ReCaptcha

(21-11-2018 09:54:59)


Slt,
Oui ça c'est nickel mais ça n'est pas du tout ce qui se passe chez moi ... moi ça revient sur l'écran d'erreur standard de Thelia avec le oops ... ok ce que je vais faire c'est copier-coller tout le controller que vous avez fourni ci-dessus car comme je le disais je n'ai pas exactement la même chose et je vais voir.
(pour mémoire je suis pourtant en 2.3.4 avec tout à jour, bizarre que j'ai un controller différent non ?)
Pierre.

Offline

#29 Re: Plugin ReCaptcha

(21-11-2018 21:37:57)


Bonsoir,

Bon j'ai copié exactement le code proposé par Zzuutt (encore merci pour sa patience), cela a changé le comportement dans le sens ou si je ne valide pas le captcha, je ne quitte plus la page contact (pour aller vers le ooops), je reste sur la même page contact, le message ne part pas, mais je n'ai pas le message "invalid cpatcha"....
Si je valide le captcha ça marche.

J'ai aussi essayé de remplacer ma template contact.html par celle de la distribution (car moi j'ai supprimé la map), rajouté ce qui est conseillé par Zzuutt, même comportement pas de message.

Bref j'en suis à un moindre mal pour l'internaute, on reste sur la page, et la case du captcha vide est suffisamment visible pour que l'on comprenne ce qu'il manque, mais je n'ai pas de message. Mais j'ai bien les alertes si je ne remplis pas les champs obligatoires. C'est un hook spécifique qui affiche ce message d'erreur ? A priori je n'ai rien de dévalidé, c'est un site très standard ...

Pierre.

Offline

#30 Re: Plugin ReCaptcha

(22-11-2018 16:08:36)


Bonjour,

Rajoutes dans contact.html

...
        {block name="contact-form"}
            {form name="thelia.front.contact"}
            {if $form_error}
                <div class="alert alert-danger">{$form_error_message}</div>
            {/if}
...

Offline

#31 Re: Plugin ReCaptcha

(22-11-2018 20:14:09)


Bonjour,

Oui ça le fait parfaitement, j'ai mis en français dans le controller ...

Je ne peux m'empêcher de revenir sur tout ce processus pour arriver à faire marcher un plugin au fond simple... pour moi cela défie carrément la notion de plugin, dans tous les CMS que je connais, installer un plugin nécessite 2 clics et 3 paramètres ce qui fait que je n'ai jamais vraiment cherché dans les bonnes directions, pensant toujours que la doc qui disait, je cite "This module allow you to add easily a reCAPTCHA to your form" avait raison et que ça devrait être simple, je n'imaginais simplement pas que je devrais modifier un controller du core ...
La il faut faire des modifications aux templates (logique) mais aussi au controller dans quelque chose qui sera écrasé à la prochaine mise à jour sauf à créer un nouveau module ... pour faire marcher ce plugin et le rendre pérenne il faut quasiment faire un second plugin ... (ok c'est une simple duplication mais largement hors de portée d'un utilisateur de base) ...

Bref que faire d'autre sinon remercier avec effusion ceux qui acceptent d'aider, acheter un bouquin sur Symfony et tenter d'apprendre une techno de plus .... :-( J'ai dû installer des reCaptacha plusieurs 10aines de fois dans des Wordpress, Spip, Drupal ou même sites HTML sans jamais que ça me prenne plus de 10mn, là ça a plutôt été 10 jours ... Oh well ...

Pierre

PS: Zzuutt si tu passes par Grenoble, une bière t'attends :-)

Last edited by pierrot (22-11-2018 20:15:36)

Offline

#32 Re: Plugin ReCaptcha

(23-11-2018 07:35:12)


Ce module ne s'intègre pas tout seul à la form de contact, il est fourni comme un outil pour les développeurs.

Il faudrait que quelqu'un prenne un moment pour faire cette intégration.


OpenStudio Toulouse

Offline

#33 Re: Plugin ReCaptcha

(23-11-2018 09:44:22)


Bonjour,
Attention, mon idée n'était pas de critiquer le plugin mais peut-être plutot de critiquer la doc qui oublie complètement de mentionner tout ça, voire qui au contraire donne l'impression que c'est très simple. Si j'avais su avant j'aurai probablement pris direct la voie d'une intégration simple à la mano (no hook, direct dans le code du template, un peu de jquery, ...), mais une fois qu'on a démarré dans une voie c'est souvent difficile de revenir en arrière on pense que la solution est toujours juste à portée de main ... :-) (sur ce précepte l'autre jour j'ai attendu 1h20 le support OVH au téléphone, une fois qu'on a attendu X minutes il semble débile de perdre cet acquis et de recommencer plus tard :-)
Bref en tous cas maintenant je sais !
Pierre.

PS: et l'offre bière tient aussi bien sûr pour roadster31 qui m'a moultes fois dépanné ici !!

Offline

#34 Re: Plugin ReCaptcha

(28-08-2019 10:51:06)


Bonjour

J'essaie d'intégrer un bouton caPTCHA invisible dans le formulaire d'inscription à la newsletter... mais c'est dur !
Voilà où j'en suis. Cela pourra peut-être aider ou me débloquer.

J'ai créé un compte sur Google Captcha "bouton invisible v2"

Dans le fichier /templates/frontOffice/monsite/newsletter.html j'ai ajouté  {hook name="recaptcha.check"} comme ceci :

            {form name="thelia.front.newsletter"}
                <form id="form-newsletter" action="{url path="/newsletter"}" method="post">
                {hook name="recaptcha.check"}

et aussi {hook name="recaptcha.invisible.button"} là :

 <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="Subscribe"}</button>
                            </div>
                        </div><!--/.form-group-->

Dans le fichier /local/modules/Front/Controller/NewsletterController.php j'ai ajouté : :

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

et puis :

        try {
            $form = $this->validateForm($newsletterForm);
            
$checkCaptchaEvent = new ReCaptchaCheckEvent();
$this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);

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

et enfin j'ai vérifié que j'ai bien {hook name="main.head-top"} dans /templates/frontOffice/monsite/layout.tpl

Bon et alors quand je veux inscrire un email à la newsletter j'ai un message en lightbox "Invalid captcha".

Est-ce que j'ai tout faux ou qu'est-ce que j'ai loupé ?

Merci
Gildart

Offline

#35 Re: Plugin ReCaptcha

(18-11-2020 23:20:35)


Bonsoir,

je déterre le sujet ... Visiblement j'ai le même genre de galère que GILDART. À l'exeption que je récupère la page d'erreur "Ooops"

Voici comment j'ai intégré le plugin :

ContactControler.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\Core\Event\Contact\ContactEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Form\Definition\FrontForm;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Log\Tlog;
use Thelia\Model\ConfigQuery;
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);
            $checkCaptchaEvent = new ReCaptchaCheckEvent(); 
                $this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);
                if ($checkCaptchaEvent->isHuman() == false) { throw new \Exception('Invalid reCAPTCHA'); }

            $event = new ContactEvent($form);

            $this->dispatch(TheliaEvents::CONTACT_SUBMIT, $event);

            $this->getMailer()->sendSimpleEmailMessage(
                [ ConfigQuery::getStoreEmail() => $event->getName() ],
                [ ConfigQuery::getStoreEmail() => ConfigQuery::getStoreName() ],
                $event->getSubject(),
                '',
                $event->getMessage(),
                [],
                [],
                [ $event->getEmail() => $event->getName() ]
            );

            if ($contactForm->hasSuccessUrl()) {
                return $this->generateSuccessRedirect($contactForm);
            }
            
            return $this->generateRedirectFromRoute('contact.success');
            
        } catch (FormValidationException $e) {
            $error_message = $e->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);
        }
    }
}

J'ai tenté une copie bête et méchante du fichier ContactControler de Zzuutt et là j'obtiens le message "invalidCaptcha" que je coche ou non ...

Je suis un peu coincé.

Offline

#36 Re: Plugin ReCaptcha

(20-11-2020 23:59:25)


Bon j'avance un peu, visiblement je n'arrive pas à récupérer

$checkCaptchaEvent

, J'obtiens toujours Invalid captcha .....

Ah et je suis en 2.4.2

ContactControler

namespace Front\Controller;

use Thelia\Controller\Front\BaseFrontController;
use Thelia\Core\Event\Contact\ContactEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Form\Definition\FrontForm;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Log\Tlog;
use Thelia\Model\ConfigQuery;
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);
            
            $checkCaptchaEvent = new ReCaptchaCheckEvent();
        

            $event = new ContactEvent($form);

            $this->dispatch(TheliaEvents::CONTACT_SUBMIT, $event);
            
            $this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);
            if ($checkCaptchaEvent->isHuman() == false) {
    				throw new \Exception('Invalid captcha');
				}
            
            					
            $this->getMailer()->sendSimpleEmailMessage(
                [ ConfigQuery::getStoreEmail() => $event->getName() ],
                [ ConfigQuery::getStoreEmail() => ConfigQuery::getStoreName() ],
                $event->getSubject(),
                '',
                $event->getMessage(),
                [],
                [],
                [ $event->getEmail() => $event->getName() ]
            );
            
            

            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);
        }
    }
}

Ah et chose étrange depuis quelques temps je n'ai plus la carte googlemaps sur ma page de contact ?! Est ce lié ?

Merci

Offline

#37 Re: Plugin ReCaptcha

(02-12-2020 11:06:52)


Bonjour a tous,
je veux bien essayer de partager des taches pour l'élaboration ou la modification d'un plugin existant, ou autre.
Sur un autre" CMS " cela s'installe en 3 mn," Mon préféré étant thelia wink " on peu peu etre s'en inspirer ?
Si on sait ou chercher biensur..
Ya t'il une "ardoise commune"  ?
Contactez moi, Je précise, que je travailles aussi beaucoup.
Mais si ca peu aider
Portez vous bien


Toujours en forme,
La différence entre le possible et l’impossible, c’est la volonté, et le  temps ...
Oui mais... ça c'est avec la meilleure volonté du Monde,
Et elle est, des fois, difficile à tenir... Thelia 2.4.4

Offline

#38 Re: Plugin ReCaptcha

(22-04-2021 10:57:25)


Hello ici!

Si j'ai bien tout compris pour éviter de modifier le code natif de Thelia il faut pour chaque formulaire, où l'on souhaite ajouter reCaptcha, créer un module ?


Aide les autres, ils t'aideront en retour.

Offline

#39 Re: Plugin ReCaptcha

(23-04-2021 10:04:07)


Le forum était plus vivant quand c'était la V1... =/

Donc en fouinant/lisant un peu à droite à gauche, il faudrait améliorer ce module pour utiliser recaptcha partout où l'on veut ?

Dans l'idée, j'aimerais faire en sorte que dans l'admin du module on puisse choisir :
- les hooks : pour injecter dans le formulaire correspondant ce qui va bien
- les events : pour exécuter le code de vérification

Mais est-ce faisable ?

Là actuellement c'est l'inverse, c'est les autres modules qui doivent appeler celui via

$checkCaptchaEvent = new ReCaptchaCheckEvent();
$this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);

Last edited by Elyos (23-04-2021 10:05:45)


Aide les autres, ils t'aideront en retour.

Offline

#40 Re: Plugin ReCaptcha

(29-04-2021 15:40:20)


Bon avant de modifier quoi que ce soit, j'ai installé le module, renseigné mes clefs et c'est tout.

Je me retrouve dans mon formulaire d'inscription avec :

<input type="hidden" name="thelia_customer_create[success_url]" value="https://monsite.fr/admin/module/ReCaptcha" /> 

c'est normal? O.o


Aide les autres, ils t'aideront en retour.

Offline

#41 Re: Plugin ReCaptcha

(29-04-2021 18:22:17)


Elyos wrote:

Bon avant de modifier quoi que ce soit, j'ai installé le module, renseigné mes clefs et c'est tout.

Je me retrouve dans mon formulaire d'inscription avec :

<input type="hidden" name="thelia_customer_create[success_url]" value="https://monsite.fr/admin/module/ReCaptcha" /> 

c'est normal? O.o


En fait, si je suis également connecté à l'admin ça me met la dernière URL de l'admin que j'ai ouvert... c'est... étrange non ?


Aide les autres, ils t'aideront en retour.

Offline

#42 Re: Plugin ReCaptcha

(29-04-2021 18:37:27)


Et je viens de voir qu'à l'inscription le label pour le choix du pays est... Ville ... '-_- (template de base pourtant)


Aide les autres, ils t'aideront en retour.

Offline

#43 Re: Plugin ReCaptcha

(29-04-2021 19:47:54)


Elyos wrote:
Elyos wrote:

Bon avant de modifier quoi que ce soit, j'ai installé le module, renseigné mes clefs et c'est tout.

Je me retrouve dans mon formulaire d'inscription avec :

<input type="hidden" name="thelia_customer_create[success_url]" value="https://monsite.fr/admin/module/ReCaptcha" /> 

c'est normal? O.o


En fait, si je suis également connecté à l'admin ça me met la dernière URL de l'admin que j'ai ouvert... c'est... étrange non ?

C'est la dernière URL que tu as visité (en front ou en back, c'est partagé). Ne trouves-tu pas logique que le formulaire de login te ramène vers la dernière page visitée (en l'occurence, {navigate to="previous"}), non ?


OpenStudio Toulouse

Offline

#44 Re: Plugin ReCaptcha

(29-04-2021 19:50:15)


Elyos wrote:

Et je viens de voir qu'à l'inscription le label pour le choix du pays est... Ville ... '-_- (template de base pourtant)

On ne doit pas utiliser le même Thelia alors !

download

Ou alors tu as tellement bidouillé le tien que tu ne maitrises plus rien.


OpenStudio Toulouse

Offline

#45 Re: Plugin ReCaptcha

(30-04-2021 07:41:07)


roadster31 wrote:

C'est la dernière URL que tu as visité (en front ou en back, c'est partagé). Ne trouves-tu pas logique que le formulaire de login te ramène vers la dernière page visitée (en l'occurence, {navigate to="previous"}), non ?

Si si c'est logique de récupérer la dernière url visitée, juste que séparé le front et le back ça aurait été mieux ?

roadster31 wrote:

On ne doit pas utiliser le même Thelia alors !

https://cloud.cqfdev.fr/index.php/s/gJt … d/download

Ou alors tu as tellement bidouillé le tien que tu ne maitrises plus rien.

Non j'ai pas bidouillé et encore moins les traductions... j'ai gardé les templates de base (que j'ai dupliqué) c'est stocké où cette traduction ?


Aide les autres, ils t'aideront en retour.

Offline

#46 Re: Plugin ReCaptcha

(30-04-2021 07:56:58)


Ok j'ai trouvé : /thelia/local/I18n

C'est la traduction dans le module de livraison chronopost qui n'était pas bonne... (du coup je me dis que j'aurais pas dû traduire comme ça : "généraliser")


Aide les autres, ils t'aideront en retour.

Offline

#47 Re: Plugin ReCaptcha

(30-04-2021 09:34:27)


Bon j'avance...

J'ai remplacé l'event ReCaptcha par les différents events :

public static function getSubscribedEvents()
    {
        return [
            TheliaEvents::CUSTOMER_CREATEACCOUNT => ['checkCaptcha', 128],
            TheliaEvents::CONTACT_SUBMIT => ['checkCaptcha', 128],
            TheliaEvents::NEWSLETTER_SUBSCRIBE => ['checkCaptcha', 128],
        ];
    }

mais dans la fonction checkCaptcha (hormis le fait que success == false tout le temps) je ne sais pas comment dire de stopper le code appelant...

if ($result['success'] !== true) {
	throw new \Exception('Invalid captcha');
	return false;
}

Exemple : pour register, ça me retourne bien l'erreur "invalid captcha" mais ça m'enregistre quand même le client...


Aide les autres, ils t'aideront en retour.

Offline

#48 Re: Plugin ReCaptcha

(30-04-2021 10:14:02)


Bon j'ai procédé autrement...

Pour ceux que ça intéresse : (si quelqu'un peut tester pour voir si ça fonctionne bien chez lui...)

dans ReCaptcha/Config/routing.xml j'ai ajouté :

<route id="customer.create.process" path="/register" methods="post">
	<default key="_controller">ReCaptcha\Controller\CustomerController::createAction</default>
	<default key="_view">register</default>
</route>
<route id="newsletter.process" path="/newsletter" methods="post">
	<default key="_controller">ReCaptcha\Controller\NewsletterController::subscribeAction</default>
	<default key="_view">newsletter</default>
</route>
<route id="contact.send" path="/contact" methods="post">
	<default key="_controller">ReCaptcha\Controller\ContactController::sendAction</default>
	<default key="_view">contact</default>
</route>

dans ReCaptcha/Controller j'ai ajouté 3 fichiers (issus du module Front) que j'ai modifié :
- CustomerController.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 ReCaptcha\Controller;

use ReCaptcha\ReCaptcha;
use Front\Front;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Thelia\Controller\Front\BaseFrontController;
use Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent;
use Thelia\Core\Event\Customer\CustomerEvent;
use Thelia\Core\Event\Customer\CustomerLoginEvent;
use Thelia\Core\Event\LostPasswordEvent;
use Thelia\Core\Event\Newsletter\NewsletterEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\Security\Authentication\CustomerUsernamePasswordFormAuthenticator;
use Thelia\Core\Security\Exception\AuthenticationException;
use Thelia\Core\Security\Exception\CustomerNotConfirmedException;
use Thelia\Core\Security\Exception\UsernameNotFoundException;
use Thelia\Core\Security\Exception\WrongPasswordException;
use Thelia\Form\CustomerLogin;
use Thelia\Form\Definition\FrontForm;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Log\Tlog;
use Thelia\Model\ConfigQuery;
use Thelia\Model\Customer;
use Thelia\Model\CustomerQuery;
use Thelia\Model\Newsletter;
use Thelia\Model\NewsletterQuery;
use Thelia\Tools\RememberMeTrait;
use Thelia\Tools\URL;
use ReCaptcha\Event\ReCaptchaCheckEvent;   
use ReCaptcha\Event\ReCaptchaEvents;

/**
 * Class CustomerController
 * @package Thelia\Controller\Front
 * @author Manuel Raynaud <manu@raynaud.io>
 */
class CustomerController extends BaseFrontController
{
    use RememberMeTrait;

    /**
     * Create a new customer.
     * On success, redirect to success_url if exists, otherwise, display the same view again.
     */
    public function createAction()
    {
        if (! $this->getSecurityContext()->hasCustomerUser()) {
            $customerCreation = $this->createForm(FrontForm::CUSTOMER_CREATE);

            try {
                $form = $this->validateForm($customerCreation, "post");
				
				$checkCaptchaEvent = new ReCaptchaCheckEvent(); 
                $this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);
                if ($checkCaptchaEvent->isHuman() == false) { throw new \Exception('Invalid reCAPTCHA'); }

                $customerCreateEvent = $this->createEventInstance($form->getData());

                $this->dispatch(TheliaEvents::CUSTOMER_CREATEACCOUNT, $customerCreateEvent);

                $newCustomer = $customerCreateEvent->getCustomer();

                // Newsletter
                if (true === $form->get('newsletter')->getData()) {
                    $newsletterEmail = $newCustomer->getEmail();
                    $nlEvent = new NewsletterEvent(
                        $newsletterEmail,
                        $this->getRequest()->getSession()->getLang()->getLocale()
                    );
                    $nlEvent->setFirstname($newCustomer->getFirstname());
                    $nlEvent->setLastname($newCustomer->getLastname());

                    // Security : Check if this new Email address already exist
                    if (null !== $newsletter = NewsletterQuery::create()->findOneByEmail($newsletterEmail)) {
                        $nlEvent->setId($newsletter->getId());
                        $this->dispatch(TheliaEvents::NEWSLETTER_UPDATE, $nlEvent);
                    } else {
                        $this->dispatch(TheliaEvents::NEWSLETTER_SUBSCRIBE, $nlEvent);
                    }
                }

                if (ConfigQuery::isCustomerEmailConfirmationEnable() && ! $newCustomer->getEnable()) {
                    $response = $this->generateRedirectFromRoute('customer.login.view');
                } else {
                    $this->processLogin($customerCreateEvent->getCustomer());

                    $cart = $this->getSession()->getSessionCart($this->getDispatcher());
                    if ($cart->getCartItems()->count() > 0) {
                        $response = $this->generateRedirectFromRoute('cart.view');
                    } else {
                        $response = $this->generateSuccessRedirect($customerCreation);
                    }
                }

                return $response;
            } catch (FormValidationException $e) {
                $message = $this->getTranslator()->trans(
                    "Please check your input: %s",
                    [
                        '%s' => $e->getMessage()
                    ],
                    Front::MESSAGE_DOMAIN
                );
            } catch (\Exception $e) {
                $message = $this->getTranslator()->trans(
                    "Sorry, an error occured: %s",
                    [
                        '%s' => $e->getMessage()
                    ],
                    Front::MESSAGE_DOMAIN
                );
            }

            Tlog::getInstance()->error(
                sprintf(
                    "Error during customer creation process : %s. Exception was %s",
                    $message,
                    $e->getMessage()
                )
            );

            $customerCreation->setErrorMessage($message);

            $this->getParserContext()
                ->addForm($customerCreation)
                ->setGeneralError($message)
            ;

            // Redirect to error URL if defined
            if ($customerCreation->hasErrorUrl()) {
                return $this->generateErrorRedirect($customerCreation);
            }
        }
    }
	
	/**
     * Dispatch event for customer login action
     *
     * @param Customer $customer
     */
    protected function processLogin(Customer $customer)
    {
        $this->dispatch(TheliaEvents::CUSTOMER_LOGIN, new CustomerLoginEvent($customer));
    }
	
	/**
     * @param $data
     * @return \Thelia\Core\Event\Customer\CustomerCreateOrUpdateEvent
     */
    private function createEventInstance($data)
    {
        $customerCreateEvent = new CustomerCreateOrUpdateEvent(
            isset($data["title"])?$data["title"]:null,
            isset($data["firstname"])?$data["firstname"]:null,
            isset($data["lastname"])?$data["lastname"]:null,
            isset($data["address1"])?$data["address1"]:null,
            isset($data["address2"])?$data["address2"]:null,
            isset($data["address3"])?$data["address3"]:null,
            isset($data["phone"])?$data["phone"]:null,
            isset($data["cellphone"])?$data["cellphone"]:null,
            isset($data["zipcode"])?$data["zipcode"]:null,
            isset($data["city"])?$data["city"]:null,
            isset($data["country"])?$data["country"]:null,
            isset($data["email"])?$data["email"]:null,
            isset($data["password"]) ? $data["password"]:null,
            isset($data["lang_id"]) ? $data["lang_id"]:$this->getSession()->getLang()->getId(),
            isset($data["reseller"])?$data["reseller"]:null,
            isset($data["sponsor"])?$data["sponsor"]:null,
            isset($data["discount"])?$data["discount"]:null,
            isset($data["company"])?$data["company"]:null,
            null,
            isset($data["state"])?$data["state"]:null
        );

        return $customerCreateEvent;
    }
}

- 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 ReCaptcha\Controller;

use ReCaptcha\ReCaptcha;

use Thelia\Controller\Front\BaseFrontController;
use Thelia\Core\Event\Contact\ContactEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Form\Definition\FrontForm;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Log\Tlog;
use Thelia\Model\ConfigQuery;
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);
			
			$checkCaptchaEvent = new ReCaptchaCheckEvent(); 
			$this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);
			if ($checkCaptchaEvent->isHuman() == false) { throw new \Exception('Invalid reCAPTCHA'); }

            $event = new ContactEvent($form);

            $this->dispatch(TheliaEvents::CONTACT_SUBMIT, $event);

            $this->getMailer()->sendSimpleEmailMessage(
                [ ConfigQuery::getStoreEmail() => $event->getName() ],
                [ ConfigQuery::getStoreEmail() => ConfigQuery::getStoreName() ],
                $event->getSubject(),
                '',
                $event->getMessage(),
                [],
                [],
                [ $event->getEmail() => $event->getName() ]
            );

            if ($contactForm->hasSuccessUrl()) {
                return $this->generateSuccessRedirect($contactForm);
            }
            
            return $this->generateRedirectFromRoute('contact.success');
            
        } catch (FormValidationException $e) {
            $error_message = $e->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);
        }
    }
}

- NewsletterController.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 ReCaptcha\Controller;

use ReCaptcha\ReCaptcha;
use Front\Front;
use Symfony\Component\HttpFoundation\JsonResponse;
use Thelia\Controller\Front\BaseFrontController;
use Thelia\Core\Event\Newsletter\NewsletterEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Form\Definition\FrontForm;
use Thelia\Log\Tlog;
use Thelia\Model\Customer;
use Thelia\Model\NewsletterQuery;
use ReCaptcha\Event\ReCaptchaCheckEvent;   
use ReCaptcha\Event\ReCaptchaEvents;

/**
 * Class NewsletterController
 * @package Thelia\Controller\Front
 * @author Manuel Raynaud <manu@raynaud.io>, Franck Allimant <franck@cqfdev.fr>
 */
class NewsletterController extends BaseFrontController
{

    public function subscribeAction()
    {
        $errorMessage = false;

        $newsletterForm = $this->createForm(FrontForm::NEWSLETTER);

        try {
            $form = $this->validateForm($newsletterForm);
			
			$checkCaptchaEvent = new ReCaptchaCheckEvent(); 
			$this->dispatch(ReCaptchaEvents::CHECK_CAPTCHA_EVENT, $checkCaptchaEvent);
			if ($checkCaptchaEvent->isHuman() == false) { throw new \Exception('Invalid reCAPTCHA'); }

            $event = new NewsletterEvent(
                $form->get('email')->getData(),
                $this->getRequest()->getSession()->getLang()->getLocale()
            );

            /** @var Customer $customer */
            if (null !== $customer = $this->getSecurityContext()->getCustomerUser()) {
                $event
                    ->setFirstname($customer->getFirstname())
                    ->setLastname($customer->getLastname())
                ;
            } else {
                $event
                    ->setFirstname($form->get('firstname')->getData())
                    ->setLastname($form->get('lastname')->getData())
                ;
            }

            $this->dispatch(TheliaEvents::NEWSLETTER_SUBSCRIBE, $event);

            // If a success URL is defined in the form, redirect to it, otherwise use the defaut view
            if ($newsletterForm->hasSuccessUrl() && ! $this->getRequest()->isXmlHttpRequest()) {
                return $this->generateSuccessRedirect($newsletterForm);
            }
        } catch (\Exception $e) {
            $errorMessage = $e->getMessage();

            Tlog::getInstance()->error(sprintf('Error during newsletter subscription : %s', $errorMessage));

            $newsletterForm->setErrorMessage($errorMessage);
        }

        // If Ajax Request
        if ($this->getRequest()->isXmlHttpRequest()) {
            return new JsonResponse([
                "success" => ($errorMessage) ? false : true,
                "message" => ($errorMessage) ? $errorMessage : $this->getTranslator()->trans(
                    "Thanks for signing up! We'll keep you posted whenever we have any new updates.",
                    [],
                    Front::MESSAGE_DOMAIN
                )
            ], ($errorMessage) ? 500 : 200);
        }

        $this->getParserContext()
            ->setGeneralError($errorMessage)
            ->addForm($newsletterForm);

        // If an error URL is defined in the form, redirect to it, otherwise use the defaut view
        if ($errorMessage && $newsletterForm->hasErrorUrl()) {
            return $this->generateErrorRedirect($newsletterForm);
        }
    }
}

A priori... ça fait le job...

J'ai fait aussi d'autres modifications pour avoir plusieurs recaptcha sur une même page (newsletter mini) :

- ReCaptcha/Hook/FrontHook.php :

<?php


namespace ReCaptcha\Hook;


use ReCaptcha\ReCaptcha;
use Thelia\Core\Event\Hook\HookRenderEvent;
use Thelia\Core\Hook\BaseHook;

class FrontHook extends BaseHook
{
    public function addRecaptchaCheck(HookRenderEvent $event)
    {
        
        $event->add("<input type=\"hidden\" name=\"g-recaptcha-response\">");
    }
}

- ReCaptcha/templates/frontOffice/[theme]/recaptcha-js.html

<script src="https://www.google.com/recaptcha/api.js?render={loop type="module-config" name="site-key" module="ReCaptcha" variable="site_key"}{$VALUE}{/loop}"></script>
<script>
grecaptcha.ready(function (){
	grecaptcha.execute('{loop type="module-config" name="site-key" module="ReCaptcha" variable="site_key"}{$VALUE}{/loop}', { action: 'forms' }).then(function (token) {
		var recaptchaElements = document.getElementsByName('g-recaptcha-response');
		for (var i = 0; i < recaptchaElements.length; i++) {
			recaptchaElements[i].value = token;
		}
	});
});
</script>

et dans les différents forms j'ai ajouté

{hook name="recaptcha.check"}

Il faudrait peut être voir pour rajouter dans la configuration sur quel formulaire on veut activer ou non recaptcha... et remettre en place la gestion invisible... (là j'ai fait pour un recaptcha invisible)

Last edited by Elyos (30-04-2021 10:21:10)


Aide les autres, ils t'aideront en retour.

Offline

#49 Re: Plugin ReCaptcha

(30-04-2021 10:32:34)


Et j'ai également modifié la ligne 44 dans ReCaptcha\Action\ReCaptchaAction.php :

if ($result['success'] == true && $result['score'] >= 0.5) { // ajout de score

Aide les autres, ils t'aideront en retour.

Offline

#50 Re: Plugin ReCaptcha

(30-04-2021 12:55:50)


Tu peux faire une PR sur le module, ça permettra de l'améliorer pour tout le monde.


OpenStudio Toulouse