Nette\Database v šablonách: best practice
- marousekJakub
- Člen | 1
Zdravím,
píšu v Nette první aplikaci s použitím Nette\Database. Rád bych, podobně jako v dibi, předával do šablon už jen výsledné řádky tabulek pro vypsání. Nevím ale, jak to zařídit, když chci použít related().
Lépe to vysvětlím asi na příkladu: mám dvě tabulky článků a
kategorií, které by měly být na stránce seřazené podle sloupce
order.
category(id, name, order)
article(id, name, text, order)
Někde v modelu mám metody getCategories() a getArticles(), které pomocí ORM vrátí příslušné záznamy, seřazené dle order. Co ale udělat v případě, že chci třeba vypsat v seznamu kategorie a pod nimi příslušné články? Nabízí se vytáhnout všechny kategorie a do šablony napsat něco jako:
<ul>
<li n:foreach="$categories as $category">
{$category->name}
<ul>
<li n:foreach="$category->related('article')->order('order') as $article">{$article->name}</li>
</ul>
</li>
</ul>
Nicméně pak se velká část logiky přesouvá z modelu do šablony, což se mi nelíbí. Třeba na to seřazení se může snadno zapomenout.
Jaké jsou nejlepší způsoby pro řešení podobných věcí? Napadlo mně ještě provést v modelu fetchAssoc(„category_id->id“), ten ale převede všechno na pole a nemůžu přistupovat k záznamům jako k objektům…
- CZechBoY
- Člen | 3608
Tak nejlepší by bylo to zabalit do objektu a nad ním volat metodu, která někde ty data sežene – buď zavolá tu metodu v repozitáři nebo vezme někde z asociativního pole, to už je jedno.
<ul>
<li n:foreach="$categories as $category">
{$category->name}
<ul>
<li n:foreach="$category->getArticles() as $article">{$article->name}</li>
</ul>
</li>
</ul>