Est t'il possible de retourner le render dans plusieurs twigs? Je ne sais pas si c'est la meilleure solution, je vous explique ce que je veux faire. Je récupère des heures d'ouvertures à partir d'un object openhours (dépendence openhours de spatie) j'aimerai mettre ces heures d'ouvertures (pouvant être changés dans la bdd) dans le footer de base.html.twig. Auriez vous une solution (controlleur global appelé en permanence) ou un service pour pouvoir afficher les horaires d'ouverture à chaque page du site (dans le footer) ?

Pour l'instant je fais ça (je peux mettre le OpenHoursRepository-> OpeningHoursRepository(en mettant un criteria selectionnant un jour de 0(dimanche) à 6(samedi).

$openingHours = OpeningHours::create([
            'monday' => ['12:00-14:00', '19:00-22:00'],
            'tuesday' => ['12:00-14:00', '19:00-22:00'],
            'thursday' => ['12:00-14:00', '19:00-22:00'],
            'friday' => ['12:00-14:00', '19:00-21:00'],
            'saturday' => ['12:00-14:00', '19:00-22:00'],
            'sunday' => ['12:00-14:00'],
        ]);
        return $this->render('index/index.html.twig', [
            'controller_name' => 'IndexController',
            'res' => $openingHours->asStructuredData('H:iP', '+01:00'),
            'openhours' => $openingHours->forWeek(),
        ]);

dans mon twig (homenav/footer.html.twig)

<footer class="bg-light text-center text-lg-start">
    <!-- Grid container -->
    <div class="container p-4">
        <!--Grid row-->
        <div class="row">
            <!--Grid column-->
            <div class="col-lg-8 col-md-12 mb-4 mb-md-0">
                <h5 class="text-uppercase">Footer text</h5>

                <p>
                    © 2020 Copyright
                </p>
            </div>
            <!--Grid column-->

            <!--Grid column-->
            <div class="col-lg-4 col-md-12 mb-4 mb-md-0">
                <h5 class="text-uppercase">Footer text</h5>

                <p>

                    {% set trans_day_hash = {
                        "monday": "Lundi",
                        "tuesday": "Mardi",
                        "wednesday": "Mercredi",
                        "thursday": "Jeudi",
                        "friday": "Vendredi",
                        "saturday": "Samedi",
                        "sunday": "Dimanche"
                    }
                    %}
                <h1>Réserver une table</h1>
                <p>{% for day,hours in openhours %}
                <h3>{{ trans_day_hash[day] }}</h3>
                {% if hours != '' %}
                    {{ hours }}
                {% else %}
                    fermé
                {% endif %}
                {% endfor %}

                </p>
            </div>
            <!--Grid column-->
        </div>
        <!--Grid row-->
    </div>
    <!-- Grid container -->

    <!-- Copyright -->
    <!--<div class="text-center p-3" style="background-color: rgba(0, 0, 0, 0.2);">
        © 2020 Copyright:
        <a class="text-dark" href="https://mdbootstrap.com/">MDBootstrap.com</a>
    </div>-->
    <!-- Copyright -->
</footer>

Sachant que je veux inclure (include) ce twig dans le base.html.twig de façon à l'afficher sur chaque page de mon site (dynamiquement de préference).

Actuellement j'ai ce résultat car la variable n'est renvoyé que par le controlleur homenavController.php. A la racine du site j'obtiens:

sur les autres pages par contre (toutes les autres) j'ai ce souci de variable non définie :

Avez vous une solution ?

4 réponses


Jessy Brs
Réponse acceptée

Salut Ptuner, oui le problème si tu le mets dans le footer, c'est qu'il faudra récupérer ton entité "$openingHours" dans chaque controller pour chaque page.
Tu peux rester ainsi et le mettre pour chaque page t'as variable.
Tu peux aussi enregistrer ta variable dans l'extension de twig et là plus besoin de récupérer ta variable dans chaque render de twig. https://symfony.com/doc/current/templates.html#creating-lazy-loaded-twig-extensions

Vu que ce sont des horaires, tu peux aussi mettre les données brut dans ta page twig. Sauf si tu as un admin pour changer facilement les horaires.

Jessy Brs
Réponse acceptée

Non, Twig met à disposition des variable si tu regardes dans les fichier de configs. config/twig.yml
Là avec l'extension Twig, ça sera sensiblement la même chose, tu vas pouvoir appeler t'as fonction dans toutes les pages de ton twig et donc l'appeler dans le footer.

Globalement tu créer un dossier Twig dans lequel tu auras un fichier AppRunTime.php et un fichier AppExtension.php
Dans celui-ci tu va définir ta variable dans la method getFunction

``
public function getFunctions()
{
return [
new TwigFunction('maMethode', [AppRuntime::class, 'maMethode']),'
];
}

``

Puis dans ton twig tout simplement tu appelera "maMethode"

Suit la documentation https://symfony.com/doc/5.4/templates.html#writing-a-twig-extension
Tu devrais y arriver en 5-10 minutes.

Ptuner
Auteur

Les balises link n'affichent pas les liens
voici ce que ça donne à la racine du site:
https://cdn.discordapp.com/attachments/1105063362762645565/1105072505699446874/image.png
et ce que ça donne quand on quitte la racine :
https://cdn.discordapp.com/attachments/1105063362762645565/1105072652508463134/image.png

Hello :)

Tu peux utiliser les blocks

// base

<footer>
    {% bloc footer_content %} {% endblock %}
    Le contenu de base du footer
</footer>

// Les pages qui doivent afficher hours
{% bloc footer_content %}
    {% $openHours %}
{% endblock %}

Et bien sur faudra ajouter en variable l'openHours dans tous les controllers qui ont besoin d'afficher l'heure, du coup la fonction qui génère les heures faudrait le mettre dans un service, et dans chaque controller faudra appeler ce service $openHours = new OpenHours(); $openHours = $openHours->get();

Ptuner
Auteur

Ok si j'utilise l'extension TWIG, je serai obligé d'executer le controlleur au moins une fois (le controlleur homenav envoyant la variable dans le render) pour avoir mes horaires dans la variable (que ça soit statique ou dynamique) ? La doc m'a l'air assez courte là dessus connais tu des bons tutos dessus (j'ai regardé auparavant mais je cherche un tuto intutif) ? Désolé de vous bombarder de questions, je suis assez novice avec le php (je connais quand même les bases) et plus encore avec Symfony. Mon but serait d'éviter d'injecter cette variable dans chaque controlleur si possible.