Označení routy „jenom pro modul xxx“ ale název modulu v module ne v presenter

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

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íče presenter
  • Když nepřidám do metadat klíč module, tak ho bude doplňovat do klíče module

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
+
0
-

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

David Grudl
Nette Core | 8218
+
0
-

A máš nějaký návrh, jak by se to mohlo řešit elegantně?

Filip Procházka
Moderator | 4668
+
0
-

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
+
0
-

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
+
0
-

Tohle si nastuduj https://doc.nette.org/…tion/routing#…, třeba tě něco napadne :)

Martin
Člen | 171
+
0
-

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)