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íč
modulea dám mu hodnotu. - Pokud nepřidám do url klíč
modulestane 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)