Routování uvnitř komponenty
- maarlin
- Člen | 207
Jsem poněkud překvapen chováním metody pro vytváření odkazů uvnitř
konkrétní komponenty.
Využil jsem VisualPaginator od Davida ke stránkování výsledků
hledání.
V URL samozřejmě předávám jeden parametr, jako výraz, který byl hledán
a samozřejmě tento výraz by se měl dále předávat v jednotlivých
odkazech na strany. Když logicky přidám do jednotlivých linků v šabloně
VP další parametr – query, vytvoří se ve skutečnosti parametr ve tvaru
%názevKomponenty%-%názevParametru%.
Tedy z následující šablony komponenty:
<a href="{link this, 'query' => $actualQuery, 'page' => $paginator->page - 1}">« přechozí</a>
vzejde toto:
<a href="/vysledky-hledani/?vp-query=aa&vp-page=2">« přechozí</a>
Aktuálně mě napadá už rovnou předávat na začátku v hledacím
formuláři vp-query, ovšem nezdá se mi to moc elegantní.
Je nějaký důvod, proč se k těm parametrům automaticky přidává ten
název komponenty?
- Ondřej Mirtes
- Člen | 1536
IMHO nemůžeš kombinovat odkaz na Presenter a zároveň na signál komponenty – můžeš vždy provést signál komponenty v rámci aktuálního view. Popiš, co potřebuješ udělat, a najdeme funkční řešení :)
- maarlin
- Člen | 207
redhead napsal(a):
Myslím že nejlepší řešení je query označit jako permanentní, jelikož ho chceš stejně posílat do všech stránek a pak už není nutno ho do link makra dávat..
Díky, to téměř vyřešilo můj problém. Jen prostě nemohu přijít na to, jak se v bootstrapu (tj. v okamžiku definování Routy) dostat nějak normálně k hodnotě toho parametru query…
- Ondřej Mirtes
- Člen | 1536
Pokud v routě definuješ nějakou změnu podoby toho parametru (že je to
třeba první úroveň ve složkové struktuře /query/presenter/action), tak to
nijak rozumně nejde. Pokud je to stále $_GET parametr (&query=obsah),
můžeš si ji vytáhnout pomocí
Environment::getHttpRequest()->getQuery('query', 'defaultValue');
.
- maarlin
- Člen | 207
Ondřej Mirtes napsal(a):
Pokud v routě definuješ nějakou změnu podoby toho parametru (že je to třeba první úroveň ve složkové struktuře /query/presenter/action), tak to nijak rozumně nejde. Pokud je to stále $_GET parametr (&query=obsah), můžeš si ji vytáhnout pomocí
Environment::getHttpRequest()->getQuery('query', 'defaultValue');
.
Rozumně nejde? $_GET parametr už to bohužel není… Existuje tedy nějaký jiný způsob, než vzetí celé URL a rozsekání dle lomítek (což je snad ten nejnespolehlivější způsob, jaký může být)?
Aktuálně mám takto napsanou routu:
$router[] = new NRoute('hledani/vysledky-hledani/<query>[/strana-<vp-page>]', array(
'presenter' => 'Hledani',
'action' => 'vysledkyHledani',
'query' => NEnvironment::getHttpRequest()->getQuery('query')
));
Opravdu není žádná šance, jak ten aktuální parametr získat zvlášť?
- Ondřej Mirtes
- Člen | 1536
Potýkal jsem se se stejným problémem při detekci jazyka a řešení neobjevil. Jde o to, že nevíš, kde ten parametr v URL hledat, protože ještě nejsou ani nadefinované routy…
Zkus tu popsat, co konkrétně ten parametr query má dělat a zkusíme vymyslet nějaké jiné řešení.
- maarlin
- Člen | 207
Parametr query je jednoduše hledaný výraz (ve smyslu hledání na webu),
který se má pak předávat i mezi jednotlivými stránkami výsledků.
Napadlo mě, že by stačilo si trochu poupravit, resp. přetížit NRoute tak,
aby se jednotlivé parametry daly definovat zvlášť pomocí nějakých
setterů. Potom by se daly jednoduše zvlášť nastavit metadata (i query) až
v okamžiku, kdy bych měl k dispozici přes nějaký getter i tu aktuální
hodnotu query.
Asi takto:
$newRoute = new NRoute('hledani/vysledky-hledani/<query>[/strana-<vp-page>]');
$newRoute->setMetadata(array(
'presenter' => 'Hledani',
'action' => 'vysledkyHledani',
'query' => $newRoute->getParam('query')
));
$router[] = $newRoute;
- Ondřej Mirtes
- Člen | 1536
A k čemu potřebuješ ten parametr vědět ještě před definicí rout?
Koukám do tvého prvního příspěvku a uvědomuju si, že vůbec takhle ten link nemusíš uvádět, protože všechny parametry Presenteru zůstanou zachovány, stačí jen uvést novou stránku.
<a href="{link this, 'page' => $paginator->page - 1}">« přechozí</a>
Tohle ti nezachová stávající parametry z Presenteru?
Jde o to, aby to $query byl persistentní parametr toho tvého SearchPresenteru (nebo jak se jmenuje) či aby to byl parametr actionu (renderDefault($query)).
Editoval Ondřej Mirtes (26. 1. 2010 22:27)