我有一个问题是使用Twig在循环中显示结果的下一行:
// Arkiglass/ProduitBundle/Controller/DefaultController.php
<?php
public function produitAction()
{
$em = $this->getDoctrine()->getManager();
$query = $em->createQuery('SELECT p FROM ArkiglassProduitBundle:Produit p');
$produit = $query->getResult();
if (!$produit)
{
throw $this->createNotFoundException('no such Product !');
}
return $this->render('ArkiglassSiteBundle:Site:produit.html.twig', array(
'produit' => $produit
));;
}
这是我的模板
{# produit.html.twig #}
{% for pr in produit %}
<table>
<tr>
<td>
{{ pr.description }}
</td>
<td>
{# display the next pr.description #}
</td>
</tr>
{% endfor %}
</table>
我尝试使用{{ pr[loop.index+1].description }}
,但它对我不起作用。
答案 0 :(得分:8)
这是连续打印两个循环运行的一种可能解决方案。循环索引(首先是基于1,然后是基于0)以2为模,因此在第一次运行中,前导<tr>
被渲染,在第二次运行中,尾随</tr>
被渲染。等等。
第一个loop.last
条件是显示第二个空列,如果最后一个循环运行在第一列中结束。第二个条件是正确关闭行。
<table>
{% for pr in produit %}
{% if (loop.index % 2) %}<tr>{% endif %}
<td>
{{ pr.description }}
</td>
{% if (loop.index % 2) and loop.last %}
<td> </td>
{% endif %}
{% if (loop.index0 % 2) or loop.last %}</tr>{% endif %}
{% endfor %}
</table>
答案 1 :(得分:1)
这看起来有点不太优雅,但会避开你的两个循环。
<tbody>
{% set previousOption = false %}
{% set nextIterator = 1 %}
{% for option in options %}
{% if options[nextIterator] is defined %}
{% set nextOption = options[nextIterator] %}
{% else %}
{% set nextOption = false %}
{% endif %}
<tr>
<td>
{{ option.label }}
</td>
<td>
{{ option.type }}
</td>
<td colspan>
<a href="{{ path('option_delete', {'questionId': question.id, 'optionId': option.id }) }}">Delete option</a>
</td>
<td>
{% if previousOption %}
<a href="{{ path('do_swap', {'optionId': option.id, 'optionId2': previousOption.id }) }}">« Boost up</a>
{% endif %}
</td>
<td>
{% if nextOption %}
<a href="{{ path('do_swap', {'optionId': option.id, 'optionId2': nextOption.id }) }}">Shut down »</a>
{% endif %}
</td>
</tr>
{% set previousOption = option %}
{% set nextIterator = (nextIterator + 1) %}
{% endfor %}
</tbody>