THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

comme dit dans le titre, je cherche à rajouter une case à cocher "do-not-send-mail" quand je met à jour une commande pour empêcher l'envoi de mél (pour le passage en "Payé" et "Expédié")

Est ce que la démarche que je décrit ci-dessous vous semble correcte ?

en 2 étapes:

1) rajouter le bouton dans l'interface
2) appeler $event->stopPropagation() si cette case est cochée avant l'envoi du mél

----

1)
Pour ça je commence par rajouter un petit bout d'html dans templates/backOffice/order-edit.html :

<label class="control-label"><input class="" type="checkbox" name="do-not-send-mail" value="1"> {intl l="Do not send mail"}</label>

Si je fais un module pour ça après, je pourrais à priori utiliser plus tard le hook "order.tab", ou peut être plutôt order.edit-js pour insérer ce code html juste après le <select>.


2)

Ensuite, je m'intéresse à core/lib/Thelia/Controller/Admin/OrderController.php

  public function updateStatus($order_id = null)
  {
    // …
    // … 
    $event->setStatus($statusId);
  
    // debut du rajout
    $no_mail = $this->getRequest()->request->get('do-not-send-mail');
    if ($no_mail)
      $event->stopPropagation();
    // fin du rajout
    $this->dispatch(TheliaEvents::ORDER_UPDATE_STATUS, $event);
    // …
  }

A priori ça marche. Mais comme ce n'est pas bien d'éditer les fichiers du cœur, je dois faire autrement.

Pour faire "propre", je dois éditer (j'imagine) tous mes modules de type "Delivery", et éditer la méthode SendMail:getSubscribedEvents() dans Listener/SendMail.php, et rajouter un événement de priorité plus élevée que "128" (qui est celle par défaut pour les ORDER_UPDATE_STATUS apparemment) , ou plutôt modifier la méthode `updateStatus(OrderEvent $event) pour ne pas envoyer de mél si cette case est cochée.

Ou plutôt, après avoir lu la doc, je peux même utiliser le même event (ça tombe bien puisqu'il n'y en a pas d'autres disponible). Ce qui devient quelque chose comme ça (à rajouter dans tout mes modules delivery):

public static function getSubscribedEvents()
{
    return [
      TheliaEvents::ORDER_UPDATE_STATUS => [ ["checkNoSend", 130], ["updateStatus", 128] ],
    ];
}

public function checkNoSend(OrderEvent $event)
{
    $no_mail = $this->getRequest()->request->get('do-not-send-mail');
    if ($no_mail)
         $event->stopPropagation();
}

Bon, du coup, c'est plutôt simple, et plutôt que de faire ça, je peux créer un module :

* dans Config/config.xml, on rajoute un kernel.event_subscriber
* La classe principale du module devra ajouter utiliser le hook `order.edit-js`
* Il faudra un MyModule\Action\DontSend implements EventSubscriberInterface, qui contiendra la méthode checkNoSend + le getSubscribedEvents() qui va bien.
* Éventuellement, je dois aussi me renseigner sur la gestion des droits (si je ne veux autoriser que les "super admin" à faire ça.


Je manque quelque chose?


Michaël Marinetti
arrive à Thélia doucement mais surement.
@Asenar

Offline


Tu fais juste un module simple, avec un event listener qui intercepte l'event ORDER_SEND_CONFIRMATION_EMAIL, et stoppe la propagation de l'event en fonction du statut de la commande.

Tu as un exemple de ce type de fonctionnement dans le module Paybox.


OpenStudio Toulouse