Routy (moduly a filter tabulky) po upgradu na novější nette

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

Dobrý den, řeším problém s routami v modulově rozdělené aplikaci a překladovými tabulkami po nahrání nové verze nette (stále verze 5.2 bez prefixů), rozdělení do modulů a presenterů jsem dělal podle tohoto návodu, který ještě tehdy byl pro verzi 5.2

původní verze version 2.0-dev released on 2011–06–24 a bootstrap.php kde všechno fungovalo jak mělo:

// Setup router using mod_rewrite detection
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {

	$container->router[] = new Route('index.php', 'Front:Home:default', Route::ONE_WAY);

	$container->router[] = new Route('admin/<presenter>/<action>[/<id>]', array(
        'module'    => 'Admin',
        'presenter' => array(
			Route::VALUE => 'Default',
			Route::FILTER_TABLE => array(
				'uzivatele'	=> 'User',
				'fotogalerie'	=> 'Gallery',
				'uvodni-strana'	=> 'Homepage',
			)
		),
        'action'    => array(
			Route::VALUE => 'default',
			Route::FILTER_TABLE => array(
				'seznam'	=> 'list',
				'pridat'	=> 'add',
				'odebrat'	=> 'remove',
				'upravit'	=> 'edit',
			)
		),
        'id'        => null,
    ));

	$container->router[] = new Route('<presenter>/<action>[/<id>]', array(
        'module'    => 'Front',
        'presenter' => array(
			Route::VALUE => 'Home',
			Route::FILTER_TABLE => array(
				'o-nas' => 'About',
				'galerie' => 'Gallery',
				'kontakt' => 'Contact',
			)
		),
        'action'    => 'default',
        'id'        => NULL,
    ));

	$container->router[] = new Route('.*?/ajaxfilemanager.php',array(''));

} else {
	$container->router = new SimpleRouter('Home:default');
}

a po upgradu na version 2.0-dev released on 2011–10–11 a úpravě indexu a bootstrapu po vzoru sandboxu/exaples takto:

// Load Nette Framework
$params['libsDir'] = dirname(__FILE__) . '/../libs';
require $params['libsDir'] . '/Nette/loader.php';

// Enable Nette Debugger for error visualisation & logging
Debugger::$logDirectory = dirname(__FILE__) . '/../log';
Debugger::$strictMode = TRUE;
Debugger::enable(Debugger::DEVELOPMENT);

// Load configuration from config.neon file
$configurator = new Configurator;
$configurator->container->params += $params;
$configurator->container->params['tempDir'] = dirname(__FILE__) . '/../temp';
$container = $configurator->loadConfig(dirname(__FILE__) . '/config.neon');

// On application startup invoke this function (connect to db, ...)
$container->application->onStartup[] = 'BaseModel::initialize';

// Setup router using mod_rewrite detection
if (function_exists('apache_get_modules') && in_array('mod_rewrite', apache_get_modules())) {

	////spolecna prekladova tabulka
	//	Route::setStyleProperty('presenter', Route::FILTER_TABLE, array(
	//		'o-nas' => 'About',
	//	));

	$router = $container->router;
	$router[] = new Route('index.php', 'Front:Home:default', Route::ONE_WAY);

	$router[] = $adminRouter = new RouteList('Admin');
	$adminRouter[] = new Route('admin/<presenter>/<action>[/<id>][/<id2>]', array(
        'presenter' => array(
			Route::VALUE => 'Default',
			Route::FILTER_TABLE => array(
				'uzivatele'		=> 'User',
				'fotogalerie'	=> 'Gallery',
				'uvodni-strana'	=> 'Homepage',
			)
		),
        'action'    => array(
			Route::VALUE => 'default',
			Route::FILTER_TABLE => array(
				'seznam'	=> 'list',
				'pridat'	=> 'add',
				'odebrat'	=> 'remove',
				'upravit'	=> 'edit',
			)
		),
        'id'        => null,
        'id2'       => null,
    ));

	$router[] = $frontRouter = new RouteList('Front');
	$frontRouter[] = new Route('<presenter>/<action>[/<id>]', array(
        'presenter' => array(
			Route::VALUE => 'Home',
			Route::FILTER_TABLE => array(
				'o-nas'		=> 'AboutUs',
				'sluzby'	=> 'Services',
				'nas-tym'	=> 'OurTeam',
				'vybaveni'	=> 'Equipment',
				'clanky'	=> 'Articles',
				'kontakt'	=> 'Contact',
			)
		),
        'action'    => 'default',
        'id'        => NULL,
    ));

	//$router[] = new Route('.*?/ajaxfilemanager.php',array(''));

} else {
	$container->router = new SimpleRouter('Front:Default:default');
}

// Configure and run the application!
$application = $container->application;
//$application->catchExceptions = TRUE;
$application->errorPresenter = 'Error';

// Run the application only if not in console mode (for testing)
if (!Environment::isConsole()){
	$application->run();
}

mi v Adminu přestaly fungovat linky na action které nejsou obsaženy v překladové tabulce, například

link(':Admin:Default:default');

který se pokud člověk není přihlášen přesměruje na Admin:Auth:login mi začalo hlásit No route for Admin:Auth:login

Prosím o radu, jestli jsem někde něco přehlédl, špatně upravil, atd.? V předchozí verzi fungovalo vše bez problémů a už jsem vyzkoušel snad vše co mě napadlo

bojovyletoun
Člen | 667
+
0
-

https://github.com/…513a9ba97a0d (4.10. – to odpovídá)
související https://forum.nette.org/…on-table-wtf

Editoval bojovyletoun (27. 11. 2011 12:38)

Neo
Člen | 5
+
0
-

Děkuji za rychlou odpověď, koukám že jsem zde opět hledal špatně. Chápu tedy dobře, že nejlepším řešením bude použít FILTER_IN/FILTER_OUT a vlastních překladových fcí? Případně natlačit do FILTER_TABLE úplně všechny možnosti, což mi tedy moc nevyhovuje. Přidělává mi to akorát práci oproti tomu jak to fungovalo doteď, uvažuje se o původní implementaci s navrhovaným názvem TRANSLATION_TABLE pro lidi jako jsem já nebo je to zavrhnuté řešení?

22
Člen | 1478
+
0
-

FILTER_TABLE už je opravený imho, pokud tam nezadáš hodnotu, tak nic nepřekládá.

bojovyletoun
Člen | 667
+
0
-

teď jsem to zkoušel. Když zadáš hodnotu, která nemá překlad, tak rejectuje.

Nicméně se to dá vyřešit takto (v reálu si pak vytvoř inverzi tabulky pomocí array_flip)
Bylo by pěkné, kdyby se ve frameworku objevila takováto funcionalita třeba pod TRANSLATION_TABLE.

$table = array("alfa" => "aa", "beta" => "bb")
new \Nette\Application\Routers\Route('<cus>', array(
	'presenter' => "PRE",
	"cus" =>
	array(
		"filterIn" => function($s)use($table) {
			return (@$a = $table[$s])?$a:$s; },
		"filterOut" => function($s)use($table) {
			return (@$a=array_search($s, $table))?$a:$s; },
	)
));

Editoval bojovyletoun (27. 11. 2011 13:49)