Universální nastavení route pro admin, page slug a presentery obecně

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

Zdravím,

snad by mi někdo mohl pomoci, nevím si už rady.

Mým cílem je docílit toho, aby router nejdrive zkoumal jestli existuje stránka v databázi (dle URL) a pokud ne, tak aby se podíval jestli existuje adekvátní presenter. Nedaří se mi toho docílit, současně mi to sice funguje, ale musím každý (front) presenter explicitně v routeru uvést (např. viz Users). Prostě ta poslední routa se nespustí i když presenter existuje a když ji dám před tu routu co spouští ty stránky tak se zase nespustí ta :-( Poradí někdo prosím?

Současný router vypadá takto:

<?php

	/**
	 * @return Nette\Application\IRouter
	 */
	public function createRouter()
	{

		$this->checkRedirect($_SERVER['REQUEST_URI']);

		$router = new RouteList();

    $router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);

		// admin route
		$router[] = new Route('admin/<presenter>/<action>/[<id>/]', array(
								'module' => "admin",
				        'presenter' => 'Adminhome',
				        'action' => 'default',
				        'id' => NULL,
				    ));


		// front route
		$router[] = new Route('user/<action>/[/<id>]', array(
				        'presenter' => 'User',
				        'action' => 'default',
				        'id' => NULL,
				    ));

		// front route
		$router[] = new Route('product/<action>[/<id>]', array(
				        'presenter' => 'Product',
				        'action' => 'default',
				        'id' => NULL,
				    ));


		$pages = $this->db; // must have for PHP 5.2?
		$router[] = new Route('<id .+>', array(
								'presenter' => 'Page',
								'action' => 'default',
								'id' => array(
									Route::FILTER_IN => function($id) use ($pages){
										if(is_numeric($id)){
											return $id;
										} else {

											$page = $pages->query('SELECT id FROM pages WHERE url = ?', $id)->fetch();

											if($page){
											  return $page->id;
											} else {
												return false;
											}
										}
									},
									Route::FILTER_OUT => function($id) use ($pages){
										if(!is_numeric($id)){
											return $id;
										} else {
											return $pages->table('pages')->get($id)->url;
										}
									},
								),
						));

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


		return $router;
	}

?>
sKopheK
Člen | 207
+
0
-

V routeru se do detailu nevyznám, ale přijde mi, že když se to „chytne“ na tu routu <id .+>, což je jakákoliv URL ve tvaru web.cz/cokoliv, už se pouští Page presenter s akcí default a řeší se jen, co bude v tom parametru id.

Tohle určitě už někdo řešil, tak bych si počkal na názor někoho zkušenějšího.

mackiee
Člen | 5
+
0
-

sKopheK napsal(a):
přijde mi, že když se to „chytne“ na tu routu <id .+>, což je jakákoliv URL ve tvaru web.cz/cokoliv, už se pouští Page presenter s akcí default a řeší se jen, co bude v tom parametru id.

Ano přesně tak, ale když pravidla otočím, tak mi laděnka říká, že neexistuje presenter prostě – nespustí tu další routu…

Tohle určitě už někdo řešil, tak bych si počkal na názor někoho zkušenějšího.

Snad :-)

Michal Vyšinský
Člen | 608
+
0
-

Ahoj, mělo by pomoci ve filterIn vracet NULL namísto FALSE. Viz tato diskuse: https://forum.nette.org/…d-nevyhovuje#…

mackiee
Člen | 5
+
0
-

Michal Vyšinský napsal(a):

Ahoj, mělo by pomoci ve filterIn vracet NULL namísto FALSE. Viz tato diskuse: https://forum.nette.org/…d-nevyhovuje#…

Ano, funguje! Zázrak – moc děkuju! :-)

routy tedy mohu již otočit a nemusím zmiňovat presentery explicitně, pokud by to někdo potřeboval tak to mám takto:

<?php

	/**
	 * @return Nette\Application\IRouter
	 */
	public function createRouter()
	{

		$this->checkRedirect($_SERVER['REQUEST_URI']);

		$router = new RouteList();

		$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);

		// admin route
		$router[] = new Route('admin/<presenter>/<action>/[<id>/]', array(
								'module' => "admin",
								'presenter' => 'Adminhome',
								'action' => 'default',
								'id' => NULL,
				    ));

		$pages = $this->db; // must have for PHP 5.2?
		$router[] = new Route('<id .+>', array(
								'presenter' => 'Page',
								'action' => 'default',
								'id' => array(
									Route::FILTER_IN => function($id) use ($pages){
										if(is_numeric($id)){
											return $id;
										} else {

											$page = $pages->query('SELECT id FROM pages WHERE url = ?', $id)->fetch();

											if($page){
											  return $page->id;
											} else {
												return NULL;
											}
										}
									},
									Route::FILTER_OUT => function($id) use ($pages){
										if(!is_numeric($id)){
											return $id;
										} else {
											return $pages->table('pages')->get($id)->url;
										}
									},
								),
						));

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

		return $router;
	}

?>