Routy (moduly a filter tabulky) po upgradu na novější nette
- Neo
- Člen | 5
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
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
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í?
- bojovyletoun
- Člen | 667
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)