Jak na: <presenter>/<action>?<id>

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

Ahoj.

Přepisuju starou aplikaci do Nette a chtěl bych se vyhnout změnám v URL. Naneštěstí odkazy v jedné části webu jsou tohoto tvaru:

http://web.cz/aktuality/aktualita?154

Kde 154 je ID aktuality, což je také nově parametr akce presenteru. Zkoušel jsem to naroubovat na Nette routování, ale tohle mi nefunguje (= tato routa se neuplatní a využije se routa obecnější):

/aktuality/aktualita?<id>

A nic jiného mne nenapadá.

Netušíte prosím někdo, jak tu routu správně zapsat?

Díky.

David Matějka
Moderator | 6445
+
+1
-

napis si vlastni router ;)


Jinak je to v query (a tedy i v parametrech) jako pole

154 => ""

takze by slo napsat globalni filtr a tam ten parametr najit a upravit…

Editoval matej21 (26. 1. 2015 21:47)

Eda
Backer | 220
+
0
-

Díky, ty globální filtry jsou supr.

Ale stejně mi to asi nepomůže, protože když to naimplementuju takto:

$router[] = new Route($baseUrl.'[<locale cs|sk>/]aktuality/aktualita', [
	'presenter' => 'News',
	'action' => 'detail',
	'locale' => 'cs',
	null => [
		Route::FILTER_IN => function (array $params) {
			foreach ($params as $key => $value) {
				if (is_numeric($key) && $value == '') {
					$params['id'] = $key;
					unset($params[$key]);
					break;
				}
			}

			return $params;
		},
		Route::FILTER_OUT => function (array $params) {
			bdump($params);
			if (isset($params['id'])) {
				$params[$params['id']] = '';
				unset($params['id']);
			}

			return $params;
		},
	],
]);

Tak URL:
/aktuality/aktualita?456
to sice přeloží na správný presenter, akci i ID, ale v opačném směru, pokud odkaz generuju, dostávám k tomu ještě na konci rovnítko (nj, jasný, je to jakoby název parametru…):
/aktuality/aktualita?456=

Nemáš i na tohle nějaký trik? :-)

Tak mě napadá. Teoreticky vlastně můžu ten vlastní router využít jen k řešení toho rovnítka na konci. Přepsat jen constructUrl a pokud bude požadovaná akce a presenter, oříznout z konce výsledku volání parenta rovnítko. Hm, to by šlo, jdu to testnout. Tak díky za námět :-)

(Ale je to teda dost dirty řešení. Asi fakt časem napíšu celý vlastní router. Bude to i rychlejší…)