NEdokážu nastavit správné routování pro požadovaný typ adresy

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

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
+
0
-

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
+
0
-

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:

edit: jiri.pudil: nojo, jsem ukecanější :-)

Editoval BigCharlie (5. 6. 2013 20:47)

fary
Člen | 155
+
0
-

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
+
0
-

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
+
0
-

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)

hAssassin
Člen | 293
+
0
-

a co se stane, pokud napises: http://aplikace/ ? a jeste jeden dotaz: bezis na localhostu nebo na hostingu? mas povoleny mod_rewrite (resp. co vypise requirement checker)?

fary
Člen | 155
+
0
-

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?

jiri.pudil
Nette Blogger | 1029
+
0
-

Třeba jsi neměl správně nastavený RewriteBase.