aky je proces pri spusteni handle, Problem pri ajaxe

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

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

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

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

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

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

Nastavení nějakých ID nech klidně v konstruktoru, to je ok. Proč mít prázdný konstruktor a volat parent?

vvoody
Člen | 910
+
0
-

Z toho modelu by som spravil sluzbu.

duskohu
Člen | 778
+
0
-

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

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.

duskohu
Člen | 778
+
0
-

Hladal som na fóre nejaý príklad ako vyriešiť takýto príklad kde máš v komponente zakladé prvky ako šablonu, handle a formulár, a ako to riešiť aby to bežalo ajaxovo aj neajaxovo, ale neašiel som nič konkrétne. Podla mňa je to bežná vec ktorá sa často používa.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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:

  1. konstruktor
  2. handle
  3. render

Je tedy třeba mít jistotu, že mám na správných místech správná data.

22
Člen | 1478
+
0
-

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

duskohu
Člen | 778
+
0
-

živozní cyklus presenteru som si pozrel, to že data prepisujem v handle mam urobene teraz, a toto riešenie sa mi veľmi nepáči, preto sa to snažím urobiť inak, a co by mal vracaťmodel ak nie pole, keby som to chcel urobiť inak?

Editoval duskohu (10. 9. 2012 22:48)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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.