Více filtrů v URL, jak napsat routu
- tajo
- Člen | 20
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) afilter
(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
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');
- Jan Tvrdík
- Nette guru | 2595
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
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
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
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)