Bonjour,

Je me suis mis à Symfony il y a peu et je galère encore.
J'ai une entité Theme avec un champs "parent". Seul un seul theme, "racine", créée avec une dataFxture, n'a pas de parent. Tous les autres thèmes héritent soit de "racine" soit d'un autre theme.

J'aimerai simplement arriver à afficher mes themes comme ça:

racine
    - Theme 1
        -- Theme 7
        -- Theme 6
    - Theme 3
        -- Theme 5
        -- Theme 2
    - Theme 4

Vous voyez l'idée, c'est juste mettre les themes par ordre alphabetique avec leur sous-theme etc.
Après, il me faudra faire pareil dans un select mais la deuxième étape.

Pour le moment, j'ai juste fait un ->findAll() et j'ai la liste brute, non ordonnée.

Ca parrait tout con mais je bloque... HELP :)

2 réponses


cinquiemeDimension
Auteur
Réponse acceptée

Bon, vu que je suis un mec réactif, j'ai laissé ce projét pendant plusieurs mois à l'abandon...
Mais j'ai (enfin) eu le temps de m'y repencher dessus.
Donc j'ai essayé DoctrineExtension et c'est déjà un truc prévu pour sf3 porté sur sf4 donc pas trop au goût du jour. Il y a bien eu une update pour supporter Doctrine2 mais honettement j'ai pas su m'en servir. J'ai déjà eu du mal à comptendre à quoi sertait les différents champs. Et quand il a été question de faire un formType pour la création laiiiiisse tomber j'ai pas su.
J'ai également essayé KnpLabs qui me prométait une compatibilité complete avec sf5 mais là c'est encore pire, la doc est assez sommaire, voir très mal faite.

Finalement j'ai fait au plus simple.
Dans theme.php

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Theme", inversedBy="children")
 */
private $parent;

/**
 * @ORM\OneToMany(targetEntity="App\Entity\Theme", mappedBy="parent")
 */
public $children;

public function getParent(): ?Theme
{
    return $this->parent;
}

public function setParent(?Theme $parent): self
{
    $this->parent = $parent;

    return $this;
}

/**
 * @return Collection|Theme[]
 */
public function getChildren(): Collection
{
    return $this->children;
}

Dans mon repository, je vais rechercher uniquement les themes sans parent:

public function findNoParent()
{
    return $this->createQueryBuilder('t')
        ->andWhere('t.parent is null')
        ->orderBy('t.libelle', 'ASC')
        ->getQuery()
        ->getResult()
    ;
}

Et un petit exemple d'affichage!

{% macro recursiveTheme(theme) %}
        {% import _self as self %}
        <li>{{ theme.libelle }} ({{ theme.id }})  
            {% if theme.children|length %}
                <ul>
                    {% for child in theme.children %}
                        {{ self.recursiveTheme(child) }}
                    {% endfor %}
                </ul>
            {% endif %}
        </li>
    {% endmacro %}
    {% from _self import recursiveTheme %}

<ul>
    {% for theme in themes %}
        {{ recursiveTheme(theme) }}
    {% endfor %}
</ul>

Chaque objet theme contient un tableau de ses enfants qui contiendront un tableau de leurs enfants etc. Et sans plugin externe. c'est bien sf5, hein.
Et pour ajouter un theme, j'ai juste à renseigner son nom et son parent.

Je pense que tu vas soit devoir faire du custom, soit passer par DoctrineExtensions et sa partie "Tree" : DoctrineExtensions/tree