Jak na odkaz s parametrem v generovaném menu s odkazy v presenteru

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

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',
	);
}
?>
zoltinho
Člen | 24
+
0
-

dalo by se nějak takhle? globalniPromenna by byla bud '' nebo by obsahovala ten parametr

<li><a href="{plink $id} {$globalniPromenna}">{$item}</a></li>

mkoubik
Člen | 728
+
0
-

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

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

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í‘:)

Patrik Votoček
Člen | 2221
+
0
-

záleží co ten parametr je a kde se berou jeho data…

zoltinho
Člen | 24
+
0
-

např.: Mám nějaký článek, chci ho editovat (ťuknu v MENU na odkaz „editovat“ s parametrem „id“ tohoto článku. Parametr je tedy ID, a vezme se jednoduše z databáze.

bojovyletoun
Člen | 667
+
0
-
<?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
+
0
-

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

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

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)