Nezachování persistentní komponenty po redirectu

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

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

jasir
Člen | 746
+
0
-

Zkus do anotace presenteru doplnit @persistent (vp).

bene
Člen | 82
+
0
-

jasir napsal(a):

Zkus do anotace presenteru doplnit @persistent (vp).

Nepomohlo. Vlastně ani nemůže, protože, jsem metodu getPersistentComponents předefinoval.

Ale zkusil jsem použít standarní zápis přes anotace (zrušil jsem předefinování metody). Stejný výsledek.

o5
Člen | 416
+
0
-

Tuhle chybu jsem jiz pred mesicem hlasil, ale bez odezvy
https://github.com/…nette/issues#…

Martin
Člen | 171
+
0
-

Mě to samé funguje po redirectu bez problémů i při @persistent (vp). PHP 5.3 Nette 2.0 dev.

duke
Člen | 650
+
0
-

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)

pekelnik
Člen | 462
+
0
-

Dnes jsem na to taky narazil… Prozatím jsem použil výše zmíněný workaround…