Nepovinné parametry na začátku route patternu

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

Ahoj,
potřeboval bych něco takovéhleho:

$router[] = new Route('[<lang>/]<presenter>[/<name>]', array(
	'lang' => 'cs',
	'presenter' => 'Default',
	'name' => 'NULL',
);

Tedy aby /neco vedlo na NecoPresenter a lang=cs a /en/neco na NecoPresenter s lang=en.

Odmysleme si, že bych v aplikaci měl EnPresenter :)

Pokud si myslíte, že je to dobrý nápad, tak zahlasujte (+1), pokud ne, tak mi řekněte, jak to elegantně vyřešit, pokud navíc s touto funkčností potřebuju víc rout.

Patrik Votoček
Člen | 2221
+
0
-

A jak by nette poznalo že /foo/bar není array('lang' => "foo", 'presenter' => "Bar") ale array('lang' => "cs", 'presenter' => "Foo", 'name' => "bar")?

redhead
Člen | 1313
+
0
-

Rozhodně by to něco takové chtělo, ale nevím jak to řešit.

Co [<lang en|sk>/]<presenter>[/<name>]? (nevím jestli je to správný zápis, routy tak často neřeším)

ales.kafka
Člen | 34
+
0
-
<?php
$router[] = new Route('[<lang [a-z]{2}>/]<presenter>[/<name>]', array(
        'lang' => 'cs',
        'presenter' => 'Default',
        'name' => 'NULL',
);
?>

By mělo fungovat jen s omezením, že presentery budou mít délku názvu rozdílnou od 2, což nejspíš není problém. Případně by šlo přímo vypsat podporované jazyky [<lang cs|en>/]

Patrik Votoček
Člen | 2221
+
0
-

btw ono to nefunguje? protože podle Docky by mělo https://doc.nette.org/…tion/routing#…

Filip Procházka
Moderator | 4668
+
0
-

Tohle přeci funguje, jenom bych možná omezil vstupní hodnoty

$langMeta = array( // použití ve více routách
	Route::VALUE => 'cs',
	Route::FILTER_IN => function ($lang) {
		return in_array($lang, array('cs', 'en')) ? $lang : NULL;
	}
);

$router[] = new Route('[<lang [a-z]{2}>/]<presenter>[/<name>]', array(
	'lang' => $langMeta,
	'presenter' => 'Default',
	'name' => 'NULL',
);
David Grudl
Nette Core | 8218
+
0
-

Bezpochyby to funguje a lze to napsat i jedním řádkem:

$router[] = new Route('[<lang=cs [a-z]{2}>/]<presenter=Default>[/<name>]');

nebo s výčtem jazyků:

$router[] = new Route('[<lang cs|en>/]<presenter=Default>[/<name>]');
Tomáš Votruba
Moderator | 1114
+
0
-

Přidávám ukázkové řešení i pro adresy typu:

// pro $lang = cs
http://neco.cz/ vs.
http://neco.cz/ukazka vs.
http://neco.cz/koupit vs.

// pro $lang = en
http://neco.cz/en/
http://neco.cz/en/preview
http://neco.cz/en/buy

Ideální by bylo http://neco.cz/en/preview bez /en/ při zachování $lang = en, ale to už je na mě moc (a frustrační tolerance pro tento týden již byla vyčerpána). Pokud víte, poraďte prosím, díky.

<?php
// bootstrap.php
Route::addStyle('#en-presenter', 'presenter');

Route::setStyleProperty('#en-presenter', Route::FILTER_TABLE, array(
	'prewiev' => 'Ukazka', // UkazkaPresener.php, dělal jsem to na českých názvech (omlouvám se), přepsat na anglické nebude problém
	'buy' => 'Koupit', // KoupitPresenter.php
));

/* přidání jazyka  cs */
$router[] = new Route('<presenter [a-z]{3,50}>/<action>', array( // tady je potřeba aby název presenteru byl větší než 2, tedy aby to detekovalo $lang, jinak jestli jde něco jako {3+}, jsem pro ;)
	"lang" => "cs",
	"presenter" => "Homepage",
	"action" => "default"
));

/* přidání jazyka en */
$router[] = new Route('en/<presenter #en-presenter>/<action>', array(
	"lang" => "en",
	"presenter" => "Homepage",
	"action" => "default"
));


// @layout / neco.latte
<a n:href="Reference:default lang => $lang" ...
?>
Filip Procházka
Moderator | 4668
+
0
-

interval od 3 do nekonečna je možné zapsat také jako {3,} :)