Routování – změna separátorů

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

Zdravím,
snad všichni používají adresy typu example.com/abc/def/123, čemuž odpovídají routy; v pro tuto třeba

$router[] = new Route('<presenter>/<view>/<id>', array(
    'presenter' => 'Article',
    'view' => 'show',
    'id' => NULL,
));

Co když ale chci místo lomítek používat pomlčky – tedy example.com/abc-def-123 Prosté přepsání lomítek v routě mi nefunguje:

$router[] = new Route('<presenter>-<view>-<id>', array(
    'presenter' => 'Article',
    'view' => 'show',
    'id' => NULL,
));

Jakým způsobem tedy modifikovat routu, aby akceptovala url s pomlčkami místo lomítek?

PetrP
Člen | 587
+
0
-

Myslím že celý řetezec ‚sežere‘ defaultní pattern pro presenter, který je:

public static $styles = array(
	...
	'presenter' => array(
		self::PATTERN => '[a-z][a-z0-9.-]*',
		...
	),
	...
);

Takže ho možna skusit změnit, ale to by mohlo vyvolat nějaké problemy při přévodu NecoNecoPresenter na neco-neco

Jod
Člen | 701
+
0
-

No asi zovšadial vyhádzať tie pomlčky.

TFSi
Člen | 23
+
0
-

Ok, tak to zatím nechám a spokojím se s lomítky :)

Ale měl bych ještě jeden dotaz:
Pokud vezmu výše zmíněnou routu

$router[] = new Route('<presenter>/<view>/<id>', array(
    'presenter' => 'Article',
    'view' => 'show',
    'id' => NULL,
));

tak funguje jak http://example.com/abc/ tak http://example.com/abc; no prostě s lomítkem na konci i bez něho.
Jak tohle co nejelegantněji pořešit aby nevznikaly duplicitní stránky?

pmg
Člen | 372
+
0
-

Nette získaný požadavek na presenter převede zpět na URL. Pokud se neshoduje s tou z požadavku, přesměruje na její kanonickou podobu (viz Presenter::canonicalize).

Pokud na konci masky není lomítko a poslední parametr není zadán, bude na konci adresy lomítko. Většinou je to požadované chování.

$router[] = new Route('<lang>/<presenter>/<view>', array(
    'presenter' => 'Default',
    'view' => 'show',
));

Tato routa bude generovat adresy example.com/cs/, example.com/cs/admin/ nebo example.com/cs/admin/edit. Pokud adresa končí lomítkem, naznačuje to, že se tam dosadí výchozí parametr. Když je ale URL kompletní, už se za něj lomítko nedává.

Pro změnu chování se dá upravit router, ptal jsem se na to tady.

PetrP
Člen | 587
+
0
-

TFSi napsal(a):

tak funguje jak http://example.com/abc/ tak http://example.com/abc; no prostě s lomítkem na konci i bez něho.
Jak tohle co nejelegantněji pořešit aby nevznikaly duplicitní stránky?

Jestli se ti ale duplicitní stránky vytvářejí (tedy nepřesměrovává se) tak koukni na Presenter::$autoCanonicalize, zda-li ho nemáš někde nastavené na false.