2011-11-11 19 views
6

Sto utilizzando php con smarty. In php Ho due matrici:Smarty: controlla se la variabile è nell'array

$code = Array 
(
    [n_id] => 1 
    [t_code] => ABC123 
    [t_description] => Test code 
    [b_enabled] => Yes 
    [n_type] => 3 
    [dt_start] => 
    [dt_end] => 
    [n_min_req_gbp] => 0 
    [n_min_req_usd] => 0 
    [n_amount_gbp] => 
    [n_amount_usd] => 
    [n_max_overall_gbp] => 
    [n_max_overall_usd] => 
    [n_extra] => 6 
    [b_reuse] => No 
    [n_applications] => Array 
     (
      [0] => 2 
     ) 
) 

e

$all_application = Array 
(
    [1] => New registration 
    [2] => Mid-subscription upgrade 
    [3] => Subscription renewal 
    [4] => Additional purchase 
) 

noti che la seconda matrice può - e sarà - crescere, questo è i dati di riferimento, da cui n_applications campo array nella prima matrice è costruito. Cioè, la matrice in n_applications conterrà un sottoinsieme di chiavi dagli array $all_applications.

Ora, sto assegnando questi due array nel modello:

$template->assign('code', $code); 
$template->assign('apps', $all_applications); 

E nel modello, Sto creando un modulo per la modifica dei campi nella matrice $code. Tutto funziona bene tranne la selezione 'applicazioni'. Voglio preselezionare quelle app che sono già nel campo n_applications. Così, nel mio modello ho questo:

<select name="c_apps[]" size="3" class="multiselect" multiple="multiple"> 
    {foreach from=$apps key=k item=a} 
     {assign var=v value=$k|@array_search:$code['n_applications']} 
     <option value="{$k}"{if $v!==FALSE} selected="selected"{/if}>{$a|escape}</option> 
    {/foreach} 
</select> 

Tuttavia questo non funziona come previsto - e tutte le opzioni finiscono per essere selezionati. Ho provato a utilizzare la funzione in_array, ma con lo stesso risultato. Qual è il modo migliore per ottenere ciò che cerco?

risposta

6

Dopo un po 'di lottare in tutte le direzioni possibili, finalmente sono riuscita a tirare fuori in questo modo (solo il codice Smarty)

<select name="c_apps[]" size="3" class="multiselect" multiple="multiple"> 
    {foreach from=$apps key=k item=a} 
     {if @in_array($k, $code.n_applications)} 
      {assign var=v value=true} 
     {else} 
      {assign var=v value=false} 
     {/if} 
     <option value="{$k}"{if $v} selected="selected"{/if}>{$a|escape}</option> 
    {/foreach} 
</select> 

E questo ha fatto il trucco.

0

Ho fatto qualcosa di simile qualche anno fa e sono incappato nella stessa sfida logica.

La mia soluzione era di modificare l'array di base (nel tuo caso, $all_applications) aggiungendo un'altra chiave lì (forse ['opt_selected']). Ho lasciato il valore predefinito vuoto e, per i dati che avrei voluto selezionare, ho modificato il valore in, indovina cosa, ... selected="selected".

Questo rende piuttosto facile per il vostro modello di Smarty:

<option value="{$k}" {$a.opt_selected|default:''}>{$a|escape}</option> 

potrebbe non essere la soluzione migliore, ma aiuta lasciando un sacco di codice di fuori del modello dove di solito non voglio troppo programma logica.

Aggiornamento

Per contrastare avere la parte HTML nel codice php, si potrebbe anche solo la bandiera della matrice:

$all_applications['opt_selected'] = 1 

... e poi organizzare Smarty come questo:

<option value="{$k}" {if $a.opt_selected eq '1'}selected="selected"{/if}> 
    {$a|escape} 
</option> 
+0

Suppongo che questo rende il modello un po 'più pulito, ma il codice PHP un po' più sporco - e inserisce specifiche HTML nel PHP, che non è anche la soluzione migliore., Ma se funziona ... –

+0

I totalmente d'accordo con te lì.Per pulire questo, potresti anche solo impostare una bandiera e nel tuo modello smarty controllare la bandiera, farò una dimostrazione nel mio post principale. – Bjoern

+0

Ho capito. Una cosa che mi preoccupa un po 'di questo approccio è ciò che anticipo il mio cliente a chiedere in seguito, vale a dire, questi codici visualizzati in una tabella con la modifica sul posto di ciascuno di essi. In questo caso, ci saranno più codici sulla stessa pagina, ognuno con una propria serie di applicazioni e un array di "tutte_applicazioni". Allora diventerà davvero disordinato ... Eppure, grazie lo stesso. –

2

si può fare in questo modo:

<select name="c_apps[]" size="3" class="multiselect" multiple="multiple"> 
    {foreach from=$apps key=k item=a} 
     <option value="{$k}"{if in_array($k, $code.n_applications)} selected="selected"{/if}>{$a|escape}</option> 
    {/foreach} 
</select> 
+0

Questa è stata la prima cosa che ho provato, ma il risultato è stato piuttosto bizzarro, poiché è stato aggiunto qualcosa di strano all'interno del tag . –

+0

Beh, dovrebbe funzionare. Qual'era il risultato? E quale versione di Smarty usi? –

Problemi correlati