Vsvětlení fungování routy / redirect

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

Ahoj
S nette sem v úplných začátcích a tak nějak sem se zaseknul při redirectu. Udělal sem si svůj formulář (Všechno co nejjednodušeji jen kvůli pochopení jak to funguje).

protected function createComponentMainForm() {
        $form = new Form;
        $form->addText("name", "jméno");
        $form->addSubmit("odeslat");
        $form->onSuccess[] = array($this, 'mainFormSucceeded');
        return $form;
}

public function mainFormSucceeded() {
        $this->redirect("Test:");
}

To je HomepagePresenter. Vytvořil sem si pak ve stejný složce TestPresenter a v templates složku Test, do ní sem nakopíroval default.late z Homepage a jen změnil aby něco vypsal.
Problém je že zaboha nemužu přijít na to jak nasměrovat to přesměrování na tu Test stránku

V RouteFactory mám jako poslední pokus

public static function createRouter() {
        $router = new RouteList;
        $router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
        $router[] = new Route('<presenter>/<action>[/<id>]', 'Test:default');
        return $router;
}

S tím že když přehodím pořadí tak to místo formuláře zobrazí tu Test stránku, ale když se zavolá metoda mainFormSucceeded() tak to vyhodí že stránku nemůže najít.

V dokumentaci sem to tak nějak nepobral, určitě to bude triviální, ale nějak to nemužu pobrat, a případnou pomoc předem dík

Felix
Nette Core | 1247
+
0
-

Nejdrive, super ze ses rozhodl pro Nette. :-)

Ohledne routovani, jdes na to trochu blbe, ale to nevadi. Trochu ocituju dokumentaci


Viz: https://doc.nette.org/…tion/routing

// výchozí akcí bude presenter Homepage a akce default
$route = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

Uvedená routa je použitelná pro libovolné presentery a akce. Akceptuje cestu např. ve tvaru /article/edit/10 nebo také /catalog/list, protože část s parameterem id je uzavřena do hranatých závorek, čímž říkáme, že je nepovinná.


Tzn, kdyz chces obecnou routu, pro jakykoli presenter a jeho akci, tak pouzijes

$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

Pokud chces nejakou konkretni, treba pro vypis poslednich clanku, tak napriklad takto

$router[] = new Route('posledni-clanky', 'Article:latests');

// Tuhle tady porad mas, jenom aby fungovali i ostatni, napriklad Home:default (homepage apod)
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

Dulezita vec!

Routy vzdy radime od nejslozitejsi/nejkonkretnejsi po nejobecnejsi. Je to z duvodu toho, ze ktera routa projde jako prvni, tak se pouzije. Takze kdyz das obecnou routu

$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

jako prvni, tak vsechny ostatni ti nebudou fungovat.

Snad jsem to obsahl vsechno :-)

Editoval Felix (12. 11. 2015 21:08)

David Matějka
Moderator | 6445
+
+1
-

tak to vyhodí že stránku nemůže najít.

co to konkretne vyhodi? nejakou chybu od nette, nebo chybu apache?

pokud od nette, tak zkontroluj, jestli mas presenter na spravnem miste (ve slozce app) a jestli ma spravny namespace.

pokud od apache, tak

  • zkontroluj, ze mas povoleny mod rewrite
  • zkontroluj, zda mas povoleno AllowOverride All
Jerry
Člen | 9
+
0
-

Aaaha, sem to celou dobu chápal blbě, teď už to dává větší smysl :-).
Nicméně stále se mi tak nějak nedaří to poskládat aby mě to po zavolání

public function mainFormSucceeded() {
        $this->redirect("Test:");
}

v presenteru přesměrovalo na tu Test stránku.

Jerry
Člen | 9
+
0
-

David M. rewrite mám povolený, AllowOverride All taky mám. Stále mi to hlásí klasický 404.
The requested URL /blabla/www/test/ was not found on this server.