[2009-03-27] V makrech {link …} a {include …} nepoužívejte array()

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8218
+
0
-

Několikrát se na fóru objevil požadavek na odkazování ve tvaru {link default, $arr}, kde parametry jsou uloženy v poli $arr. Tohle nefungovalo podle očekávání. Od revize 240 je problém vyřešen, ale jako vedlejší efekt bylo nutné zrušit zbytečné leč tolerované obalování parametrů do polí (tj. třeba {plink default, array('param' ⇒ 1)}).

Prohledejte prosím kód šablon na řetězec array( a výskyty jako {plink default, array('param' ⇒ 1)} nahraďte za {plink default, 'param' ⇒ 1}. Totéž platí pro makra link, ajaxlink nebo include.

úprava je jako obvykle zpětně kompatibilní a na staré použití upozorňuje varováním

pmg
Člen | 372
+
0
-

. . . jako vedlejší efekt bylo nutné zrušit zbytečné leč tolerované obalování parametrů do polí . . .

Je to proto, aby pole mohlo být jedním z parametrů odkazované funkce? Taková změna by ale zpětně kompatibilní nebyla. Mluvím o stavu, kdy by byly ekvivalentní zápisy {link default array(1, 2)} a {link default 0 => array(1, 2)}.

David Grudl
Nette Core | 8218
+
0
-

Jj, cílem je, aby tyto zápisy byly ekvivalentní. Změna je zpětně kompatibilní v tom smyslu, že když je na začátku ‚array‘, tak to vyhodí warning a funguje postaru.

xificurk
Člen | 121
+
0
-

Tak nevím jestli se náhodou něco nezměnilo, ale…
{plink this, $params}
se mi přeloží na
<?php echo TemplateHelpers::escapeHtml($presenter->link('this', array($params))) ?>

Jde nějak plink makru předat parametry jako pole?

_Martin_
Generous Backer | 679
+
0
-

xificurk napsal(a):

Tak nevím jestli se náhodou něco nezměnilo, ale…
{plink this, $params}
se mi přeloží na
<?php echo TemplateHelpers::escapeHtml($presenter->link('this', array($params))) ?>

Jde nějak plink makru předat parametry jako pole?

Nejde, neboť v současné době není v Nette logika, která by dokázala rozpoznat, zda předané pole je „polem parametrů“ a nebo „jedním konkrétním parametrem typu pole“.

Jan Tvrdík
Nette guru | 2595
+
0
-

Nejde, neboť v současné době není v Nette logika, která by dokázala rozpoznat, zda předané pole je „polem parametrů“ a nebo „jedním konkrétním parametrem typu pole“.

Ta logika tam není, protože to nijak poznat nelze. Pokud potřebuji použít pole parametrů, tak je potřeba si vytvořit vlastní makro.

Patrik Votoček
Člen | 2221
+
0
-

Na PS se tohle řešilo a asi to do budoucna bude tak že přibude makro (nebo se změní aktuální fungování některého z maker) které bude určené právě na toto…

_Martin_
Generous Backer | 679
+
0
-

Jan Tvrdík napsal(a):

Ta logika tam není, protože to nijak poznat nelze. Pokud potřebuji použít pole parametrů, tak je potřeba si vytvořit vlastní makro.

Ono v té šabloně by to i šlo, například zápisem *$pole, ale co jsme se bavili s Davidem na PS, tak on by rád, aby to makro bylo ekvivalentní funkci link v presenteru – a tam už něco takového udělat nejde.

Otázka je, jestli někdo používá jako parametr pole – kdyby ne, mohla by se možnost dát pole jako parametr zrušit. Ale možná to je hloupost.

blacksun
Člen | 177
+
0
-

Ahoj,

dopadlo tohle nějak?

Pokouším se zapsat v šabloně pomocí makra link odkaz na akci z jiného presenteru, které chci předat několik parametrů typu string a jeden parametr typu pole, což se mi nedaří.

Zkoušel sem zápis

<?php
{link :presenter:akce, 'par1'=>'hod1', 'par2' => array('id1'=>'val1', 'id2'=>'val2')}
?>

i

<?php
{var args => array('par1'=>'hod1', 'par2' => array('id1'=>'val1', 'id2'=>'val2')) }
{$presenter->link(':presenter:akce', $args)}
?>

případně i co jsem našel s hvězdičkou

<?php
{var args => array('par1'=>'hod1', 'par2' => array('id1'=>'val1', 'id2'=>'val2')) }
{link :presenter:akce, *$args}
?>

ale nikdy se mi ten odkaz nevygeneruje správně s tím polem..

blacksun
Člen | 177
+
0
-

Tak díky nakopnutí a po vyzkoušením aktuálně nejnovější verze 0.9.5 funguje v pohodě první zápis.