Dynamické linky – array $args jako proměnná
- lucass
- Člen | 89
Opět zdravím všechny!
Můj dotaz se týká linkování, kdy v cyklu sestavuju odkazy a jako parametr $args vkládám pole. Mějme následující kód v HTML šabloně:
...
{foreach $links as $key => $linkObj}
<a href="{plink $linkObj->getDestination(), array('id' => 5)}">
{/foreach}
...
Toto funguje ok. Funkce, která je vrácena v destination ve tvaru Presenter:view, má vstupní parametr $id a toto zpracuje. Routa to také pobere tak, jak má.
Podívejme se na další příklad:
...
{foreach $links as $key => $linkObj}
<?php $args = array('id' => 5); ?>
<a href="{plink $linkObj->getDestination(), $args}">
{/foreach}
...
V momentě, kdy předám parametr $args jako pole v proměnné, dojde ve třídě Application/Route na řádku 279 ke špatné koverzi array na string. Jedná se o podmínku
if (strcasecmp($params[$name], $meta['default']) === 0) { ...
Když vypnu routy, zmíněná chyba nenastane, ale parametr id, který by měl být v URL ve tvaru id=5, je uveden ve tvaru id[id]=5.
Mohlo by se jednat o bug, nebo je chyba na mé straně? Verze 0.8, rev. 139.
- Jod
- Člen | 701
Keby si skúsil miesto plink, link? Ale asi je to to isté :D
Parametre sa dajú v pohode vkladať aj cez čiarku, len je treba mať nastavenú routu
<?php
// ...
<a href="{plink $linkObj->getDestination(), 5}">
// ...
?>
Alebo ešte skús použiť miesto array(id ⇒ 5) , array(5), keď hovoríš, že keď zmažeš routy ide to
- lucass
- Člen | 89
Jj, to vím. Těch způsobů, jak ty parametry vkládat, je více:
<?php
// ...
<a href="{plink $linkObj->getDestination(), 5}">
// nebo
<a href="{plink $linkObj->getDestination(), 'id' => 5}">
// nebo
<a href="{plink $linkObj->getDestination(), array('id' => 5)}">
?>
Ten první je v pohodě, tam mohu dát klidně jednu $id, kde si předtím do $id přiřadím číslo 5. Ale když bude parametrů více, netuším, jak toto poskládat do proměnné bez použití array, tj. abych pak měl např.:
<?php
// ...
<a href="{plink $linkObj->getDestination(), 'id' => 5, 'name' => 'název produktu'}">
// ...
?>
Jako string jsem to do proměnné $args (tj. $args = „‚id‘ ⇒ 5, ‚name‘ ⇒ ‚název produktu‘“ a pak to dostadit do toho linku) zkoušel, ale nepobralo to (předpokládal jsem, že to PHP vezme stejně jako třeba new $class(), ale to jsem asi moc naivní;)). Takže string nepobere, array také ne. Nějaké další nápady?;)
- lucass
- Člen | 89
Takže se zřejmě jedná o bug:
<?php
// ...
<?php $args = array('id' => 5, 'name' => 'název produktu');?>
<a href="{plink $linkObj->getDestination(), $args}">
// ...
?>
není stejné jako
<?php
// ...
<?php $args = array('id' => 5, 'name' => 'název produktu');?>
<a href="<?php echo $presenter->link($linkObj->getDestination(), $args);?>">
// ...
?>
Druhá možnost bez použití curlyBrackets funguje bez problémů.
Verze 0.8, rev. 139.
Editoval lucass (10. 12. 2008 10:49)
- lucass
- Člen | 89
Sorry, mohlo mě to napadnout. Tady to je:
<?php
// ...
<?php $args = array('id' => 5, 'name' => 'název produktu');?>
<a href="<?php echo $template->escape($presenter->link($colLink->getLink(), array($args))) ?>">
// ...
?>
V podstatě obalí pole dalším polem. Což není dobré.
Zřejmě by stačilo jen někam do Nette, kde se curlyBrackets zpracovávají, dodat podmínku ve smyslu:
<?php
// ... pseudozapis
if (is_array($arguments))
$arguments;
else
array($arguments);
// ...
?>
Nebo tak něco.
Editoval lucass (10. 12. 2008 11:29)
- David Grudl
- Nette Core | 8218
Tohle by mělo fungovat:
<a href="{plink $linkObj->getDestination(), 'id' => 5, 'name' => 'název produktu'}">
- lucass
- Člen | 89
David Grudl napsal(a):
Tohle by mělo fungovat:
<a href="{plink $linkObj->getDestination(), 'id' => 5, 'name' => 'název produktu'}">
:) To právě nechci. Já předem nevím, kolik těch parametrů bude. Abych to uvedl na pravou míru, používám to takto:
<a href="{plink $linkObj->getDestination(), $linkObj->getArgs()}">
A v tom je ten bug. Přestože getArgs() vrací pole, dojde při použití curlyBrackets ještě k jednomu obalení polem. Při standardním echo $presenter->link() je to ok.