Routování uvnitř komponenty

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

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?

Ani
Člen | 226
+
0
-

Tohle by měl řešit plink místo link.

Ondřej Mirtes
Člen | 1536
+
0
-

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í :)

redhead
Člen | 1313
+
0
-

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..

maarlin
Člen | 207
+
0
-

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

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

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

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

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

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)

maarlin
Člen | 207
+
0
-

Ondro, díky, nevěděl jsem o možnosti nastavit ten persistentní parametr přes jméno proměnné… :)