K {p/link this} přidat {p/link url}

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

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

mcmatak
Člen | 504
+
0
-

a nezapomněl si na persistentní parametry? to je to co hledáš ne?

Bernard Williams
Člen | 207
+
0
-

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.

Patrik Votoček
Člen | 2221
+
0
-

právě jsi přesně popsal persistentní parametry…

mcmatak
Člen | 504
+
0
-

hm to sice chápu, taky řeším podobný problém, ale smířil jsem se s tím, že jiné views prostě mají nepotřebný persistent

Bernard Williams
Člen | 207
+
0
-

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

Cifro
Člen | 245
+
0
-

A nemajú byť tie triediace parametre ako signály? Ty nemeniš celé view (to je ten celý zoznam flash diskov – jedna kategória eshopu) ale ty meniš iba časť toho view (zobrazenie iba niektorých flash disky v danej kategórii).

Patrik Votoček
Člen | 2221
+
0
-

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?

jtousek
Člen | 951
+
0
-

@vrtak-cz: No dobře, ale jak tedy řešit uvedený problém?

Bernard Williams
Člen | 207
+
0
-

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

jtousek
Člen | 951
+
0
-

@Bernard Williams:

Díky, možná to použiju až budu implementovat filtrování. :) Ale spíš by mě zajímalo vrtákovo řešení s perzistentními parametry.

Patrik Votoček
Člen | 2221
+
0
-

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

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

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ě…

hrach
Člen | 1838
+
0
-

jistě, najít jen jinou alternativu k url, která bude lepší, ale nápad je to dobrý, s tím hloupým nulováním se musel setkat každý!

dakota
Člen | 148
+
0
-

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

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

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

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)
jtousek
Člen | 951
+
0
-

Perzistence na úrovni akcí zní docela lákavě. :)

mcmatak
Člen | 504
+
0
-

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

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