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

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