routování více presenterů – chyba 404

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

Přeji dobrý den,
po krátké přestávce jsem opět narazil na malý problém. Všude v příkladech se řeší routování pouze na jeden presenter, já jich mám ale 7. Poradil by mi někdo jak nadefinovat více rout? funguje mi totiž pouze úvodní stránka a po kliknutí na jakýkoli jiný odkaz mám chybu 404.

zkoušel jsem to takhle ale nic:

<?php
$router = $application->getRouter();

$router[] = new Route('index.php', array(
	'presenter' => 'Poptavky',
	'action' => 'default',
), Route::ONE_WAY);

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


$router[] = new Route('<presenter>/<action>/<id>', array(
	'presenter' => 'Novinky',
	'action' => 'default',
	'id' => NULL,
));
?>
ic
Člen | 430
+
0
-

Tak když jsou nějaké routery stejné, jako ty dva poslední tak nemají vůbec význam… na ten druhý se nikdy nedostane, tak je to takové divné no. Která z těch stránek je vlastně ta ‚úvodní‘?

Editoval ic (3. 9. 2009 14:23)

Ondřej Mirtes
Člen | 1536
+
0
-

Nepochopils, jak fungují routy :) Pole předané jako druhý parametr znamená výchozí hodnoty, pokud daný parametr chybí. Pro všech sedm presenterů ti tedy stačí routa:

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

Přičemž při přístupu na / se zajde na Poptavky:default, při přístupu na /novinky/ se zajde na Novinky:default, při přístupu na /dalsi/moje-view se zajde na Dalsi:moje-view apod.


Pokud ti to hlásí 404ku při přístupu jinam než na / a Nette se vůbec nedostane ke slovu (poznáš podle chybějící X-Powered-By HTTP hlavičky ve Firebugu či absenci řetězce Nette Framework pod čarou), je chyba v .htaccess, potažmo v mod_rewrite.

Editoval LastHunter (3. 9. 2009 15:19)

pjoter
Člen | 118
+
0
-

Díky za rady, ten .htaccess používám z příkladu, rewrite na serveru běží, nemůže to být tím že složku document_root mám jinak pojmenovanou ?

Tak tím to není, tak čím to může být ? pro jistotu Vám ukážu bootstrap.php:

<?php



// Step 1: Load Nette Framework
// this allows load Nette Framework classes automatically so that
// you don't have to litter your code with 'require' statements
require LIBS_DIR . '/Nette/loader.php';
require LIBS_DIR . '/Nette.Extras/Captcha/Captcha.php';
require LIBS_DIR . '/Nette.Extras/VisualPaginator/VisualPaginator.php';
require LIBS_DIR . '/Nette.Extras/RoutingDebugger/RoutingDebugger.php';

// Step 2: Configure environment
// enable Nette\Debug for better exception and error visualisation
Debug::enable(Debug::DEVELOPMENT);

// Step 3: Configure application
$application = Environment::getApplication();
$application->catchExceptions = FALSE;

$router = $application->getRouter();

$router[] = new Route('index.php', array(
	'presenter' => 'Default',
	'action' => 'default',
), Route::ONE_WAY);

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

//RoutingDebugger::run();


$user = Environment::getUser();

// Step 4: Run the application!
$application = Environment::getApplication();
$application->run();
?>

a htaccess :

<?php
# configure PHP
php_flag magic_quotes_gpc off
php_flag register_globals off

# mod_rewrite
RewriteEngine On
#RewriteBase /

# front controller
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
?>

ok, bylo to tim .htaccess byla potreba nastavit rewrite base

Editoval pjoter (3. 9. 2009 16:51)

pjoter
Člen | 118
+
0
-

jeste jeden dotaz soucasna podoba mi vyhovuje akorat mam problem v presenteru Detail. Jedna se o detail poptavky soucasna url ma podobu: document_root/detail/default/7. Prosil bych o radu jak misto toho default dosadit pro vsechny detaily nazev detailu z databaze ? Dekuju…

Bernard Williams
Člen | 207
+
0
-

pjoter napsal(a):

jeste jeden dotaz soucasna podoba mi vyhovuje akorat mam problem v presenteru Detail. Jedna se o detail poptavky soucasna url ma podobu: document_root/detail/default/7. Prosil bych o radu jak misto toho default dosadit pro vsechny detaily nazev detailu z databaze ? Dekuju…

Nazdárek,

předpokládám, že plink máš asi ve tvaru {plink Detail:default, $id}. Já to řeším tak, že odkaz rozšířím ještě o jeden parametr: {plink Detail:default, $id, $detail_name} a ten pak zahrnu v routě. V tvém případě by to bylo něco podobné tomuto:

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

Snad to pomůže.

Ponz: nezapomeň upravit action, aby počítal s tím novým parametrem.

S pozdravem
Bernard

Editoval Bernard Williams (4. 9. 2009 17:39)

pjoter
Člen | 118
+
0
-

Díky Bernadrdovi. Udělal jsem to jak si mi napsal ovšem je v tom ještě nějaký problém. Jako by nette bralo v potaz pouze jedno z těch pravidel. Když dám pravidlo pro Detail před Default tak fungujou detaily ale ostatní presentery se nezobrazí a naopak.

moje route pravidla:

<?php
$router = $application->getRouter();

$router[] = new Route('index.php', array(
	'presenter' => 'Default',
	'action' => 'default',
), Route::ONE_WAY);

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

$router[] = new Route('<presenter>/<action>/<id>', array(
	'presenter' => 'Default',
	'action' => 'default',
	'id' => NULL,
));
?>
Ondřej Mirtes
Člen | 1536
+
0
-

Nette nemá šanci rozlišit, zda adresou` blabla/jméno/5` myslíš druhou nebo třetí routu, tak se namatchuje ta s <presenter>/<name>/<id>.

pjoter
Člen | 118
+
0
-

ale tak snad existuje nejake reseni nebo ne ?

vlki
Člen | 218
+
0
-

Myslím, že by mohlo stačit uvést pro ten presenter v routě s Detailem masku.

<?php
$router[] = new Route('<presenter (Detail)>/<name>/<id>', array(
        'presenter' => 'Detail',
        'action' => 'default',
        'id' => NULL,
        'name' => NULL));
?>

Pokud je to jen jeden presenter, tak klidně přímo:

<?php
$router[] = new Route('detail/<name>/<id>', array(
        'presenter' => 'Detail',
        'action' => 'default',
        'id' => NULL,
        'name' => NULL));
?>

Adresy s blabla jako presenter ti pak probublají až k té poslední routě.