Routování – filter_in/out pro presenter a action zaroven, tj. ne oddeelene – je to mozne?
- ras
- Člen | 135
Ahoj všem,
používám Nette pro tvorbu v podstatě statických webů. Do teď jsem si vystačil s jedním presenterem, ale teď bych jich chtěl používat více (a v rámci presenteru uvažuji i o více než jedné default action). Zároveň bych ALE chtěl zachovat stavájící způsob tvorby URL, kterou řeším přes pole s parametry. Parametry mi pak zajišťují i automatické generovaní sitemap.xml. A stále přitom nepotřebuji DB.
Do teď jsem měl router nastavený v RouterFactory.php na
$router[] = new Route('<action>[/<id>]', array(
Route::PRESENTER_KEY => 'Home',
Presenter::ACTION_KEY => array(
Route::VALUE => 'default',
Route::FILTER_TABLE => self::routeTable()
)
(nekamenovat za to, že to chytne úplně vše)
a funkce routeTable v podstatě jen zpracovala pole ve tvaru
(czenglish si prosím nevšímejte, to je nepodstatné)
'vyhody-reseni-xxx' => array(
'view' => 'vyhodyx',
'changefreq' => 'monthly',
'priority' => '0.5',
),
'vyhody-reseni-yyy' => array(
'view' => 'vyhodyy',
'changefreq' => 'monthly',
'priority' => '0.5',
),
'kontakty' => array(
'view' => 'kontakty',
'changefreq' => 'monthly',
'priority' => '0.3',
),
takže fukce routeTable vracela toho
array(3) {
"vyhody-reseni-xxx" => "vyhodyx" (4)
"vyhody-reseni-yyy" => "vyhodyy" (4)
"kontakty" => "kontakty" (4)
}
a vše mi fungovalo, tak jak jsem potřeboval.
Aktáuálně bych chtěl mít pole pro tvorbu URL a sitemap.xml v tomto
tvaru
(výchozí klíče pole jsou samozřejmě unikátní, protože generované URL
musí být také unikátní)
'vyhody-reseni-xxx' => array(
'presenter' => 'Vyhody',
'view' => 'xxx',
'changefreq' => 'monthly',
'priority' => '0.5',
),
'vyhody-reseni-yyy' => array(
'presenter' => 'Vyhody',
'view' => 'yyy',
'changefreq' => 'monthly',
'priority' => '0.5',
),
'kontakty' => array(
'presenter' => 'Kontakty',
'view' => 'default',
'changefreq' => 'monthly',
'priority' => '0.3',
),
ale potřeboval bych nakopnout jak řešit router.
Chápu, že potřebuji na základě znalosti URL přiřadit jak presenter, tak action. Nicméně budu znát jen action, nicméně jsem schopen k ní zároveň dohledat presenter … a naopak vygenerovat URL (ale to už asi bude analogické) … teoreticky je mi vše vclku jasné, jen nějak ten první krůček praxe chybí.
Existuje v Nette možnost? věřím, že ano … předpokládám, že přes vlastní router, ale přiznám se, že vůbec netuším jak ho udělat.
Pokud by to někoho zaujalo a byl ochoten mi pomocí … bude mít moji vděčnost (klidně i místo zdarma na mém nově připravovaném GITovém hostingu).
Diky moc, za pomoc.
Radek
- enumag
- Člen | 2118
V dev verzi na to filtry jsou. https://github.com/….global.phpt
Na stable použij tohle. https://pla.nette.org/…ru-ve-filtru
Editoval enumag (16. 8. 2013 13:06)
- ras
- Člen | 135
Tak řešení bych měl … hezké asi není … ale splňuje požadavky, tj. pokud by se to někomu někdy hodilo. Prostě se vytvoří routa pro každou stránku, tj. pro miniweby do pár desítek stránek je to reálně použitelné.
$router = new RouteList();
foreach (self::$route AS $url=>$item) {
$router[] = new Route($url, $item['presenter'].':'.$item['view']);
}
Pozn.: uvedené self::$route je výše uvedené pole, které původně zpracovával ten Route::FILTER_TABLE ⇒ self::routeTable()