Dotaz – kde v nette predavate aktivni odkaz
- Duch.Veliky
- Člen | 68
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
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
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
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
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
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
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)
- Duch.Veliky
- Člen | 68
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é
- wodCZ
- Člen | 49
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
Jasně no, to dávám smysl. Tak to ošetřím v BasePresenteru :) Díky
Editoval Duch.Veliky (10. 9. 2014 19:09)