Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/02/2011, 12h11   #1
Membre éclairé
 
Inscription : avril 2004
Messages : 328
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 328
Points : 336
Points : 336
Par défaut Nested Set Behavior

Bonjour,

J'ai besoin, pour stocker des opérations, d'utiliser le behavior Doctrine : NestedSet. Mais je rencontre deux problèmes.

Le premier, est la méthodologie pour stocker des objets et enregistrer leurs relations hiérarchiques. J'ai beau utiliser des :
  • insertAsLastChildOf
  • insertNextSiblingOf
  • etc.
je n'obtiens jamais quelque chose de très correct. Par exemple, pour stocker l'opération : 3 * (1 + 2), il faut que je déclare les éléments à l'envers :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
    /**
     * Sets the hierarchy for 3*(1+2):
     *  - *
     *  - - 3
     *  - - +
     *  - - - 1
     *  - - - 2
     *  
     *  @return nothing
     */
    function setConstraintHierarchy()
    {
        Doctrine_Core::getTable('PocConstraint')->getTree()->createRoot($this->mult);
        $this->plus->getNode()->insertAsLastChildOf($this->mult);
        $this->operand_2->getNode()->insertAsLastChildOf($this->plus);
        $this->operand_1->getNode()->insertAsLastChildOf($this->plus);
        $this->operand_3->getNode()->insertAsLastChildOf($this->mult);
 
    }
alors que je souhaiterais plutôt faire :
Code :
1
2
3
4
5
6
7
8
9
 
    function setConstraintHierarchy()
    {
        Doctrine_Core::getTable('PocConstraint')->getTree()->createRoot($this->mult);
        $this->operand_3->getNode()->insertAsLastChildOf($this->mult);
        $this->plus->getNode()->insertAsLastChildOf($this->mult);
        $this->operand_1->getNode()->insertAsLastChildOf($this->plus);
        $this->operand_2->getNode()->insertAsLastChildOf($this->plus);
    }

L'autre problème me vient de l'utilisation de la méthode getChildren. Dans mon cas d'utilisation, je veux récupérer l'ensemble des enfants d'un noeud et afficher leur valeur :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
    public function __toString()
    {
        $value = $this->getValue();
 
        if ($children = $this->getNode()->getChildren()) {
            foreach ($children as $constraint) {
                $value .= $constraint->__toString();
            }
        }
 
        return $value;
    }
Or, ce code ne marche pas en l'état, avec l'initialisation précédente, mais marche si j'ajoute :
Code :
1
2
3
4
5
6
7
8
9
10
11
    function setConstraintHierarchy()
    {
        Doctrine_Core::getTable('PocConstraint')->getTree()->createRoot($this->mult);
        $this->plus->getNode()->insertAsLastChildOf($this->mult);
        $this->operand_2->getNode()->insertAsLastChildOf($this->plus);
        $this->operand_1->getNode()->insertAsLastChildOf($this->plus);
        $this->operand_3->getNode()->insertAsLastChildOf($this->mult);
        
        $treeObject = Doctrine_Core::getTable('PocConstraint')->getTree();
        $tree = $treeObject->fetchTree();
    }
Je ne comprends pas du tout l'utilité d'ajouter le fetchTree à un objet que je n'utilise même pas ...

Si quelqu'un avait des idées, merci !!
bilbonec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 14h25   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Le message est passé a la trappe.

Je crains que le nombre de spécialiste, ici, ne soit très limité sur ce behavior.

A part si le code (que je n'ai pas inspecté) du fechTree fait des écritures sur la base, ne je vois pas. Sauf à considérer qu'il forcerait l'écriture d'un éventuel cache, mais alors, pourquoi ta lecture ne le ferait-il pas aussi ?

D'autant que j'avoue ne pas bien comprendre le code que tu utilises, ni l'intérêt d'utiliser une structure de bdd pour stocker ceci.

Est-ce que parser une chaine : "3 * ( 1 + 2 )" ne serait pas plus simple à stocker et gérer ?

Dans le pire des cas, créer un environnement d'objets "emboitables" et sérialisable pour ne stocker que la partie sérialisée ?

J'ai un peu l'impression d'avoir vu passer un boulet au dessus de la tête d'une mouche décoiffée
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 08h52   #3
Membre éclairé
 
Inscription : avril 2004
Messages : 328
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 328
Points : 336
Points : 336
Bonjour Michel,

Merci d'avoir pris le temps de répondre

Citation:
A part si le code (que je n'ai pas inspecté) du fechTree fait des écritures sur la base, ne je vois pas. Sauf à considérer qu'il forcerait l'écriture d'un éventuel cache
Ayant eu il y a quelques jours (sur un tout autre sujet que les NestedSet) un problème similaire à ce que tu évoques (la gestion du cache), il est bien possible que cela vienne de quelque part par là.

En ce qui concerne l'intérêt, le code proposé ici n'est qu'une méthode pour une série de tests unitaires. Ce que je cherche à stocker n'est pas une expression du type 1+(2*3) mais une hiérarchie entre objets métiers.

Bien que ce soit le premier problème le plus bloquant, merci de la piste pour le second !! J'ai tendance à croire que la vérité se trouve là
bilbonec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 09h22   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Je te laisse mener les recherches, sur que tu nous fera part de tes conclusions.

Et tant pis pour la mouche on va lui acheter un peigne
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 10h24   #5
Membre confirmé
 
Avatar de Vivian Pennel
 
Vivian Pennel
Developpeur Symfony | JSF/Seam
Inscription : août 2004
Messages : 173
Détails du profil
Informations personnelles :
Nom : Vivian Pennel
Âge : 23
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Developpeur Symfony | JSF/Seam
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : août 2004
Messages : 173
Points : 246
Points : 246
L'intérêt du behavior est de simplifier les requêtes sur structure hiérarchique.

Pour que ceci fonctionne correctement notamment ton problème de getChildren() il faut hydrader les objets hiérarchiquement, via Doctrine_Core::HYDRATE_HIERARCHY ou fetchTree() plus directement.

Ensuite pour tes problèmes d'insertions à l'envers, il faut bien comprendre comment fonctionne la structure d'un arbre SQL, pour ca je te conseille de lire cet article
http://sqlpro.developpez.com/cours/arborescence/
__________________
Mon blog : http://blog.developpez.com/vivian-pennel/
Vivian Pennel est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h57.


 
 
 
 
Partenaires

Hébergement Web