Jump to content

"Ajouter au panier" disparu depuis mise a jours 1.2.5 -> 1.3.1


Recommended Posts

Bonjour à tous,

J'ai mis a jour mon prestashop de la version 1.2.5 vers la version 1.3.1 en suivant le tuto disponible sur le site. Mais j'ai un soucis...
Depuis la mise a jours, je ne peux plus ajouter de produit au panier car le bouton "ajouter au panier" a disparu (tout comme le champs demandant la qtt a ajouter au panier).
J'ai donc regarder un peu le code notament le product.tpl qui contient ceci:



               {if (!$allow_oosp && $product->quantity != 0) || $virtual}

                   <input type="text" name="qty" id="quantity_wanted" class="text" value="{if isset($quantityBackup)}{$quantityBackup|intval}{else}1{/if}" size="2" maxlength="3" />

{l s='Quantity :'}

               {else}

                    

               {/if}



donc si j'ai bien compris avant d'afficher la case "quantité a ajouter au panier", il vérifie qu'il reste bien des produits en stock. Par ailleurs il verifie aussi que !$allow_oosp, ce que j'ai pu tester comme ceci:


{if (!$allow_oosp)}

1
{/if}


et il m'affiche bien 1 dans le code.
Donc le pb ne viens pas de !$allow_oosp

Si je test de la même manière $product->quantity


{if ($product->quantity != 0)}

1
{/if}


Il ne m'affiche rien.
Conclusion, le pb viens de $product->quantity qui est égal à 0.

Je regarde donc ma classe product (classes/Product.php) et je trouve ceci:

    public static function getQuantity($id_product, $id_product_attribute = NULL)
   {
       $lang = Configuration::get('PS_LANG_DEFAULT');
       if (Pack::isPack(intval($id_product), intval($lang)) AND !Pack::isInStock(intval($id_product), intval($lang)))
           return 0;

       $result = Db::getInstance()->GetRow('
       SELECT IF(COUNT(id_product_attribute), SUM(pa.`quantity`), p.`quantity`) as total
       FROM `'._DB_PREFIX_.'product` p
       LEFT JOIN `'._DB_PREFIX_.'product_attribute` AS pa ON pa.`id_product` = p.`id_product`
       WHERE p.`id_product` = '.intval($id_product).'
       '.(isset($id_product_attribute) ? 'AND `id_product_attribute` = '.intval($id_product_attribute) : '').'
       GROUP BY p.`id_product`');
       return $result['total'];
   }



Je vérifie ensuite que dans ma base, le champ "quantity" du produit n'est pas à 0 et ce n'est bien sur pas le cas...

Je ne comprend pas où est le problème...

Quelqu'un à une idée?

Bonne journée à tous!


edit:
j'ai essayer d'exécuter la requète dans phpmyadmin sous cette form:

SELECT IF(COUNT(id_product_attribute), SUM(pa.`quantity`), p.`quantity`) as total FROM `ps_product` p LEFT JOIN `ps_product_attribute` AS pa ON pa.`id_product` = p.`id_product` WHERE p.`id_product` = 37 GROUP BY p.`id_product`



J'ai regardé dans la base si le produit ayant l'id 37 était bien en stock (ce qui est le cas car il en reste 182)
et la requète me retourne bien 182.

J'ai comprend de moins en moins....


edit 2:

j'avance un peu... et je pense avoir trouvé d'ou viens mon soucis: la classe Pack.php.
elle comprend notament ces deux fonctions:

public static function getItems($id_product, $id_lang)
   {
       if (in_array($id_product, self::$cachePackItems))
           return self::$cachePackItems[$id_product];
       $result = Db::getInstance()->ExecuteS('SELECT id_product_item, quantity FROM '._DB_PREFIX_.'pack where id_product_pack = '.intval($id_product)); //retourne forcement 1 car c'est ce qu'il y a dans la bdd
       $arrayResult = array();
       foreach ($result AS $row)
       {
           $p = new Product($row['id_product_item'], false, intval($id_lang));
           $p->pack_quantity = $row['quantity'];
           $arrayResult[] = $p;
       }
       self::$cachePackItems[$id_product] = $arrayResult;
       return self::$cachePackItems[$id_product];
   }

   public static function isInStock($id_product, $id_lang)
   {
       $items = self::getItems(intval($id_product), intval($id_lang));
       foreach ($items AS $item) // $item->quantity == 0 dans tous les cas actuellement
           if ($item->quantity == 0 AND !$item->isAvailableWhenOutOfStock(intval($item->out_of_stock)))
               return false;  //retourne toujours false actuellement
       return true;
   }



j'ai rajouter des commentaire pour donner les valeur de certain trucs...
il me semble que le soucis viens de la première fonction
Mais je ne comprend pas tout le code alors un peu difficile de trouver le pb exact!

Link to comment
Share on other sites

Suite du problème:

Alors en fait, le soucis viens de

 $p->pack_quantity = $row['quantity'];


qu'ils utilisent dans la première fonction.
dans le seconde, on utilise $item->quantity et non $item->pack_quantity

donc si je change ceci:

$p->pack_quantity = $row['quantity'];


en ceci:

$p->quantity = $row['quantity'];



ca fonctionne. Mais puis-je me permettre de modifier comme cela une classe?
Est ce que ca ne vas pas mettre le bazar ailleurs?
Pour terminer, pourquoi suis je le seul a avoir ce problème ?

Link to comment
Share on other sites

  • 9 months later...
  • 2 weeks later...

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...