[2009–12–22] novinka: grid rendering
- David Grudl
- Nette Core | 8227
Potřebujete vyrenderovat pole produktů $products do podobné mřížky?
<tr>
<td>{$product[1]}</td>
<td>{$product[2]}</td>
<td>{$product[3]}</td>
</tr>
<tr>
<td>{$product[4]}</td>
<td>{$product[5]}</td>
<td>{$product[6]}</td>
</tr>
<tr>
<td>{$product[7]}</td>
<td>{$product[8]}</td>
</tr>
Kdyby to nebyla mřížka, stačilo by napsat třeba
{foreach $products as $product}
<td>{$product}</td>
{/foreach}
Ale na mřížku, zdá se, jeden foreach nestačí, jsou potřeba dva vnořené cykly a v takovém případě ani foreach použít nelze. Nebo zapojit nějaké komplikované ify. Nebo použít novinku, metody iteratoru isFirst() a isLast() s podporou renderování mřížek.
V uvedeném příkladě má mřížka šířku 3, kód by tedy vypadal následovně:
{foreach $products as $product}
{if $iterator->isFirst(3)}<tr>{/if}
<td>{$product}</td>
{if $iterator->isLast(3)}</tr>{/if}
{/foreach}
Ještě drobnost: v šablonách lze psát XML deklarace
<?xml version=... ?>
a nebudou vyhodnoceny jako PHP kód,
nezávisle na nastavení direktivy short_open_tag.
- Ondřej Mirtes
- Člen | 1536
Hezké, ale je tam WTF faktor :)
Mám tomu rozumět jako ($counter % $number) == 1 || isLast()
?
Dalo by se to nějak použít, kdybych chtěl vyrenderovat tabulku (sloupce tabulky x záznamy)? Tohle je jen pro případ, že chci vyrenderovat do mřížky seznam itemů, ale žádný vztah mezi hodnotou a sloupcem tam není, je to jen mřížka.
- Ondřej Mirtes
- Člen | 1536
Solution napsal(a):
Jen abych to správně pochopil, to se na začátku uloží proměnná, která se iteruje a pokud má číslo 3, tak ukončí nebo začne nový řádek a potom se resetuje?
Jinak hezké :-), píšu si.
To je to modulo :)) https://github.com/…00dcf04d8a18
- sin
- Člen | 82
To funguje jenom ve vyvojove verzi? protoze v API to neni https://api.nette.org/…tor.php.html#64
- Proki
- Člen | 66
Měl bych návrh na drobné vylepšení. Pokud renderuji data do mřížky, tak nyní není možnost jednoduše využít metody isEven() a isOdd() pro odlišení sudých a lichých řádků. Hezké by bylo, kdyby tyto metody přijímaly argument stejný jako metody isFirst() a isLast(). Co si o tom myslíte vy?
Nyní pro zvýraznění sudých řádků musím využívat takto nepěkný kód:
<?php
<table>
{assign $alternate FALSE}
{foreach $items as $item}
{if $iterator->isFirst(5)}<tr{attr class('alternate', $alternate)}>{? $alternate = !$alternate}{/if}
<td>{$item}</td>
{if $iterator->isLast(5)}</tr>{/if}
{/foreach}
</table>
?>
Hezčí by to bylo například takto:
<?php
<table>
{foreach $items as $item}
{if $iterator->isFirst(5)}<tr{attr class('alternate', $iterator->isEven(5))}>{/if}
<td>{$item}</td>
{if $iterator->isLast(5)}</tr>{/if}
{/foreach}
</table>
?>
Editoval Proki (15. 1. 2010 21:29)