2013-07-18 73 views
3

我是Twig和Symfony2的新手。我想知道如何使用Twig創建3列表格。我的數據來自數據庫如何在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 
+0

請提供更多信息,例如var1的內容 – Raptor

+0

var 1是一個例子,假設var1是來自我的數據庫的一組數據。我收到的數據我只需要在3列中顯示我的信息讓我們假設它是每個人3人的信息姓名,地址在一個單元格..不知道如何解釋更多的遺憾..英文 – Mkfootwo

+0

我想幫助:你應該打印'​​'和''之間的值(你錯了'') – Raptor

回答

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 %} 
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> 
+0

這不是我想要做的,但感謝@Kyrillos我解釋自己很抱歉,但我編輯與代碼的職位,所以你可以理解我想要什麼。 – Mkfootwo

+0

你是法國人@Mkfootwo? –

+0

是的,我確實是法國人。 – Mkfootwo

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次迭代,並且不要忘記在循環終止時關閉最後一個。

+0

它的工作感謝你,但第一行顯示2行,然後其他行3行像現在這是問題。 – Mkfootwo

+0

是的,因爲loop.index從1開始,請使用loop.index0而不是loop.index。 – Peekmo

+0

謝謝你,你是對的。 – Mkfootwo

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> 
1

Peekmo的解決方案是正確的,但有可能是用樹枝批次過濾器更合適的方法。這個過濾器將一個列表分成更小的子集。您可以控制尺寸並使用嵌套for循環顯示行及其內容。文檔中的示例是對此問題的確切答案。過濾器也將整齊地處理空單元格。即你在一個陣列8層的價值觀和你想有一個3列的表格,最後一個單元格將emtpy

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

5
你是使用批處理(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 %}