Routování – filter_in/out pro presenter a action zaroven, tj. ne oddeelene – je to mozne?

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

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

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

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