aky je proces pri spusteni handle, Problem pri ajaxe

- duskohu
 - Člen | 778
 
Caute mam jeden mali problem pri handloch, pravdepodobne som to nepochopil uplne spravne;
Mam: komponentu do ktorej posielam model:
poslem model komponente,
do $this->taskDetail [activeRow] dam zaznam a ten poslem aj sablone
v sablone zavolam handle nastane presmerovanie na ten isty presenter a nacita
sa znovu komponenta
preda sa jej model a vytvori $this->taskDetail
spracuje handle teda zmeni status urobi redirect ked sa nejedna o ajax
poziadavok
a znovu nacita to iste ale $this->taskDetail ma uz zmeneny status
uskutocnuje sa to takto?????
a ako zabezpecit to aby mi to fungovalo aj pri ajaxe???
lebo pri ajaxovom volani mi zmena prebehne ale po invalidacii sa neprejavi
v snippete az ked urobim refresh,
predpokladam ze je to preto, lebo pri ajaxovom poziadavku to prebehne trosku
inak, ale neviem co mam zle.
viete mi poradit?
  /* Komponenta */
  public function __construct($task, $taskId)
  {
    parent::__construct();
    $this->task = $task;
    $this->taskId = taskId;
    $this->taskDetail = $this->task->findBy(array('id'=>$this->taskId))->fetch();
  }
  public function render()
  {
    $this->template->taskDetail =  $this->taskDetail;
    $this->template->render();
  }
  /* Handle */
  public function handleChange()
  {
    $this->task->updateTaskStatus($this->taskId, 2);
    if (!$this->presenter->isAjax()) {
        $this->presenter->redirect('this');
    } else {
        $this->invalidateControl('status');
    }
  }
  /* SABLONA LATTE */
  {snippet status}
  {$taskDetail->status_id}
  <a n:href="change!" class="ajax">Zmen</a>
  {/snippet}
  /* MODEL Task */ // model uvadzam len informacne, koli metode updateTaskStatus ktora meni status
  protected function getTable()
  {
    return $this->connection->table($this->tableName);
  }
  public function findBy(array $by)
  {
    return $this->getTable()->where($by);
  }
  public function findOneBy(array $by)
  {
    return $this->findBy($by)->limit(1)->fetch();
  }
  public function updateTaskStatus($taskId, $status )
  {
    $update = array('status_id'=>$status);
    $task = $this->findOneBy(array('id' => $taskId))->update($update);
  }
				
- Vojtěch Dobeš
 - Gold Partner | 1316
 
Dřív než to dočtu – co takhle to slušně zformátovat? Pokud teda právě neprogramuješ v telefonu… číst věty bez jakékoliv interpunkce, prasácky formátovaný kód a trsy otazníků dokáží touhu odpovědět spolehlivě pohřbít.

- Vojtěch Dobeš
 - Gold Partner | 1316
 
Důvod bude ten, že ty načteš data už v konstruktoru, a pak je měníš
později. Nicméně zatímco bez ajaxu proběhne redirect, při ajaxu
neproběhne a ty zůstaneš se starými daty. Načítej data až v
render metodě.
Čím méně práce v konstruktoru, tím lépe.

- duskohu
 - Člen | 778
 
Dobre keď premiestnim všetko do render(), tak ako vyriešim tento príklad, aby fungoval ajaxovo aj neajaxovo?
komponentu volám:
  public function createComponentTaskDetail()
  {
    $taskDetail = new TaskDetail();
    $taskDetail->setTaskId(10);
    $taskDetail->setTask($this->context->createTask());
    return $taskDetail;
  }
Samotná komponenta:
http://pastebin.com/z2xEVjks
Model Task:
http://pastebin.com/pswjWbVD

- Vojtěch Dobeš
 - Gold Partner | 1316
 
Důležité je, aby data byla načtena až po zpracování signálu, což
bude v metodě render.

- Vojtěch Dobeš
 - Gold Partner | 1316
 
Nastavení nějakých ID nech klidně v konstruktoru, to je ok. Proč mít prázdný konstruktor a volat parent?

- duskohu
 - Člen | 778
 
No v metode render data načitavam:
//nastavim $this->taskDetail \Nette\Database\Table\ActiveRow
$this->taskDetail = $this->task->findBy(array('id'=>$this->taskId))->fetch();
ale potom nemožem použiť v handle toto:
if($this->taskDetail->status == 2)
//ale asi budem musiet stale volat model:
$task = $this->task->findBy(array('id'=>$this->taskId))->fetch()
if($task ->status == 2)
a to isté aj vo formuláru
proste v render načítam data a pošlem šablone, a pokaždé ked budem volať
nejaké data v komponente, alebo meniť data, a budem chcieť aby boli
aktuálne tak, cez model.
Nebude to zbytočne veľká záťaž?

- Vojtěch Dobeš
 - Gold Partner | 1316
 
Protože pracuješ s poli (pokud to dobře chápu), asi nic jiného udělat
nejde. Vrať si z metody updateTaskStatus aktuální data a v
handle metodě je znovu přiřaď do šablony. Pak nebudeš muset
dělat 2 dotazy do DB.

- Vojtěch Dobeš
 - Gold Partner | 1316
 
duskohu já asi nerozumím. Ta oprava ti nefunguje? Nejde vůbec o Nette komponenty, ale o chování tvého modelu, který vrací array. Životní cyklus ke:
- konstruktor
 - handle
 - render
 
Je tedy třeba mít jistotu, že mám na správných místech správná data.

- 22
 - Člen | 1478
 
Bez znalosti životního cyklu presenteru nemá smysl se s Ajaxem v Nette pouštět vůbec do křížku.

- Vojtěch Dobeš
 - Gold Partner | 1316
 
Prostě bych udělal změnu v tom prvním kódu, co jsi poslal:
$this->taskDetail = $this->task->updateTaskStatus($this->taskId, 2);
Přičemž bych upravil tu metodu updateTaskStatus, aby vrátila
aktuální data.