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.

Ce que je fais

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);
        }
    }
}

Ce que je veux

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.

Ce que j'obtiens

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 :)

Aucune réponse