Problém s Filter_Table a parametrem action

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Eda
Backer | 220
+
+2
-

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?

lutor
Člen | 27
+
0
-

Také jsem narazil na tento problém, neví někdo důvod, proč tomu tak je?

Díky.

David Grudl
Nette Core | 8218
+
0
-

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')