Gestion de la paternité (Symfony 1.2, Doctrine)


Samuel Breton
Gestion de la paternité (Symfony 1.2,...

La gestion d’arbres en SQL se fait traditionnellement par une auto-jointure, avec le champ classique parent_id. Cette méthode est cependant très coûteuse quand il s’agit de faire des recherches dans cet arbre car il faut alors utiliser la récursivité.

Une autre méthode beaucoup plus puissante existe : la gestion intervallaire. Vous pouvez trouver une explication détaillée de cette méthode ici :
http://sqlpro.developpez.com/cours/arborescence/.

Nous allons voir dans cet article comment implémenter celle-ci dans un projet symfony 1.2 avec doctrine.

(suite…)

Show Comments (28)

Comments

  • Jérémy B.

    Excellent article !
    Je l’ai bookmarké depuis un bout de temps mais je n’avais toujours pas eu le temps de venir déposer un commentaire.
    Ce post complète très bien celui de Redo the Office.

    • Article Author
  • thomas

    voici un petit outil que je viens de créer pour faciliter la mise en place du nestedset et de jquery. Effectivement suivant le nom de son module et de son modele, il faut mettre le nez dans le code et modifier toutes les occurences. Plus la peine, nous générons les fichiers avec le nom de votre modèle!
    http://www.lexik.fr/nested/index.php

    • Article Author
  • BugsByte

    Salut,

    Félicitation pour ce travail.

    Je cherche à faire la même chose avec Symfony/Propel et prototype/scriptaculous mais je n\’y parviens pas.

    Savez-vous où je peux trouver de l\’aide ?

    • Article Author
  • Manu

    Très bon article !

    Ma question concerne l’outil de Thomas, pourquoi le champs affiché ne doit pas être un champs I18N ?

    D’avance merci 🙂

    • Article Author
  • thomas

    @Manu
    Bonjour et merci!
    le champs ne doit pas être I18N car dans le backend dans le listing nous avons rencontré des erreurs en listant un champs I18N. Donc pour simplifier et corriger facilement, on ne liste pas un champs I18N.
    Cependant avec les mises a jours symfony ce problème ne ressort peut être plus, à tester!

    • Article Author
  • arsenik

    Super tuto !
    J’ai bien aimé ton générateur de fichiers car il manque quelques lignes de codes dans le post 🙂

    @BugsByte pour avec propel j’avais combiné le tree de chez dhmlgoodies

    • Article Author
  • Nicolas

    Hello,

    It will be cool :
    – to optimize the number of requests ($tree->getNode() makes a request per line),
    – to add sortable behavior (like the menu management in Drupal),
    – and to update more than one change at the same time.

    Thanks for your webiste.

    • Article Author
  • Seb

    Toujours aussi utile ce site !!!
    Je me suis ajouté 2 objects actions pour déplacer les enfants de même parent si ça peut être utile …
    http://404past-it.fr/721

    Par contre, je ne comprends pas l\’action Order ….

    Encore merci!
    Seb

    • Article Author
  • Thibault

    Ouf ! Sacré travail. Qui m\’a fait gagner pas mal de temps, merci beaucoup.

    À quand un plugin ?

    • Article Author
  • Sean

    Merci pour tout votre travail, mais la plupart des blocs de code semble corrompu, avec des lignes manquantes ou de parties manquantes. Je pense que c’est un problème avec WP-CODEBOX Plugin que j’ai vu le même problème sur certains autres blogs récemment. Pourriez-vous supprimer les balises de code de sorte que nous pouvons voir tout le code?

    • Article Author
  • azerty

    Attention, pour fonctionner avec la version 1.4 de Symfony, une petite modification doit être réalisée sur le fichier action.class.php au niveau de la ligne 37 :

    Ancienne ligne :
    $validator = new sfValidatorDoctrineChoiceMany(array(‘model’ => ‘Tree’));

    Nouvelle ligne :
    $validator = new sfValidatorDoctrineChoice(array(‘model’ => ‘Tree’, ‘multiple’ => true));

    • Article Author
  • yano

    Super post, merci encore.
    Bravo aussi pour la génération de fichier, c’est génial.

    • Article Author
  • yano

    Super post, merci encore.
    Bravo aussi pour la génération de fichier, c\’est génial.

    • Article Author
  • Amenophis

    Bonjour,
    Tout marche bien,
    mais pourriez vous m’expliquer la différence entre les 2 routes tree et tree_tree ??

    Merci

    • Article Author
  • Clem

    Merci pour cet excellent post et pour la génération de fichiers, c’est vraiment très utile !!

    Par contre, je tenais juste à signaler qu’après avoir perdu quelques dizaines de cheveux, le code jQuery ci-dessus n’est pas compatible avec la version 1.4, mais qu’il ne fonctionne qu’avec la version 1.2.6 (le draggable est bien pris en compte, mais pas le droppable)…

    • Article Author
  • Clem

    Suite à de nouveaux développements sur Symfony 1.4 (et en parcourant aussi les commentaires de l’article de Redo The Office), voilà la nouvelle version de l’affichage de l’arbre : http://pastie.org/1053323.

    En espérant que ça serve… 🙂

    • Article Author
  • Xav.

    Voici ma petite contribution concernant le support du I18N. Il suffit simplement dans Obj.class.php de remplacer dans la méthode getIndentedName():
    $this[‘name’]

    par :
    sprintf(‘%s’, $this)

    Merci pour ce tuto en tout cas.

    • Article Author
  • Xav.

    Voici ma petite contribution concernant le support du I18N. Il suffit simplement dans Obj.class.php de remplacer dans la méthode getIndentedName():
    $this[\’name\’]

    par :
    sprintf(\’%s\’, $this)

    Merci pour ce tuto en tout cas.

    • Article Author
  • neolitec

    Ca a l’air super comme tuto, mais alors y’a des erreurs…
    Pas réussi à mettre en place parce que trop pénible à suivre… dommage parce que ça m’aurait grave servi ^^

    • Article Author
  • Mathieu

    Juste une petite question… je souhaiterais que le root_id pointe vers sa propre table, est ce possible ?

    Par exemple dans je souhaiterais créer un « root » qui serait type de documents, et qui contiendrait par exemple « word » « excel » « powerpoint » etc… qui seraient tous présents dans la meme table.

    • Article Author
  • Mathieu

    Est il possible de faire pointer le root_id vers l’id de la table en question ?

    Par exemple : on aurait « type de documents » qui aurait pour enfant « word » « excel » etc…

    • Article Author
  • thiongs

    Bonjour, j\’ai essayé d\’utiliser ton générateur de fichier, mais apparement ça marche pas. Ce serait génial si tu regardais pour moi ce qui cloche.

    • Article Author
  • Toofff

    Bonjour, Une petite modification pour le fichier /data/fixtures/data.yml qui pourrait être sympa.

    Tree:
    NestedSet: true
    Tree_1:
    name: Couleurs
    children:
    Tree_2:
    name: Bleu
    Tree_3:
    name: Rouge
    children:
    Tree_4:
    name: Vert
    Tree_5:
    name: Langages
    Avec ce petit bout de code c’est nestedset qui fait tout pour l’insertion en BDD :)nn1

    • Article Author
  • thomas

    @Toofff

    Effectivement, en indentant les fixtures et en saisissant un children, inutile de renseigner les bornes left et right. Cette info n’avait pas été mise à jour dans le post, merci.

    • Article Author
  • Kevin

    Merci beaucoup, cela va me faire gagner pas mal de temps!
    Cependant, j’ai quelques soucis (j’ai utilisé le générateur pour les fichiers)
    Lorsque que j’ajoute, supprime ou déplace un élément, cela ne me met à jour les valeurs lft et rgt uniquement des éléments du même niveau d’un même parent, et pas le reste,
    et quand je supprime le dernier enfant d’un noeud, le parent n’est pas mis à jour.

    Est ce que quelqu’un à eu ce problème?
    Merci.

    • Article Author
  • Kevin

    Merci beaucoup, cela va me faire gagner pas mal de temps!
    Cependant, j\’ai quelques soucis (j\’ai utilisé le générateur pour les fichiers)
    Lorsque que j\’ajoute, supprime ou déplace un élément, cela ne me met à jour les valeurs lft et rgt uniquement des éléments du même niveau d\’un même parent, et pas le reste,
    et quand je supprime le dernier enfant d\’un noeud, le parent n\’est pas mis à jour.

    Est ce que quelqu\’un à eu ce problème?
    Merci.

    • Article Author
  • Kevin

    J’apporte une petite précision à mon pb cité ci-dessus:
    Je travaille sur une bdd existante, et je ne peux pas (idéalement) trier ma liste en fonction du root_id (seule modif que j’ai apporté aux fichiers générés), je trie donc uniquement en fonction de la valeur lft
    Du coup, le fait que ce ne soit pas correctement mis à jour me donne des résultats farfelu dans l’affichage de la liste (visuellement des enfants ne se retrouvent plus au bon niveau ou avec le bon parent)

    • Article Author
  • Kevin

    Au temps pour moi!
    En faisant un test sans partir d’une table existante, j’ai compris mon erreur.
    Comme je le disais, je pars d’une bdd existante, avec un classique parent_id, comme dit au début de l’article, et je l’ai utilisé comme root_id…
    Du coup forcément, ça ne se comportait pas comme je l’attendais!

    Bref tout ça pour dire que ça marche nickel maintenant.
    Encore merci (et désolé pour mes 3 posts inutiles…)

    • Article Author

Recevez nos articles