Nastavení action při zadaném ID

pux
Člen | 14
+
0
-

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
+
0
-

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.

David Matějka
Moderator | 6445
+
0
-

ve FILTER_OUT musíš tu action unsetnout