Jump to content
hasniou

Problème updateQty (Ajoute 2 fois la quantité)

Recommended Posts

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

Share this post


Link to post
Share on other sites

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à^^

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Bah votre script doit vérifier une fois de trop...

Share this post


Link to post
Share on other sites

Je ne comprend pas pourquoi mon code doit se déclencher 2 fois ?

Que vérifie-il de trop mon script ?

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

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

 

 

 

 

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 !

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More