Jump to content
SITOLOG - F Bugnet

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

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

Share this post


Link to post
Share on other sites

I have same problem.
Method

Tools::getPath

is using this two columns:

SELECT id_category, level_depth, nleft, nright

when creating breadcrumb.

Share this post


Link to post
Share on other sites

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 ?

Share this post


Link to post
Share on other sites

upd: my problem was that after import categories from OSC nleft and nright was set to 0. But when i create new category from admin this fields (nleft, nright) was recalculated for all categories.

  • Like 1

Share this post


Link to post
Share on other sites

Left and right values are used in nested set hierarchy model. You can search for more info, but in short every category has the smallest left and the largest right value than any of its subcategories.

  • Like 1

Share this post


Link to post
Share on other sites

Right, those values are used within the "nested set" hierarchy model which is the mysql organizational structure being used to organize categories and their relationships.

Edited by spuhg5 (see edit history)

Share this post


Link to post
Share on other sites

Here is a small module you could use to Regenerate Category Tree for your shop (nleft, and nright values).

 

I Only tested it with PrestaShop 1.4.6.2

 

 

regenerateCatTree.zip

  • Like 2

Share this post


Link to post
Share on other sites

Here is a small module you could use to Regenerate Category Tree for your shop (nleft, and nright values).

 

I Only tested it with PrestaShop 1.4.6.2

 

 

regenerateCatTree.zip

 

Hi,

 

Thank your for your post, could you explain me how to use your tool ? Do i need to create a php file to call your tool ? ( object creation ? )

 

Thanks.

Share this post


Link to post
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

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

Share this post


Link to post
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.

Share this post


Link to post
Share on other sites

Thanks for the module. ;-)

Works with prestashop 1.4.8

Share this post


Link to post
Share on other sites

I am working on Ximxii XML. They have multitreaded category to insert. I did that. But unable to insert nleft and nright . Please help me to insert that.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Hello,

 

I'm facing the exact same issue as akaeu.

 

Did you ever find a solution ?

Thanks!

Share this post


Link to post
Share on other sites

I have a similar problem. Any chance we could get a Mod Update for 1.5.5 / 1.5.6

 

Thanks

Share this post


Link to post
Share on other sites

module from 1.5.5+

 

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.

  • Like 1

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Do you have any Cache Enabled? Try Disabling it and try again to see what happens.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 !

Share this post


Link to post
Share on other sites

Hi !

Thanks for this great module

I'm on 1.6.0.6 : it seems to work for the display in blockcategories but not in blocktopmenu :(

Any idea ?

Thanks in advance for your help

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
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.

Share this post


Link to post
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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

Hi Sebs,

 

I think i have the same problem, i import categories by csv and all nleft and nright = 0

 

Could you send me this script in mp?

 

Thanks in advance!

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Retour d'expérience: ce module fonctionne parfaitement avec une version de Prestashop 1.5.4. 

Share this post


Link to post
Share on other sites

For update all your Categories, just do that :

 

Category::regenerateEntireNtree();

  • Like 1

Share this post


Link to post
Share on other sites

I've tried to upload the module onto 1.6.0.13 but the import doesn't work through the admin nor via FTP.

 

Do you place to update the module?

 

@garcimore : how do you do that?

Share this post


Link to post
Share on other sites

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?!

Share this post


Link to post
Share on other sites

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 !

Share this post


Link to post
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).

Share this post


Link to post
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).

Share this post


Link to post
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.

Share this post


Link to post
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 

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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 !

Share this post


Link to post
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.

Share this post


Link to post
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 :)

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 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
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

 

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

Share this post


Link to post
Share on other sites

I have the same problem but see category tree in product association but is incomplete. Some categories and if I create a new category don't show in BO. Help me please . This and more problems I solved is caused from upgrade Ps 1.4 to 1.6.?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
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 !!!!

Share this post


Link to post
Share on other sites

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

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More