THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Merci pour la solution la plus simple.

C'est à dire que je vais faire dans le form qui s'appelle CartAdd et j'ajoute mon input "comment", ensuite je vais dans le formulaire html dédié afin d'ajouter ma balise textarea correspondant avec le name="comment" et où je choppe le fichier qui permet l'event handler ?

Offline


où je choppe le fichier qui permet l'event handler ?

Je ne comprends pas la question.

Je résume :

1) Tu ajoutes un champ au formulaire d'ajout au panier
2) Quand le formulaire d'ajout au panier est soumis, un event CART_ADD_ITEM est dispatché par Thelia
3) Dans ton event handler (qui est abonné à CART_ADD_ITEM), tu récupères ton champ dans la requête ($this->request->get(...))
4) Tu sauvegarde le contenu de ton champ.

Voilà.


OpenStudio Toulouse

Offline

Offline


Question : Je voudrais que lorsque j'ajoute un produit avec un message personnalisé soit lié en fonction de la quantité du produit.

Par exemple, j'ai un produit avec un message personnalisé (toto) et un autre produit avec un message personnalisé (tata)/
Est que dans le panier, il y est bien 2 lignes distincts de produits qui sont identiques mais qui ont un message de personnalisation différent.

Offline


Le plus simple est de mettre en place un event lister sur CART_ADD avec une priorité élevée (255), qui force l'ajout d'une nouvelle ligne au lieu d'incrémenter une ligne existante :

    public function addItem(CartEvent $event)
    {
        if (/* il n'existe pas une ligne du cart avec le même message que celui qu'on ajoute */) {
            // Prevent the cart action from adding the item, force it to create a new one instead
            $event->setAppend(false);
            $event->setNewness(true);
        }
    }

A toi de calculer la condition "il n'existe pas une ligne du cart avec le même message que celui qu'on ajoute" smile

Et voilà !


OpenStudio Toulouse

Offline


Donc si j'ai bien compris je créer une eventlistener dans mon module sur l'event CART_ADD et je l'adapte à ma situation.

Offline


Est ce qu'il est possible de faire des query dans thelia ?

Offline


Faire des query ? C'est à dire ?


OpenStudio Toulouse

Offline


C'est à dire que je fais récupérer le cartItemId via une boucle php et je voudrais en fonction de ce cartItemId récupéré tous les messages personnalisés insérés dans ma table.

Et donc je dois utiliser une repository où il y aura une requête sql pour exécuter cela.

Offline


$liste = TaTableQuery::create()->findByCartItemlId($leCartItemId);

/** @var TaTable $item */
foreach($liste as $item) {
   ...
}

Il te faut te documenter sur Propel... http://propelorm.org/documentation/03-basic-crud.html


OpenStudio Toulouse

Offline


Merci pour ton aide précieuse smile

Offline


Merci beaucoup smile

Offline


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);
                }
            }
        }        
    }

Voici ce que j'ai fait

Offline


L'event CART_ADD n'existe pas dans TheliaEvents

Offline


Oui. En cherchant 2mn, tu aurais trouvé : const CART_ADDITEM = "action.addArticle";


OpenStudio Toulouse

Offline


j'ai trouvé celui là toute à fait mais en testant ça fait que synchronise au moment de l'ajout dans le panier.

voici mon code

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_ADDITEM => ['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();
        echo $comment;
        echo $cartItemId;

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

    public function saveOrderProductId(OrderEvent $event) {
        $orderProducts = OrderProductQuery::create()->findByOrderId($event->getOrder()->getId());
        echo $orderProducts;
        /** @var OrderProduct $orderProduct */
        foreach ($orderProducts as $orderProduct) {
            if (null !== $productComment = ProductCommentQuery::create()->findOneByCartItemId($orderProduct->getCartItemId())){
                echo $orderProduct;
                $productComment 
                    ->setOrderProductId($orderProduct->getId())
                    ->save();
            }
        }
    }

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

Offline


ca fait que synchronise au moment de l'ajout dans le panier.

Il ne manquerait pas des mots ?


OpenStudio Toulouse

Offline


Pardon au moment où je fais l'action d'ajout dans le panier du produit et ça reste sur la loading page.

Offline


Erreur 500 ? Regarde donc dans la console du navigateur...


OpenStudio Toulouse

Offline


Pourquoi cela ne fonctionne pas du tout quand j'utilise 2 fois le même événement .

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

Offline


Regarde la doc:
http://doc.thelia.net/en/documentation/ … tions.html

 /**
     * Returns an array of event names this subscriber wants to listen to.
     *
     * The array keys are event names and the value can be:
     *
     *  * The method name to call (priority defaults to 0)
     *  * An array composed of the method name to call and the priority
     *  * An array of arrays composed of the method names to call and respective
     *    priorities, or 0 if unset
     *
     * For instance:
     *
     *  * array('eventName' => 'methodName')
     *  * array('eventName' => array('methodName', $priority))
     *  * array('eventName' => array(array('methodName1', $priority), array('methodName2'))
     *
     * @return array The event names to listen to
     *
     * @api
     */

A mon avis, cela devrait être

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

Offline


Merci beaucoup pour l'information et je n'avais pas bien lu la dernière ligne de la documentation.

Offline


J'essayais d'effectuer cette requête sql :

$productComments = ProductCommentQuery::create()->findOneByCartItemId($cartItemId);

Mais j'ai un retour erreur 500

Offline


voici mon function addItem

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
                    $cartEvent->setAppend(false);
                    $cartEvent->setNewness(true);
                }
            }
        }        
    }

cela me renvoie une 500 et c'est du à ma query peut être ?

Offline


cela me renvoie une 500 et c'est du à ma query peut être ?

Si tu travailles en dev, les exceptions s’affichent dans ton navigateur.


OpenStudio Toulouse