NEdokážu nastavit správné routování pro požadovaný typ adresy
- fary
- Člen | 155
Ahoj, asi jsem zaostalej, ale já prostě nechápu to routování. Proto jsem se tedy rozhodl napsat sem a zeptat se.
Mám třídy: HomepagePresenter a ArticlesPresenter
Mám šablny: templates/Homepage/default.latte, templates/Articles/default.latte
a templates/Articles/detail.latte
A teď k tomu routování. V bootstrapu jsem si nastavil:
// Set routers
$router = new RouteList();
$router[] = new Route('articles/<action>', 'Articles:default');
$router[] = new Route('<presenter>/<action>', 'Homepage:default');
$container->addService('router', $router);
Vůbec nevím, jak to udělat, abych měl adresu ve tvaru: http://aplikace/articles/detail
Podle dokumentace prostě nejsem schopen tohle dát dohromady.
- jiri.pudil
- Nette Blogger | 1029
Tohle by mělo být správně. V tvém případě by měla dokonce stačit jen jedna routa:
$router[] = new Route('<presenter>/<action>', 'Homepage:default');
Takže co přesně je špatně? V jakém tvaru tu adresu máš?
- BigCharlie
- Člen | 283
Pro tebou popsaný případ bude stačit tohle:
$router = new RouteList();
$router[] = new Route('<presenter>/<action>', 'Homepage:default');
To tvoje by mělo taky fungovat, ale první routu tam máš navíc (totéž odchytne druhá).
Co to znamená? Za <presenter>
se vždy dosadí jméno
požadovaného presenteru (v tvém případě tedy buď articles
nebo homepage
), za <action>
pak akce (tj. u
Homepage
máš default
, u Articles
pak
buď default
nebo detail
).
Co to znamená dosadí jméno presenteru? Pokud přistoupíš na
adresu http://aplikace/articles/detail, routa pozná, že se ptáš
na presenter Articles
, akci detail
(zkráceně
Articles:detail). A obráceně, pokud v šabloně někde odkážeš na
Articles:detail, vygeneruje se odpovídající adresa.
Co znamená to Homepage:default
v routě? To je prostě
výchozí kombinace presenter:action, tj. co se má provést pokud vlezeš
na http://aplikace/
Co ti dál pomůže:
- dokumentace
- Pandova přednáška o routování
- vlastní pokusy a routing debugger
edit: jiri.pudil: nojo, jsem ukecanější :-)
Editoval BigCharlie (5. 6. 2013 20:47)
- fary
- Člen | 155
Nechápu, co dělám špatně.
Ve třídě HomepagePresenter mám:
<?php
/**
* Homepage presenter.
*/
class HomepagePresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->my_var = 'HomepagePresenter';
}
public function actionDefault()
{
$this->template->my_var = 'HomepagePresenter::actionDefault()';
}
}
Ve třídě ArticlesPresenter mám:
<?php
/**
* Articles presenter.
*/
class ArticlesPresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->my_var = 'ArticlesPresenter';
}
public function actionDefault()
{
$this->template->my_var = 'ArticlesPresenter::actionDefault()';
}
public function actionDetail()
{
$this->template->my_var = 'ArticlesPresenter::actionDetail()';
}
}
V šabloně templates/Homepage/default.latte mám:
{block content}
<h1>{$my_var}</h1>
V šabloně templates/Articles/default.latte mám:
{block content}
<h1>{$my_var}</h1>
V šabloně templates/Articles/detail.latte mám:
{block content}
<h1>{$my_var}</h1>
A routy jsem si nastavil podle vašich rad na:
$container->router = new Nette\Application\Routers\Route('<presenter>/<action>', 'Homepage:default');
Moje představa je ta, že:
když zadám „http://aplikace/“ tak se mně zobrazí nadpis
„HomepagePresenter“
když zadám „http://aplikace/homepage/default“ tak se mně zobrazí nadpis
‚HomepagePresenter::actionDefault()‘
když zadám „http://aplikace/articles/“ tak se mně zobrazí nadpis
‚ArticlesPresenter‘
když zadám „http://aplikace/articles/default“ tak se mně zobrazí nadpis
‚ArticlesPresenter::actionDefault()‘
když zadám „http://aplikace/articles/detail“ tak se mně zobrazí nadpis
‚ArticlesPresenter::actionDetail()‘
Prostě tam asi nemám něco, co tam bejt má. :-(
- Šaman
- Člen | 2659
Jenomže action*
metody jen předcházejí render*
metodám. Když už dojde na šablonu, provedla se i render metoda a ta ti
přepsala tu my_var
. Action metody neslouží na plnění šablony
proměnnýma, ale na věci, které se mají udělat ještě před vlastním
renderováním (např. nastavení komponent – defaulní hodnoty do
formulářů apod.)
Zkus si to místo nastavování proměnných echovat rovnou na výstup, uvidíš v jakém pořadí se ti provádějí.
Jinak http://aplikace/
a
http://aplikace/homepage/default
je z pohledu aplikace stejná
routa (vede na stejný kód – stejnou akci presenteru). Jen router ti to
automatocky zkrátí na nejmenší možný tvar.
- fary
- Člen | 155
To ano, s tím přepisováním té proměnné to chápu, ale mně se děje to, že i když bych to měl mít správně nastavené, tak když napíšu třeba „http://aplikace/articles/detail“, tak se mně vypíše akorát chyba Not Found.
EDIT:
Takže už vím, kde byla chyba. Já jsem zde uváděl (pro jednoduchost) http://aplikace ale reálně to mám
http://localhost/sandbox/wwww/. V apachi jsem si nastavil
virtualhost abych mohl zadávat http://aplikace a jde to.
ale jakto, že to nefungovalo před tím?
Editoval fary (6. 6. 2013 1:01)
- fary
- Člen | 155
Mám to na localhostu, ale už to funguje, viz. výše. Akorát zatím nechápu, jak to, že mně to nefungovalo s tou adresou http://localhost/sandbox/www/ ale s adresou http://aplikace/ po tom, co jsem si tuhle stránku přidal do Apache už jo?