Znovunačtení widgetu a zachování parametru

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

Mám galerii, která vykresluje jeden obrázek z pole, které je předáno widgetu jako parametr

GaleriePresenter.phtml

<?php
{var pictures[] => 'obrazek1.jpg'}
{var pictures[] => array('src'=>'obrazek2.jpg','alt'=>'Obrázek 2','title'=>'Ilustrační obrázek 2')}
@{widget gallery $pictures,'test'}
?>

pod tímto obrázkem vykresluji odkaz na další obrázky z pole

<?php
$this->link('//switch!',0);
$this->link('//switch!',1);
?>

A obsuhuji to jednoduchým handlerem

<?php
public function handleSwitch($index){
    $this->setIndex($index);
}
?>

Všechno krásně funguje a obrázky se přepínají jak mají. Akorát v URL zůstávají parametry.
Jakmile však do handleru dám

<?php
public function handleSwitch($index){
    $this->setIndex($index);
    $this->redirect('this');
}
?>

Tak se mi vždy zobrazí jen první obrázek a přestane fungovat přepínání. Chápu to tak, že se nejprve vykreslí to správné, pak se provede redirect s výchozím nastavením.

Jak tedy dosáhnout redirectu tak, aby widget měl svůj parametr a zároveň nebyl vidět v URL a to celé bez Ajaxu? Jde to vůbec?

2bfree
Člen | 248
+
0
-

Jinými slovy $this->invalidateControl() způsobí bez ajaxu znovunačtení celé stránky?

bojovyletoun
Člen | 667
+
0
-

Dle důležitosti:

  1. osobně bych nepoužíval signály k tomuto účelu.(pak nemusíš řešit 2) Protože to je spíš nějaký pohled, který je pořád stejný. Opakované volání pohledu dává smysl. Tedy metodu render($id).Naproti tomu signál je třeba smazání fotky. To je signál, který „něco udělá“, odešle formulář, smaže fotku. Opakované smazání „stejné“ fotky nedává smysl. Je to jakási analogie mezi get a post
  2. Redirect není nutný. (protože obsluha signálu je před renderem viz). Tedy spíš je na závadu. Tím ztratíš ten parametr.

Pokud přesto to chceš řešit přes signál, je to možné, ale špatné řešení, že explicitně předáš parametr při redirectu: …redirect(‚this‘,‚index‘=>$index)

a nebo označit parametr jako persistentní na začátku třídy. Tím odpadne this->index=$index a navíc se právě parametr předá při redirectu, což je o něco lepší řešení.

  1. kosmetická.
public function handleSwitch($index){
    $this->setIndex($index); // zbytečné. Pokud  má komponenta property index (navíc @persistent), a volá se handleXy($index) tak se přiřadí automaticky.
  1. zůstává v url--- Nějak se musí rozlišit, který obrázek vykreslit. Url je jedno z možných úložiští. místo toho lze lze třeba užít DB, session, ale proč?
  2. pracuješ s ajaxem nebo bez?

Editoval bojovyletoun (30. 12. 2010 23:36)