THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Merci,

Donc il faut que je rajoute un event listener dans mon module ou j'ajoute cela à l'event listener que j'ai déja mis en place ?

Offline

Offline


class ProductCommentInfo implements EventSubscriberInterface
{
    protected $request;

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

    public static function getSubscribedEvents()
    {
        return [
            TheliaEvents::CART_ADDITEM => ['saveComment', 10],
            TheliaEvents::ORDER_BEFORE_PAYMENT => ['saveOrderProductId',10]
        ];
    }

    public function saveComment(CartEvent $cartEvent)
    {
        $comment = $this->request->get('comment');
        $cartItemId = $cartEvent->getCart()->getLastCartItemAdded()->getId();

        if ($cartItemId != null && $comment != null) {
            $productComment = new ProductComment();
            $productComment->setCartItemId($cartItemId);
            $productComment->setComment($comment);
            $productComment->save();
            $this->request->getSession()->set('comment', '');
        }
    }

    public function saveOrderProductId(OrderEvent $event) {
        $orderProducts = OrderProductQuery::create()->findByOrderId($event->getOrder()->getId());

        /** @var OrderProduct $orderProduct */
        foreach ($orderProducts as $orderProduct) {
            if (null !== $bidule = ProductCommentQuery::create()->findOneByCartItemId($orderProduct->getCartItemId())) {
                $bidule 
                    ->setOrderProductId($orderProduct->getId())
                    ->save();
            }
        }
    }
}

un truc de ce genre là mais bien sur, il ne faut pas que j'oublie d'ajouter dans mon schema.xml le order_product_id en foreigne key et de de régénerer le sql pour qu'il s'impacte.

Est ce que j'ai bien suivi ?

Offline

Offline


Dommage, tout le processus fonctionne correctement et le seul problème c'est qu'il n'y aucun enregistrement dans ma table dans la base de données.

Offline


J'ai fait un petit update de mon eventlistener

namespace ProductComment\EventListeners;

use ProductComment\Controller\ProductCommentController;
use ProductComment\Model\ProductComment;
use Symfony\Component\Config\Definition\Exception\Exception;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Thelia\Core\Event\Cart\CartCreateEvent;
use Thelia\Core\Event\Cart\CartEvent;
use Thelia\Core\Event\Cart\CartItemEvent;
use Thelia\Core\Event\Order\OrderEvent;
use Thelia\Core\Event\TheliaEvents;
use Thelia\Core\HttpFoundation\Request;
use Thelia\Model\CartItem;

/**
 * Class ProductCommentInfo
 * @package ProductComment\EventListeners
 */
class ProductCommentInfo implements EventSubscriberInterface
{
    protected $request;

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

    public static function getSubscribedEvents()
    {
        return [
            TheliaEvents::CART_ADD => ['addItem', 255],
            TheliaEvents::CART_ADDITEM => ['saveComment', 10],
            TheliaEvents::ORDER_BEFORE_PAYMENT => ['saveOrderProductId',10]
        ];
    }

    public function saveComment(CartEvent $cartEvent)
    {
        $comment = $this->request->get('comment');
        $cartItemId = $cartEvent->getCart()->getLastCartItemAdded()->getId();

        if ($cartItemId != null && $comment != null) {
            $productComment = new ProductComment();
            $productComment->setCartItemId($cartItemId);
            $productComment->setComment($comment);
            $productComment->setOrderProductId('')
            $productComment->save();
            $this->request->getSession()->set('comment', '');
        }
    }

    public function saveOrderProductId(OrderEvent $event) {
        $orderProducts = OrderProductQuery::create()->findByOrderId($event->getOrder()->getId());

        /** @var OrderProduct $orderProduct */
        foreach ($orderProducts as $orderProduct) {
            if (null !== $productComment = ProductCommentQuery::create()->findOneByCartItemId($orderProduct->getCartItemId())){
                $productComment 
                    ->setOrderProductId($orderProduct->getId())
                    ->save();
            }
        }
    }

    public function addItem(CartEvent $cartEvent)
    {
        $comment = $comment = $this->request->get('comment');
        $cartItems = $cartEvent->getCart()->getCartItems();
        foreach ($cartItems as $cartItem) {
            $cartItemId = $cartItem->getId();
            $productComments = ProductCommentQuery::create()->findByCartItemId($cartItemId);
            foreach ($productComments as $productComment) {
                if ($comment != null && $comment != $productComment) {
                    // Prevent the cart action from adding the item, force it to create a new one instead
                    $event->setAppend(false);
                    $event->setNewness(true);
                }
            }
        }        
    }
}

Cela ne fonctionne pas pour l'enregistrement de mon message lors de l'ajout dans le panier et je n'ai aucun erreur qui s'affiche pour me dire d'où vient le soucis.

Merci

Offline


Utilise un IDE avec debugger, c'est quand même plus simple. Sinon tu fais des echo et tu regardes ce qui se passe.

Et puis moi je contrôlerais que comment n'est pas null avant de commencer à faire quoi que ce soit, mais bon, chacun voit midi à sa porte.


OpenStudio Toulouse

Offline


merci je vais pratiquer cette technique là