Podivné chování n:href, nefiltruje link v proměnné
- ldown
- Člen | 29
Mám problém s překladem url v šabloně.
Mám např. takový presenter:
class MainPresenter extends Presenter {
public $path;
public function renderCategory($categoryId)
{
// $path se vezme z modelu, zde priklad
$path = array(
12 => 'Školní potřeby',
13 => 'Sešity'
);
foreach ($path as $id => $text) {
$this->path[] = array(
// toto nebude fungovat
'link' => "Main:category $id",
// toto funguje
//'link' => $this->link("this", $id),
'text' => $text,
);
}
}
V šabloně pak:
<div n:inner-foreach="$presenter->path as $bread">
{* toto nefunguje => filtruje se to jen na '#' *}
<a n:href="$bread['link']">{$bread['text']}</a> ›
{* tato druha varianta funguje => spravne se to vyfiltruje v presenteru*}
{* <a href="{$bread['link']}">{$bread['text']}</a> › *}
{* kdyz to sem dam natvrdo, tak to funguje => routy jsou spravne *}
<a n:href="Main:category 12">Školní potřeby</a>
</div>
Prostě mě to nefiltruje v šabloně link který mám v proměnné.
Když ho filtruji v presenteru tak je vše ok.
Zapnul jsem i Presenter::INVALID_LINK_EXCEPTION ale nic to nevyhazuje.
Teoreticky bych mohl použít ten způsob, který funguje, ale pak by bylo zase složitější kešování.
Nějaký bug?
- Jan Tvrdík
- Nette guru | 2595
To je zcela v pořádku. Fungovat ale mohlo:
{var $destination = 'Main:category', $id = 12}
<a n:href="$destination, $id">test</a>
Oprava: $presenter
→ $destination
- 22
- Člen | 1478
co to máte za Nette prosím?
<a n:href="Homepage:default 12">test</a> //nefunguje, ale autor vlákna tvrdí, že ano
<a n:href="Homepage:default, id => 12">test</a> //funguje
{var $presenter = 'Main:category', $id = 12}
<a n:href="$presenter, $id">test</a> //nefunguje -> Call to a member function link() on a non-object
{var $link = 'Main:category', $id = 12}
<a n:href="$link, $id">test</a> //nefunguje
<a n:href="$link, id => $id">test</a> //funguje
default nastavení routeru ze sandboxu
Editoval 22 (28. 6. 2011 13:03)
- Jan Tvrdík
- Nette guru | 2595
ldown wrote:
Mě to právě v pořádku nepřijde, ale to je asi věc názoru.
Kdybych chápal, jak funguje Latte, chápal bys, proč to nefunguje. To tvoje
by totiž znamenalo $presenter->link($link)
, což je blbost. To
moje znamená $presenter->link($destination, array(12))
.
- ldown
- Člen | 29
Právě že považuji Nette za inteligentní, a když mu předám řetězec, který obsahuje mezeru za názvem Presenteru (nebo čárku), tak zbytek považuje jako argument fuknce.
Ale když to tak není, nevadí, jen je potřeba s tím počítat. Třeba to bude ve verzi 2.2. :)
P.S.: příspěvek byl psán pod vlivem vína
- bojovyletoun
- Člen | 667
Makro link má jednu vlastnost: Nijak jím nelze dostat
link('Dest', array(POLE)
. Je sice možné zapsat
{link Dest: , a=>b,c=>d}
, ale mám li parametry někde
v poli předem mám smůlu, prostě {link Dest: $POLE}
nejde.
Protože UIMacros::Macrolink
...'->link(%node.word, %node.array?))'
%node.array vždy vyrobí
pole, takže vznikne link('Dest', array(array(POLE))
.
- Buď by bylo možné přidat podobnou kontrolu jako je
v PrsenterComponent::link do makra (přes nějaké
$args=fetchWord(); $linkParams=is_array($args)?$args:fetchAll()+$args
). Trochu lépe využít tokenizer a použít scan(advance =false) - BC change: změna na %node.args, pak by bylo ale nutné všechny parametry uzavírat do pole
- nepožívat makro a psát
href={$presenter->link(dst,$POLE)}