Dynamicky načítané presenery do odkazu

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

Zdravím,
chtěl jsem se zeptat jestli je možné psát dynamické odkazy. Že by nebyl odkaz napevno napsaný, ale dynamicky načtený z databáze. Konkrétně mám odkaz v kompponentě (proto plink, t en jedinej mě fungoval) a potřeboval bych volat něco jako:

<h3><a href="{plink $dynamic->presenter_name:$dynamic->presenter_name|action $dynamic->slug}">{$dynamic->title}</a></h3>

z databáze se načte presenter: $dynamic->presetner_name (např: News). Potom se uřízne poslední písmeno a převedou se všechny písmena na malý (např. new). Výsledek by tedy byl: News:new $dynamic->slug

Je takovéhle vytvaření odkazů vůbec možné? Případně jak ho docílit?

Díky moc

Filip Procházka
Moderator | 4668
+
0
-

Do databáze si uložíš název presenteru a argumenty, potom zavoláš s daty z databáze

$link = $presenter->lazyLink($nazevPresenteru, $argumenty);

Získáš objekt, který když převedeš na string, bude odkazem. Pokud se ti to nehodí, můžeš odkazy vytvářet rovnou

$link = $presenter->link($nazevPresenteru, $argumenty);

Potom si je v nějakém strukturovaném poli předáš do šablony a vykreslíš.

Tabetha
Člen | 140
+
0
-

osobne by som dal do toho presenter_name bud celu cestu na presenter a action alebo nový stlpec kde ochovas action a neviem či pred slug nemá byť ešte čiarka

<h3><a href="{plink $dynamic->presenter_name:$dynamic->action_name ,$dynamic->slug}">{$dynamic->title}</a></h3>
Filip Procházka
Moderator | 4668
+
0
-

Dělat tohle v šabloně je hloupé. Lepší je připravit si to v komponentě do pole a pak jen vykreslit.

Oli
Člen | 1215
+
0
-

Díky moc!
Tím lazyLinkem mě to nešlo. Tím linkem jsem to nějak udělal. Asi to není uplně správné řešení. Udělal jsem si string bez slugu a ten potom pripojil až v šabloně. Jinak bych musel procházet pole navíc i v prsenteru. Řeším to tedy takhle:
v presenteru:

$link = $value->presenter_name.":".Strings::lower(($value->presenter_name == "News" ? $value->presenter_name : Strings::truncate($value->presenter_name, --$length, null)));
$this->link[$value->id] = $this->presenter->link($link);

$this->template->link = $this->link;

a v šabloně:

<div n:foreach="$dynamics as $dynamic">
     ...
    <h3><a href="{$link[$dynamic->id]."/".$dynamic->slug}">{$dynamic->title}</a></h3>
</div>
Filip Procházka
Moderator | 4668
+
0
-

To je naprosto otřesné řešení, na tohle se používají filtry nad routami

Oli
Člen | 1215
+
0
-

Promin, ale nejak nechapu jak to muze pomoct. Je pravda, ze jsem se už dřív koukal na nějaký filtry, ale jaksi jsem to nepochopil, takže používám jen Route::FILTER_TABLE pro překlad. Mohl by jsi prosím trochu objasnit jak to v tomhle konkrétním případě pomůže? Třeba pak konečně pochopím jak se to vlastně používá :-)

Filip Procházka
Moderator | 4668
+
0
-

Uděláš si routu, které nastavíš dva filtry, tyto dva filtry budou přijímat IDčko v parametru <slug> a budou ho překládat na cestu. Prostuduj si tohle téma, třeba napoví (ber v úvahu, že je to psané pro dibi) – po můj druhý příspěvěk, to s tím ModelsLoaderem je deprecated.