Označení routy „jenom pro modul xxx“ ale název modulu v module ne v presenter
- Filip Procházka
- Moderator | 4668
Zdravím,
snažím se přijít na to jak oznařit určitou routu, že je pouze pro
určitý modul, resp. že je preferovaná pro určitý modul.
fakta:
- Jde tak, že doplním do metadat klíč
module
a dám mu hodnotu. - Pokud nepřidám do url klíč
module
stane se „konstatní“ a routa bude pouze pro určitý modul, jinak bude „pouze“ výchozí, pro učitý modul. - Když přidám do metadat klíč
module
, tak se bude snažit doplňovat do klíčepresenter
- Když nepřidám do metadat klíč
module
, tak ho bude doplňovat do klíčemodule
A problém je v tom, že já potřebuju, aby se mi název modulu měnil v
module
a ne presenter
.
$router[] = new Route("//admin.{$domain}/<presenter>/<action>", array(
'module' => 'Admin',
'presenter' => 'Auth'
'action' => 'default',
), $flags);
// tuhle routu se teď snažím vytvořit
$router[] = new Route("//www.{$domain}/<module>/<presenter>/<action>", array(
// jak označit routu, jenom pro modul Front ?
'module' => 'Front',
'action' => 'default',
), $flags);
$router[] = new Route("/<module>/<presenter>/<action>", array(
'action' => 'default',
), $flags);
ukázka:
:Front:Module:Presenter: /front/module.presenter/
:Front:Presenter /front/presenter/
ale já pořebuju
:Front:Module:Presenter: /front.module/presenter/
:Front:Presenter /front/presenter/
Mám v systému zavedené používané adresy a neexistuje, abych je měnil.
Ale protože nebyla vždy výchozí routa pro jedne modul, nemůžu proto
bezpečně linkovat z modulu Admin
do modulu Front
,
protože to generuje cestu na současnou routu.
bez té prostřední routy se mi systém chová následovně, ale s ní mi
zase mrví moduly… (c1c9de0 released on 2011-01-07
)
přechod z :Front:Module:Presenter:
na
:Front:Module:Module2:Presenter:
v pořáku i zpátky.
přechod z :Admin:Module:Presenter:
na
:Admin:Module:Module2:Presenter:
v pořáku i zpátky.
přechod z :Front:Module:Presenter:
na
:Admin:Module:Presenter:
v pořáku
přechod z :Admin:Module:Presenter:
na
:Front:Module:Presenter:
vygeneruje
http://admin.{$domain}/front/module.presenter/
místo http://www.{$domain}/front.module/presenter/
Možná se dám i na víru, abych se mohl pomodlit za to, aby to byl bug :P
Editoval HosipLan (14. 1. 2011 15:16)
- Filip Procházka
- Moderator | 4668
Takže mám řešení, ale docela jsem se u toho zapotil a musel jsem si následně upravit slovník.
$this[] = $front = new Nette\Application\MultiRouter('Front');
$front[] = new Nette\Application\Route("//www.{$domain}/<module>/<presenter>/<action>", array(
'module' => array(
Route::FILTER_TABLE => array(
// ...
)
),
'action' => 'default',
), $flags);
// hack? pokud je presenter přímo v modulu, použije se tato routa
$front[] = new Nette\Application\Route("//www.{$domain}/<presenter>/<action>", array(
'action' => 'default',
), $flags);
ale už mi to tlačí moduly tam kam potřebuju. Jenom to chtělo
„navíc“ tu druhou routu, která odchytí i presentery, které jsou přímo
ve Front
- Filip Procházka
- Moderator | 4668
co takhle
$router[] = new Route("//www.{$domain}/<module>/<presenter>/<action>", array(
'module' => array(
Route::FOR_MODULE => 'Front'
),
'action' => 'default',
), $flags);
pro definování přiřazení, ale bez výchozí hodnoty
s tím že by to pro ten cyklus v constructUrl v MultiRoute, který cachuje priority přiřazení k presenterům a modulům mělo vyžší význam než Route::VALUE
$router[] = new Route("//www.{$domain}/<module>/<presenter>/<action>", array(
'module' => 'Front',
'action' => 'default',
), $flags | Route::PUT_MODULE_PATH_WHERE_IT_BELONGS);
// nebo Route::VARIABLE_MODULE_PARAM
pro přenášení celé cesty modulu do <module>
, kam
logicky patří, nebo ne?
nebo tak nějak… :)
- Martin
- Člen | 171
Hezké. Teď zrovna řeším něco podobného. Potřebuji, aby aplikace,
kterou nahraji na některé servery, kde adresář xxx
na rootu
automaticky tvoří subdoménu xxx.domain.com
, routovala ze všech
subdomén do jiného modulu, než subdoména www
. Ale na jiných
serverech, kde se takto subdomény netvoří, aby mi totéž udělala adresa ve
tvaru [www].domain.com/xxx
. Lze to jednoduše zařídit jen
routerem bez měnění .htaccess? Zatím to mám dost primitivně (dosud
neodzkoušeno na serveru) pomocí:
$application->onStartup[] = function() use ($application) {
Model::init(Environment::getConfig()->database); //inicializace statické proměnné $subdomain
$router = $application->getRouter();
if (Model::$subdomain == 'www')
{
$router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
}
else
{
$router[] = new Route('index.php', 'JinyModul:Homepage:default', Route::ONE_WAY);
$router[] = new Route('<presenter>/<action>/<id>', array(
'module' => 'JinyModul',
'presenter' => 'Homepage',
'action' => 'default',
'id' => NULL,
));
}
};
Je to ale správná cesta?
Editoval Martin (25. 5. 2011 23:17)
- Filip Procházka
- Moderator | 4668
Tohle si nastuduj https://doc.nette.org/…tion/routing#…, třeba tě něco napadne :)
- Martin
- Člen | 171
To jsem četl několikrát. Ale neřeší to můj problém (možná jsem
něco přehlédl). Potřebuji úplně jiné routování z www
a
úplně jiné z ostatních domén. To, co jsem napsal nahoře, mi funguje, už
jsem to odzkoušel i na serveru s automatickým tvořením subdomén.
V podstatě filosofie požadavku přesně odpovídá tomu větvění
v podmínce (těch rout tam bude víc a budou se naprosto lišit). Jen mi to
nepřijde příliš elegantní a nejsem si jistý, jestli to je odolné proti
CSRF. Konstantu, ze které se subdoména zjišťuje, nastavuji v
index.php
(což je jediný php soubor na adresáři každé
subdomény).
Editoval Martin (26. 5. 2011 10:05)