次のようなforループがあるとします。
{% for elem in arrMenu %}
<div class="topmenu-button">
<a href="{{ elem.url }}">{{ elem.name }}</a>
</div>
{% endfor %}
そのフォームでは、次のようにレンダリングされます。
<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>
どうすればtwig divの最初と最後のクラスを追加できるので、次のような結果が得られます。
<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>
「特殊変数」を使用できますloop.first
およびloop.last
欲しいものに。
{% 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 %}
編集:「1つのケース」をどの程度気にするかによって、このような解決策が必要になる場合があります。
{% 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 %}
ループはfirst
とlast
に同時にすることはできないため、elseif
を使用して(DRY-topmenu-button
将来は?):
{% for elem in arrMenu %}
{% set append %}
{% if loop.first %}first{% endif %}
{% if loop.last %}last{% endif %}
{% endset %}
<div class="topmenu-button {{ append }}">
<a href="{{ elem.url }}">{{ elem.name }}</a>
</div>
{% endfor %}
より簡潔に:
{% for elem in arrMenu %}
<div class="topmenu-button {% if loop.first %}first{% endif %} {% if loop.last %}last{% endif %}">
<a href="{{ elem.url }}">{{ elem.name }}</a>
</div>
{% endfor %}
編集:これにより、class
属性に余分なスペースが追加されます(完全に問題ありません)。 Edit2:これは1要素配列を処理しません(first = last)
タグのクラス属性を管理する場合は、3項条件の方が適しています。
<span class="topmenu-button {{ (loop.first) ? 'first' : '' }}">{{ item.text }}</span>
これをDrupal 8ビューテンプレートで使用します。「elseif」のおかげで、アイテムが1つしかない場合、最初のアイテムは「最後の」クラスを取得できません。
{% 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 %}