Nastavení action při zadaném ID
- pux
- Člen | 14
Pokračuji v problému z předchozího
příspěvku, kdy chci načíst detail
view, pokud je na
nějaké stránce zadané ID. Moje routa vypadá:
[<locale=cs [cs|en]{2}>/]<presenter>[/<id>]
A potřebuji funkční vícejazyčné adresy ve tvaru:
// Clanky:default
example.com/clanky
example.com/en/articles
// Clanky:detail
example.com/clanky/foo-bar
example.com/en/articles/foo-bar
Zkouším toho dosáhnout pomocí globálních filtrů (kde už překládám
u anglické verze clanky
na articles
):
// Použito u FILTER_IN i FILTER_OUT
if (isset($params['id']) && $params['id']) {
$params['action'] = 'detail';
}
A samozřejmě mám v ClankyPresenter
i adekvátní
metodu:
public function renderDetail(string $id): void
{
// ...
}
Pokud ale zadám adresu example.com/clanky/foo-bar
, končím na
chybě:
Invalid link: No route for Clanky:detail(locale=cs, id=foo-bar)
To stejné, pokud se na detail článku snažím generovat odkaz jinde
v šabloně pomocí <a n:href="Clanky:detail $id">
, končím
na stejné chybě (jen je v parametrech prohozeno id
a
locale
).
locale
mám jako persistentní parametr presenteru a u
renderDefault
metody ho v parametrech taky nemám, proč se mi cpe
do renderDetail
a navíc problém nevyřeší ani to, když ho tam
(nerad) předám? Nebo na to jdu úplně špatně?
- pux
- Člen | 14
Tak zatím jediné, co se zdá, že funguje, je udělat dvě hardcoded routy:
$router->addRoute('clanky/<id>', [
'presenter' => 'Clanky',
'action' => 'detail',
'locale' => 'cs',
]);
$router->addRoute('en/articles/<id>', [
'presenter' => 'Clanky',
'action' => 'detail',
'locale' => 'en',
]);
Pokud by to šlo ale zapracovat do té jedné (protože mám za to, že by to mělo fungovat), budu rád za tip.