Dynamické linky – array $args jako proměnná

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

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

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

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?;)

Jod
Člen | 701
+
0
-

Keď už tak môžeš skúsiť eval(„array(‚id‘ ⇒ 5)“); :D :D :D

No možno to bude tým, že tá metóda bere string aj array parametre
Skús ešte (array)$args, bo ma nič nenapadá =D

lucass
Člen | 89
+
0
-

Přetypování také vyzkoušeno – bezúspěšně. Eval průbnu.

Jod
Člen | 701
+
0
-

Skús ešte array_push nejak, možno to oblbneš :D

lucass
Člen | 89
+
0
-

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)

Jod
Člen | 701
+
0
-

A pozrel si sa čo generuje curlyBrackets filter v tempe? Tam by malo byť vidieť kde je pes zakopaný.

lucass
Člen | 89
+
0
-

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

Tohle by mělo fungovat:

<a href="{plink $linkObj->getDestination(), 'id' => 5, 'name' => 'název produktu'}">
lucass
Člen | 89
+
0
-

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.

David Grudl
Nette Core | 8218
+
0
-

Už rozumím. V tom případě je lepší použít přímo $presenter->link().