2010-11-23 18 views
1

J'essaie de cocher les cases en fonction des valeurs d'un tableau smarty.Smarty cocher les cases sélectionnées en utilisant array_search

Dans mon php

$smarty->assign('locations_array',array(4,6,9,7)); 

Je veux rechercher dans le tableau et s'il y a une correspondance cocher la case à cocher. Voici ce que j'ai essayé dans mon template mais je n'arrive pas à le faire fonctionner. Je ne sais pas comment je peux passer array_search l'aiguille et la meule de foin dont elle a besoin?

{foreach $locations as $x} 
    {if $x.id == $x.id|@array_search:$locations_array} 
    <label><input checked type="checkbox" name="locations[]" value="{$x.id}"/>{$x.title}</label> 
    {else} 
    <label><input type="checkbox" name="locations[]" value="{$x.id}" />{$x.title</label> 
    {/if} 
{/foreach} 

Est-ce possible sans créer de fonction personnalisée?

+0

Je pense que je l'ai eu à travailler avec {if x.id $ | array_search: locations_array de $} – andrew

+0

Le @ est utilisé que si la chose est un tableau et le tableau est PASED après la fonction. Le problème est que seule la dernière case est cochée malgré l'emplacement id qui correspondent aux id dans locations_array – andrew

+0

andrew: Au lieu de: {if x.id $ | array_search: locations_array de $}, utilise toujours: { if $ x.id | array_search: $ locations_array! == false} sinon si $ x.id est trouvé dans la clé 0 du tableau, ce test échoue si vous ne le souhaitez pas. Voir avertissement ici: http://php.net/manual/en/function.array-search.php –

Répondre

1

Sans réellement répondre à votre question principale (je ne sais pas si vous pouvez passer deux vars à la fonction du modèle), tout cela pourrait être évité en créant un nouveau tableau au lieu de $locations dans le fichier php. Juste en regardant votre code posté, vous voudriez que chaque élément ait trois sous-éléments: title, id, et checked. De cette façon, vous évitez d'avoir à comparer les tableaux du côté du modèle et vous évitez également d'écrire une fonction personnalisée.

+0

Que la case ne coïncide pas avec une case dépend des préférences individuelles, elles doivent donc être vérifiées ou non pour l'utilisateur spécifique. – andrew

+0

C'est bien; Vous devriez aussi savoir quel utilisateur vous traitez dans le fichier php, donc vous pouvez toujours créer un tableau personnalisé pour cet utilisateur avant d'appeler '$ smarty-> display()'. – eykanal

+0

:) vous pouvez le laisser sans aucun vote up ou down, le vote est encouragé mais facultatif. – eykanal

1

Pour référence, je pense que c'est la syntaxe correcte lors de l'utilisation de array_search. Où $ x.id est l'aiguille et $ locations_array est le tableau haystack.
J'ai décidé d'opter pour une approche différente basée sur les commentaires d'eknals

0

Je n'ai pas travaillé avec array_search mais j'ai une solution simple à votre problème. vous pouvez vérifier votre valeur checkbox avec locations_array dans la boucle foreach.

**$i = 0;** 
     {foreach $locations as $x} 
      **{if $x.id == $locations_array[$i]}** 
      <label><input checked type="checkbox" name="locations[]" value="{$x.id}"/>{$x.title}</label> 
      {else} 
      <label><input type="checkbox" name="locations[]" value="{$x.id}" />{$x.title</label> 
      {/if} 
**$i++;** 
     {/foreach}