Všechny URL na 1 presenter

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

Zdravím,
řeším problém.

Mám aplikaci postavenou na Angularu tzn. si to routuje sama, ale nevím jak to udělat na straně nette. Mám zadané klíčové routy:

return array(
				new Route('/', array(
					'presenter' => 'Home',
					'action' => 'default',
					'module' => 'System'
				)),
				new Route('/system', array(
						'presenter' => 'System',
						'action' => 'default',
						'module' => 'System'
				)),
				new Route('/templates/<action>', array(
						'presenter' => 'Template',
						'action' => 'default',
						'module' => 'System'
				)),
				new Route('/services/<presenter>/<action>', array(
						'presenter' => 'Home',
						'action' => 'default',
						'module' => 'System:Services'
				)),
				new Route('/logout', array(
						'presenter' => 'System',
						'action' => 'logout',
						'module' => 'System'
				))

Ty funguji bez problému, ale potřeboval bych přidat ještě jednu routu, která vezme cokoli co přijde v URL a nesplňuje to výše uvedené, tak to hodí na presenter: System, action: default, Module: System (tzn. ekvivalent routě /system), ale bez redirectu. Z hlediska SEO se tomů říká duplicitní URL tuším (ale jelikož je to administrace, tak mě to netrápí).

Díky moc za radu

Editoval jashin (16. 1. 2016 11:04)

Hurass
Člen | 114
+
0
-

Stačí přidat jen další route, úplně na konec toho pole:

new Route('/<param>', array(
    'presenter' => 'System',
    'action' => 'default',
    'module' => 'System'
)),

A v presenteru System v metodě actionDefault a renderDefault budeš mít dostupnou proměnou $param:

public function actionDefault($param) {};
public function renderDefault($param) {};
jashin
Člen | 34
+
0
-

Pokud zkusím URL: „/system/-1“

Tak to bohužel nefunguje. Hodí to no route klasicky. Pokud to, ale upravím na /system/<param> tak už se to trefí, ale přesměruje mě to na „/system?param=-1“ a to taky nechci.

CZechBoY
Člen | 3608
+
+1
-

Tak uprav tu systemovou routu a pridej tam nepovinny parametr param.

jashin
Člen | 34
+
0
-

To už je skoro ono, nefunguje to na /system/-1/dfadf např. Prostě jakoukoli URL by to mělo hitnout.

ali
Člen | 342
+
0
-

@Hurass to napsal dobre, jen si pro routu definuj match znaky

viz dokumentace

$route = new Route('<presenter>/<action>[/<id [0-9]+>]', 'Homepage:default');
jashin
Člen | 34
+
0
-

ali napsal(a):

@Hurass to napsal dobre, jen si pro routu definuj match znaky

viz dokumentace

$route = new Route('<presenter>/<action>[/<id [0-9]+>]', 'Homepage:default');

To přece neřeší můj případ, kdy to chci posílat vše na 1 presenter a akci

David Matějka
Moderator | 6445
+
+1
-

defaultni pattern pro parametry v masce je vse krom /,

takze staci upravit masku na neco jako /<param .+>

ali
Člen | 342
+
0
-

@jashin prave ze resi, kdyz si to upravis (viz @DavidMatějka), tak v presenteru budes mit jako parametr celou url, kterou uzivatel zadal..

jashin
Člen | 34
+
0
-

@DavidMatějka to je přesně ono :) Díky!