Routy s různými vstupními a výstupními parametry

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

Částečně přeneseno z jiného vlákna.

Honza M. napsal(a):

enoice napsal(a):

Já chci pořešit

  • Routy s různými vstupními a výstupnímmi parametry (jak jsem ti (Davide) o tom říkal na narozkách Honzy Tichýho)

Co to je?

Řekněme že máš routu kterou zapíšeš třeba jenom jako <seouri> čili 1 vstupní parametr, ale Routa by ti měla umožnit nějaký callbacky třeba na model, kterej by ti vrátil výstupní parametry – například id a lang, případně i action nebo Presenter (a samozřejmě i opačně). Na první pohled se může zdát, že tohle se s aktuálníma Routama udělat dá, ale obávám se, že opravdu nedá :)

Ukázka teoretické funkcionality:

/*
 * Tabulka pro představu

 (id) | (article_id | lang) | text
+-----+-------------+-------+-----+
 1    | 1           | cs    | ...
 2    | 1           | en    | ...
 3    | 2           | cs    | ...
 4    | 1           | de    | ...

*/

function uriIn($route) {
	// paramsOut obsahují parametry z Url
	$uri = $route->paramsOut["seouri"];
	$result = dibi::query("SELECT [article_id], [lang] FROM [articles] WHERE [uri]=%s", $uri)->fetch();
	// paramsIn nastavujeme parametry pro aplikaci
	$route->paramsIn["lang"] = $result["lang"];
	$route->paramsIn["id"] = $result["article_id"];
}

function uriOut($request, $route) {
	// naopak bereme parametry aplikace a překládáme je do parametrů pro složení url
	$lang = $route->paramsIn["lang"];
	$id = $route->paramsIn["id"];
	$uri = dibi::query("SELECT [uri] FROM [articles] WHERE [article_id]=%i AND [lang]=%s", $id, $lang)->fetchSingle();
	$route->paramsOut["seouri"] = $uri;
}

$route = new ExtendedRoute("<seouri>", array(
	"presenter" => "Articles",
	"action" => "default",
));

// callback se zavolá uvnitř Route::match()
$route->translateParamsIn[] = "uriIn";

// callback se zavolá uvnitř Route::constructUrl()
$route->translateParamsOut[] = "uriOut";

// MultiRouter
$router[] = $route;

Editoval enoice (22. 10. 2009 8:30)

Honza Marek
Člen | 1664
+
0
-

Já teď mám vlastní router, který z adresy rozpozná jazyk, presenter (Homepage/Page) a id stránky. Předpokládám, že tato vlastnost by to uměla vyřešit, takže jsem rozhodně pro. Jenom se trochu ztrácím v názvosloví, co je out a in, tak nad tím bych ještě popřemýšlel.

ViliamKopecky
Nette hipster | 230
+
0
-

Názvosloví taky nemám ujasněné (teď při psaní jsem to nějakolikrát přejmenoval:)… Ale jak znám Davídka, tak on si vezme myšlenku a implementuje to trošku jinak – lépe.

Jan Tvrdík
Nette guru | 2595
+
0
-

Nad něčím takovým jsem taky uvažoval, ale ještě jsem se nedostal k tomu, abych si to napsal.

David Grudl
Nette Core | 8229
+
0
-

Pokud by ten vstupně/výstupní filtr byl specifický vždy jen pro jednu routu, je pak otázka, zda neudělat rovnou konkrétní routu. Tj. metody uriIn() a uriOut() je potřeba stejně někam dát, takže si mohu vytvořit rovnou třídu MySpecRoute extends Route a do ní obě metody dát už v podobě přepsání metod match() a constructUrl(). Ty zavolají rodiče a poté modifikují PresenterRequest.

ViliamKopecky
Nette hipster | 230
+
0
-

David Grudl napsal(a):

Pokud by ten vstupně/výstupní filtr byl specifický vždy jen pro jednu routu, je pak otázka, zda neudělat rovnou konkrétní routu. Tj. metody uriIn() a uriOut() je potřeba stejně někam dát, takže si mohu vytvořit rovnou třídu MySpecRoute extends Route a do ní obě metody dát už v podobě přepsání metod match() a constructUrl(). Ty zavolají rodiče a poté modifikují PresenterRequest.

Tak jsem to udělal… respektive jsem vše zkopíroval, a přidal asi čtyři (ono jich je o trochu víc, tak 30) řádky. Ono jde o to, že jsem nechtěl přijít o ty užitečné vlastnosti které se v match() a constructUrl() provádějí. Pošlu ti to radši mailem, tady se mi to nechce ukazovat.

Jinak – ano, pak jsem si jednotlivý routy dědil od téhle.

Editoval enoice (22. 10. 2009 16:44)