THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

J'ai besoin de votre aide.
En effet,au moment où un de mes clients qui n 'a pas encore un compte sur thelia , tape son email et son mot dans l'interface de cnx Thelia,  je veux lui créer un compte et le connecté sans qu'il soit obligé de passer par "s'inscrire".
Le problème c'est que je sait pas où mettre mon code de création de compte ? il me faut une action avant l'action Login  hmm

Merci de me répondre c'est vraiment urgent

Offline


Il faut renseigner un CustomerCreateOrUpdateEvent, de le dispatcher avec l'event CUSTOMER_CREATEACCOUNT, et tu pourras ensuite le connecter automatiquement.

Genre un truc comme ça (ici, dans $data j'ai les infos clients).

    $customerCreateEvent = new CustomerCreateOrUpdateEvent(
                $data['title'],
                $data['firstname'], // First name
                $data['lastname'],
                $data['address1'], // address 1'',
                $data['address2'], // address 2'',
                '', // address 3'',
                '', // telephone
                $data['cellphone'], // cellphone,
                $data['zipcode'], // zip code,
                $data['city'], // city,
                $data['country'],

                $data['email'],
                md5($data['email']), // password
                $this->getSession()->getLang()->getId(),
                null, // reseller
                null, // sponsor
                0, // discount
                null, // company
                null // ref
            );


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

    if ($customerCreateEvent->hasCustomer()) {
        $this->dispatch(TheliaEvents::CUSTOMER_LOGIN, new CustomerLoginEvent($customer));
    } else {
        throw new TheliaException("Echec de création du compte client");
    }

OpenStudio Toulouse

Offline


Bonjour,
Merci pour votre réponse.
Mais  l'event CUSTOMER_CREATEACCOUNT comment je peux le déclencher au moment où e customer tape son email et son mot de passe et clique sur"Suivant".
Autrement si le customer n'existe pas dans la base de données de Thelia sur la page de cnx jvai avoir des messages d'erreurs de genre email ou  mot de passe invalide.

En plus, en créant le compte jvai récupérer les informations personnelles du customer (nom, prénom, adresse, ...) d'une autre base et les enregistrer dans la base Thelia.

Last edited by Samia (13-11-2018 08:31:53)

Offline


Je ne connais pas ton appli, mais enfin  j'imagine que la user va soumettre une form où il aura saisi son mail et son mot de passe. Donc,  te faut créer une route dans ton module, qui va être invoquée lorsque le user soumet la form.

La route va invoquer le contrôleur, qui va récupérer l'email et le mot de passe, se connecter à l'autre base pour charger les autres informations sur le user, créer le user Thelia, et le connecter.

Voilà.


OpenStudio Toulouse

Offline


Si j'ai bien compris je dois dans l'ordre faire ce qui suit:
1/ Sous Controller de mon module ajouter un contrôleur:
<?php
namespace CreateOrUpdateCustomer\Controller;

use Thelia\Controller\Front\BaseFrontController;

class CreateCustomerController extends BaseFrontController
{
    public function createCustomer()
    {
        $customerCreateEvent = new CustomerCreateOrUpdateEvent(
                $data['title'],
                $data['firstname'], // First name
                $data['lastname'],
                $data['address1'], // address 1'',
                $data['address2'], // address 2'',
                '', // address 3'',
                '', // telephone
                $data['cellphone'], // cellphone,
                $data['zipcode'], // zip code,
                $data['city'], // city,
                $data['country'],

                $data['email'],
                md5($data['email']), // password
                $this->getSession()->getLang()->getId(),
                null, // reseller
                null, // sponsor
                0, // discount
                null, // company
                null // ref
            );


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

    if ($customerCreateEvent->hasCustomer()) {
        $this->dispatch(TheliaEvents::CUSTOMER_LOGIN, new CustomerLoginEvent($customer));
    } else {
        throw new TheliaException("Echec de création du compte client");
    }
    }
}
2/ Dans le fichier routing.xml de mon module j'ajoute:
<route id="CreateOrUpdateCustomer." path="/CreateOrUpdateCustomer/Controller/CreateCustomer">
        <default key="_controller">CreateOrUpdateCustomer:Controller:CreateCustomer</default>
    </route>

C'est un peu flou pour moi parce que je vois comment jvai dire à mon appli de déclencher mon contrôleur au moment de l'authentification du customer

Offline


Ben, tu va lui dire d'invoquer la route que tu as créé, et lui passer email et mot de passe, non ?


OpenStudio Toulouse

Offline


Ben justement je vois pas où et comment lui dire d'invoquer la route que j'ai créé, et lui passer email et mot de passe.

Offline


Dans l'action d'un form. Une route, c'est juste une URL.


OpenStudio Toulouse

Offline


roadster31 wrote:

Dans l'action d'un form. Une route, c'est juste une URL.

action d'un form c'est par exemple: CUSTOMER_CREATE ?
si j'utilise cette action ça veux pas dire que mon controller sera invoquer quand le user tape sur s'inscrire?

En faite c'est toujours flou par rapport à mon besoin

Offline


<form action="...">


OpenStudio Toulouse

Offline


Merci quand même  pour ton retour mais on s'est pas compris je crois.

Mon problème c'est dans quelle action des actions Thelia jvai déclenché mon code psk les actions s'exécutent suite à l'envoi d'un formulaire par exemple, alors que dans mon cas si l'utilisateur tape son mail et son mot de passe il clique sur suivant il va être bloqué par le comportement par défaut de thelia et un msg d'erreur sera afficher indiquant que: mot de passe ou login n'existe pas.

Offline


Je ne comprends pas ton problème. Tu sais comment fonctionne un formulaire HTML ?

Ton utilisateur indique login et mot de passe dans un formulaire, l'action (l'URL appelée par le formulaire), c'est la route vers ton contrôleur; qui crée et connecte ton user.


OpenStudio Toulouse

Offline


Dans mon cas jvai utiliser le formulaire "form-login" de la page login.html  qui existent déjà, et l'action de ce formulaire c'est "/login, donc je peux pas faire des modification au dessus qui risquent d'être écraser suite à une mise à jour.
Donc pour tous  ce qui est connexion je veux garder le comportement par défaut de thelia, je veux juste qu'avant la connexion et au moment où il rentre c'est identifiant je le crée un customer dans ma base.
Donc le fait de mettre "/login" dans le path de mon router ça déclenche rien du tous

Offline


Ton module peut définir la route "/login" avec le même ID que dans le module Front, elle sera ainsi surchargée, et c'est ton module qui sera appelé ai lieu du module Front :

    <route id="customer.login.process" path="/login" methods="post">
       <default key="_controller">CreateOrUpdateCustomer:Controller:CreateCustomer</default>
        <default key="_view">login</default>
    </route>


OpenStudio Toulouse

Offline


Là c'est beaucoup plus clair, merci pour votre patience.
Jvai essayer cette solution.

Offline


Bonjour,
Oft j'ai essayer votre solution et ça marche pas mon module n'a pas été appelé au lieu du module Front, sachant que dans le fichier routing.xml de mon module j'ai ajouter ce qui suit:
<route id="customer.login.process" path="/login" methods="post">
        <default key="_controller">CreateOrUpdateCustomer\Controller\CreateNewCustomerController::createCustomerAction</default>
        <default key="_view">login</default>
    </route>

Offline

Offline


J'ai vider le cache mais ça marche toujours pas.
Pour tester j'ai fait une petite requête d'insertion dans la base ma ça marche pas