54 votes

Twig, ajoute la première et la dernière classe

Disons que j'ai une boucle for comme celle-ci :

 {% for elem in arrMenu %}
    <div class="topmenu-button">
        <a href="{{ elem.url }}">{{ elem.name }}</a>
    </div>
{% endfor %}

Sous cette forme, cela donnerait quelque chose comme :

 <div class="topmenu-button"><a href="url">name</a></div>
<div class="topmenu-button"><a href="url">name</a></div>
<div class="topmenu-button"><a href="url">name</a></div>
<div class="topmenu-button"><a href="url">name</a></div>

Comment twig peut-il m'aider à ajouter la première et la dernière classes du div, de sorte que j'aurais un résultat comme :

 <div class="topmenu-button first"><a href="url">name</a></div>
<div class="topmenu-button"><a href="url">name</a></div>
<div class="topmenu-button"><a href="url">name</a></div>
<div class="topmenu-button last"><a href="url">name</a></div>

130voto

Kendall Hopkins Points 12193

Vous pouvez utiliser les "variables spéciales" loop.first et loop.last pour ce que vous voulez.

RELIER

 {% for elem in arrMenu %}
    {% if loop.first %}
    <div class="topmenu-button first">        
    {% elseif loop.last %}
    <div class="topmenu-button last">        
    {% else %}
    <div class="topmenu-button">        
    {% endif %}
        <a href="{{ elem.url }}">{{ elem.name }}</a>
    </div>
{% endfor %}

EDIT : selon combien vous vous souciez du « un cas », vous pourriez avoir besoin d'une solution comme celle-ci.

 {% for elem in arrMenu %}
    {% set classes = ["topmenu-button"] %}
    {% if loop.first %}{% set classes = classes|merge(["first"]) %}{% endif %}
    {% if loop.last %}{% set classes = classes|merge(["last"]) %}{% endif %}
    <div class="{{ classes|join(" ") }}">        
        <a href="{{ elem.url }}">{{ elem.name }}</a>
    </div>
{% endfor %}

4voto

Paul Leclerc Points 543

S'il s'agit de gérer l'attribut de classe d'une balise, une condition ternaire serait préférable.

 <span class="topmenu-button {{ (loop.first) ? 'first' : '' }}">{{ item.text }}</span>

0voto

Gódi Péter Points 1

Je l'utilise dans le modèle de vues Drupal 8. Merci pour 'elseif', si vous n'avez qu'un seul élément, le premier élément n'obtient jamais la 'dernière' classe :

 {% for row in rows %}
    {% set parity = cycle(['odd', 'even'], loop.index0) %}
    {% set row_classes = [ default_row_class ? 'views-row', ] %}    

    <div class="views-prerow {{parity}}{% if loop.first %} first{% elseif loop.last %} last{% endif %}">
        <div{{ row.attributes.addClass(row_classes) }}>
            {{ row.content }}
        </div>
    </div>
{% endfor %}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X