如何在Symfony2中使用Twig制作3列表

时间:2013-07-18 06:09:19

标签: symfony pagination html-table twig

我是Twig和Symfony2的新手。我想知道如何用Twig创建一个3列表。我的数据来自数据库

到目前为止,我已经尝试了一切,但仍然没有效果。我在Stackoverflow上发现了这个关于制作一个2列表的问题,除了我之外它完美无缺。我想要3列。

<table>
  {% for var in var1 %}
    {% if (loop.index % 2) %}<tr>{% endif %}
    <td>
      <div class="bloc">
        <a href="{{ path('xxxxxxx', {'id':var.id}) }}">
        <span>{{ var.name}}  </spann></a></div>
        <img src="{{ asset(var.image ) }}"  />    
      </div>
    </td>
    {% if (loop.index % 2) and loop.last %}
      <td>&nbsp</td>
    {% endif %}
    {% if (loop.index0 % 2) or loop.last %}</tr>{% endif %}
  {% endfor %}
</table>


ex: var1  contains names and pictures from database.
name1  name2  name3
name4  name5  name6
...

这就是我的ATM

name1   name2
name3   name4   name5
name6   name7   name8

6 个答案:

答案 0 :(得分:5)

我的解决方案适用于任意数量的列:

{% set columns = 3 %}
{% for name in names %}
    {% if loop.first or loop.index0 is divisibleby(columns) %}
        <tr>
    {% endif %}

    <td>{{ name }}</td>

    {% if loop.last and loop.index is not divisibleby(columns) %}
        {% for n in range(low=columns - (loop.index % columns), high=1, step=-1) %}
            <td>&nbsp;</td>
        {% endfor %}
    {% endif %}
    {% if loop.last or loop.index is divisibleby(columns) %}
        </tr>
    {% endif %}
{% endfor %}

答案 1 :(得分:5)

正确的方法是使用batch(array_chunk):

{% for batchResults in result.items|batch(result.total_results / columns) %}
    <div class="{{cycle(['left', 'left', 'right'], loop.index)}}">
        {% for item in batchResults %}
            <div class="{% if loop.last %}last{% endif %}">
                {{item}}
            </div>
        {% endfor %}
    </div>
{% endfor %}

答案 2 :(得分:1)

Peekmo的解决方案是正确的,但在树枝中使用批量过滤器可能有一种更简洁的方法。此过滤器将列表分成较小的子集。您可以控制大小并使用嵌套for循环来显示行及其内容。文档中的示例是对此问题的准确答案。过滤器也可以整齐地处理空单元格。即你在一个数组中有8个值,你想要一个3列表,最后一个单元格将是emtpy

http://twig.sensiolabs.org/doc/filters/batch.html

答案 3 :(得分:0)

你应该尝试类似的东西:

<table>
{% for var in var1%}
<tr>
    <td>Title1<td>
    <td>Title2<td>
    <td>Title3<td>
</tr>
<tr>
    <td>{{ var.attr1 }}<td>
    <td>{{ var.attr2 }}<td>
    <td>{{ var.attr3 }}<td>
</tr>
{%endfor%}
 </table>

答案 4 :(得分:0)

<table>
<tr>

{% for var in var1%}
{% if loop.index0 is divisibleby(3) %}
</tr>
<tr>
{% endif %}
    <td>{{ var }}</td>

{% if loop.last %}
</tr>
{% endif %}

{%endfor%}
 </table>

我认为这可以解决您的问题,您必须每3次迭代打开标记,并且不要忘记在循环终止时关闭最后一个。

答案 5 :(得分:0)

未经测试,但应打印干净的桌子。

<table>
  {% for var in var1 %}
    {% if not (loop.index0 % 3) %}<tr>{% endif %}
    <td>
      <div class="bloc">
        <a href="{{ path('xxxxxxx', {'id':var.id}) }}">
        <span>{{ var.name}}  </spann></a></div>
        <img src="{{ asset(var.image ) }}"  />    
      </div>
    </td>
    {% if (loop.index % 2) and loop.last %}
      <td>&nbsp</td>
    {% endif %}
    {% if (loop.index % 3) and loop.last %}
      <td>&nbsp</td>
    {% endif %}
    {% if not (loop.index % 3) or loop.last %}</tr>{% endif %}
  {% endfor %}
</table>