Nefungjící odkaz vytvořený z proměnné

Janek007
Člen | 4
+
0
-

Ahoj,
v šabloně mám odkaz (fungující) v tomto tvaru:

<a n:href=":Docs:DocDetail: $item->id">detail</a>

Router:

$router->addRoute('dokumenty/detail/<id \d+>', 'Docs:DocDetail:default');

Odkaz funguje, i pokud v šabloně zadám id natvrdo:

<a n:href=":Docs:DocDetail: 600">detail</a>

Na jiném místě bych potřeboval vytvořit stejný odkaz vložením proměnné:

// v presenteru
$this->template->reference = ":Docs:DocDetail: 600";

// v šabloně
<a n:href="{$reference}">detail</a>

ale tracy hlásí „No route for Docs:DocDetail: 600()“

Nevíte v čem je problém?

Díky za jakoukoliv konstruktivní odpověď.

Honza

Pepino
Člen | 249
+
+2
-
// v presenteru
$this->template->reference = $this->link(':Docs:DocDetail', 600);

// v šabloně
<a href="{$reference}">detail</a>

Editoval Pepino (20. 12. 2023 13:35)

m.brecher
Generous Backer | 763
+
0
-

@Janek007

Url ve tvaru „:Module:Presenter:action, $param“ lze použít v latte v atributu n:href, nebo v tagu {link }, pokud potřebuješ normální url pro html, použij metodu link() presenteru:

$this->template->reference = $this->link(":Docs:DocDetail:default", ['id' => 600]);

Poznámka: přehlednější je akce v odkazech vypisovat „:Docs:DocDetail:default“ místo zkráceného zápisu „:Docs:DocDetail:“

m.brecher
Generous Backer | 763
+
0
-

@Janek007

Na jiném místě bych potřeboval vytvořit stejný odkaz vložením proměnné:

// v presenteru
$this->template->reference = ":Docs:DocDetail: 600";

// v šabloně
<a n:href="{$reference}">detail</a>

Pro voči nevidim, chyba je v nesprávné syntaxi v n:href atributu v šabloně !!

$reference je symbolické url ve tvaru Module:Presenter:action a zapisuje se do n:href atributu PŘÍMO bez složených závorek !!

   <a n:href="$reference">detail</a>

tohle stejně latte nezvládne, asi nejde mít v proměnné $reference současně presenter a parametr, ale tohle už zvládne:

$this->template->refPresenter = ":Docs:DocDetail:default";
$this->template->refId = "600";
<a n:href="$refPresenter, $refId">detail</a>

Nicméně lepší je přeorganizovat si kód tak, aby Jsi mohl odkazy vypisovat v šabloně standardním způsobem:

<a n:href=":Docs:DocDetail:default, id: 600">detail</a>
m.brecher
Generous Backer | 763
+
+1
-

@Janek007

Ještě mě napadá poznámka bokem – entitu dokument je ideální obsluhovat na úrovni presenteru DocumentPresenter a zobrazení detailu entity na úrovni akce :detail. Z Tvojí ukázky jsem nabyl dojmu, že máš řízení o jeden level posunuté nahoru – místo presenteru modul, místo akce presenter. Samozřejmě i Tvůj způsob jde použít, ale povede Tě časem do nepřehledného kódu v projektu. Moduly je vhodné používat pro seskupení rozsáhlejších celků, např. celá administrace do modulu :Admin. Potom by i odkazy byly srozumitelnější – místo „Docs:DocDetail:“ – > „Document:detail“

Janek007
Člen | 4
+
0
-

m.brecher napsal(a):

@Janek007

Ještě mě napadá poznámka bokem – entitu dokument je ideální obsluhovat na úrovni presenteru DocumentPresenter a zobrazení detailu entity na úrovni akce :detail. Z Tvojí ukázky jsem nabyl dojmu, že máš řízení o jeden level posunuté nahoru – místo presenteru modul, místo akce presenter. Samozřejmě i Tvůj způsob jde použít, ale povede Tě časem do nepřehledného kódu v projektu. Moduly je vhodné používat pro seskupení rozsáhlejších celků, např. celá administrace do modulu :Admin. Potom by i odkazy byly srozumitelnější – místo „Docs:DocDetail:“ – > „Document:detail“

Máš pravdu. Ono se to takhle v mém kódu přímo nejmenuje, ty názvy jsem zvolil pro ilustraci. Nechápal jsem, kde je chyba, metoda link to vyřešila – vaše rady mi pomohly, díky. Celé se to týká mechanismu pro vytvoření navigačního proužku odkazů pod hlavičkou stránky…

Ještě mi pak chvíli trvalo rozseknout problém n:href versus href – pokud vygeneruji odkaz metodou presenter->link, funguje mi pouze pokud použiju klasický HTML href.

dakur
Člen | 493
+
+2
-

Přirozeně, link() použiješ v PHP kódu, n:href v latte šabloně – dělá to to stejné. Takže pokud z „Docs:DocDetail“ uděláš URL už v presenteru pomocí link(), nepotřebuješ to dělat znova v latte pomocí n:href – prostě jen vypíšeš už vygenerovanou URL do běžného href atributu.