THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

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

Offline


Est-il possible avec Thelia de faire un produit virtuel que l'on ajoute au panier sans recréer un produit au niveau du BO ?

Merci d'avance

Offline


C'est pas clair ton histoire. Que veux tu faire exactement ?


OpenStudio Toulouse

Offline


Et bien, j'aurai besoin de modifier le prix d'une déclinaison suivant certaines dates, le problème c'est qu'en partant de ma solution actuelle qui consiste à modifier directement le prix de la déclinaison pour avoir le bon prix dans le panier, tous les autres clients qui achèteront ce produit avec cette même déclinaison auront le prix modifié de la personne ayant commandé juste avant.

Y'aurait-il une solution afin d'éviter ça ?
Pouvoir créer un produit temporairement/virtuellement pour que celui-ci soit bien ajouté au panier avec les mêmes caractéristiques..

Merci d'avance

Offline


Les produits dans le panier du client sont stockés dans la table cart_item, avec toutes les informations de prix.

Un module peut donc modifier le prix du produit lors de sa mise au panier en intervenant sur le CartItem associé.


OpenStudio Toulouse

Offline


Quelle est la démarche à faire ?

Récupérer le contenu du panier et modifier directement le prix des produits ?

Offline


La démarche est d'écrire un module qui implémente tes règles de prix, écoute l’événement de mise au panier (CART_ADDITEM) et applique les règles au prix du produit qui vient d'être ajouté en modifiant l'entrée du propduit dans la table cart_item.


OpenStudio Toulouse

Offline


Le problème est que cela modifie simplement le montant "TOTAL" du panier et non le prix individuel d'un produit contenu dans le panier.

Offline


Comment peut-on modifier le total du panier sans modifier le prix des articles ? Je ne comprends pas ce que tu veux faire.


OpenStudio Toulouse

Offline


Le montant total du panier est modifié c'est très bien, mais sur la liste des produits du panier, le prix de mon produit et plus précisément sa déclinaison n'est pas modifié.

Ce serait peut être plus simple de créer un produit à la volée du coup non ?

Offline


Je ne comprends toujours pas ce que tu veux faire, concrètement.


OpenStudio Toulouse

Offline


C'est très simple, je propose des produits avec plusieurs déclinaisons, des séjours en l’occurrence.

Pour les déclinaisons, on retrouve le type de chambre, la capacité totale du logement etc ...
J'ai crée un module de Calendrier permettant de gérer la disponibilité de chaque produit suivant la date choisis et permettant d'assigner un prix spécifique suivant la période.

Ex. du 10/10/2015 au 20/10/2015 => 750€ ...

Sur la fiche produit, le client choisis la date de son séjour (10/10 au 20/10) et ce que je souhaite justement faire, au lieu de prendre le prix de référence de la déclinaison, c'est de pouvoir modifier son prix pour que celui-ci corresponde au tarif établi sur le Calendrier quand le produit est ajouté au panier.

Je comprends bien la démarche que vous me proposez mais le problème est que cette solution ne modifie que le prix total du panier et non le prix du produit en lui même.

Offline


La solution que je propose, modifier dans CartItem le prix d'un *article* du panier, répond parfaitement à ce besoin.


OpenStudio Toulouse

Offline


Ok je vois.

J'utilise ça actuellement :

$cartEvent = $this->getCartEvent();
$cartEvent->setNewness(true);
$cartEvent->setAppend(true);
$cartEvent->setQuantity(1);
$cartEvent->setProductSaleElementsId($product_sale_elements);
$cartEvent->setProduct($product);

$this->getDispatcher()->dispatch(TheliaEvents::CART_ADDITEM, $cartEvent);

Si je comprends bien, au lieu de lui préciser Product et ProductSaleElementsId il faudrait plutôt créer un CartItem c'est bien ça ?

Offline


Non. Le cartItem est crée par l'action Cart lorsque tu dispatche TheliaEvents::CART_ADDITEM.

Il te faut faire un event listener sur TheliaEvents::CART_ADDITEM avec une priorité inférieur à 128 (de façon à laisser Thelia créer le CartItem). Cet event listement qui va récupérer l'event qui contiendra à ce moment là le CartItem. Tu le retrouves avec un event->getCartItem(), et tu peux alors modifier les prix.


OpenStudio Toulouse

Offline


Voilà ce que j'ai fais :

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Thelia\Core\Event\ActionEvent;
use Thelia\Core\Event\TheliaEvents;

class Cart implements EventSubscriberInterface
{
    public function create(ActionEvent $event)
    {
        $cart = $event->getCartItem();
        $cart->setPrice(1200);
    }

    public static function getSubscribedEvents()
    {
        return array(
            TheliaEvents::CART_ADDITEM => array('create', 100)
        );
    }
}

----------------------------------------------------

Le seul soucis c'est que setPrice modifie en effet la table cart_item mais seulement le montant total du panier, est-il possible de modifier également le prix d'un *article* du panier en suivant cette solution, si oui de quelle façon ?

Offline


Tu as oublié le save()..


OpenStudio Toulouse

Offline


Même chose avec le save() ...

Pour résumer le prix de mon produit est de 144€ de base.
Voilà ce que le panier m'affiche :

Type---------------------------------------------------- Prix TTC
Type de séjour----------Studio ------------------- 144 €

TOTAL TTC PANIER ----------------------------- 1440 € TTC / 1200 € HT

Ce que je souhaiterais :

Type---------------------------------------------------- Prix TTC
Type de séjour----------Studio ------------------- 1440 €

TOTAL TTC PANIER ----------------------------- 1440 € TTC / 1200 € HT

Offline


Vérifie que la boucle affiche bien les infos de la boucle cart, et non pas celles du produit...


OpenStudio Toulouse

Offline


Dernière question, est-il possible d'ajouter d'autres paramètres à l'évènement CART_ADDITEM ?

J'aurai en effet besoin de récupérer plusieurs informations dedans.

Offline


Une idée ?

Offline


Oui, tu crées ton propre événement qui extends CartEvent, et tu dispatches une instance de cet event au lieu d'une instance de CartEvent.

Dans tes listeners à toi, tu pourras alors récupérer les infos que tu as fait circuler.


OpenStudio Toulouse

Offline


J'ai trouvé plus simple finalement juste un __set sur mon événement pour pouvoir le récupérer en __get de l'autre côté.

Je garde votre solution pour la prochaine fois.

Offline


C'est pas très propre.


OpenStudio Toulouse

Offline


J'ai modifié en ajoutant mon propre événement, c'est en effet beaucoup plus propre.

Offline