Bonjour à tous !
Je me permets de ré-ouvrir ce sujet parce que la fonction que j'ai fini par pondre me pose problème. J'aimerai qu'elle parcourt les items du cart, qu'elle vérifie si ce sont des tuyaux, si la quantité est au moins de 30 et si oui, elle ajoute un certain produit via la référence de ce dernier.
Il y a deux tailles de tuyaux, et si j'ai les deux dans mon panier et que je veux augmenter la quantité de chacun à 30 ou plus, je rencontre un problème : ma fonction s'arrête au premier tuyau qu'elle trouve et qui rentre dans mes conditions. Si j'ai la taille 1 en premier dans le panier, avec une quantité à 30 ou plus, elle ne traitera jamais le tuyau de taille 2 qui arrive après dans le panier.
Si je veux que ça s'opère sur les deux tailles, je suis obligé de réduire la taille du premier tuyau qui arrive dans le panier en dessous de 30, attendre que la page se recharge, et là je peux augmenter la taille du deuxième tuyau à 30 ou plus pour déclencher l'ajout du produit spécifique.
Je ne sais pas si c'est bien clair ce que j'explique... N'hésitez pas à me demander de reformuler.
Voici mon action :
/**
* Apply my business logic to the cart
*
* @param CartEvent $cartEvent
* @param EventDispatcher $dispatcher
* @throws PropelException
*/
public function applyMyBusinessLogic(TheliaCartEvent $cartEvent, $eventName, EventDispatcherInterface $dispatcher) {
//Get all the items of the cart
$items = $cartEvent->getCart()->getCartItems();
foreach ($items as $item) {
//We search through each item, get the product and verify with it's name if it's a pipe
$product = ProductQuery::create()->findOneById($item->getProductId());
if(strpos($product->getTitle(), 'nom de tuyau') !== false) {
//If it's indeed a pipe, we verify it's more than 30 meters
if($item->getQuantity()) {
//If so, we check wich pipe-size it is
if($product->getRef() === 'Référence tuyau taille 1') {
$kitRef = "Référence du produit à ajouter taille 1";
} else if($product->getRef() === 'Référence tuyau taille 2') {
$kitRef = "Référence du produit à ajouter taille 2";
}
$add = true;
//verify if there's not already the right product
foreach ($items as $itemInCart) {
$product = ProductQuery::create()->findOneById($itemInCart->getProductId());
if($product->getRef() === $kitRef) {
//If so, we don't do anything.
$add = false;
}
}
if($add === true) {
//If there's not already the right kit, we add it to the cart
$kitPompe = ProductQuery::create()->findOneByRef($kitRef);
$this->addKitToCart($cartEvent, $kitPompe, $dispatcher);
}
}
}
}
}
/**
* Add a product in parameter to the cart
*
* @param $cartEvent
* @param $kit
* @param EventDispatcherInterface $dispatcher
*/
public function addKitToCart($cartEvent, $kit, EventDispatcherInterface $dispatcher) {
$event = New CartEvent($cartEvent->getCart());
$event
->setProduct($kit->getId())
->setQuantity(1)
->setProductSaleElementsId($kit->getDefaultSaleElements()->getId())
->setAppend(false)
->setNewness(true);
$dispatcher->dispatch(TheliaEvents::CART_ADDITEM, $event);
}
/**
* Subscribe to Thelia cart events
*
*/
public static function getSubscribedEvents() {
return array(
TheliaEvents::CART_UPDATEITEM => array("applyMyBusinessLogic", 64), // Called when the cart is updated
TheliaEvents::AFTER_CARTADDITEM=> array("applyMyBusinessLogic", 64), // Called when the cart is updated
);
}
Je me suis demandé si ça ne venait pas de l’événement d'ajout de produit, mais non il doit bien y avoir quelque chose dans mon algorithme qui l'empêche de continuer après avoir vu que le premier tuyau possédait déjà le produit spécifique à ajouter. Surtout que la fonction marche à merveille s'il n'y a qu'un seul tuyau avec une quantité de 30, ou bien s'il n'y qu'une seule taille de tuyau dans le panier.
J'ai passé plusieurs jours dessus sans voir ce que j'ai pu mal faire, je viens donc vous appeler à l'aide pour réclamer un point de vue différent
Merci d'avance !