Ako napísať vlastny router?

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

Kedže routovanie mi moc do hlavy nejde, tak sa chcem spýtať ako poriešiť routovanie, tak aby som nemal milion statických rout?

Napriklad:

$router[] = new Route('kontakt', 'Page:kontakt');
$router[] = new Route('o-mne', 'Page:omne');
$router[] = new Route('portfolio', 'Page:portfolio');
...

Napriklad ako napisat routu, tak aby iba pri PagePresenter bralo v url action. Alebo ako by ste to spravili vy?

F.Vesely
Člen | 369
+
+3
-

https://github.com/…tatic-router pro staticke routy

Tvuj pripad bych resil pres parametr v default action Page presenteru a setView.

Neco jako:

$router[] = new Route('<slug>', 'Page:default');
function actionDefault($slug) {
	$this->setView($slug);
}

nebo lepe mit stranky v db a pak mit:

function renderDefault($slug) {
	$this->template->page = $this->pagesManager->findBySlug($slug);
}

Editoval F.Vesely (17. 7. 2015 0:24)

PhelixMad
Člen | 36
+
0
-

No to by sa dalo, ale ako sa na to odkazem v šablone aby mi url nevracalo ako /page/kontakt ale ako /kontakt?

F.Vesely
Člen | 369
+
0
-

Pokud budes mit tu routu, co jsem psal, tak odkaz vytvoris takto:

<a n:href="Page: $slug">...</a>
PhelixMad
Člen | 36
+
0
-

A keby som sa chcel odkazovat takto:

<a n:href="Page:kontakt">...</a>

Ako by mohla vypadat routa?

F.Vesely
Člen | 369
+
0
-

Tak muzes zkusit:

$router[] = new Route('<action>', 'Page:default');
PhelixMad
Člen | 36
+
0
-

To som skusal len som potom nevedel nastavit Homepage, navyse to action by som chcel aby platilo len pre PagePresenter a pri ostatných bralo ako <presenter>/<action>… a to neviem ako spravit

Unlink
Člen | 298
+
0
-

No to už len z princípu nieje možné spraviť automaticky.
Ak dostaneš URL /kontakt tak to je Kontakt:default alebo Page:kontakt

Budeš mať tých pages veľa, lebo to by si ich musel asi len vymenovať, poprípade napísať vlastný router, ktorý overí či je v DB taká page.

PhelixMad
Člen | 36
+
0
-

momentálne som to vyriesil asi takto:

Router

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

PagePresenter

class PagePresenter extends BasePresenter
{
	public function renderDefault($slug)
	{
		if(empty($slug)) {
			$this->forward('Homepage:default');
		}
	}
}

Neviem či to nazvať best practise ale funguje to. Forward je preto lebo redirect sa mi zasekne v slučke, kvoli route.

F.Vesely
Člen | 369
+
0
-

Pro Homepage pouzij:

$router[] = new Route('', 'Homepage:default');

a dej ho jako prvni, protoze zalezi na poradi rout.