THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Bonjour,

je viens vers vous ce jour car je me penche un peu plus sur le développement de module et j'avoue qu'après des essais et autre, je suis un peu en galère.

J'ai regardé tout le code des modules disponible sur Github, comprendre la logique, je travaille sous PHPStorm (pour l'auto-completion avec Thelia c'est vraiment top)

L'idée de ce module, qui est tout simple en fait, est de remplir le champ postscriptum de la table order_product quand une commande est payée.
Dans l'idéal, je chercherais à faire que ce champ se remplisse selon la manière suivante:

$postscriptum= $product_id.":".$customer_email.":".$order_date

Et là je bloque un peu... J'ai essayé plein de chose mais sans y arriver...

J'en suis là :

namespace PostscriptumKeys\Action;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

use Thelia\Core\Event\Order\OrderEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Model\OrderProduct;
use Thelia\Model\Base\OrderProductQuery;


class PostscriptumKeys implements EventSubscriberInterface
{
    protected $request;
    public function __construct(Request $request)
    {
        $this->request = $request;
    }



    public function PostscriptumCreate(OrderEvent $event)
    {
        $order_id= $event->getPlacedOrder();
        $product = OrderProductQuery::create()
            ->findByOrderId($order_id)
            ->count();

        if ($product > 0) {



        }
    }

    public static function getSubscribedEvents()
    {
        return [
            TheliaEvents::ORDER_PAY => ['PostscriptumCreate', 128]
        ];
    }
}

Si une âme charitable pourrait m'aider, cela serait fort sympathique.

Merci d'avance à vous d'avoir pris le temps de me lire.

Thibault

Offline


Bonjour,

A quoi ressemble ton fichier config.xml ?

Pour la mise à jour du champ  postscriptum il faudra probablement créer un événement ProductUpdateEvent.

Offline


Je me suis inspiré du module ExtraOrderData disponible sur Github.

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="http://thelia.net/schema/dic/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://thelia.net/schema/dic/config http://thelia.net/schema/dic/config/thelia-1.0.xsd">

  <services>
    <service id="PostscriptumKeys.action" class="PostscriptumKeys\Action\PostscriptumKeysAction" scope="request">
      <argument type="service" id="request"/>
      <tag name="kernel.event_subscriber"/>
    </service>
  </services>
  
</config>

Offline


Ta méthode PostscriptumCreate ne peut pas marcher. Quelque chose comme ceci marcherait sans doute mieux :

        $orderId= $event->getPlacedOrder()->getId();
        $orderDate = $event->getPlacedOrder()->getCreatedAt('d/m/Y');
        $customerEmail = $event->getPlacedOrder()->getCustomer()->getEmail();
        
        $produitsCommandes = OrderProductQuery::create()->findByOrderId($orderId);
        
        /** @var OrderProduct $produitCommande */
        foreach ($produitsCommandes as $produitCommande) {
            $product = ProductQuery::create()->findOneByRef($produitCommande->getProductRef());

            $data = $product->getId() . ':' . $customerEmail . ':' . $orderDate;
            
            $produitCommande->setPostscriptum($data)->save();
        }

Par ailleurs, je te recommande de placer l'appel de cette méthode AVANT l'appel des modules de paiement, car ils utilisent parfois une redirection qui arrête le dispatching des events :

public static function getSubscribedEvents()
    {
        return [
            TheliaEvents::ORDER_PAY => ['PostscriptumCreate', 150]
        ];
    }

Enfin, tu ne sembles pas avoir besoin de la request, inutile donc de la passer au constructeur de ta classe.


OpenStudio Toulouse

Offline


Merci, pour l'instant ce que je ne souhaite faire ne fonctionne pas, mais avant de revenir je vais continuer à chercher car c'est comme ca que l'on apprend et que l'on progresse smile

En tout cas merci pour la piste j'ai déjà compris un peu mieux la gestion des événements, mais je vais continuer à potasser la chose smile