Routy s různými vstupními a výstupními parametry
- ViliamKopecky
- Nette hipster | 230
Čá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
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
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
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
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
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)