Problém s Filter_Table a parametrem action
- Eda
- Backer | 220
Ahoj.
Potřeboval bych vytvořit nějakou takovouto routu:
$router[] = new NewsRoute($baseUrl.'[<locale cs|sk>/]<presenter>/<action>', [
'action' => [
Route::VALUE => 'default',
Route::FILTER_TABLE => [
'staraurl.php' => 'detail',
],
],
'locale' => 'cs',
);
Takto to ovšem nefunguje. Problém je v tom, že v klíči ve FILTER_TABLE
je tečka. A pokud se podívám na regulární výraz ve statické členské
proměnné třídy Nette\Application\Routers\Route
$styles,
najdu tohle:
public static $styles = array(
'#' => array( // default style for path parameters
self::PATTERN => '[^/]+',
self::FILTER_OUT => array(__CLASS__, 'param2path'),
),
'?#' => array( // default style for query parameters
),
'module' => array(
self::PATTERN => '[a-z][a-z0-9.-]*',
self::FILTER_IN => array(__CLASS__, 'path2presenter'),
self::FILTER_OUT => array(__CLASS__, 'presenter2path'),
),
'presenter' => array(
self::PATTERN => '[a-z][a-z0-9.-]*',
self::FILTER_IN => array(__CLASS__, 'path2presenter'),
self::FILTER_OUT => array(__CLASS__, 'presenter2path'),
),
'action' => array(
self::PATTERN => '[a-z][a-z0-9-]*',
self::FILTER_IN => array(__CLASS__, 'path2action'),
self::FILTER_OUT => array(__CLASS__, 'action2path'),
),
'?module' => array(
),
'?presenter' => array(
),
'?action' => array(
),
);
Tzn. akce nesmí obsahovat narozdíl od presenteru a modulu tečku.
Zkusil jsem to řešit nejdřív upravením kódu třídy Route – jen dopsáním tečky do toho reguláru. Fungovalo to. Ale když jsem to zkusil použít tak, že jsem si vytvořil vlastní Router dědicí od Route, který jen přepisoval tuhle statickou proměnnou, padá to na chybě:
preg_match(): Empty regular expression in pattern
Konkrétně na řádku 176 třídy Route, kde je cca tohle:
if (!$matches = Strings::match($path, $re)) {
// stop, not matched
return NULL;
}
Zatím to řeším samostatnou Routou, kde je ten action parametr staticky zapsán v řetězci.
Chtěl jsem se ale zeptat, protože někdo jiný by to při přepisu staré
aplikace také mohl potřebovat: Je nutné, aby akce v tom reguláru neměla
povolenou tečku? Když jsem zkoušel tam tu tečku dopsat, tak vše fungovalo.
I všechny testy nette/application
prochází OK. Můžu poslat
pull-request?
- David Grudl
- Nette Core | 8218
Změnit regulární výraz lze přímo
v masce routy, netřeba zasahovat do pole $styles
. A když
už, do Route::$styles
lze zapisovat, takže není nutné dědit
třídu nebo modifikovat zdrojový kód Nette.
V názvu akce nemůže být tečka, protože nelze v PHP mít tečku ve
jméně metody, třeba renderAbc.Def()
.
Pokud chceš routovat staraurl.php
třeba na
Homepage:default
, použij routu
new Route('[<locale cs|sk>/]staraurl.php', 'Homepage:default')