Jump to content

PS V1.4 Category table _ What is nleft et nright for?


SITOLOG - F Bugnet

Recommended Posts

Hi,

Note for moderator: Not sure this is the right place to post such question, but do not know a better place. Please move this post if necessary.

I'm adapting some modules I made, to be compatible with the coming V1.4. Using the category table, I found two new columns, called nleft and nright.

Has no clue what this is for and meaning. Analysing the current values set for the Apple categories, did not find any logic.

As I 'm working on a module capable of deleting/adding a category, need to know if I should take care of those parameters and what to put in.

Help is welcome. Thanks
Franck

  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...

Thanks for this beginning of answer .At least we know now this is the breadcrumb (fil d'ariane in French).

But anyone as a clue about how to set or calculate these values?

The default nleft values are 1 2 3 4 and the nright values 8 3 4 5 for the categories provided as example.
what is this 8 meaning ?

Link to comment
Share on other sites

  • 3 weeks later...
  • 1 year later...
  • 2 weeks later...
  • 4 weeks later...

To install the module by going to:

Back Office > Modules > Add a module from my computer : Module file : Upload

 

 

Than just run the module by going to "Configure" for this model

 

You have to run it manually every time you need to fix any category tree errors

post-304183-0-60827900-1342830501_thumb.png

  • Like 1
Link to comment
Share on other sites

To install the module by going to:

Back Office > Modules > Add a module from my computer : Module file : Upload

 

 

Than just run the module by going to "Configure" for this model

 

You have to run it manually every time you need to fix any category tree errors

 

Thanks, in fact i already installed it .. and it seems to work fine. Thanks a lot for your module.

Link to comment
Share on other sites

  • 2 weeks later...
  • 1 month later...
  • 4 weeks later...
  • 1 month later...
  • 2 months later...

I have 1.5.2 with imported categories and also imported products with the default prestashop but it seems that on the product page the breadcrumb is not showing the full path. Is showing only Home and the product link. It doesn't matter if the product is directly on a category or subcategory.

 

I tryed the module posted here and I regenerated the tree but still not working. Any othe sollutions ?

  • Like 1
Link to comment
Share on other sites

  • 5 months later...
  • 2 months later...

I used this and it worked perfectly on 1.5.5. I just FTP'd the unzipped Folder up to the Modules Folder and Installed from Admin.

Tried several times but doesnt' work on my 1.5.6. Removed from the server and FTP'd back and installed from Admin, but still not working. It says it worked, but nothing happened to the table.

Link to comment
Share on other sites

  • 1 month later...
  • 3 months later...

Thanks.

In 1.6.0.5: Installing ok, but it seems to do nothing (no error, … message: done).
I must migrate over 500 categories. I mapped the db tables from extern with sql but there are not correct functions in bo/fo.

Greetings from Berlin

Link to comment
Share on other sites

  • 2 weeks later...

Hi everyone !

 

I was stuck on the same problem like abehsera (i'm on 1.5.6.2): 

 

Tried several times but doesnt' work on my 1.5.6. Removed from the server and FTP'd back and installed from Admin, but still not working. It says it worked, but nothing happened to the table.

 

Same symptoms, same results ...

 

I searched and found that the function regenerateEntireNtree() from class Category (classes/Category.php) has a condition (line 408 in my file) :

if (isset($categories_array[0]) && $categories_array[0]['subcategories'])
   Category::_subTree($categories_array, $categories_array[0]['subcategories'][0], $n);

but in database, my "root" category has id_parent = 1, not "0" (as expected in condition).

I have changed manually in database this id_parent to 0 and relauch the module, and it worked.

 

Hope this would work for you too !

Link to comment
Share on other sites

  • 3 weeks later...
  • 4 weeks later...
  • 1 month later...
  • 3 weeks later...

I'm on Prestashop 1.6.0.8 and I looking for a module to regeneretate my nleft and nright values.

 

nleft nright values are generated automatically while you adding categories.

so if you will, for example, create temporarily "TEST" category, all nleft / nright values should be regenerated

  • Like 1
Link to comment
Share on other sites

I tried this over and over again, deleting, creating, checking the database, but the nleft and nright values never changed.

Also disabled caching, cleared the cache. Created categories for one shop only, created categories for all shops, neither action changed the nright,nleft values, always = 0.

I would really appreciate any help you could give, since I know not what to do else.

 

I'm using Prestashop 1.6.0.8, Multishop feature enabled, two live running shops. But unable to create new categories, alwas getting 404, and nleft/nright = 0.

Link to comment
Share on other sites

nleft nright values are generated automatically while you adding categories.

so if you will, for example, create temporarily "TEST" category, all nleft / nright values should be regenerated

 

 

NOT TRUE.

 

My friend had to make me a php script to regenerate all of them on 1.6.0.8

 

The option to regenerate nleft and nright should be built in into the PrestaShop Cleaner module.

  • Like 1
Link to comment
Share on other sites

werl, is it possible to share the script? much obliged :D

 

 

The problem you currently have, I had it for more than two months.

 

Nobody from Prestashop team's helped me. Where are those guys when you need to have these bugs fixed.

 

Open Source...

 

 

 

Give me a couple of minute, i send it to you via PM.

  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...

Hi,

I have the same problem in 1.6.0.8 migrated from 1.4.3.7

Cannot create new category in the BO, but would like a way to do it manually in waiting for a solution, 

or to repair my values in the database (in production!!).

Thanks to post this repairing script.

Rene

Link to comment
Share on other sites

  • 7 months later...
  • 4 weeks later...
  • 1 month later...

Bonjour à tous,

 

Ce module ne fonctionne pas pour 1.6 et j'ai le même type de problèmes.

 

Je ne parviens pas à afficher les url categories sans voir une erreur 404 :(

 

Quelqu'un saurait m'aider svp?!

Bonjour,

 

Avez vous trouvé une solution par module ? Merci d'avance, j'ai exactement le même soucis après injection des catégories par CSV. Merci !

Link to comment
Share on other sites

  • 3 weeks later...

Est-ce que le module pour regénérer les catégories fonctionne sur la 1.6? Après un message de confirmation de téléchargement du module dans le back-office, le module n'apparait pas dans la liste des modules (même en le recherchant).

Link to comment
Share on other sites

Est-ce que le module pour regénérer les catégories fonctionne sur la 1.6? Après un message de confirmation de téléchargement du module dans le back-office, le module n'apparait pas dans la liste des modules (même en le recherchant).

Bonjour,

 

Non malheureusement il n'est pas compatible avec la 1.6, pour ma part, j'ai été obligé de restaurer la base de donnée sur une sauvegarde de la veille pour corriger le soucis (mais ma boutique n'est pas encore en production).

Link to comment
Share on other sites

Merci pour ta réponse. Par contre cela veut-dire que je n'ai aucune solution, même faire qqchose à la main dans la base de données? J'avoue ne pas comprendre ce bug... Merci d'avoir pris le temps de me lire en tous cas.

Malheureusement je ne connais pas la manipulation, j'ai trouvé des choses avec google mais c'était trop technique pour essayer... Vois avec ton hébergeur si tu as une sauvegarde, sinon il ne te reste plus qu'à trouver les modifications en question à effectuer à la main. Bon courage 

Link to comment
Share on other sites

Même si module il y avait, ce n'est pas magique. Le module ne peut savoir comment reconstruire si la table est trop en vrac.

 

Plusieurs choses à savoir/comprendre :

(Les explications sont données ici pour du mono-boutique)

Vous devez avoir dans ps_category ces 2 premières lignes qui concernent la catégorie Root et Accueil. Root est invisible mais obligatoire.

id_category	id_parent	id_shop_default	level_depth    nleft  nright active	 date_add	       date_upd	      position	is_root_category
1	           0	             1	             0	         1	22	1    2014-02-27 04:28:50  2014-02-27 04:28:50	0	   0
2	           1	             1	             1	         2	21	1    2014-02-27 04:28:50  2014-02-27 04:28:50	0	   1

root (id=1) doit avoir 0 en is_root_category.

Accueil(id=2) DOIT être en 1

 

Si vous n'êtes pas sûr des noms des catégories, regardez dans ps_category_lang

 

Vérifiez dans ps_configuration que l'id home est correct (PS_HOME_CATEGORY = 2)

Vérifiez le également dans ps_shop (id_category = 2)

Dessinez sur une feuille l'arbre de vos catégories avec leur nom et leur id (autrement vous allez vite être perdus^^)

 

Il faut comprendre que les nleft et nright encadrent chaque catégorie, qu'ils sont uniques et se suivent sans trous !

Root encadre l'ensemble.

Pour l'instant vous savez qu'elle démarre à 1.

Comptez le nombre de lignes dans cette table et multipliez le par 2, vous aurez le nright max.

Dans l'exemple ci-dessus la catégorie va de 1 à 22

 

La catégorie Accueil encadre également l'ensemble, juste après root

Donc elle démarre à 2 à gauche et termine à 21 (dans l'exemple)

 

Ensuite, et c'est là qu'on commence à s'amuser, il faut repérer les sous-catégories en différenciant celles qui ont également des sous-catégories.

Exemple simple avec une sous-catégorie seule. (id=3, nom Test1)

Cette catégorie va donc commencer à 3 en nleft et aller à 4 en nright (Elle s'encadre elle-même^^) avec 2 comme id_parent (Accueil pour ceux qui n'ont pas suivi)

Ainsi de suite pour toutes les catégories simples.

 

Pour une catégorie (id=4, nom Test2) avec sous-catégorie, on ne rempli pour l'instant que nleft. Le dernier n utilisé étant 4, ici nleft sera 5, son id_parent sera 2  (Accueil, toujours pour ceux qui n'ont pas suivi)

1ère sous-catégorie de cette catégorie:

id_parent = 4 (logique)

nleft = 6 et si pas de sous-catégorie, nright = 7

Idem pour les suivantes. Arrivés à la dernière, par exemple id= 8, id_parent=4, nleft = 12 et nright = 13 on peut donc connaitre le nright de la catégorie parente qui sera donc 14 (si vous avez suivi)

 

Ainsi de suite pour toutes vos catégories/sous-catégories.

le dernier nright doit correspondre à celui de l'accueil - 1

 

Certains vont me dire, surtout ceux qui suivent, que je n'ai rien dit concernant la colonne level_depth. Cette colonne correspond à la profondeur de la catégorie depuis root.

Donc facile à remplir:

Root profondeur = 0

Accueil = 1

Toutes les catégories de 1er niveau = 2 et ainsi de suite.

 

Bon on a fait le principal mais il reste des choses à vérifier.

Dans ps_category_lang, contrôler le nombre et les id des catégories et s'assurer qu'ils correspondent bien à ceux de ps_category.

Dans ps_category_group vérifier que les catégories sont bien accessibles à chaque groupe client (sauf root qui a juste un groupe 0)

Dans ps_category_shop vérifier que toutes vos catégories sont bien présentes pour l'id_shop 1

Dans ps_category_product, pas évident à contrôler comme ça, il suffira de vérifier pour chaque produit sa ou ses associations.

 

Je ne vous ai pas parlé des positions, car c'est très simple à remettre en place dans votre BO par simple glisser/déposer^^

 

Voilà pour ceux qui voulaient comprendre le fonctionnement et éventuellement réparer leur tables. Faites ça au calme, avec un arbre dessiné comme expliqué plus haut et tout devrait rentrer dans l'ordre.

 

Evidemment, si vous avez 5000 catégories ça ne va pas être une partie de plaisir...

 

Personnellement, je commence par reconstruire les catégories principales, puis j'importe par série et je contrôle à chaque import.

 

Bon courage :)

  • Like 3
Link to comment
Share on other sites

  • 2 months later...

Bonjour , j'ai eu le même soucis. 

A chaque fois que je créé une nouvelle catégorie , celle ci m'indiquait une page 404.

Dans la base de donnée le nlfet et nright était à 0 tout les deux.

Le travail que proposait Eolia me semblait titanesque mais ca ma mit sur la piste pour trouver une procédure plus rapide.

Je m'explique:

 

Ouvrez votre base de donnée à la table ps_catergory.

Affichez par 500 lignes pour plus de facilités et classez par nleft.

Vous deviez avoir les nleft à la suite, vérifiez s'il y a des trous ou des duplicats .

Avant de supprimer ou corriger , vérifiez l'id de la catégorie afin de déterminer de laquelle il s'agit.

 

Moi personnellement j'ai trouvé comme ça. J'ai du supprimer une ligne et une catégorie qui n'existait pas en fait.

Ensuite j'ai passé le Category Tree Regenerator et Nickel.

 

J'espère que cela aidera qqun.  ;)

  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...
  • 2 weeks later...

En ce qui me concerne, j'ai essayé d'installer le module 1.5.5+ sur une version 1.6.0.6 par l'admin, mais le module n'apparait pas ensuite dans la liste des modules, et pour cause, le zip décompresse tous les fichiers du modules à la racine du répertoire "modules", alors que ces fichiers devraient être rangés dans un dossier "regenerateCatTree".

Il faut donc charger le module manuellement, en versant les 4 fichiers dézippés dans un dossier "regenerateCatTree" que vous aurez créé dans le dossier modules.

 

Ensuite, le module est bien apparu dans ma liste, et il a fonctionné pour moi, merci au dev !

Link to comment
Share on other sites

Great ideas. So the module simply runs

Category::regenerateEntireNtree();

 

and looking through the site, this function is also run when a category is imported via csv AND from the PSCleaner "PrestaShop Cleaner" module under FUNCTIONAL INTEGRITY CONSTRAINTS Check & Fix.

Link to comment
Share on other sites

  • 5 months later...

Même si module il y avait, ce n'est pas magique. Le module ne peut savoir comment reconstruire si la table est trop en vrac.

 

Plusieurs choses à savoir/comprendre :

(Les explications sont données ici pour du mono-boutique)

Vous devez avoir dans ps_category ces 2 premières lignes qui concernent la catégorie Root et Accueil. Root est invisible mais obligatoire.

id_category	id_parent	id_shop_default	level_depth    nleft  nright active	 date_add	       date_upd	      position	is_root_category
1	           0	             1	             0	         1	22	1    2014-02-27 04:28:50  2014-02-27 04:28:50	0	   0
2	           1	             1	             1	         2	21	1    2014-02-27 04:28:50  2014-02-27 04:28:50	0	   1

root (id=1) doit avoir 0 en is_root_category.

Accueil(id=2) DOIT être en 1

 

Si vous n'êtes pas sûr des noms des catégories, regardez dans ps_category_lang

 

Vérifiez dans ps_configuration que l'id home est correct (PS_HOME_CATEGORY = 2)

Vérifiez le également dans ps_shop (id_category = 2)

Dessinez sur une feuille l'arbre de vos catégories avec leur nom et leur id (autrement vous allez vite être perdus^^)

 

Il faut comprendre que les nleft et nright encadrent chaque catégorie, qu'ils sont uniques et se suivent sans trous !

Root encadre l'ensemble.

Pour l'instant vous savez qu'elle démarre à 1.

Comptez le nombre de lignes dans cette table et multipliez le par 2, vous aurez le nright max.

Dans l'exemple ci-dessus la catégorie va de 1 à 22

 

La catégorie Accueil encadre également l'ensemble, juste après root

Donc elle démarre à 2 à gauche et termine à 21 (dans l'exemple)

 

Ensuite, et c'est là qu'on commence à s'amuser, il faut repérer les sous-catégories en différenciant celles qui ont également des sous-catégories.

Exemple simple avec une sous-catégorie seule. (id=3, nom Test1)

Cette catégorie va donc commencer à 3 en nleft et aller à 4 en nright (Elle s'encadre elle-même^^) avec 2 comme id_parent (Accueil pour ceux qui n'ont pas suivi)

Ainsi de suite pour toutes les catégories simples.

 

Pour une catégorie (id=4, nom Test2) avec sous-catégorie, on ne rempli pour l'instant que nleft. Le dernier n utilisé étant 4, ici nleft sera 5, son id_parent sera 2  (Accueil, toujours pour ceux qui n'ont pas suivi)

1ère sous-catégorie de cette catégorie:

id_parent = 4 (logique)

nleft = 6 et si pas de sous-catégorie, nright = 7

Idem pour les suivantes. Arrivés à la dernière, par exemple id= 8, id_parent=4, nleft = 12 et nright = 13 on peut donc connaitre le nright de la catégorie parente qui sera donc 14 (si vous avez suivi)

 

Ainsi de suite pour toutes vos catégories/sous-catégories.

le dernier nright doit correspondre à celui de l'accueil - 1

 

Certains vont me dire, surtout ceux qui suivent, que je n'ai rien dit concernant la colonne level_depth. Cette colonne correspond à la profondeur de la catégorie depuis root.

Donc facile à remplir:

Root profondeur = 0

Accueil = 1

Toutes les catégories de 1er niveau = 2 et ainsi de suite.

 

Bon on a fait le principal mais il reste des choses à vérifier.

Dans ps_category_lang, contrôler le nombre et les id des catégories et s'assurer qu'ils correspondent bien à ceux de ps_category.

Dans ps_category_group vérifier que les catégories sont bien accessibles à chaque groupe client (sauf root qui a juste un groupe 0)

Dans ps_category_shop vérifier que toutes vos catégories sont bien présentes pour l'id_shop 1

Dans ps_category_product, pas évident à contrôler comme ça, il suffira de vérifier pour chaque produit sa ou ses associations.

 

Je ne vous ai pas parlé des positions, car c'est très simple à remettre en place dans votre BO par simple glisser/déposer^^

 

Voilà pour ceux qui voulaient comprendre le fonctionnement et éventuellement réparer leur tables. Faites ça au calme, avec un arbre dessiné comme expliqué plus haut et tout devrait rentrer dans l'ordre.

 

Evidemment, si vous avez 5000 catégories ça ne va pas être une partie de plaisir...

 

Personnellement, je commence par reconstruire les catégories principales, puis j'importe par série et je contrôle à chaque import.

 

Bon courage :)

Bonjour 

Merci beaucoup pour ce contenu ! 

Il se trouve que mon catalogue est complètement tronqué (mélangé) en front office et je pense qu'il s'agit d'un problème de catégorie.

J'ai donc démarré votre processus mais mes catégories non pas de chiffres qui se suivent par ex je passe de 3 à 36 est ce que cela est un problème ou ne dois je regarder que les nleft ?

 

Merci pour votre réponse 

Link to comment
Share on other sites

  • 2 weeks later...

Super, merci pour le module, je l'ai installé sans soucis sur 1.6.0.5, par contre effectivement il faut faire un petit peu de préparation sur les catégories si ce n'est pas propre.

Je lancé plusieurs fois pour que celà fonctionne totalement avec une arborescence en multiboutique (2 shop), et pour l'instant ça m'a l'air correct, les espaces entre les nleft et right sont bons, c'est super... et pourtant j'avais vraiment mis la bazard à la main....

 

Par contre si quelqu'un peut me valider que je suis dans le bon:

j'ai 2 catégories root id=2 et id=4  'is_root_category' dont le parent est id=1 / level_deph 0 / position 1 

ça fonctionne sauf que ces 2 catégories root que j'ai ajouté aprés n'ont aucun produit lié et apparaissent en tête de mon site map, ne peut on pas les empêcher d’apparaître?

Sinon je veux bien la requête sql pour lier tout mes produits à cet id =2

Link to comment
Share on other sites

  • 3 months later...
  • 2 months later...

nleft nright values are generated automatically while you adding categories.

so if you will, for example, create temporarily "TEST" category, all nleft / nright values should be regenerated

 

works perfectly on 1.6.1.7 ... as we say in Auvergne : "il vaut mieux 1 qui sait que 100 qui cherchent"  :)

Link to comment
Share on other sites

  • 3 months later...
  • 3 months later...

Hi,

 

I opened this topic years ago. I see it is still an issue for many people. Just wanted to mention that since my intitial question I invested lot of time to maste these nleft and nright parameter and that PrestaCategories is including for year a tool to repair broken categories trees, including the nested parameters. Has saved hundred of sites as of today.

For moderator : sorry I know we are not in the right forum to talk about paid modules (this is why I do not include a link) , feel free to move to topic if required..

 

Rgds

Franck

Link to comment
Share on other sites

  • 5 months later...
On 06/04/2014 at 9:50 AM, RyderOne said:

Hi everyone !

 

I was stuck on the same problem like abehsera (i'm on 1.5.6.2): 

 

 

Same symptoms, same results ...

 

I searched and found that the function regenerateEntireNtree() from class Category (classes/Category.php) has a condition (line 408 in my file) :


if (isset($categories_array[0]) && $categories_array[0]['subcategories'])
   Category::_subTree($categories_array, $categories_array[0]['subcategories'][0], $n);

but in database, my "root" category has id_parent = 1, not "0" (as expected in condition).

I have changed manually in database this id_parent to 0 and relauch the module, and it worked.

 

Hope this would work for you too !

You saved my life !!!!

Link to comment
Share on other sites

  • 11 months later...
  • 3 years later...
  • 5 months later...

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