Translation table + WTF
- Filip Procházka
- Moderator | 4668
Zdravim,
louskali jsme na chatu záhadu a přišli jsme na zajimavou věc.
Tohle matchne :
Route::setStyleProperty('presenter', Route::FILTER_TABLE, array(
'uzivatele' => 'Users'
));
$router[] = new Route('<presenter uzivatele>/<user>', array(
'action' => 'default',
'user' => null
));
ale tohle už ne
Route::setStyleProperty('presenter', Route::FILTER_TABLE, array(
'uzivatele' => 'Users'
));
$router[] = new Route('<presenter Users>/<user>', array(
'action' => 'default',
'user' => null
));
Nejenom mně se to zdá dost WTF. Co když budu chtít mít několik překladových tabulek a jenom výčet povolených presenterů? to budu muset mít milion rout. Na lepší řešení jsme nepřišli, pokud někdo ví jak nato správně tak sem s tím prosím :)
//Edit: samozřejmě nám jde o to aby to matchlo například „/uzivatele/franta“ ale abych prostě mohl napsat původní název presenteru
Editoval HosipLan (3. 1. 2010 1:13)
- Jan Tvrdík
- Nette guru | 2595
Musíš si uvědomit, že píšeš regulární výraz pro část URL nikoliv
pro název presenteru. Tento regulární výraz už není dále filtrován či
překládán. Pro více povolených variant lze použít znak |
(např. <presenter uzivatele|neco dalšího>
).
- Ondřej Mirtes
- Člen | 1536
Chování je naprosto logické, ale možná by to s ním chtělo něco udělat, aby se to k programátorovi chovalo přívětivěji a umožňovalo i opačný zápis, tedy pravou stranu pole (hodnoty) z překladového slovníku.
- Filip Procházka
- Moderator | 4668
Ano to vím a proto se ptám jak to vyřešit abych si mohl určit presentery pro routu a zároveň mi fungovala translation table
- PetrP
- Člen | 587
nebo použít překladový slovník trochu jinak:
Route::setStyleProperty(
'presenter',
Route::FILTER_OUT,
callback('HezkeUrl::getPresenterTranslation')
);
Route::setStyleProperty(
'presenter',
Route::FILTER_IN,
callback('HezkeUrl::getPresenterName')
);
class HezkeUrl
static function getPresenterName($translation)
{
if ($translation === 'uzivatel') return 'User';
return NULL;
}
A když ti ty metody vrátí NULL
tak se routa nematchne (lze
dělat jen na povinné parametry)
- romansklenar
- Člen | 655
HosipLan napsal(a):
Nejenom mně se to zdá dost WTF.
Ano taky jsem na to teďkom narazil a očekával jsem, že se to bude chovat opačně… ale tak profarané to routování bohužel není :(
- David Grudl
- Nette Core | 8218
Jestli to dobře chápu, problém je v tom, že překladová tabulka nefunguje jako filtr, tj. pokud překlad existuje, přeloží se, pokud neexistuje, bere se původní hodnota. Taky mě to překvapilo :-) Bylo by tedy vhodnější implementovat předkládací tabulku podobně jako funguje filtrovací callback?
- dakota
- Člen | 148
David Grudl napsal(a):
Jestli to dobře chápu, problém je v tom, že překladová tabulka nefunguje jako filtr, tj. pokud překlad existuje, přeloží se, pokud neexistuje, bere se původní hodnota. Taky mě to překvapilo :-) Bylo by tedy vhodnější implementovat předkládací tabulku podobně jako funguje filtrovací callback?
som za, aby FILTER_TABLE fungoval ako filter
EDIT: prip. aby sa to dalo nastaviť či to ma fungovať ako filter alebo nie
Editoval dakota (1. 12. 2010 16:44)
- jansfabik
- Člen | 193
Bude se to ještě řešit?
Pokaždé, když používám Route::FILTER_TABLE
, tak musím
dát do regulárního výrazu všechny možné části URL, aby routa
„neodchytávala“ to, co nemá. Když je těch překládaných hodnot víc,
tak je to nepřehledné a špatně se to upravuje.
Vysvětlím to na příkladu:
// regulární výraz je nutný, aby šla používat druhá routa
$router[] = new Route('<presenter registrace|prihlaseni|profil|vyhledavani|kontakt>/<action>[/<id>]', array(
'presenter' => array(
Route::FILTER_TABLE => array(
'registrace' => 'Register',
'prihlaseni' => 'Login',
'profil' => 'Profile',
'vyhledavani' => 'Search',
'kontakt' => 'Contact',
),
),
'action' => 'default'
));
$router[] = new Route('<article>/<action>', 'Article:default');
Zatím jsem se nesetkal s tím, že bych použil filtrovací tabulku a očekával, že projdou i hodnoty, které v tabulce nejsou. Nebylo by lepší, kdyby ta tabulka byla opravdu filtrovací?
- jansfabik
- Člen | 193
No právě, že by mohlo. RouteList
zkusí použít nejprve tu
první, a teprve pokud by vrátila NULL
, tak by teprve zkoušel
použít tu druhou routu.
Takhle to funguje teďka: (viz API)
if (isset($meta[self::FILTER_TABLE][$params[$name]])) {
$params[$name] = $meta[self::FILTER_TABLE][$params[$name]];
}
Myslím, že takhle by to bylo mnohem intuitivnější:
if (isset($meta[self::FILTER_TABLE])) {
if (isset($meta[self::FILTER_TABLE][$params[$name]])) {
$params[$name] = $meta[self::FILTER_TABLE][$params[$name]];
} else {
return NULL; // not matched
}
}
Obdobně by se pak musela upravit i konstrukce URL.
- Matúš Matula
- Člen | 257
tiez sa priklanam k nazoru uzivatela @jansfabik. Jasne, ze sa to da napisat pomocou FILTER_IN/OUT, ale FILTER_TABLE by bola pekna skratka. Osobne som tiez ocakaval, ze to bude fungovat ako ozajstny filter, takto implementovane je to pre mna nelogicke a radsej to nepouzivam =)
- frosty22
- Člen | 373
Sice chování FILTER_TABLE je z části tedy matoucí, vzhledem k tomu, že v názvu je FILTER, na druhou stranu se i toto chování dá občaně využít, čili bych spíše než-li přetvořit ono chování přidal další možnost:
FILTER_TABLE,
TRANSLATE_TABLE
Pouze tady by byl trošku problém v pojmenování VS zpětná kompatibilita
Editoval frosty22 (16. 8. 2011 9:32)