routování více presenterů – chyba 404
- pjoter
- Člen | 118
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,
));
?>
- Ondřej Mirtes
- Člen | 1536
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
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)
- Bernard Williams
- Člen | 207
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
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
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>
.
- vlki
- Člen | 218
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ě.