Jump to content

bug , tri par 'position' des produits


Recommended Posts

  • 3 weeks later...

Je confirme malheureusement...Dans la table ps_Category_product, je me retrouve avec des couples (id_cat,position) identiques.
Désolé, j'ai modifié la table et je n'ai plus de copie d'écran.
Mais même après correction, je ne parviens plus à accéder à certaines catégories depuis le BO.

Link to comment
Share on other sites

  • 3 weeks later...

Bon, heureusement la cliente elle réussit très bien à faire apparaitre le bug (bien que j'ignore toujours comment).

Ci-joint :

1- la mise en évidence des incohérences sur la base de données, on y voit une requête de recherche de doublons sur le couple (id_category,position) ainsi que le contenu de la table en elle même.

Cette image peut être utilisée pour une soumission de bug sans me demander de permission.

requette:

SELECT
cp1.id_category,
cp1.id_product,
cp1.`position`,
cp2.id_product
FROM
ps_category_product AS cp1
Inner Join ps_category_product AS cp2 ON cp1.id_category = cp2.id_category AND cp1.id_product < cp2.id_product AND cp1.`position` = cp2.`position`
ORDER BY
cp1.id_category ASC



2- Une mise en évidence du problème que cela pose sur le back office

Cette image peut être utilisée pour une soumission de bug sans me demander de permission.

17505_Fpm0DdlbJd68pGG9NK4r_t

17506_AD9yRbFF0QupqvX6WXez_t

Link to comment
Share on other sites

  • 2 weeks later...

Eh bien non, la dernière fois que j'ai lu votre charte, celle ci indiquait qu'il fallait qu'un modérateur valide un bug sur le forum avant qu'on le soumette sur le bug tracker... mais bon, comme il n'y a jamais de réponse ou presque...

Pour les autres personnes ayant ce problème :

En attendant de trouver où réside le bug, j'ai un petit module permettant de réparer les positionnements de la BDD... Il n'empêche pas la corruption du système de positionnement de revenir ni ne répare sa cause, il ne s'attaque qu'aux effets du bug, c'est à dire aux trous dans le système de positionnement ou aux positions doublonnés. Une foi le script lancé on peut à nouveau manipuler correctement les positions des produits... jusqu'à la prochaine corruption du système ! (après quoi il suffit de recliquer ;) ).

C'est juste une rustine, mais ça intéresse quelqu'un ?

Moi je suis intéressé par toute information sur le moyen de reproduire le bug (ou toute dénonciation de la classe ou méthode en cause ^^), notre cliente est gênée par ce bug et j'aimerais le résoudre rapidement. (Si je trouve la cause du bug je la soumettrais ici avec le correctif dès qu'il sera prêt).

Link to comment
Share on other sites

Non, rien n'a été modifié à ce sujet. Il n'y a pas besoin d'autorisation pour poster dans le Bug Tracker. Bien au contraire on encourage à poster là plutôt que dans ce forum.

Avant d'y poster il est néanmoins judicieux d'essayer de reproduire le bug en question sur la version SVN, histoire de ne pas faire perdre du temps aux développeurs à essayer de reproduire un bug déjà signalé et corrigé entre-temps, mais rien d'obligatoire.

Link to comment
Share on other sites

Bon j'ai trouvé d'où vient le souci de l'ordre un peu rock'n roll des produits dans les catégories...
J'ai téléchargé un prestashop tout propre (1.2.5) et fait des tests sur la catégorie "accueil"
Il y a 4 produits : 1-ipod Nano, 2- ipod Shuffle, 6-Macbook, 7-iPod touch

Je les ai mis dans cet ordre :

id_product / position
1 0
2 1
6 2
7 3

Si j'édite et enregistre le produit 6, on se retrouve avec :

id_product / position
1 0
2 1
6 2
7 2

Si j'édite et enregistre le produit 2 (en partant de la position de départ), on se retrouve avec :

id_product / position
1 0
2 1
6 1
7 2

Si j'édite et enregistre le produit 1 (en partant de la position de départ), on se retrouve avec :

id_product / position
1 0
2 0
6 1
7 2

En fait, ça décale tous les produits qui sont après celui édité.

