twig incrémenter l'itérateur dans une boucle

a marqué ce sujet comme résolu.

Bonjour,

je dois créer un planning sous symfony.

admettons une boucle twig qui doit boucler entre 2 timestamps toutes les 5 minutes (300 secondes).
lorsque je rencontre un rendez-vous, je l’affiche et je dois augmenter l’itérateur de la durée du rendez-vous.

{% for i in range (timestamp_debut, timestamp_fin, 300) %}
    {% if rendezvous[i] is defined %} {# c 'est que le timestamp correspond à un rdv #}
     <li class="rdv{{ rendezvous[i].duree }}">rendez-vous</li>
     {% set i = i + (rendezvous[i].duree * 60) %}
    {% else %}
    <li class="libre"></li>
    {% endif %} 
{% endfor %}

sauf que {% set i = i + (rendezvous[i].duree * 60) %} n’incrémente pas le i du for, mais bien un i que je créé pour l’occasion…

une idée?

j’ai trouvé un palliatif tout moche :D , si vous avez mieux, je suis preneur! :p

{% set z = 0 %}

{% for i in range (timestamp_debut, timestamp_fin, 300) %}
    {% if z != 0 %}
        {% set z = z - 1 %}
    {% else %}
        {% if rendezvous[i] is defined %} {# c 'est que le timestamp correspond à un rdv #}
             <li class="rdv{{ rendezvous[i].duree }}">rendez-vous</li>
            {% set z = rendezvous[i].duree / 5 - 1 %}
        {% else %}
           <li class="libre"></li>
        {% endif %} 
    {% endif %} 
{% endfor %}
+0 -0

Je suis d’accord avec @A-312 : il te sera beaucoup plus facile de gérer cela en créant un tableau dans ton contrôleur avec les données prêtes à afficher, pou ensuite l’envoyer à Twig.

Tu pourras alors manipuler à souhait ton itérateur, et ta vue se résumera alors simplement à afficher le contenu de ce tableau.

Quelque chose dans ce goût-là :

Contrôleur

/**
  * @Route(...)
  */
public function rendezVousAction(): Response
{
    $rdv = [];
    // Ici, tu remplis le tableau avec les rendez-vous que tu veux afficher (et seulement ceux-là)
    return $this->render('une_vue.twig', ['rendezvous' => $rdv]);
}

Vue

{% for event in rendezvous %}
    <li class="rdv{{ event.duree }}">rendez-vous</li>
{% endfor %}

Je pense qu’il pourrait être une bonne idée d’essayer de passer par des règles CSS pour positionner tes rendez-vous et ainsi créer des « trous » sur les temps libres, mais à confirmer ^^

+0 -0

Merci pour vos réponses, j’y ai pensé à générer un tableau dans le contrôleur pour séparer la vue de la logique.

mais ce n’est pas de la logique, mais bien de l’affichage.

la logique c’est de définir les les ouvertures de plages horaires, les rendez-vous et pas de définir une entrée vide entre les rendez-vous. c’est de l’affichage de définir qu’entre 2 rendez-vous il faut sauter 100px si la hauteur est de 1200px.

bref.

j’ai trouvé un palliatif, pas très propre, mais qui fonctionne au poil. merci

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte