(re)storeRequest po AJAXovém dotazu
- Neo
- Člen | 5
Dobrý den,
používám k plné spokojenosti NiftyGrid, ale narazil jsem na problém. Příklad grid s uživateli, kde jeden ze sloupců slouží k přepínání enabled/disabled, ajaxově, což funguje:
<?php
$this->addColumn('enabled', 'povolen')->setBooleanEditable()->setBooleanFilter()
->setRenderer(function ($row) use ($presenter) {
$img = \Nette\Utils\Html::el('img')->width(19)->height(19);
$text = ($row->enabled == 1 ) ? 'ano' : 'ne';
$img_src = ($row->enabled == 1 ) ? '/icons/enabled.png' : '/icons/disabled.png';
$img->src($presenter->template->basePath . $img_src)
->setText($text)->alt($text)->title($text);
if ($presenter->user->isAllowed('users', 'changeActive')) {
return \Nette\Utils\Html::el('a')
->href($presenter->link('changeActive!', $row->id))
->class('ajax')->add($img);
} else {
return $img;
}
});
?>
pak mám řádkovou akci na editaci, která směřuje na Presenter:action kde je formulář (storeRequest je takto mimo aby se pro každý řádek negeneroval nový backlink):
<?php
$presenterLinkName = $this->presenterLinkName;
$backlink = $presenter->storeRequest();
$this->addButton('edit')
->setLink(function ($row) use ($presenter, $presenterLinkName, $backlink) {
return $presenter->link($presenterLinkName.'edit', array($row->id, 'backlink'=>$backlink));
})
->setAjax(false)
->setIcon('ui-icon-pencil')
->setLabel('upravit záznam');
?>
Problém mám ale s tím backlinkem, když nejdříve ajaxově například vypnu uživatele a následně ho jdu upravit do formuláře, tak při návratu přes restoreRequest($backlink) je ten uživatel najednou zase zapnutý. Pokud restoreRequest odstraním a dojde na obyčejný redirect() tak je vše v pořádku.
Podezřívám tedy metodu storeRequest(), že mi uloží stav aplikace
i s tím, že došlo ke spuštění handleru a při návratu ho zavolá znovu.
Nebo jsem něco přehlédl, nebo špatně používám storeRequest()? Snažil
jsem se o tom najít a přečíst všechno na tomto fóru.
Backlink mám persistentní ve všech presenterech a pracuje v pořádku.
Přikládám ještě pro jistotu handler:
<?php
public function handleChangeActive($id) {
if (!$this->user->isAllowed('users', 'change-active')) {
$this->accessDenied();
} else {
$user = $this->model->get($id);
if (!$user) {
$this->flashMessage('Zadaný uživatel neexistuje', 'error');
} elseif ($user->roles->name == 'root' && $user->enabled && $this->isLastRoot()) {
$this[$this->gridName]->flashMessage('Nelze zakázat jediného zbývajícího roota', 'error');
} else {
$user->enabled = !$user->enabled;
if ($user->update() === false) {
$this[$this->gridName]->flashMessage('Chyba při změně záznamu, zkuste to prosím znovu.', 'error');
}
if ($this->isAjax()) {
$this[$this->gridName]->invalidateControl();
} else {
$this->redirect('list');
}
}
}
if ($this->isAjax()) {
$this[$this->gridName]->invalidateControl('flashes');
}
}
?>
P.S. Nette 2.0.10 stabilní, PHP 5.3.10