Komponenta sa vytvara pred volanim metody startup v presenteri

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

Ahoj, narazil som na celkom závažný problém, keď mám komponentu v presenteri, ktorý je prístupný len prihláseným užívateľom V metóde startup si jednoducho overím, či je užívateľ prihlásený a ak nie, presmerujem ho preč.

Táto komponenta je závislá na identite užívateľa, takže keď príde neprihlásený užívateľ, vôbec by sa nemala vďaka startup metóde v presenteri vytvoriť. Tu som sa dočítal, že vytváranie komponenty je nezávislé od flow presentera, takže startup tomu nezabráni.

Moja otázka je, ako preniesť metódu startup presentera aj do procesu vytvárania komponenty, prípadne iný spôsob, ako tento problém ošetriť, vďaka za pomoc.

ViPEr*CZ*
Člen | 817
+
0
-

Komponenta pokud vím se vytváří ve chvíli kdy je vyžadována. Tedy až tehdy, kdy je opravdu potřeba se zavolá továrna komponenty. Je možné vidět nějaký kód co přesně to dělá a co od toho požadujete?

sabrx
Člen | 47
+
0
-

Myslel som si to tiež, ale podľa vzniknutej chyby to tak asi nebude.

Takže mám SecuredPresenter, v ktorom mám túto metódu startup:

protected function startup() {
    parent::startup();

    if (!$this->getUser()->isLoggedIn()) {
        $this->redirect('Signin:');
    }

    $this->lang = null; // stored in session for signed users
}

Potom mám TaskPresenter (dedí od SecuredPresenter), a v ňom túto metódu:

protected function startup() {
	parent::startup();
	// ďalší kód
}

Mám tu takisto zmieňovanú komponentu:

protected function createComponentTaskList() {
	return new TaskList($this->taskList, $this->tasklistModel, $this->taskModel, $this->displayList);
}

Komponentu potom vykreslujem v šablóne k jednej z akcií TaskPresenter, lenže tá by vôbec nemala nastať, keď je užívateľ odhlásený. Myslel som si, že komponenta sa vytvára až vo chvíli, keď na ňu Nette narazí pri renderovaní šablóny.

Jan Endel
Člen | 1016
+
0
-

Klikatelná laděna by byla mnohem lepší ;).

sabrx
Člen | 47
+
0
-

Jan Endel napsal(a):

Klikatelná laděna by byla mnohem lepší ;).

Dufam, ze staci takto

Tomáš Votruba
Moderator | 1114
+
0
-

@sabrx: Doporučuji vyzkoušet Nette Bluescreen Cloud

ViPEr*CZ*
Člen | 817
+
0
-

sabrx napsal(a):

Jan Endel napsal(a):

Klikatelná laděna by byla mnohem lepší ;).

Dufam, ze staci takto

Jsme pohodlný… nestačí. To vypadá, že se někde pokoušíte přistoupit k té komponentě. V té laděnce by to mohlo být vidět, když se prokliká kude se to dostane k volání té továrny komponenty. ;-)

sabrx
Člen | 47
+
0
-

@Schmutzka: vdaka, rychle a pohodlne, tu je odkaz: http://ladenka.juzna.cz/…a7c29cdb459d

ViPEr*CZ: ked sa subor otvori v prehliadaci ako stranka, da sa tam klikat, je to to iste ako vyssie uvedeny odkaz. Ak som vas nepochopil, prosim objasnite.

Editoval sabrx (10. 4. 2013 20:51)

David Matějka
Moderator | 6445
+
0
-

problem je v tom, ze uzivatel chtel provest nejakou akci v komponente (taskList-markUndone). najednou ale nebyl prihlasen, coz zjistil SecuredPresenter a presmeroval uzivatele na prihlaseni. nette pri redirectu uklada stav komponent a kvuli tomu ji inicializuje. nedavno jsem se tim setkal, ale nevim, jestli jsem to vubec nejak resil. ted me napada tohle:
v SecuredPresenter jak mas $this->redirect('Signin:'); zkus dat misto toho

$this->redirectUrl($this->link("Signin:"));

pri $this->link() by se totiz stav pres saveGlobalState ukladat nemel a tudiz by nemelo dojit k vytvoreni komponenty

sabrx
Člen | 47
+
0
-

@matej21: perfektne, vdaka! Doteraz som vobec nevedel, ze to tak funguje, a to som si myslel, ze uz o Nette nieco viem. Holt, vzdy je sa co ucit :-)