Routa s viac volitelnymi parametrami

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

Urcite to bolo uz riesene ale nic som nenasiel co by mi fungovalo tak ma prosim hned nepochovajte :)
Ide o toto:
Pouzivam len jeden presenter ten som vypustil z routy aby tam nesvietil:

$router[] = new Route('<action>', 'H');

Obcas predavam aj id usera teda pridal som volitelny parameter id:

$router[] = new Route('<action>[/<id>]', 'S');

Okrem id si predavam aj ine parametry ako napr. type, atp. a tu vznika moj problem ako pridat dalsi parameter. Ak spravim nieco ako toto:

$router[] = new Route('<action>[/<id>][/<type>]', 'S');

Tak to nema ziaden vplyv

Viem ze je to fakt trivialne ale netusim ako to spravit. vedeli by ste mi poradit
mod_rewrite mam povoleny
php v. 5.4.12
nette v. 2.0.13

mkoubik
Člen | 728
+
0
-

Potřebuješ aby fungovala varianta s type ale bez id? Předpokládám že ne, pak stačí routu upravit na:

$router[] = new Route('<action>[/<id>[/<type>]]', 'S');
gondro
Člen | 7
+
0
-

mkoubik napsal(a):

Potřebuješ aby fungovala varianta s type ale bez id? Předpokládám že ne, pak stačí routu upravit na:

$router[] = new Route('<action>[/<id>[/<type>]]', 'S');

Nie potrebujem aby fungovala varianta s „type“ alebo s „id“ teda nezavysle na sebe

David Matějka
Moderator | 6445
+
0
-

tak zkus

$router[] = new Route('<action>[/<id \d+>][/<type>]', 'S');
kaylo2122
Člen | 6
+
0
-

Zatím dle odpovědí ti nikdo neporadil tak aby jsi také pochopil jak to funguje takže ti sem posílám příklady a popisky k tomu jak to funguje a jak to můžeš využít.

Nezapoměn že presenter,module,action jsou víceméně předefinované klíče.

Takže pokud chceš nastavit pevnou routu s povinnými parametry URL tak bude routa vypadat takhle:

$route[] = new Route("<mujKlic>/<mujKlic1>/mujKlic2>/","MujModul:MujPresenter:MojeDefaultniMetodaPresenteru");

Takze ve výsledku aby se ti spustil modul MujModul s presenterem MujPresenter a metodou renderMojeDefaultniMetodaPresenteru(). By jsi musel přistoupit na URL adresu:

**mydomain.tld/hodnota/hodnota1/hodnota2/* následně by ti tyto hodnoty byli přístupné pod klíčema uvedenýma v routeru tzn. „mujKlic“,„mujKlic1“ a „mujKlic2“.

Pokud chceš v url používat parametry pro dynamicke volání presenterů a jejich metod dodáš do routy na začátek <presenter>/<action>/…

V případě že chceš vytvářet nepovinné parametry url obaluješ definici hranatými závorkami [ ].

$route[] = new Route("user/[<type>/][<id>/]","MujModul:MujPresenter:MojeDefaultniMetodaPresenteru"); //všimni si že první parametr nemá žádné závorky, tím omezuji okruh definice na pouze na url v které bude obstahovat domain.tld/user/ což znamená že mi to bude brát v úvahu:
 domain.tld/user/moderator/
 domain.tld/user/moderator/10/

No a v případě že to chceš vyřešit aby to nebylo závyslé na poslupnosti v url tak by router měl vypadat nějak takto:

$route[] = new Route("user/[<type [A-Za-z]+>/][<id [0-9]+>/]","MujModul:MujPresenter:MojeDefaultniMetodaPresenteru");

Zde si všimni dalších hranatých závorek v definici mezi <> ty určují za jakých podmínek je splněn daný výraz což pro klíč type znamená libovolně dlouhý řetězec složený pouze s písmen velkých či malých, id složený pouze z číslic. Pokud chceš omezit délku řetězce v url můžeš nahradit + za {5} kde 5 reprezentuje délku.

Doufám že jsem ti pomohl a poradil dostatečně na to aby jsi routování porozuměl.

gondro
Člen | 7
+
0
-

matej21 napsal(a):

tak zkus

$router[] = new Route('<action>[/<id \d+>][/<type>]', 'S');

Toto je to co som potreboval :) Dakujem

Taktiez dakujem kaylo2122 za vycerpavajucu odpoved