Routes a problem s lomitkom na konci
- edke
- Člen | 198
Prehladal som forum aj dokumentaciu, ale neporadilo sa mi najst riesenie na moj nasledujuci problem. Chcel by som v aplikacii oddelit dokumenty a dalsie moduly. Pacilo by sa mi, keby URL adresy vyzerali nasledovne:
http://example.sk/kontakty -> dokument
http://example.sk/prehlad-cinnosti-> dokument
http://example.sk/portfolio/
http://example.sk/portfolio/45 -> modul na zobrazovanie portfolia
Pri takto zadefinovanych routach to ale nefunguje:
$router[] = new Route('/<document>', array(
'module' => 'Frontend',
'presenter' => 'Document',
'action' => 'default',
'document' => NULL,
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Frontend',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL,
));
Problem tam robi lomitko na konci, ktore tam moze a nemusi byt. Potom aj url http://example.sk/portfolio/ je zachytena prvou routou.
Dalo by sa to riesit napriklad cez koncovku .html:
$router[] = new Route('/<document>.html', array(
'module' => 'Frontend',
'presenter' => 'Document',
'action' => 'default',
'document' => NULL,
));
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'Frontend',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL,
));
Potom by dokumenty vyzerali ako http://example.sk/kontakty.html ale toto riesenie sa mi nejako nepaci. Vie niekto poradit, ako nastavit routes tak, aby to lomitko na konci rozhodovalo, ci to bude prva routa a teda dokument, alebo iny presenter zachyteny druhou routou ?
- vlki
- Člen | 218
Bojím se, že takového chování bez napsání vlastní Routy nedosáhneš.
Šlo by to přes překladový slovník, který by fungoval jako takový filtr, ale pokud by byl dokument a „modul“ stejné url, tak by to vyhodnotil podle pořadí uvedených rout.
Taky by ti to asi nevyhovovalo z pohledu toho, že dokumenty by byly přístupné i z url, která by lomítko na konci měla.
http://example.sk/kontakty/
by se přesměrovalo na
http://example.sk/kontakty
Pokud bys šel do napsání vlastní Route, což osobně vřele doporučuji, tak bys mohl plně využít možnosti oddělení routovací vrstvy od ostatních. Např. SimpleSeoRouter Honzy Tvrdíka.
Samotný problém je v tomto řádku. (resp. on to není problém, spíš feature, ale asi ne vždy se hodí:))
Editoval vlki (20. 5. 2009 11:39)
- David Grudl
- Nette Core | 8284
Koncové lomítko nemůže fungovat jako rozlišovač rout, protože je obecně chápané jako volitelné a rozumný server pak přesměruje 301 na kanonickou variantu.
To je podobné jako dělat rozdíly mezi http://www.rodina.cz/ a http://rodina.cz/ ;)
- Tomik
- Nette Evangelist | 485
Co to zkusit takto:
<?php
$router[] = new Route('<presenter portfolio|contact|default>/<action>/<id>', array(
'module' => 'Frontend',
'presenter' => 'Default',
'action' => 'default',
'id' => NULL,
));
$router[] = new Route('<document>', array(
'module' => 'Frontend',
'presenter' => 'Document',
'action' => 'default',
'document' => NULL,
));
?>
Tedy vyjmenovat všechny presentery, které budeš chtít použít v té první routě, pokud adresa nebude vyhovovat ani jednomu presenteru, bude se to považivat ža dokument. Tedy doufám, nezkoušel jsem, píšu z hlavy. :)
- edke
- Člen | 198
Tomik wrote:
Co to zkusit takto:
<?php $router[] = new Route('<presenter portfolio|contact|default>/<action>/<id>', array( 'module' => 'Frontend', 'presenter' => 'Default', 'action' => 'default', 'id' => NULL, )); $router[] = new Route('<document>', array( 'module' => 'Frontend', 'presenter' => 'Document', 'action' => 'default', 'document' => NULL, )); ?>
Tedy vyjmenovat všechny presentery, které budeš chtít použít v té první routě, pokud adresa nebude vyhovovat ani jednomu presenteru, bude se to považivat ža dokument. Tedy doufám, nezkoušel jsem, píšu z hlavy. :)
To by slo, len to samozrejme zahrna neustale doplnanie pri pridavani dalsich nie-dokumentovych presenterov. Co je riesenie, ale nie velmi elegantne :) No nic, zatial teda pouzivam variantu, kde dokument bude mat priponu .html, samozrejme to funguje tak ako treba. Casom mozno vymyslim nieco lepsie.
- Tomik
- Nette Evangelist | 485
edke napsal(a):
To by slo, len to samozrejme zahrna neustale doplnanie pri pridavani dalsich nie-dokumentovych presenterov. Co je riesenie, ale nie velmi elegantne :) No nic, zatial teda pouzivam variantu, kde dokument bude mat priponu .html, samozrejme to funguje tak ako treba. Casom mozno vymyslim nieco lepsie.
V tom případě, pokud ti ani toto nevyhovuje, pak doporučuju si opravdu napsat ten router vlastní. :)
- edke
- Člen | 198
Takze nakoniec som si napisal vlastny Route, inspiroval som sa velmi peknym prikladom Jana Tvrdika a jeho SimpleSeoRouter. Konecne mi to routuje tak ako som si predstavoval :) Dakujem Vam vsetkym za prispevky.