Jump to content

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

Link to comment
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 ?

Link to comment
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;
 }

 

 

 

 

Link to comment
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

Link to comment
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 !

Link to comment
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...