[2009–12–22] novinka: grid rendering

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8105
+
0
-

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

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.

Padik
Člen | 11
+
0
-

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.

Ondřej Mirtes
Člen | 1536
+
0
-

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

To funguje jenom ve vyvojove verzi? protoze v API to neni https://api.nette.org/…tor.php.html#64

Ondřej Mirtes
Člen | 1536
+
0
-

Ano, od této změny ještě žádná stable nevyšla.

Proki
Člen | 66
+
0
-

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)