Translation table + WTF

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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

Filip Procházka
Moderator | 4668
+
0
-

Takže odpověď je „vlastní router“. Ok

PetrP
Člen | 587
+
0
-

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
+
0
-

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 | 7790
+
0
-

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
+
0
-

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
+
0
-

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í?

Aurielle
Člen | 1281
+
0
-

Na to si buď napiš FILTER_IN/OUT který bude dělat to, co ti teď dělá filter table, nebo si přepiš routy… Nette nemůže vědět, jestli URL ve tvaru registrace/action spadá pod první nebo druhou routu, pokud nepoužiješ zmíněný výčet nebo filtrovací funkci.

jansfabik
Člen | 193
+
0
-

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.

Aurielle
Člen | 1281
+
0
-

Jenže filtrovací tabulka filtruje zadané styly pouze tehdy, jsou-li přítomny a nastaveny, nefunguje jako filtr v pravém slova smyslu. Tebou navrhovaná úprava je přesně to, co dělá FILTER_IN/OUT.

Matúš Matula
Člen | 248
+
0
-

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
+
0
-

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)