K {p/link this} přidat {p/link url}
- Bernard Williams
- Člen | 207
Nazdárek,
narazil jsem na (dle mého) ne úplně správné chování makra {plink this}. Uvedu příklad:
Nacházím se třeba na adrese domena.ltd/action/id/. Když použiji {plink this}, tak se správně ocitnu zase na stejné adrese. Co ale v případě, když se na této adrese nachází nějaká kategorie z e-shopu a já na té stránce mám formulář, který umožňuje zobrazené zboží nějak filtrovat. Po odeslání formuláře se ocitnu třeba na adrese domena.ltd/action/id/?order=cena&cena_max=10000 – zatím vše v poho. Když si ale představím, že po aplikování filtru se pořád bavíme o několika desítkách produktů, tak asi každého napadne na stránku přidat paginator a tady je právě kámen úrazu. V paginatoru mějme třeba {link this, page ⇒ $page+1}, což mě ale chybně zavede na domena.ltd/action/id/strana-2/ místo na adresu domena.ltd/action/id/strana-2/?order=cena&cena_max=10000, kterou potřebuji. Co tedy zavést makro {p/link url}, které by zohledňovalo všechny parametry v adrese?
Nebo je snad jiná možnost, jak tuto situaci elegantně řešit? Zatím musím zpracovávat všechny parametry v presenteru a pracně je podstrkávat šabloně.
Bernard
- Bernard Williams
- Člen | 207
Ne, na ty jsem nezapomněl a nepoužil jsem je záměrně. Dané třídící parametry chci pouze v daném pohledu a ne v celém Presenteru/Aplikaci.
- Bernard Williams
- Člen | 207
@vrtak-cz: Persistentní parametry znám a používám je, ale zde si opravdu myslím, že se nehodí.
Zkusím se více rozepsat a navázat to na příklad. Kdybych prodával třeba flash disky, tak bych měl adresu mujeshop.ltd/kategorie/flash-disky/ takových to stran by bylo třeba 16. Z těch všech flash disků bych chtěl zobrazit jen ty, co jsou v nějaké akci a na to bych použil právě můj formulář, který odesílá data pomocí metody GET. Adresa zobrazující flash disky by vypadala tedy mujeshop.ltd/kategorie/flash-disky/?filter=news (živý příklad). Kdybych proměnnou filter (a všechny ostatní proměnné, podle kterých můžu třídit a filtrovat) dal jako persistentní, tak v případě, že bych se najednou rozhodl, že nechci flash disk, ale raději pevné disky, tak při pokusu jít do kategorie s pevnými disky (tj. mujeshop.ltd/kategorie/pevne-disky/) bych šel na mujeshop.ltd/kategorie/pevne-disky/?filter=news !!!, kde by se uplatnily ty vaše persistentní parametry a zobrazily se jen disky v akci, ale ve výchozím stavu by se měly zobrazit všechny disky! No ne? Proto nechci a prakticky ani nemůžu použít ty persistentní parametry, protože bych si s tím jen přidělal práci. Zkrátka ty třídící a filtrovací proměnné se použijí jen na daný produkt a ne na všechny produkty/stránky/pohledy, jako se persistentní parametry používají (třeba proměnná lang). Už víte co tím myslím a co by makro {plink url} mělo dělat? Aspoň někdo? Prosím..
- Patrik Votoček
- Člen | 2221
já rozumím co tím chceš říct. a ano je to problém ale přesto se jedná o persistentní parametry. jak jinak by jsi chtěl určovat který parametr si mám pamatovat a který ne? jak v link poznám že chci přejít na jinou jinou kategorii a nechci zachovavat filtrovaci parametry? a jak rozeznat stav kdy je naopak zachovat chci?
- Bernard Williams
- Člen | 207
Cifro@: Ne, jedná se o formulář a ne signály. Dalo by se to řešit i přes signály, ale formulářem mohu zajistit nastavení více filtrů najednou (select boxy).
@vrtak-cz: Žádné určování nebo pamatování bych nemusel
definovat. Zkrátka bych použil makro {link url, „key“=>„value“} a
vygeneroval by se mi odkaz podle toho, na jaké adrese se právě
nacházím:
/flash-disky/ ⇒ /flash-disky/?key=value
popř.
/flash-disky/?filter=news ⇒
/flash-disky/?filter=news&key=value
Zkrátka by se použily všechny parametry, co se právě v adresním řádku
nacházejí a k nim by se přidaly (popř. aktualizovali) další parametry, co
v makru zadám.
@jtousek: Já to zatím řeším takhle:
<a href="{$presenter->link('this', array_merge(array('paginator-page' => $paginator->page + 1), $params))}">Další</a>
Kde $params obsahuje všechny parametry ( $this->getParam() ). Jednodušší zápis:
<a href="{link this, 'page' => $paginator->page + 1, $params}">Další</a>
nelze použít, protože makro {link} nepozná, že proměnná $params je vlastně pole parametrů.
- Patrik Votoček
- Člen | 2221
@jtousek: jednoduše nastavením persistentů na nulovou hodnotu…
@Bernard Williams: dobře a jak by jsi pak vytvořil odkaz bez těchto
„filtrovacích“ dat?
Tj.:
**/flash-disky/?filter=news* ⇒ /flash-disky/?key=value ?
- Bernard Williams
- Člen | 207
vrtak-cz napsal(a):
@jtousek: jednoduše nastavením persistentů na nulovou hodnotu…
Ono jednoduše není zas tak úplně pravda. Musel bys to ošetřit u všech odkazů vyskytujících se na stránce. Třeba v případě e-schopu CZC tady mluvíme o cca stovkách odkazech. Ano, třeba u kategorií to stačí přidat do toho cyklu, ale třeba právě CZC tam má dalších X desítek odkazů, které bys musel ošetřovat ručně a lehce se na nějaký ten odkaz zapomene.
@vrtak-cz: Bez těch parametrů by se odkaz vytvořil stejně jednoduše, jako dosud. Tj. třeba:
{plink this}
{plink Presenter:action, $id}
Pouze tam, kde bych chtěl ty filtrovací data přidávat všechna a automaticky, bych použil {plink url} (url místo this). Zbytek by udělalo Nette. Tím bych nemusel pořád myslet na persistentní parametry a nulovat je. Tím nechci tvrdit, že jsou na nic, ale na tenhle příklad se nehodí. Osobně si myslím, že by se uplatnění našlo ve více aplikacích a u více lidí, proto to tady taky píšu, jinak bych to neřešil.
Pozn. url je jen nápad, mohl by se tam použít jiný „magický“ výraz..
- Patrik Votoček
- Člen | 2221
už jsem konečně pochopil o co ti jde… jde ti o magické „url“ v „Nette Link“ formatu odkazu… který by se choval tak jak chceš ty… z toho předchozího mě to nedošlo… nicméně i tak se mě to nelíbí… „url“ působí moc kolizně…
- dakota
- Člen | 148
+1 za implementáciu, uľahčilo by to zápis odkazov pri stránkovaní a …, kde persistentne parametre nie su vhodné
označenie „url“ asi nie je vhodné pretože pri generovani odkazov sa použiva tvar
$this->link(destination [,arg [,arg ...]]);
kde „destination“ znamena nejaka konkrétna akcia – https://doc.nette.org/…n/presenters
možno by sa dalo použiť označenie „+“ na konci destination:
<a href="{link this+, 'page' => $page + 1}">ďalšia</a>
kde „+“ by znamelo že sa pri generovaní odkazu maju použiť všetky parametre z aktuálneho requestu a k nim sa maju pridať dalšie, prip. odobrať (pri nastavení parametru na NULL)
niečo podobné sa už používa pri generovaní absolutného odkazu „//destination“ a „destination!“ pri generovaní ajaxoveho odkazu
Editoval dakota (17. 10. 2010 23:06)
- David Grudl
- Nette Core | 8228
Předávat všechny parametry není principiálně vhodné, je potřeba
uvést jejich výčet (shodneme se snad na tom, že není dobré, aby aplikace,
které do URL podstrčím &hele=vole
, tohle poté vygenerovala
v odkazech). Takový výčet v tuto chvíli existuje a říká se mu
persistentní parametry.
- dakota
- Člen | 148
súhlas s tým aby sa podstrčené parametre typu &hele=vole neprenášali dalej v odkazoch
ako potom správne riešiť použitie persistentných parametrov, ktoré sa prenášajú aj do odkazov na inú akciu daneho presenteru kde nechcem aby sa prenášali /napr. pri výpise položiek/
myslim tym napr.: ak má presenter dve akcie default a detail, ak si nastavím parametre z vyhladavacieho formulára na persistent, tak sa mi tieto parametre okrem stránkovania /čo je správne/ prenášaju sa aj do odkazu na akciu detail
riešim to nastavením hodnoty parametru na null prip. nepouzivam persistentné parametre a do strankovania uvediem presny vyčet parametrov a predam ich ako pole – hlavne ked ide o väčší počet parametrov
Editoval dakota (19. 10. 2010 18:58)
- David Grudl
- Nette Core | 8228
Jsou dvě možnosti:
- nevytvářet více akcí a místo toho vytvářet více presenterů
- implementovat persistenci na úrovni akcí (tedy vytvořit a prodiskutovat RFC a ideálně dodat patch)
- mcmatak
- Člen | 504
já to teda řeším tím nulováním, např. levý výčet kategorií má vždy vynulované všechny params, ono tam sem se ještě nesetkal s tím, že by nějaké params bylo potřeba přenášet a pokud jo je to spíše vyjímečné,
u těch akcí asi bohatě by stačilo kdyby bylo vyjmenovány mezi parametry fce render
např.
renderDefault($id, $seourl, $lang)
no a tohle by se prostě automaticky přenášelo
- dakota
- Člen | 148
mcmatak napsal(a):
u těch akcí asi bohatě by stačilo kdyby bylo vyjmenovány mezi parametry fce render
např.
renderDefault($id, $seourl, $lang)
no a tohle by se prostě automaticky přenášelo
pri určovaní, ktoré parametre sa maju prenášať, by som touto cestou nešiel, neviem si predstaviť uviesť napr. 30 parametrov u funkcie
implementácia persistencie parametrov na úrovní akcií by mohla vyriešiť nechcené prenášanie parametrov na ostatné akcie presenteru, napr. zapis @persistent(default) u premennej by znamenal ze sa maju prenašať parametre iba na akciu default
ak by sa to implementovalo – problem vidim ešte v jednom – pri uplatnení filtrovacích parametrov by sa parametre prenašali napr. len na akciu default ako potom vygenerovať link na vychodzi stav (bez filtrovacích parametrov) – tu pomôže asi len to nulovanie