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?