Latte – výpis dat po sloupcích
- Elijen
- Člen | 171
Potřeboval bych vypsat pole hodnot do N sloupců, ale nikoli po řádcích nýbrž po sloupcích. Mám-li například pole:
$pole = array('Adéla', 'Andrea', 'Bára', 'Klára', 'Petra', 'Míša', 'Zuzka');
Jednoduše ho vypíši do dvou sloupců pomocí makra foreach do podoby:
₊-------+--------+
| Adéla | Andrea |
| Bára | Klára |
| Petra | Míša |
| Zuzka | |
+-------+--------+
Já bych ale potřeboval vypsat položky takto:
₊--------+-------+
| Adéla | Petra |
| Andrea | Míša |
| Bára | Zuzka |
| Klára | |
+--------+-------+
Dal bych ruku do ohně za to, že jsem na to již viděl komponentu nebo latte makro, ale za boha to nemohu vygooglit. Samozřejmě se to dá udělat ošklivě pomocí x podmínek v šabloně, ale to mi nepřijde příliš elegantní. Jak byste to řešili vy?
- Filip Procházka
- Moderator | 4668
Já bych to řešil vhodným naformátováním struktury v render metodě presenteru
$pole = array('Adéla', 'Andrea', 'Bára', 'Klára', 'Petra', 'Míša', 'Zuzka');
$this->template->columns = array_partition($pole, 2);
pomocí nějaké šikovné funkce
function array_partition($array, $columns = 2)
{
$result = array();
array_walk(array_values($array), function ($item, $key) use (&$result, $columns)) {
$result[$key%$columns][] = $item;
};
return $result
}
abych si to mohl pěkně vykreslit
<tr n:foreach="$rows as $row">
<td n:foreach="$row as $item">{$item}</td>
</tr>
Editoval HosipLan (22. 1. 2012 21:26)
- Filip Procházka
- Moderator | 4668
Makra first a last ti buďto pro prvni, poslední nebo pro n-tou iteraci „vykreslí“ obsah.
Co píše @**redhead** dělá právě přesně tu první tabulku. @**Elijen** ale chce vykreslovat „po sloupcích“, což takto neuděláš, musíš si na to to pole upravit, nebo podmínkovat jako o závod.
- Elijen
- Člen | 171
Díky za reakce,
@HosipLan Tvá funkce nefunguje jak by měla. Vypisuje první
variantu, jen jaksi transformovaně (do dvou řádků). Asi by bylo
výhodnější použít array_chunk
na rozdělení po sloupcích a
položky v šabloně vypsat pomocí {while}
či
{for}
.
Zatím jsem to vyřešil pomocí seznamu <ul>
pro každý
sloupec a CSS atributu float:
render:
$columnCount = 2;
$items = array('Adéla', 'Andrea', 'Bára', 'Klára', 'Petra', 'Míša', 'Zuzka');
$this->template->items = $items;
$this->template->columnSize = ceil(count($items) / $columnCount);
latte:
{foreach $items as $item}
{first $columnSize}<ul>{/first}
<li>{$item}</li>
{last $columnSize}</ul>{/last}
{/foreach}
Tento problém ale řeším poměrně často a někdy by mohlo být nutné použít tabulku místo seznamu (i když sémanticky se jedná vlastně o seznam).
Editoval Elijen (23. 1. 2012 14:32)