Le problème vient de la fonction deleteCategories (classes/Product.php ligne 475) qui est appelée à chaque fois et qui supprime le produit de la table category_product puis remet tous les autres dans l'ordre... ce qui explique que tous les produits suivants sont décales d'une place vers le haut.
Et comme le produit édité est réinséré ensuite avec son ancien numéro de position, ça crée un doublon

La solution est donc de ne pas toucher aux catégories du produit que l'on édite.

J'ai modifié le fichier Product.php ligne 456 (updateCategories):
Avant :

$this->deleteCategories();
$productCats = array();
foreach ($categories AS &$categorie)
   $categorie = intval($categorie);




Apres :

$productCats = array();
foreach ($categories AS &$categorie)
   $categorie = intval($categorie);
$this->deleteCategories($categories);



puis la fonction deleteCategories ligne 475
Avant :

public function deleteCategories()
{
   $result = Db::getInstance()->Executes('SELECT `id_category` FROM `'._DB_PREFIX_.'category_product` WHERE `id_product` = '.intval($this->id));
   $return = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_product` WHERE `id_product` = '.intval($this->id));
   foreach($result AS $row)
       $this->cleanPositions(intval($row['id_category']));
   return $return;
}



Après :

public function deleteCategories($categoryNotToClean=array())
{
   $result = Db::getInstance()->Executes('SELECT `id_category` FROM `'._DB_PREFIX_.'category_product` WHERE `id_product` = '.intval($this->id));
   $return = Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'category_product` WHERE `id_product` = '.intval($this->id));
   foreach($result AS $row)
       if(!in_array(intval($row['id_category']), $categoryNotToClean))
           $this->cleanPositions(intval($row['id_category']));
   return $return;
}



Voilà... j'espère que ça en aidera quelques-uns !
En tous cas je suis fan de cette solution e-commerce, bien écrite, complète et TRES performante :)

Link to comment
Share on other sites

Thanks alot, I love you Stephane !!!
lol

Tu me retires une sacrée épine du pied car j'avais éliminé l'édition de produit comme étant la source du problème, je risquais donc de chercher longtemps :s... (j'ai surement du tester en éditant un produit en dernière position, ce qui expliquerait que cela n'ait pas généré de corruption de la table).

D'accord avec toi pour Prestashop, avant je bossais avec osCommerce, quelle galère, depuis que je suis passé à Prestashop c'est devenu un loisir !
J'aime beaucoup l'architecture des modules, pas besoin de toucher aux fichiers Core comme sous osCommerce... (pire encore qu'osCommerce, j'utilisais CRELoaded: payant et buggé jusqu'à la moelle, franchement les bugs de prestashop c'est rien à coté !!!)

@Fabrice:
Désolé, mauvaise lecture de la charte que je viens de relire, my fault... Par contre chose que je ne suis tjs pas sur d'avoir compris : Est-on obligé de poster dans un autre forum à propos du "bug" ou "suspicion de bug" avant de poster ici ? Car je l'ai déjà fait par deux fois je crois (une fois pour la variable LC_TIME et l'autre je ne sais plus) sans aucune réponse...

Link to comment
Share on other sites

Simple script for resolve the product bugged ^^

<?PHP
$conn = mysql_connect('localhost', 'root', 'root') or die ('Error connecting to mysql');
mysql_select_db('ps', $conn);
$query_c  = "SELECT id_category FROM `category` ORDER BY `id_category`";
$result_c = mysql_query($query_c);
while($row_c = mysql_fetch_array($result_c, MYSQL_ASSOC)){
   $query_cp  = "SELECT * FROM `category_product` WHERE `id_category` = '".$row_c['id_category']."' ORDER BY `id_product`";
   $result_cp = mysql_query($query_cp);
   $i = 0;
   while($row_cp = mysql_fetch_array($result_cp, MYSQL_ASSOC)){
       $query = "UPDATE `category_product` SET `position`='".$i."' WHERE (`id_category`='".$row_cp['id_category']."') AND (`id_product`='".$row_cp['id_product']."')";
       mysql_query($query);
       $i++;
   }    
}

mysql_free_result($result_c);
mysql_free_result($result_cp);
mysql_close($conn);
?>

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