Bonjour,

Je récupère les données d'une entité 'Restaurant' qui a une relation OneToMany avec l'entité 'Menu' qui a elle même une relation OneToMany avec l'entité 'Composante'. Je souhaite afficher dans un panel les données du restaurant ainsi que ses menus avec les composants dans un autre panel toujours sur la même page..

Ici ma fonction d'affichage tiré du controller RestaurantController

#[Route('/restaurant/{slug}', name: 'restaurant.show', methods: ['GET', 'POST'])]
    public function show(Restaurant $restaurant, ComposanteRepository $compRepo, Request $request, EntityManagerInterface $manager, PaginatorInterface $paginator)
    {

        // dd($request);
        $form = $this->createForm(RestaurantType::class, $restaurant);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $restaurant = $form->getData();
            $manager->persist($restaurant);
            $manager->flush();

            $this->addFlash(
                'success',
                'Votre établissement a été modifié avec success 🙂'
            );
            return $this->redirectToRoute('restaurant');
        }

        $composantes = $compRepo->findAll();
        $composantes = $paginator->paginate(
            $compRepo->findAll(),
            $request->query->getInt('page', 1), /*page number*/
            6 /*limit per page*/
        );

        return $this->render(

            'restaurant/show.html.twig',
            [
                'composantes' => $composantes,
                'restaurant' => $restaurant,
                'form' => $form->createView()

            ]
        );
    }

Une partie de mon Template show.html.twig.

<div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">

                <a href="{{path('repas.add', { id: restaurant.id })}}" class="btn btn-primary">
                    ➕ Ajouter un repas
                </a>

                {% for menu in restaurant.menus %}

                    <p class="">{{ menu.name }}</p>

                    {% if not composantes.items is same as([]) %}
                        <div class="my-5">
                            <div class="shadow-4 rounded-5 overflow-hidden">
                                <table class="table align-middle mb-0 bg-white">
                                    <thead class="bg-light">
                                        <tr>
                                            <th>Nom</th>
                                            <th>Adresse</th>
                                            <th>Actions</th>
                                        </tr>
                                    </thead>
                                    <tbody>
                                        {% for composante in menu.composantes %}
                                            <tr>
                                                <td>
                                                    <div class="d-flex align-items-center">
                                                        <div class="ms-4">

                                                            <p class="fw-bold mb-1">{{composante.libelle_comp}}</p>

                                                        </div>
                                                    </div>
                                                </td>
                                                <td>
                                                    <p class="fw-normal mb-1">{{composante.prix_unitaire}}</p>
                                                </td>
                                                <td>
                                                    <p class="fw-normal mb-1">{{composante.poids_unitaire}}</p>                                                             
                                                </td>
                                            </tr>
                                        {% endfor %}
                                    </tbody>
                                </table>
                            </div>
                        </div>
                        {# display navigation #}
                        <div class="navigation d-flex justify-content-center mt-2">
                            {{ knp_pagination_render(composantes) }}
                        </div>
                    {% else %}
                        <h4>
                            Il n'y a pas de restaurant enregistré</h4>
                    {% endif %}
                {% endfor %}
            </div>

Ce que je veux

Je veux afficher sur mon panel dans la vue le 'Name' du menu et un tableau avec les composantes qui le compose

Ce que j'obtiens

Quand je boucle seulement sur les menus sans les composantes je n'ai pas d'erreur mais des que j'utilise la boucle for sur les composantes j'obtiens cette erreur :

Neither the property "libelle_comp" nor one of the methods "libelle_comp()", "getlibelle_comp()"/"islibelle_comp()"/"haslibelle_comp()" or "__call()" exist and have public access in class "App\Entity\Composante".

Je ne sais pas si je suis très clair :)
Merci d'avance à ceux qui prendront le temps de me répondre.

3 réponses


mary_25
Réponse acceptée

Bonjour Dominique,
Je travail sur un projet e-commerce de mode qui reste dans le même principe:
J'ai une entité 'categorie' (accessoire, vêtements, chaussure) qui est en relation OneToMany avec l'entité 'sous_categorie' (tee-shirt, jean, pantalon) qui a elle même une relation OneToMany avec l'entité 'Article' (qui va contenir : un nom, une descripiton).

Je vous donnne ci-joint le code à adpaté à votre projet :

la vue twig :

        <div class="container">         
        <div class="panel panel-default">            
            {# j'affiche mes categories #}
            {% for categories in categories %}
                <div class="panel-heading">

                    <span class="text-primary"> ceci est une catégorie :</span> 
                    {{ categories.name }}

                </div>

                {# j'affiche mes article #}
                {% for categories in categories.getSousCategories %}
                    <div class="panel-body">
                        <span class="text-danger"> ceci est une sous-catégorie :</span> {{ categories.name }}

                        {# j'affiche mes article (bakground vert) #}
                        <div class="panel-footer" style="background-color: #00800066;">
                            {% for categories in categories.getArticles %}
                                ceci est un article :{{ categories.nom }}
                                <br>

                            {% endfor %}
                        </div>
                    </div>

                {% endfor %}
                 <br><br><br>
            {% endfor %}
        </div>
    </div>

le controller :

 #[Route('/show/2', name: 'app_show')]
public function show_two(ArticlesRepository $articlesRepository, CategoriesRepository $categoriesRepository, SousCategoriesRepository $sousCategoriesRepository): Response
{

    return $this->render('admin/show.html.twig', [
        'articles' => $articlesRepository->findBy([], ['id' => 'asc']),
        'categories' => $categoriesRepository->findBy([], ['name' => 'asc']),
        'sous_categories' => $sousCategoriesRepository->findBy([], ['name' => 'asc']),

    ]);
}

j'espère avoir réussi à vous aider

Bonjour Mary_25,

Merci pour votre aide, votre méthode fonctionne mais j'ai j'ai finalement juste suprimé le ' _ ' et cela fonctionne.

{% for composante in menu.composantes %}
<p class="fw-bold mb-1">{{composante.LibelleComp}}</p>
{% endfor %}

Ravie d'avoir réussi à vous aider.
Mon code était un peux plus complexe car je pensais que vous vouliez afficher le(s) nom du(des) restaurant(s) + menu + composante.
Bonne journée