Jak v Nette\Database na kategorie

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Melmen
Člen | 132
+
0
-

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 :-)

vvoody
Člen | 910
+
0
-

Tu najdes dva odkazy kde sme stromove menu riesili.

hrach
Člen | 1838
+
0
-

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

@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)

hrach
Člen | 1838
+
0
-

no mas to jinak spatne :D mas tam dvakrat related na $os, ja to mel trochu jinak :))