Please note that PrestaShop Community sections are largely self-moderated. PrestaShop team members may or may not participate in non-English sections. To improve the chances of receiving feedback to your question or comment, please post it in English to the main sections of our Forum.

Vous parlez français ? par ici !
bug , tri par 'position' des produits
#1
Posted 15 December 2009 - 09:20 AM
#2
Posted 15 December 2009 - 11:20 AM
#3
Posted 15 December 2009 - 12:06 PM
#4
Posted 03 January 2010 - 02:32 PM
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.
#5
Posted 21 January 2010 - 12:45 PM
Quelqu'un a réussi à savoir quel action provoque ces doublons ? Je n'ai pas réussi à en réobtenir...
#6
Posted 21 January 2010 - 05:32 PM
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.
Attached File(s)
bug-report-1.png (57bytes)
Number of downloads: 459
bug-report-2.png (32bytes)
Number of downloads: 474
#7
Posted 29 January 2010 - 03:05 PM
#8
Posted 09 February 2010 - 01:45 PM
From 1260875180:
Des retours (même négatifs) seraient sympathiques eux aussi ! Poster une soumission de bug propre prend du temps, et jusqu'ici dans mon cas n'est jamais récompensée...
#9
Posted 09 February 2010 - 06:31 PM
#10
Posted 09 February 2010 - 07:25 PM
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).
#11
Posted 09 February 2010 - 07:58 PM
il est question dans mon premier post de poster uniquement des bugs avérés. jamais je n'ai dit que nous les validions.
ou alors les conditions sont modifiées et tu me l'apprends.
#12
Posted 09 February 2010 - 10:39 PM
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.
#13
Posted 17 February 2010 - 04:49 PM
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 :)
#14
Posted 17 February 2010 - 08:29 PM
Cdlt,
Pierre.
#15
Posted 18 February 2010 - 03:21 PM
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...
#16
Posted 25 February 2010 - 10:00 AM
<?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);
?>
#17
Posted 26 February 2010 - 08:45 AM
Il me semble que pour parfaire la propreté de ta modification il faut ajouter l'IGNORE flag à l'INSERT de la fin de updateCategories.
Cordialement, Damien.
1 user(s) are reading this topic
0 members, 1 guests, 0 anonymous users












