hasniou Posted April 18, 2018 Share Posted April 18, 2018 Bonjour, Pour ajouter un produit (avec image de personnalisation) au panier je fais : // $line contient le produit à ajouter avec son image de personnalisation Tools::copy($line['url_preview'], _PS_UPLOAD_DIR_.$customized_value); Tools::copy($line['url_preview'], _PS_UPLOAD_DIR_.$customized_value.'_small'); $data = array( 'id_product_attribute' => $line['id_product_attribute'], 'id_address_delivery' => (int)$this->context->cart->id_address_delivery, 'id_cart' => (int)$this->context->cart->id, 'id_product' => (int)$line['article_id'], 'quantity' => (int)$line['quantity'], 'in_cart' => 1 ); Db::getInstance()->insert('customization', $data); $id_customization = (int)Db::getInstance()->Insert_ID(); $data = array( 'id_customization' => $id_customization, 'type' => (int)Product::CUSTOMIZE_FILE, 'index' => (int)$this->getFirstCustomizationFieldId($line['article_id']), 'value' => $customized_value ); Db::getInstance()->insert('customized_data', $data); $this->context->cart->updateQty((int)$line['quantity'], $line['article_id'], $line['id_product_attribute'], $id_customization); $this->context->cart->update(); Tout fonctionne correctement, sauf que le produit s'ajoute avec une quantité double. C'est a dire : Si la quantité à ajouter est 1 : le produit sera ajouté avec une quantité = 2 Si la quantité à ajouter est 5 : le produit sera ajouté avec une quantité = 10 Quelqu'un a rencontré le même problème ? Merci de votre aide ! PS 1.6.1.17 Link to comment Share on other sites More sharing options...
Eolia Posted April 18, 2018 Share Posted April 18, 2018 Parce que votre code doit se déclencher 2 fois... Sur quel événement se déclenche-t-il ? Et le cart->update() est inutile la fonction updateQty() le fait déjà^^ Link to comment Share on other sites More sharing options...
hasniou Posted April 18, 2018 Author Share Posted April 18, 2018 init() de OrderController.php En gros, le script doit vérifier à chaque fois si un produit est ajouté depuis une API externe pour l'ajouter de mon côté dans le panier Prestashop Link to comment Share on other sites More sharing options...
Eolia Posted April 18, 2018 Share Posted April 18, 2018 Bah votre script doit vérifier une fois de trop... Link to comment Share on other sites More sharing options...
hasniou Posted April 18, 2018 Author Share Posted April 18, 2018 Je ne comprend pas pourquoi mon code doit se déclencher 2 fois ? Que vérifie-il de trop mon script ? Link to comment Share on other sites More sharing options...
Eolia Posted April 18, 2018 Share Posted April 18, 2018 Bah je ne connais pas votre script. Le code ci-dessus est correct, à part le update() de trop, pour le reste je ne sais pas comment votre vérification se déclenche... Vous ne vérifiez pas non plus que la perso est déjà dans le panier ? Link to comment Share on other sites More sharing options...
hasniou Posted April 18, 2018 Author Share Posted April 18, 2018 Voici le script complet : controllers/front/OrderController.php : require_once(_PS_TOOL_DIR_.'mon_api/src/ApiClient.php'); use Fapi\ApiClient\ApiClient; public function init() { global $orderTotal; parent::init(); // Vérifier si panier depuis API $config = array( 'app_id' => '************', 'secret_key' => '***********************' ); $parameters = array(); $apiClient = new ApiClient($config); $path_cart = 'carts/me?expand=lines'; $foticart = $apiClient->api($path_cart, 'get', $parameters); if(isset($foticart['lines']) && !empty($foticart['lines'])) { foreach ($foticart['lines'] as $line){ //Ajouter chaque ligne au panier PS //CAS.1 : Un panier PS existe déjà => jouter à ce panier if($this->context->cart && $this->context->cart->id){ $customized_value = (int)($line['cart_id'].$line['cart_line_id']); if(!$this->context->cart->containsCustomizarion($customized_value)){ // Si le produit n'a pas déjà été ajouté // copier l'image de l'api vers PS : //$customized_value = md5(uniqid(rand(), true)); Tools::copy($line['url_preview'], _PS_UPLOAD_DIR_.$customized_value); Tools::copy($line['url_preview'], _PS_UPLOAD_DIR_.$customized_value.'_small'); $data = array( 'id_product_attribute' => $line['id_product_attribute'], 'id_address_delivery' => (int)$this->context->cart->id_address_delivery, 'id_cart' => (int)$this->context->cart->id, 'id_product' => (int)$line['article_id'], 'quantity' => (int)$line['quantity'], 'in_cart' => 1 ); Db::getInstance()->insert('customization', $data); $id_customization = (int)Db::getInstance()->Insert_ID(); $data = array( 'id_customization' => $id_customization, 'type' => (int)Product::CUSTOMIZE_FILE, 'index' => (int)$this->getFirstCustomizationFieldId($line['article_id']), 'value' => $customized_value ); Db::getInstance()->insert('customized_data', $data); $this->context->cart->updateQty((int)$line['quantity'], $line['article_id'], $line['id_product_attribute'], $id_customization); } } //CAS.2 : Aucun panier PS existe => Créer un panier PS et y jouter le produit if(!$this->context->cart || !$this->context->cart->id){ $this->context->cart = new Cart(); $this->context->cart->id_customer = (int)($this->context->cookie->id_customer); $this->context->cart->id_address_delivery = (int) (Address::getFirstCustomerAddressId($this->context->cart->id_customer)); $this->context->cart->id_address_invoice = $this->context->cart->id_address_delivery; $this->context->cart->id_lang = (int)($this->context->cookie->id_lang); $this->context->cart->id_currency = (int)($this->context->cookie->id_currency); $this->context->cart->id_carrier = 4; $this->context->cart->recyclable = 0; $this->context->cart->gift = 0; $this->context->cart->Add(); $this->context->cookie->id_cart = (int)($this->context->cart->id); // } } } Dans classes/Cart.php J'ai ajouté (vérification si une customisation existe : recherche par value qui correspond au nom de l'image qui doit être unique) : public function containsCustomizarion($value){ $result = Db::getInstance()->getValue(' SELECT count(*) FROM `'._DB_PREFIX_.'customization` cu LEFT JOIN `'._DB_PREFIX_.'customized_data` cd ON (cu.`id_customization` = cd.`id_customization`) WHERE cu.id_cart = '.(int)$this->id.' AND cd.value = '.(int)$value.' AND type = '.(int)Product::CUSTOMIZE_FILE.' AND in_cart = 1' ); if($result > 0) return true; else return false; } Link to comment Share on other sites More sharing options...
Eolia Posted April 18, 2018 Share Posted April 18, 2018 Ok, le code de vérification était déjà là avant que vous posiez la question sur ce post ? La valeur de : $line['quantity'] est ok ? Link to comment Share on other sites More sharing options...
hasniou Posted April 18, 2018 Author Share Posted April 18, 2018 Oui, la vérification était la depuis le début et $line['quantity'] est correct : quand $line['quantity'] = 1, le produit est ajouté avec une quantité = 2 (double). En regardant dans la BDD : dans ps_cart_product : quantity = 1 dans ps_customization : quantity = 2 Link to comment Share on other sites More sharing options...
hasniou Posted April 18, 2018 Author Share Posted April 18, 2018 J'ai trouvé la solution à mon problème. Je la partage au cas ou ça pourrai aider quelqu'un. La méthode updateQty() appel à son tour la méthode _updateCustomizationQuantity() qui s'en charge de modifier la quantité dans la table ps_customization (augmente ou diminue). Avant d’appeler updateQty(), la customization doit être ajouté avec 'quantity' = 0 et 'in_cart' = 0 (la méthode _updateCustomizationQuantity() s'en chargera de mettre à jour ces deux paramètres par la suite) $data = array( 'id_product_attribute' => $line['id_product_attribute'], 'id_address_delivery' => (int)$this->context->cart->id_address_delivery, 'id_cart' => (int)$this->context->cart->id, 'id_product' => (int)$line['article_id'], 'quantity' => 0, 'in_cart' => 0 ); Db::getInstance()->insert('customization', $data); @Eolia Merci pour ton aide ! Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now