THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Hello,

j'essaye de modifier une table dès lors qu'une commande est validée (payé).

J'utilise pour ça :

    public static function getSubscribedEvents()
    {
        return array(
            TheliaEvents::CART_ADDITEM => array('create', 100),
            TheliaEvents::ORDER_UPDATE_STATUS => array('calendarBooking', 128)
        );
    }

Le problème est que l'event n'a pas l'air d'être pris en compte, il ne passe pas dans ma fonction ...
Une idée du problème ?

Offline


Hello,

Tu as déclaré ton EventListener dans les configs de ton module ?
Il faut vider la cache après la déclaration.


Développeur Web chez OpenStudio
Thelia Module, Thelia School, My GitHub, My Twitter

Offline


C'est corrigé, j'ai remplacé ORDER_UPDATE_STATUS par ORDER_AFTER_CREATE

Offline


Attention l'event ORDER_AFTER_CREATE est déclenché qu'une seul fois après la création de la commande, du coup elle n'est pas forcément payée à ce moment.


Développeur Web chez OpenStudio
Thelia Module, Thelia School, My GitHub, My Twitter

Offline


Hmm je vois, quel serait l'event adéquate qui correspond à la validation de la commande ?

Offline


De plus, ya t-il une méthode pour récupérer l'ensemble des produits de la commande lors de l'écoute de cet event ?

Offline


Normalement ORDER_UPDATE_STATUS smile

Normalement :

$event->getOrder()->getOrderProducts()

Développeur Web chez OpenStudio
Thelia Module, Thelia School, My GitHub, My Twitter

Offline


C'est étrange mais avec ORDER_UPDATE_STATUS il ne passe pas dedans ...

Pareil pour $event->getOrder()->getOrderProducts, il ne me récupère aucun produit alors que le panier est bien rempli.

Offline


Normal que le panier soit vide, car tu es sur une commande.
Quand tu change le statut de la commande dans l'admin, tu ne passes pas dans ton eventListener ?

NB : quand un paniers est validé, il devient une commande avec un statut "Non Payée" Une fois que le client a payé avec un module de paiement, l'event ORDER_UPDATE_STATUS est propagé pour passer la commande en statu payée.


Développeur Web chez OpenStudio
Thelia Module, Thelia School, My GitHub, My Twitter

Offline


Est-il possible par la même occasion d'ajouter des infos à la commande pour le remonter au BO ?

Offline


Pour ce faire, tu dois écrire un module qui se chargera de stocker ces infos en base, et de les restituer avec une boucle.


OpenStudio Toulouse

Offline


Quelle solution me proposez-vous pour pouvoir récupérer la session Thelia depuis l'action d'un module qui se charge d'écouter un Event thelia ?

Offline


Il faut que tu injectes la dépendance dans ton Listener

Exemple :

        <service id="MonId" class="MaClass" scope="request">
            <argument type="service" id="request"/>
            <tag name="kernel.event_subscriber"/>
        </service>
use Thelia\Core\HttpFoundation\Request;

class MaClass implements EventSubscriberInterface
{
    /** @var Request  */
    protected $request;

    public function __construct(Request $request)
    {
         $this->request = $request;
    }
$this->request->getSession();

Développeur Web chez OpenStudio
Thelia Module, Thelia School, My GitHub, My Twitter

Offline


<services>
        <service id="module.action.calendar.cart" class="Calendar\Actions\Cart" scope="request">
            <argument type="service" id="request"/>
            <tag name="kernel.event_subscriber"/>
        </service>
    </services>

class Cart implements EventSubscriberInterface
{
    protected $request;

    protected $session;

    public function __construct(Request $request)
    {
        $this->request = $request;

        $this->session = $request->getSession();
    }

J'obtiens cette erreur : Catchable fatal error: Argument 1 passed to Calendar\Actions\Cart::__construct() must be an instance of Thelia\Core\HttpFoundation\Request, none given

Offline

Offline


Tout est bon, merci.

Offline


J'ai un autre besoin, je souhaite faire une vérification juste avant le paiement pour vérifier que mes produits sont bien disponible (stock > 0).
Ya t-il un event pour faire cela ? Si oui lequel, faut-il mettre une priorité plus importante que le core de Thelia (128) et stopper la propagation si le produit n'est plus en stock ?

Merci d'avance

Offline


Il te suffit d'intercepter TheliaEvents::ORDER_PAY, avec une priorité > 128, de faire ton contrôle et de rediriger le client vers une page spécifique si le stock n'est plus dispo. Tu stopperas aussi la propagation de l'event.


OpenStudio Toulouse

Offline


Petit soucis pour pouvoir rediriger correctement vers une autre page, j'essaye de le faire avec $this->generateRedirectFromRoute('cart.view') mais il n'arrive pas à me trouver la fonction à partir de mon object ... il faut injecter une dépendance spécifique ?

Offline


Comme tu es dans un event listener, tu ne peux pas utiliser les méthodes des controlleurs.

Par contre, tu peux lever une RedirectException, genre :

throw new RedirectException(
    URL::getInstance()->absoluteUrl('/cart')
);

Ou alors, si tu tiens à utiliser une route plutôt qu'une URL (ce qui se défend), tu peux injecter le routeur "front.router" dans ton event listener (disons dans $router), et faire un truc de ce genre:

throw new RedirectException(
    URL::getInstance()->absoluteUrl(
        $router->generate('cart.view')
    )
);

OpenStudio Toulouse

Offline


Peut associer à RedirectException un message d'erreur pour l'afficher ensuite sur ma vue ?

Offline


Oui, regarde la signature du constructeur.


OpenStudio Toulouse

Offline


Il n'y a pas un autre Event pour vérifier que la commande est bien passé et qui vérifie si le paiement est valide que ce soit par Chèque / Virement ou CB ?

Offline


La liste des events order

    const ORDER_SET_DELIVERY_ADDRESS = "action.order.setDeliveryAddress";
    const ORDER_SET_DELIVERY_MODULE = "action.order.setDeliveryModule";
    const ORDER_SET_POSTAGE = "action.order.setPostage";
    const ORDER_SET_INVOICE_ADDRESS = "action.order.setInvoiceAddress";
    const ORDER_SET_PAYMENT_MODULE = "action.order.setPaymentModule";
    const ORDER_PAY = "action.order.pay";
    const ORDER_BEFORE_CREATE = "action.order.beforeCreate";
    const ORDER_AFTER_CREATE = "action.order.afterCreate";
    const ORDER_BEFORE_PAYMENT = "action.order.beforePayment";
    const ORDER_CART_CLEAR = "action.order.cartClear";

    const ORDER_CREATE_MANUAL = "action.order.createManual";

    const ORDER_UPDATE_STATUS = "action.order.updateStatus";

    const ORDER_SEND_CONFIRMATION_EMAIL = "action.order.sendOrderConfirmationEmail";

    const ORDER_SEND_NOTIFICATION_EMAIL = "action.order.sendOrderNotificationEmail";

    const ORDER_UPDATE_DELIVERY_REF = "action.order.updateDeliveryRef";
    const ORDER_UPDATE_ADDRESS = "action.order.updateAddress";

    const ORDER_PRODUCT_BEFORE_CREATE = "action.orderProduct.beforeCreate";
    const ORDER_PRODUCT_AFTER_CREATE = "action.orderProduct.afterCreate";

Développeur Web chez OpenStudio
Thelia Module, Thelia School, My GitHub, My Twitter