[2009–12–22] novinka: grid rendering

před 9 lety

David Grudl
Nette Core | 6770
+
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.

před 9 lety

Ondřej Mirtes
Člen | 1539
+
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.

před 9 lety

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.

před 9 lety

Ondřej Mirtes
Člen | 1539
+
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

před 9 lety

sin
Člen | 82
+
0
-

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

před 9 lety

Ondřej Mirtes
Člen | 1539
+
0
-

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

před 9 lety

Proki
Backer | 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)