Přesměrování z presenteru obsahující komponentu NiftyGrid

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

Dobrý den,
při programování jsem narazil na takovou podivnost. Při přesměrování nepřihlášeného uživatele z adresy

presenter/action/?shortNewsGrid-order=title+ASC&shortNewsGrid-perPage=50

dojde k chybě, protože se zavolá konstruktor datagridu (NiftyGrid) s nulovými argumenty.

Přesměrovávám, myslím standartně:

protected function startUp()
    {
        parent::startup();
        if (!$this->user->isLoggedIn()){
            $this->redirect('Sign:default');
        }
    }

Vytváření komponenty mám takovéto:

/**
     * Creates component ShortNewsGrid
     * @return ShortNewsGrid
     */
    protected function createComponentShortNewsGrid()
    {
        return new ShortNewsGrid($this->shortNewsList, $this->shortNewsRepository);
    }

Proč se volá konstruktor datagridu před vlastním přesměrováním, když přesměrovávám už v metodě startup, a jak to potlačit?

Děkuji všem za radu.

Filip Procházka
Moderator | 4668
+
0
-

A odkud se ty dvě vlastnosti toho presenteru vezmou? Kde je plníš?

duke
Člen | 650
+
0
-

sinner napsal(a):

Proč se volá konstruktor datagridu před vlastním přesměrováním, když přesměrovávám už v metodě startup…

Protože u redirekce (tj. volání Presenter::redirect) převod 'Sign:default' na cílové url počítá také (skrz volání Presenter::saveGlobalState) s persistentními komponentami, ve kterých mohlo před voláním metody redirect dojít ke změně. To, jak je to v Nette řešeno, nejspíš také souvisí s kanonickými url.

sinner napsal(a):
…, a jak to potlačit?

Možná pomůže nahradit toto:

$this->redirect('Sign:default');

tímto:

$this->redirectUrl($this->link('Sign:default'));

Pokud to pomůže, je otázka, zda je toto chování Nette korektní…

sinner
Člen | 20
+
0
-

Filip Procházka napsal(a):

A odkud se ty dvě vlastnosti toho presenteru vezmou? Kde je plníš?

protected function startup()
{
    parent::startup();
    ....
    $this->shortNewsRepository = $this->context->shortNews;
    ...
}

public function actionShortNews()
{
    $this->shortNewsList = $this->shortNewsRepository->getAll();
}

duke napsal(a):

sinner napsal(a):
…, a jak to potlačit?

Možná pomůže nahradit toto:

$this->redirect('Sign:default');

tímto:

$this->redirectUrl($this->link('Sign:default'));

Pokud to pomůže, je otázka, zda je toto chování Nette korektní…

Pomohlo díky moc