Catastrophe, vous obtenez ce message d'erreur lors de l'enregistrement d'une catégorie :

[PrestaShop\PrestaShop\Core\Domain\Category\Exception\CategoryConstraintException code 6]

Ou bien lors de l'enregistrement d'un produit :

This product must be in the default category.

Ou encore vous constatez des erreurs dans l'affichage des produits, dans l'arborescence de vos catégories...

Pas de panique !

Prestashop utilise la représentation intervalaire de l'arborescence

Par exemple, pour une arborescence comme celle-ci :

Accueil

Cat 1

Cat 2

Sous cat 21

Sous cat 22

Cat 3

On va enregistrer en base de donnée les intervales de chaque catégorie.:

Accueil de 1 à 12

Cat 1 de 2 à 3

Cat 2 de 4 à 9

Sous Cat 21 de 5 à 6

Sous Cat 22 de 7 à 8

Cat 3 de 10 à 11

C'est une façon élégante d'éviter des requêtes récursives couteuses en cas d'arborescence complexe.

Par exemple, pour trouver tous les descendant de Cat 2, il suffit d'une requête, catégories dont l'interval est entre 4 et 9.

Pour trouver les catégories qui ont des enfants, une seule requête : fin d'intervale moins début = 1

Pour en savoir plus, lisez cet article très intéressant :

https://sqlpro.developpez.com/cours/arborescence/

Comment les intervales des catégories Prestashop ont pu être cassés ?

Très souvent, lorsque les catégories sont envoyées par un outils extérieur, ou encore lors de manipulations directes de la base de donnée.

Si vous supprimez une catégorie directement dans la base de donnée, l'arbre sera faux !

Il faut donc reconstruire tout l'encadrement en tenant compte de cet intervale supprimé. Si vous avez beaucoup de catégories, bonne chance pour faire ça manuellement !

Réparer les intervales nright et nleft facilement

Pas de panique donc, il existe une fonction de la classe Category de prestashop qui reconstruit la base de donnée.

Malheureusement, Prestashop n'a pas mis en place un simple outil de réparation qui permet de l'appeler, mais vous pouvez le faire dans un module.

Avant tout, remettre tous le nright et nleft à 0 :

update ps_category set nright=0, nleft=0;

Impératif si vous avez des catégories orphelines, qui ne seront pas prises en compte par la reconstruction et dont les index vont mettre la pagaille !

On va par exemple utiliser le module welcome de prestashop (qui n'est appelé qu'au niveau du backoffice), et appeler la fonction dans un hook.

Dans modules/welcome/welcome.php faites la modification suivante dans la fonction hookDisplayBackOfficeHeader:

 public function hookDisplayBackOfficeHeader()
 {
 if (!$this->onBoarding->isFinished()) {
 $this->context->controller->addCSS($this->_path.'public/module.css', 'all');
 $this->context->controller->addJS($this->_path.'public/module.js', 'all');
 }
/*ajout pour reconstruire arbre*/
 Category::regenerateEntireNtree();
/*fin ajout*/
 }

Connectez vous ensuite à votre backoffice.

C'est reconstruit.

Supprimez la modification (pour ne pas reconstruire la table en permanence !!).

Si jamais après la reconstruction, vous constatez que des catégories on toujours nright et nleft à 0, effectuez la requête suivante :

DELETE a,b,c,d,e FROM ps_category a LEFT JOIN ps_category_group b ON (a.`id_category` = b.`id_category`) LEFT JOIN ps_category_lang c ON (a.`id_category` = c.`id_category`) LEFT JOIN ps_category_product d ON (a.`id_category` = d.`id_category`) LEFT JOIN ps_category_shop e ON (a.`id_category` = e.`id_category`) WHERE a.`nleft`=0 and a`nright`=0

Vous avez un bug ou des erreur sur votre boutique Prestashop ?

Contactez moi pour une intervention rapide sur votre site...mes 20 ans d'expérience me permettent de trouver rapidement une solution à tous vos problèmes sur Prestashop.