Jump to content

[RESOLU] Gros bug sur la création des Pack d'articles. Besoin urgent de votre aide (presta 1.5.3.1)


Jean Francois G

Recommended Posts

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 !

post-280753-0-00291400-1357994357_thumb.jpg

post-280753-0-75283200-1357994364_thumb.jpg

Edited by Jean Francois G (see edit history)
Link to comment
Share on other sites

  • 2 weeks later...

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 by brunosz (see edit history)
Link to comment
Share on other sites

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 by Wandrille (see edit history)
Link to comment
Share on other sites

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

  • Like 2
Link to comment
Share on other sites

  • 3 months later...

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

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

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 by bipbipcoyote (see edit history)
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...