Jak na odkaz s parametrem v generovaném menu s odkazy v presenteru
- zoltinho
- Člen | 24
Pěkně to funguje, když nepředávám žádné parametry.. jak to přepsat,
aby to bylo funkční?
Případně řešíte někdo podobné menu lépe? Díky
V šabloně
<?php
<ul>
{foreach $menuItems as $id=>$item}
<li><a href="{plink $id}">{$item}</a></li>
{/foreach}
</ul>
?>
V presenteru
<?php
public function beforeRender($parametr){
$this->template->menuItems = array(
'NejakyPresenter:'=>'Odkaz',
'JinyPresenter:akce'=>'Odkaz na jiný presenter',
//takhle to určitě nepůjde:
'DalsiPresenter:akce, $parametr' => 'Odkaz na presenter s předaným parametrem',
);
}
?>
- mkoubik
- Člen | 728
Šlo by to třeba takhle
public function beforeRender($parametr){
$this->template->menuItems = array(
$this->link('NejakyPresenter:')=>'Odkaz',
$this->link('JinyPresenter:akce')=>'Odkaz na jiný presenter',
$this->link('DalsiPresenter:akce', '$parametr') => 'Odkaz na presenter s předaným parametrem',
);
}
a vypisovat to pomocí <a href={$link}>
- bojovyletoun
- Člen | 667
beforeRender je bez parametrů přeci: https://api.nette.org/…ter.php.html#179
pokud chceš parametr, tak buď $this->params['parametr']
nebo $this->parametr
, je-li ělenskou proměnnou
Editoval bojovyletoun (17. 5. 2011 20:40)
- zoltinho
- Člen | 24
Asi je to hloupý dotaz, ale jak to implementovat do toho beforeRender? Něco jsem načetl a zkoušel, ale vždy se mi proměnná někde vytratila.. Params jsem ještě v Nette nepoužíval, tak nevím.
Použil jsem to co psal mkoubik, a menu jsem z beforeRenderu
přesunul do všech něcoRender, a funguje.
Až na to, že se opakuje kód, je to fajn, ale vnitřní pocit mi říká, že
to je moc špatně to takhle dělat.
Díky za jakekoliv ‚nakopnutí‘:)
- bojovyletoun
- Člen | 667
<?php
public param2; // viz dále (*)
public function beforeRender(){
$this->template->menuItems = array(
'NejakyPresenter:'=>'Odkaz',
'JinyPresenter:akce'=>'Odkaz na jiný presenter',
'DalsiPresenter:akce, '. $this->params['parametr'] => 'Odkaz na presenter s předaným parametrem',
// můžeme použít tuto 'zkratku', je li deklarován jako proměnná třídy
'DalsiPresenter2:akce, '. $this->param2 => 'Odkaz na presenter s předaným parametrem',
);
}
?>
V prvním příkladu byla i ta chyba, že jsi měl
'DalsiPresenter:akce, $parametr'
– v jednoduchých uvozovkách
se proměnná nevyhodnotí.
- Filip Procházka
- Moderator | 4668
doporučuju používat lazyLink, člověk si to pak můžeš ještě někde „po cestě“ doupravit
$menu[] = (object)array( # líp se s tím pak pracuje, když je to objekt
'title' => 'Kontankt',
'link' => $this->lazyLink(':Kontakt:default') # jako normální #link
);
<ul n:foreach="$menu as $item">
<li><a href="{$item->link}">{$item->title}</li>
</ul>
- nanuqcz
- Člen | 822
Jen by mě zajímalo, nešlo by to principielně třeba takhle?
V presenteru
<?php
public function actionDefault(){
// Menu
$this->template->menuItems = array(
// Odkaz 1 s parametrem
array(
'text' => 'O nás',
'destination' => 'Articles:show',
'args' => array('id' => 1), //argumenty pro plink by měly být array
),
// Odkaz 2 bez parametru
array(
'text' => 'Kontakt',
'destination' => 'Contact:default',
'args' => NULL,
),
);
}
?>
V šabloně
<?php
<ul>
{foreach $menuItems as $item}
<li><a href="{plink $item['destination'], $item['args']}">{$item['text']}</a></li>
{/foreach}
</ul>
?>
Myslím, že něco takového už jsem v jednom svojem projektu použil a fungovalo to dobře.
EDIT: tak jsem se podíval do zdrojáků toho projektu, a taky jsem tam
použil $this->link($destination, $args)
. Takže nemůžu
zaručit, že to co jsem tu psal bude fungovat (ale kdyby fungovalo, bylo by to
hezké řešení :-) )
Editoval xxxObiWan (18. 5. 2011 11:57)
- Filip Procházka
- Moderator | 4668
Moje řešení je lepší :) protože si nastavíš odkaz a až v momentě
výpisu (echo $item->link;
===
echo $item->link->__toString();
) se ti až vygeneruje
(dotáže se komponenty, ve které byl vytvořen na ten odkaz). Můžeš si tak
třeba ještě někde nějaký parametr přidat, nebo něco.
Editoval HosipLan (18. 5. 2011 12:10)