Nezachování persistentní komponenty po redirectu
- bene
- Člen | 82
Narazil jsem na takovou zvláštnost.
mám definováno:
public static function getPersistentComponents()
{
return array_merge(parent::getPersistentComponents(), array('vp'));
}
public function createComponentVp()
{
return new VisualPaginator($this, 'vp');
}
Při přejití do editace a navrácení zpět se mi číslo stránky zachová.
Problém ale je když provedu redirect. Číslo stránky se neuchová.
public function actionDelete($id, $_token)
{
$customer = CustomerRow::m()->get($id);
$customer->destroy();
$this->flashMessage(sprintf("Zákazník '%s' byl úspěšně smazán.", $customer->name));
$this->redirect('default');
}
Problém se ale vyřeší, pokud před redirectem komponentu zavolám.
public function actionDelete($id, $_token)
{
$customer = CustomerRow::m()->get($id);
$customer->destroy();
$this->flashMessage(sprintf("Zákazník '%s' byl úspěšně smazán.", $customer->name));
$this['vp']; // abych po redirektu zachoval aktualni cislo stranky
$this->redirect('default');
}
U persistentích parametrů mi to nedělá.
Jedná se o chybu nebo něco dělám špatně?
php: 5.2.6, nette 0.9.6
- o5
- Člen | 416
Tuhle chybu jsem jiz pred mesicem hlasil, ale bez odezvy
https://github.com/…nette/issues#…
- duke
- Člen | 650
Také jsem na tento problém narazil, a dospěl jsem k závěru, že jde o to, že při vytváření url pro redirekt (nejspíš ale i v ostatních případech) se berou v potaz jen již instanciované komponenty, nikoli všechny (tj. nikoli ty, které se vytvářejí přes továrničku lazy způsobem). Jako workaround funguje před redirekcí (resp. před prvním generováním linku) všechny persistentní komponenty instanciovat. Otázka je, zda by to neměl dělat framework automaticky, protože pokud neinstancuje persistentní komponentu, komponenta v podstatě přestává být persistentní.
Jinak co se týče použití anotace persistent() a statické metody getPersistentComponents, tak jediný rozdíl vidím v tom, že anotace se nedědí, takže je třeba je opakovat u všech potomků.
EDIT: Tak jsem zjistil, že framework to automaticky dělá (metodou saveGlobalState), ale dělá to až mezi voláním afterRender() a sendTemplate(), čili se to projeví pouze v šabloně presenteru, a nikoli v redirektech iniciovaných z action metod. Prozatím to tedy řeším následující metodou v BasePresenteru:
public function redirect($code, $destination = NULL, $args = array())
{
$this->saveGlobalState(); // fix of issue #21 (https://github.com/nette/nette/issues/21)
call_user_func_array('parent::redirect', func_get_args());
}
Editoval duke (4. 12. 2011 17:06)