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.