Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau à plusieurs dimensions (tree structure)

Avec utilisation de relations polymorphiques

    14 novembre 2019 à 23:37:31

    Bonjour à tous,

    Pour commencer et pour pas qu'il y ai d'ambiguité, je tiens à signaler que mon projet est en Laravel, mais mon soucis est d'ordre plus générale et touche plus principalement au PHP.

    Afin de mieux comprendre ce que je souhaite faire, voici une petite explication : Je souhaite créer des templates.

    Un "Template" contient un "Panel". 
    Ce "Panel" peut contenir des "Item" ainsi que d'autres "Panel".
    Il faut donc continuer ainsi de suite jusqu'à arriver au dernier "Item".

    Concrètement, voici comment je souhaite que la donnée soit structurée :

        - Template
            - Panel "Section"
                - Panel "Slider"
                    - Panel "Slide 1"
                        - Item "Text 1"
                        - Item "Text 2"
                        - Item "Button"
                    - Panel "Slide 2"
                        - Panel "Buttons"
                            - Item "Button 1"
                            - Item "Button 2"
                        - Item "Text"

    A l'aide des relations polymorphiques proposées par Laravel, j'ai donc 3 models que sont Panel, Item, et PanelContent (ce dernier contenant les attributs "parent_id", "contentable_id" et "contentable_type" afin de déterminer quel Panel sera le parent, et quel Item ou Panel sera le contenu).

    Mes Models contiennent les function nécessaires afin de récupérer le(s) contenu(s) d'un panel et le parent d'un panel/item.

    Actuellement, j'utilise une fonction récursive afin de récupérer les enfants d'un Panel et de construire petit à petit le tableau sous le format que j'ai pu évoqué au dessus. 

    public function getChildren(PanelContent $panelContent, string $parentName, string $key) {
        $this->result['template']['global_panel'][$parentName][$key] = $panelContent->contentable;
        if ($panelContent->contentable_type === 'panel') {
            foreach($panelContent->parent->contents as $key => $container) {
                $this->getChildren($container, $container->parent->name, $key);
            }
        }
    }

    Comme évoqué ci dessus, je souhaite obtenir un tableau qui pourrait ressembler à ceci :

    $this->result = [
        'template' => [
            'id' => 1,
            'name' => 'MySlider'
            'contents' => [
                'id' => 745,
                'name' => 'slider',
                'type' => 'panel',
                'slides' => [
                    0 => [
                        'id' => 500,
                        'name' => 'slide',
                        'type' => 'panel'
                        'buttons' => [
                            0 => [
                                'id' => 877,
                                'name' => 'button',
                                'type' => 'item'
                            ]
                        ]
                    ],
                    1 => [
                        'id' => 500,
                        'name' => 'slide',
                        'type' => 'panel'
                        'buttons' => [
                            0 => [
                                'id' => 877,
                                'name' => 'button',
                                'type' => 'item'
                            ]
                        ]
                    ]
                ]
            ]
        ]
    ];

    etc etc etc afin de constuire des templates comme illustré tout en haut du topic.

    Actuellement ce que j'obtiens, c'est quelque chose qui ressemble à ça :

    $this->result = [
        'template' => [
            'id' => 1,
            'name' => 'MySlider'
            'contents' => [
                'id' => 745,
                'name' => 'slider',
                'type' => 'panel'
            ],
            'slides' => [
                0 => [
                    'id' => 500,
                    'name' => 'slide',
                    'type' => 'panel'
                ],
                1 => [
                    'id' => 500,
                    'name' => 'slide',
                    'type' => 'panel'
                ]
            ],
            'buttons' => [
                0 => [
                    'id' => 877,
                    'name' => 'button',
                    'type' => 'item'
                ],
                1 => [
                    'id' => 877,
                    'name' => 'button',
                    'type' => 'item'
                ]
            ]
        ]
    ];

    Alors au vu du code que j'ai partagé ci dessus, le résultat obtenu semble "normal", car la clé que je lui passe au moment de la construction du tableau ne permet pas de placer au bon endroit mes éléments.

    Seulement, j'ai vraiment du mal à comprendre comment je pourrais faire autrement.
    J'espère que les explications sont assez clair, j'ai l'impression de m'éparpiller un peu partout. Auriez-vous une idée de comment je pourrais faire afin de construire correctement mon tableau ?

    Je vous remercie d'avance et vous souhaite une agréable nuit :) 

    -
    Edité par Yekael 14 novembre 2019 à 23:40:05

    • Partager sur Facebook
    • Partager sur Twitter

    Tableau à plusieurs dimensions (tree structure)

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown