proč když nenajde presenter, nepokračuje v routách dál?

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

Zdravím,
mám menší dotaz… mám web (zatím na localhostu), kde mam i některé stránky statické, takže je mám jednoduše v databázi a v routách je mam nastavený tak, aby se mi načítaly rovnou jako root/staticka_stranka, ale když chci ve stejném modulu použít navíc i možnost jinýho presenteru, nejde to…

uvádím tu důležitou část rout:

<?php
        $router[] = new Route('<presenter>/<action>/<id>', array(
                'module' => 'Web',
		'presenter' => 'Default',
                'action' => 'default',
                'id' => NULL
	));
        $router[] = new Route('<page>', array(
                'module' => 'Web',
		'presenter' => 'Default',
                'action' => 'default',
		'page' => 'home',
	));
?>

nahoře je klasická routa (základní) a dole jsou ty statické stránky… když ty vrchní routy zmažu, statický weby fungujou krásně, ale nemám možnost použít jinej presenter než tenhle Default…

Proč, když v první routě nenajde presenter, tak nepokračuje dál ??

zkoušel jsem i smazat z první routy <?php ‚presenter‘ ⇒ ‚Default‘ ?> že bych tím vymezil presenter jako povinný, a že by v routách pokračoval dál… ale pořát nejde… timhle jsem sice zprovoznil presenter ale zase nefungujou <page>

Edit: mno fungujou, ale pouze jako root/default/?page=home

Editoval SyXcz (30. 10. 2010 20:54)

Aurielle
Člen | 1281
+
0
-

Prohoď ty routy… a nastav regulár u page tak, aby ti nebral lomítka, jinak ti ta routa sežere úplně všechno… ([^\])

SyXcz
Člen | 75
+
0
-

tak teď nevim jestli jsem tě dobře pochopil, anebo už mi to nějak nemyslí z toho neustálýho přemejšlení :)

routy sem prohodil, a pokud jsem do pochopil dobře, tak za page dal že tam nesmí být lomítko

<?php
        $router[] = new Route('<page>[^/]', array(
                'module' => 'Web',
                'presenter' => 'Default',
                'action' => 'default',
                'page' => 'home',
        ));
        $router[] = new Route('<presenter>/<action>/<id>', array(
                'module' => 'Web',
                'presenter' => 'Default',
                'action' => 'default',
                'id' => NULL
        ));
?>

ale timhle stylem mi začne generovat i ty presentery bez lomítka… i když odkaz vytvoří ve stylu root/Presenter/ tak po kliknutí mě stejně hodí na root/presenter, což je pro něj :Web:Defaul: page=presenter

Vyki
Člen | 388
+
0
-

Vyzkoušej dát page jako povinný parametr, tím že zakomentuješ jeho výchozí hodnotu

<?php
        $router[] = new Route('<page>', array(
                'module' => 'Web',
                'presenter' => 'Default',
                'action' => 'default',
                //'page' => 'home',
        ));
?>

EDIT: .. a nech ho nad tou druhou routou. A ještě mě napadá, že není úplně v pořádku, že jsou ty výchozí hodnoty parametrů stejné. To kam se budou odkazovat přes ten zjednodušený tvat bych dál do zvláštního action.
Pak by to mohlo vypadat takto:

<?php

	// matchne example.com/testovacistranka
	// link budes generovat jako {link :Web:Default:page, 'testovacistranka'}
        $router[] = new Route('<page>', array(
                'module' => 'Web',
                'presenter' => 'Default',
                'action' => 'page',		//v presenteru default si vytvoris action, která to obslouží
        ));

	$router[] = new Route('<presenter>/<action>/<id>', array(
                'module' => 'Web',
                'presenter' => 'Default',
                'action' => 'default',
                'id' => NULL
        ));
?>

Editoval Vyki (30. 10. 2010 22:49)

SyXcz
Člen | 75
+
0
-

stále bez výsledku…

mno nic nakonec jsem to udělal tak, že jsem před ty statický stránky hodil preffix „info-“, jsou to stejně většinou stránky s informacema, třeba místo „o-me“ bude „info-o-me“ anebo „info-kontakt“, to pro mě neni tak tragický..

ale třeba do budoucna by bylo dobrý znát odpověď…

anebo kdyby byl někdo schopnej upravit „Nette\Application\Route“ tak, že by třída kontrolovala existenci presenteru, a případně pokračovala dál…

Debugbar mi ukazuje routu „yes“ a „may“ (možná), tak by v případě že neexistuje presenter třeba mohla kouknout jestli souhlasí ta druhá možná routa…

mno nevim, zas tak do hloubky v tom nejsem odborník :)

SyXcz
Člen | 75
+
0
-

Vyki napsal(a):

A ještě mě napadá, že není úplně v pořádku, že jsou ty výchozí hodnoty parametrů stejné. To kam se budou odkazovat přes ten zjednodušený tvat bych dál do zvláštního action.

mno tak jsem to zkusil a ani to negeneruje routy, hlásí error:%20Unable%20to%20pass%20parameters%20to%20action%20'Web:Default:page',%20missing%20corresponding%20method.

Edit: jaj sem neudělal action v presenteru… mno ale stejně mi to ty presentery pořát háže ho tý actionPage

Editoval SyXcz (30. 10. 2010 23:13)

assassik
Člen | 43
+
0
-

Místo <page>[^/] by mělo být <page [^/]+> ne?
Nebude to pak dělat problém s Homapage:stranka atd… ale Homepage:default to bohužel pořád matchne když není action povynný.

Asi bych to viděl na vlastní router pokud tam nechceš mít ty prefixy. Stačilo by něco jednoduchýho ve stylu
(existuje stránka v DB ? načte z DB : zkusim najít presenter )

V tomhle nejsem zrovna expert, ale někde na foru tu něco určitě bude.

Editoval assassik (31. 10. 2010 9:07)

Aurielle
Člen | 1281
+
0
-

Co použít vlastní styl?

Route::addStyle('#cat');
Route::setStyleProperty('#cat', Route::FILTER_IN, callback('FlashGames\RouterHelper::getCat'));
Route::setStyleProperty('#cat', Route::FILTER_OUT, callback('FlashGames\RouterHelper::getCatPath'));

$router[] = new Route('<category #cat>', array(
	'module' => 'Games',
	'presenter' => 'Category',
	'action' => 'view',
));

A obslužné funkce:

public static function getCat($url)
{
	$row = Models\Category::findBySlug($url);
	if($row === NULL)
		return NULL;

	return $row->id;
}

public static function getCatPath($id)
{
	$row = Models\Category::findById($id);
	if($row === NULL)
		return NULL;

	return $row->slug;
}