Jean Francois G Posted January 12, 2013 Share Posted January 12, 2013 (edited) bonjour la communauté. J'ai un gros soucis dans les pack d'articles. Lorsque je fait un article contenant un pack de 3 ou 4 autres articles différents, au lieu d'afficher les articles comme je les ai choisi, il en prend un au hasard et le repete, en zapant un des articles prévus. Quelqu'un pourrait m'expliquer comment corriger ce bug ? J'ai mis les photos du problème en pièce jointe. Merci ! Edited January 23, 2013 by Jean Francois G (see edit history) Link to comment Share on other sites More sharing options...
Jean Francois G Posted January 12, 2013 Author Share Posted January 12, 2013 UP ? Personne n'a d'idée ? Vos pack a vous fonctionnent ? Link to comment Share on other sites More sharing options...
elise_REA Posted January 21, 2013 Share Posted January 21, 2013 Bonjour, J'ai le même souci que toi sur les packs : l'avant dernier produit ajouté apparaît en double alors que le dernier produit ajouté n'apparaît pas. Quelqu'un saurait-il corriger ce bug ? Elise Link to comment Share on other sites More sharing options...
elise_REA Posted January 21, 2013 Share Posted January 21, 2013 PS : sous Prestashop v 1.5.3.1 Link to comment Share on other sites More sharing options...
brunosz Posted January 22, 2013 Share Posted January 22, 2013 (edited) Bonjour, J'ai également ce bug que j'ai corrigé en modifiant légèrement le fichier /classes/Pack.php: dans la fonction getItemTable($id_product, $id_lang, $full = false) aux lignes 153,154 et 155, la variable $row est renommée $row2. Ci-dessous, je place le code de la fonction modifiée. Cdt. Brunosz public static function getItemTable($id_product, $id_lang, $full = false) { if (!Pack::isFeatureActive()) return array(); $sql = 'SELECT p.*, product_shop.*, pl.*, image_shop.`id_image`, il.`legend`, cl.`name` AS category_default, a.quantity AS pack_quantity, product_shop.`id_category_default`, a.id_product_pack FROM `'._DB_PREFIX_.'pack` a LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_product = a.id_product_item LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON p.id_product = pl.id_product AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').' LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'. Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').' LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') '.Shop::addSqlAssociation('product', 'p').' LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON product_shop.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').' WHERE product_shop.`id_shop` = '.(int)Context::getContext()->shop->id.' AND ((image_shop.id_image IS NOT NULL OR i.id_image IS NULL) OR (image_shop.id_image IS NULL AND i.cover=1)) AND a.`id_product_pack` = '.(int)$id_product; $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); foreach ($result as &$row) $row = Product::getTaxesInformations($row); if (!$full) return $result; $array_result = array(); foreach ($result as $row2) //$row devient $row2 if (!Pack::isPack($row2['id_product'])) //$row devient $row2 $array_result[] = Product::getProductProperties($id_lang, $row2); //$row devient $row2 return $array_result; } Edited January 22, 2013 by brunosz (see edit history) Link to comment Share on other sites More sharing options...
Rob_Heeney Posted January 22, 2013 Share Posted January 22, 2013 Je viens de me rendre compte que j'avais le même bug; Je viens de tester ta modif, ça marque nickel! Merci! Rob Link to comment Share on other sites More sharing options...
Jean Francois G Posted January 23, 2013 Author Share Posted January 23, 2013 alors la, parfait, ca marche ! Et encore un débug effectué par un utilisateur doué ! Félicitations Link to comment Share on other sites More sharing options...
elise_REA Posted January 23, 2013 Share Posted January 23, 2013 Un grand merci à toi bruno, le pack fonctionne nickel après ta modif Link to comment Share on other sites More sharing options...
Wandrille Posted January 24, 2013 Share Posted January 24, 2013 Le bug est effectivement bien présent. Je viens également de le corriger sur prestashop 1.5.3.1 Link to comment Share on other sites More sharing options...
Wandrille Posted January 24, 2013 Share Posted January 24, 2013 (edited) Il s'agit pour une fois davantage d'un bug de PHP que de prestashop. Après quelques tests, voici la mise en évidence du bug à l'aide de ce petit bout de code : <?php $a = array(1,2,3); $z = $a; foreach ($a as &${} foreach ($a as ${} print_r($a); if ($a != $z) print('bug'); ?> Ce code produit le résultat suivant : Array ( [0] => 1 [1] => 2 [2] => 2 ) bug On observe un doublement de la dernière valeur du tableau, tandis que celui-ci ne devrait pas être modifié. J'observe ce bug sur PHP 5.4.3 et les anciennes versions. Je viens de rapporter le bug à l'équipe PHP afin qu'ils corrigent celui-ci rapidement Edited January 25, 2013 by Wandrille (see edit history) Link to comment Share on other sites More sharing options...
brunosz Posted January 25, 2013 Share Posted January 25, 2013 @Wandrille Bonjour, En se référant aux préconisations d'utilisation des réferences dans les boucles foreach (cf note d'avertissement dans le manuel php dans la section foreach), on règle le bug en insérant un unset($row) après la première boucle utilsant une référence &$row. Je place ici le code correctif en tant qu'alternative à ma premère intervention sur ce bug. public static function getItemTable($id_product, $id_lang, $full = false) { if (!Pack::isFeatureActive()) return array(); $sql = 'SELECT p.*, product_shop.*, pl.*, image_shop.`id_image`, il.`legend`, cl.`name` AS category_default, a.quantity AS pack_quantity, product_shop.`id_category_default`, a.id_product_pack FROM `'._DB_PREFIX_.'pack` a LEFT JOIN `'._DB_PREFIX_.'product` p ON p.id_product = a.id_product_item LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON p.id_product = pl.id_product AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').' LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'. Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').' LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.') '.Shop::addSqlAssociation('product', 'p').' LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON product_shop.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('cl').' WHERE product_shop.`id_shop` = '.(int)Context::getContext()->shop->id.' AND ((image_shop.id_image IS NOT NULL OR i.id_image IS NULL) OR (image_shop.id_image IS NULL AND i.cover=1)) AND a.`id_product_pack` = '.(int)$id_product; $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql); foreach ($result as &$row) $row = Product::getTaxesInformations($row); if (!$full) return $result; unset($row); //Instruction à ajouter. $array_result = array(); foreach ($result as $row) if (!Pack::isPack($row['id_product'])) $array_result[] = Product::getProductProperties($id_lang, $row); return $array_result; } 2 Link to comment Share on other sites More sharing options...
warzag Posted January 28, 2013 Share Posted January 28, 2013 Gracias! Link to comment Share on other sites More sharing options...
apparence Posted January 29, 2013 Share Posted January 29, 2013 Merci pour cette précieuse info j'ai le même soucis où doit-on coller ce code ? Dans quel fichier exactement … ligne ? Merci de votre aide. Bien cordialement Olivier Link to comment Share on other sites More sharing options...
Jean Francois G Posted January 29, 2013 Author Share Posted January 29, 2013 @apparence : tout est marqué sur le post de brunoZ quelques lignes plus haut. Difficile d'expliquer mieux que ce qu'il à fait, il y a le nom du fichier, son dossier, et les codes a ajouter. Link to comment Share on other sites More sharing options...
apparence Posted January 29, 2013 Share Posted January 29, 2013 Excusez… j'ai trouvé ∞ vraiment merci pour ces infos !!! Link to comment Share on other sites More sharing options...
bipbipcoyote Posted May 7, 2013 Share Posted May 7, 2013 Bonjour, je relance le topic car pour moi, ce n'est pas tout à fait réglé, j'ai bien appliqué la solution proposée et donc obtenu le résultat escompté mais sur le second pack uniquement, sur le troisième pack, aucun produit le composant ne s'affiche vous pouvez le constater ici ne peut-on encore améliorer le code pour que le nombre de pack ne soit pas limité Merci Link to comment Share on other sites More sharing options...
brunosz Posted May 8, 2013 Share Posted May 8, 2013 Bonjour bipbipcoyote, je viens de valider le fonctionnement avec plusieurs packs et cela fonctionne pour moi. Je vous invite à utiliser la version de la fonction getItemTable que j'ai postée 25/01/2013 (voir plus haut) et nous dire si cela fonctionne également pour vous. Cordialement. Link to comment Share on other sites More sharing options...
bipbipcoyote Posted May 8, 2013 Share Posted May 8, 2013 (edited) Bonjour, Merci pour la réponse, j'ai revérifié une nouvelle fois l'encodage de ce "produit-pack" et sans doute que dans une de mes manipulations, j'ai décoché la mention 'pack' donc le produit était considéré comme un produit normal. J'étais donc le seull fautif, on est parfois tellement persuadé de ce que l'on fait que l'on ne remarque plus les erreurs monumentales devant notre nez ça m'étonnait aussi, je me disais si ça marche pour 2, ça doit fonctionner pour 3 ou plus Encore merci d'avoir consacrer un peu de temps à me répondre Edited May 8, 2013 by bipbipcoyote (see edit history) 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