Více filtrů v URL, jak napsat routu

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

Zdravím,

snažím se napsat routu, která by akceptovala tyto adresy

/
/top
/random
/abcd
/abcd/top
/abcd/random
  • abcd můžou být různé řetězce různé délky obsahující a-z
  • vždy se odkazuje na Homepage:default
  • code (abcd) a filter (random, top) jsou persistentní parametry daného presenteru

Dostal jsem se k tomuto:

Route('[<code [a-z]*>][/<filter top|random>]', 'Homepage:default');

Což funguje až na /top a /random.
Můžete prosím navrhnout opravu?
Děkuji

David Matějka
Moderator | 6445
+
0
-

problem je, ze i top a random odpovida tomu [a-z]*

ted me nenapada, jak to dat do jedny routy, ale muzes definovat 2 routy (a napadaji me 2 varianty, snad bude aspon 1 funkcni :))

$router[] = new Route('/', 'Homepage:default');
$router[] = new Route('/[<code [a-z]*>/]<filter top|random>', 'Homepage:default');

//nebo
$router[] = new Route('/[<filter top|random>]', 'Homepage:default');
$router[] = new Route('/[<code [a-z]*>][/<filter top|random>]', 'Homepage:default');
tajo
Člen | 20
+
0
-

Bohužel nefunguje ani jedno. Není schopné to vzít /abcd/top – udělá to z adresy /top?code=abcd
Kdybych měl pole řetězců, které se mohou vyskytovat v code (místo abcd), jak by se to dalo do té routy napasovat?

tajo
Člen | 20
+
0
-

Neelegantní řešení:

$router[] = new Route('[<code '.implode($codes, "|").'>][/<filter top|random>]','Homepage:default');
$router[] = new Route('<filter top|random>', 'Homepage:default');
Jan Tvrdík
Nette guru | 2595
+
0
-

Osobně nechápu, proč lidi pořád vymýšlí, jak ohnout a nakombinovat Route místo toho, aby si napsali vlastní router.

vvoody
Člen | 910
+
0
-

Ty by si chcel aby

{link Homepage:default code => top}

aj

{link Homepage:default filter => top}

vygenerovalo adresu /top?

Ak hej, tak ti nezostáva nič iné, než sa pokúsiť naprogramovať pre routeru vešteckú guľu, aby sa vedel rozhodnúť či top je hodnota parametra code alebo filter. Navrhni si to poriadne. Keď ja chcem mať viacero nepovinných parametrov v url tak ich jednoducho prefixujem. Je to potom aj oveľa krajšia a zrozumiteľnejšia url. Npr v nejakom pc eshope

/kategoria-grafiky-amd/strana-4/cena-do-200/

tak sa ti nestane že by bola niektorá url nejednoznačná.

Ascaria
Člen | 187
+
0
-

Napadá mě několik řešení:

<?php
// Asi nejprimitivnější a nejefektivnější řešení je to prohodit, mělo by fungovat i /abcd
Route('[<filter top|random>][/<code [a-z]+>]', 'Homepage:default');

// Velká písmena, ale to pak v url vypadá divně
Route('[<code [a-z]+>][/<filter Top|Random>]', 'Homepage:default');

// Potom pomlčka před filtrem aby nematchnul code, ale vznikne asi i neco jako www.web.cz-random
Route('[<code [a-z]+>][-<filter top|random>]', 'Homepage:default');

// Použití negace (vše kromě top a random), netestováno, pravděpodobně nefunkční
Route('[<code [^top|random]+>][/<filter top|random>]', 'Homepage:default');

// Dle vvoody pak neco jako.. pomlcka u filtru zajisti, aby to nematchlo code, pac to je jen a-z
Route('[<code [a-z]+>][/filter-<filter top|random>]', 'Homepage:default');
?>

Editoval Ascaria (9. 5. 2013 16:25)

tajo
Člen | 20
+
0
-

vvoody:
Ne, to jsi pochopil špatně. Pod code si můžeš představit nicky uživatelů. Na stránce se zobrazí feed příspěvků daného uživatele. Na adrese / se zobrazí příspěvky všech uživatelů.
Filter s hodnotami top|random|nic pak slouží pro určení toho, jak příspěvky ve feedu řadit (nejlepší, náhodné, nejnovější).

EDIT: Koukám na tvůj příspěvek znova. Ano, vygenerovat by obojí mělo /top. Samozřejmě, že v code nikdy nebudou hodnoty „random“ a „top“…

Ascaria:
Tyhle varianty mě také napadly. Prohození by vypadalo blbě. Negace mi nikdy nefungovala. Velká písmena, pomlčky a další věci navíc také nevypadají hezky.

Nakonec jsem to vyřešil tím, že do code explodnu všechny možnosti (viz výše). Nikdy jich nebude víc než 50, tak by to snad neměl být pro ten regexp problém.

Editoval tajo (10. 5. 2013 3:18)

Ascaria
Člen | 187
+
0
-

Jenom ještě poslední otázka, nemáš ty code třeba 2 znakovy? Že by bylo něco jako <code [a-z]{2}>

tajo
Člen | 20
+
0
-

Ascaria: Bohužel ne, ten příklad s nicky má velmi blízko realitě

Editoval tajo (12. 5. 2013 3:24)