Dotaz – kde v nette predavate aktivni odkaz

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

Zdravím,

kde předáváte, který odkaz je aktivní? Mám nějaké stromové menu o dvou úrovních, kde druhá úroveň je vyjížděcí. Potřeboval bych tedy (ideálně v routeru) nadefinovat nějaký parametr „kategorie“ a „podkategorie“. Jde to definovat v routeru? Zatím se mi nedaří přijít na to jak. Definovat to na začátku každého presenteru mi přijde zbytečně složité a nepřehledné.

Něco ve smyslu:

<?php
$router[] = new Route('//admin.%domain%/produkty/kategorie', 'Admin:Kategorie:vypis');
?>

.. a k tomu bych potřeboval vytvořit proměnnou např $menu = „produkty“; $podmenu = „kategorie“;

Jde to nějak?

Editoval Duch.Veliky (10. 9. 2014 16:18)

Duch.Veliky
Člen | 68
+
0
-

A rovnou kdyby se to definovalo, tak by se mi i líbilo tam mít možnost nadefinovat defaultní H1 a TITLE :-)

iguana007
Člen | 970
+
0
-

Já to řeším tak, že mám v databázi uložený traverzní strom (v podstatě sitemap) a u každé položky mám definován i presenter, action/render a předaný parametr id (slug) a na základě toho jsem schopen vykreslovat speciální hodnoty (active) class atributu u odkazu, vykreslovat menu, sitemap webu, drobečkovou navigaci atd.

Duch.Veliky
Člen | 68
+
0
-

Jo drobečková navigace to je taky další téma s tim spojený, tu jsem dycky definoval v danym presenteru stejně tak jako H1 a TITLE a další věci a přitom by bylo lepší to mít někde sjednocený.

Takže prostě nepoužíváš ten default router pro konkrétní URL, ale routuješ si to sám v BasePresenteru podle databáze?

iguana007
Člen | 970
+
0
-

Nene … můj router je víceméně obyčejný a vypadá takto:

<?php

namespace iGiCMS;

use FrontModule\CmsModel;
use Nette\Application\Routers\Route;
use Nette;
use Nette\Application\Routers\RouteList;


/**
 * Router factory.
 */
class RouterFactory
{

	/**
	 * @return \Nette\Application\IRouter
	 */
	public function createRouter()
	{
		$router = new RouteList();

		$router[] = new Route('index.php', 'Front:Homepage:default', Route::ONE_WAY);

		$router[] = $adminRouter = new \Nette\Application\Routers\RouteList('Admin');
		$adminRouter[] = new Route('admin/<presenter>/<action>/<id>', array(
			'presenter' => 'Homepage',
			'action' => 'default',
			'id' => NULL,
		));

		$router[] = $frontRouter = new \Nette\Application\Routers\RouteList('Front');
		$frontRouter[] = new PageRoute('<id>', array(
			'id' => array(
				Route::FILTER_OUT => function ($id) {
						if (!is_numeric($id)) {
							return $id;
						} else {
							$url = CmsModel::getPageUrlById($id);
							return $url;
						}
					}
			),
			'presenter' => 'Page',
			'action' => 'default'
		));

		$frontRouter[] = new Route('<presenter>/<action>/<id>', array(
			'presenter' => 'Homepage',
			'action' => 'default',
			'id' => NULL,
		));

		return $router;
	}

}

A v presenteru si už jen volám modelové metody ve stylu: getBreadcrumbs, getMenu, getSidebarMenu atd.

akadlec
Člen | 1326
+
0
-

Jestli tě chápu dobře, tak chceš si k položkám menu přidávat nějaké classy co budou signalizovat zda je zobrazena právě ta stránka?
Pokud ano, tak to se řeší tam kde máš zpracování toho menu a ne v routeru. V nette jsou k dispozici i nějaké extension pro menu, mě osobně nevyhovovala žádná a tak dělám vlastní extension pro generování menu.

Duch.Veliky
Člen | 68
+
0
-

No chtěl bych vytvořit nějakou proměnnou. K odkazům bych si pak dal už jenom:
<a href="" {if $menu == „kategorie“}class=„oznacene“{/if}>Odkaz</a>

Prostě ideální by bylo něco ve smyslu:

<?php
$frontRouter[] = new Route('produkty/kategorie', array(
            'presenter' => 'ProduktyKategorie',
            'action' => 'vypis',
            'title' => 'Title',
            'h1' => 'Nadpis sekce',
            'menu' => 'produkty',
            'kategorie' => 'kategorie'
        ));
?>

Editoval Duch.Veliky (10. 9. 2014 18:23)

akadlec
Člen | 1326
+
0
-

tak na to slouží ifcurrent či si můžeš jen porovnávat link s nějakou routou.

Duch.Veliky
Člen | 68
+
0
-

No právě ne, protože to je stromové menu celkem rozsáhlé struktury a já podle označeného odkazu musím rozeznat jaké pododkazy mají být rozjeté

akadlec
Člen | 1326
+
0
-

Tak potom teda fakt potřebuješ něco na to menu, řešit to v routeru je imho špatně.

wodCZ
Člen | 49
+
0
-

Nechci mystifikovat, berte můj příspěvek s rezervou.
Router je místo, které překládá URL → [model],presenter,akce a parametry a naopak. To, jak bude rozbalené menu, nebo jaký bude titulek už by neměla být práce routeru. Já bych to pravděpodobně dal někam do beforeRender v nějakém BasePresenteru. Dřív mi to nedává smysl, protože nemusím vždy vykreslovat šablonu (ajaxové požadavky, signály, redirecty po odeslaných formulářích, …).

Tyto informace budu chtít jen při vykreslování šablony, takže je nesmysl to počítat dřív, než budu renderovat.
Router by měl být co nejčistší, protože se používá jak při zpracování odkazů, tak při jejich generování.

Duch.Veliky
Člen | 68
+
0
-

Jasně no, to dávám smysl. Tak to ošetřím v BasePresenteru :) Díky

Editoval Duch.Veliky (10. 9. 2014 19:09)

akadlec
Člen | 1326
+
+1
-

A co ti tady celou dobu píšu?

iguana007
Člen | 970
+
0
-

Já mu to taky už psal :D