Jak v Nette\Database na kategorie
- Melmen
- Člen | 132
Ahoj,
řeším jednu aplikaci, a za boha nevím jak mám vyřešit následující problém:
Mám tabulku os, kde je id (pk), name (tabulka je pro seznam
operačních systémů)
Tabulku categories, kde je id (pk), name, slug, os_id (fk do
tabulky os), categories_id(fk do categories – na rodiče).
A teď co potřebuju:
Mám menu, kde bude seznam všech os (Android, iOS…) Po kliknutí Třeba na Android by se měla rozbalit nabídka s podkategoriema. Nejdřív bych potřeboval vypsat Hlavní kategorii (tam kde je null), a pod ní všechny její potomky.
Může mě někdo (na)kopnout jak toho docílit? Nepotřebuju nekonečné zanořování kategorii, jen rozdělení podle OS, hlavní kategorie, a její sub-kategorie.
Nette používám 2.0.3, akorát Nette\Database jsem dneska sosnul z Githubu od @hrach :)
Díky za pomoc :-)
- hrach
- Člen | 1838
jen tak z hlavy:
foreach ($db->table('os') as $os) {
echo $os->name;
foreach ($os->related('categories')->where('categories_id', null) as $category) {
echo $category->name;
foreach ($os->related('categories') as $subCategory) {
echo $subCategory->name;
}
}
}
Pokud mas DiscroveredReflection, melo by to snad takto fungovat, jinak by
bylo treba upravit ConventionalReflection, aby vedel, jak mirit sam na sebe
v tomto radku
foreach ($os->related('categories') as $subCategory) {
.
- Melmen
- Člen | 132
@hrach Funguje perfektně, díky ! Jen jsem si musel dát podmínku ->where(‚categories_id != ?‘, null) do toho třetího foreache :-)
Pro ty co by řešily něco podobného, zde je kód v Latte:
<ul class="nav">
<li n:foreach="$oss as $os" class="dropdown">
<a href="#"
class="dropdown-toggle"
data-toggle="dropdown">
{$os->name}
<b class="caret"></b>
</a>
<ul class="dropdown-menu">
{foreach $os->related('categories')->where('categories_id', null) as $category}
<li> <span style="color: red;">{$category->name}:</span></li>
{foreach $os->related('categories')->where('categories_id != ?', "null") as $subCategory}
<li> <span style="color: green;">{$subCategory->name}:</span></li>
{/foreach}
{/foreach}
</ul>
</li>
</ul>
$oss
je v presenteru
$this->context->createOs()
Ještě jednou díky, moc mi to pomohlo!
//EDIT: Kecám,
->where('categories_id != ?', null) jsem musel přepsat na `->where('categories_id', $category->id)
–
jinak jsem měl všude v menu stejný položky, teď už je to super :-)
Editoval Melmen (22. 7. 2012 17:32)