Prestashop : petit bug lors de la régénération des déclinaisons
Lors du développement d’un module en rapport avec le générateur de déclinaisons de Prestashop, un souci est apparu du fait que ce module doit, pour fonctionner, utiliser la table attribute_impact qui permet de récupérer l’impact de chaque valeur d’attribut pour le produit concerné, cette table n’étant mise à jour que par le générateur de déclinaisons.
Tout fonctionne correctement jusqu’à ce que les attributs soient modifiés, en effet lorsque qu’on souhaite modifier les déclinaisons d’un produit il est possible de vouloir supprimer des valeurs voir des attributs entiers, mais dans ce cas précis, le générateur ne vide pas la table des impacts avant de créer les nouveaux, ce qui dans la majorité des cas n’est pas pénalisant puisque cette table ne sert qu’à sauvegarder ces valeurs sans toutefois les utiliser réellement puisque qu’elles sont dans un tableau lors de la dite génération.
Malheureusement, le module utilisant cette table afin de connaitre les valeurs utilisées par le produit, on se retrouve avec des attributs et valeurs qui ne sont pas répertoriées dans la table product_attribute_combination mais bien visibles et sélectionnables sur la fiche produit.
Pour corriger cette erreur, il est nécessaire de surcharger le contrôleur du générateur afin de vider les données concernant le produit dans la table attribute_impact avant que ce dernier ne les enregistrent à nouveau.
Ce ‘bug’ est au moins existant pour les versions 1.5 et 1.6 de Prestashop.
Le fichier AdminAttributeGeneratorController est donc nécessaire, en cliquant sur le lien vous pouvez le télécharger, il faut ensuite le décompacter et le placer dans le répertoire override/controllers/admin de votre boutique Prestashop, puis supprimer, si nécessaire, le fichier cache/class_index.php, afin qu’il prenne en compte cette nouvelle surcharge.
Le code présent dans ce fichier est le suivant :
protected static function setAttributesImpacts($id_product, $tab) { // Delete old impacts Db::getInstance()->execute('DELETE FROM '._DB_PREFIX_.'attribute_impact WHERE id_product = '.$id_product); // Create new ones return parent::setAttributesImpacts($id_product, $tab); }
La partie importante étant celle en gras qui va supprimer les données de la base avant d’appeler la méthode par défaut, le tour est joué, votre table attribute_impact est propre.