2011-11-11 16 views
6

Estoy usando php con smarty. En php tengo dos matrices:Smarty: compruebe si la variable está en la matriz

$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 
     ) 
) 

y

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

Tenga en cuenta que la segunda matriz puede - y - crecer, estos son los datos de referencia, a partir del cual n_applications campo de matriz en la primera matriz es construido. Es decir, la matriz en n_applications contendrá un subconjunto de claves de las matrices $all_applications.

Ahora, estoy asignando estas dos matrices en la plantilla:

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

Y en la plantilla, estoy creando un formulario para editar los campos de la matriz $code. Todo funciona bien excepto la selección de 'aplicaciones'. Quiero preseleccionar las aplicaciones que ya están en el campo n_applications. Entonces, en mi plantilla tengo esto:

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

Sin embargo, esto no funciona como se esperaba, y TODAS las opciones terminan siendo seleccionadas. Intenté usar la función in_array, pero con el mismo resultado. ¿Cuál es la mejor manera de lograr lo que estoy buscando?

Respuesta

6

Después de un poco de luchar en todas las direcciones posibles, que finalmente lograron llevarlo a cabo como esto (sólo código 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> 

Y esto hizo el truco.

0

He hecho algo similar hace unos años, y tropecé con el mismo desafío lógico.

Mi solución fue modificar la matriz base (en su caso, $all_applications) mientras agregaba otra clave allí (tal vez ['opt_selected']). Dejé el valor predeterminado vacío, y para los datos que quería haber seleccionado, he cambiado el valor a, adivinen qué, ... selected="selected".

Esto hace que sea más fácil para su plantilla de Smarty:

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

tal vez no sea la mejor solución, pero ayuda dejando una gran cantidad de código de la plantilla en la que por lo general no quiero demasiada programa lógica.

actualización

Para contrarrestar tiene la parte HTML en su código PHP, puede ser que también acaba de Bandera La matriz:

$all_applications['opt_selected'] = 1 

... y luego organizar Smarty como esto:

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

Supongo que esto hace que la plantilla sea un poco más limpia, pero el código PHP es un poco más sucio y pone detalles de HTML en el PHP, que tampoco es la mejor solución, pero si funciona ... –

+0

I Totalmente de acuerdo contigo.Para limpiar esto, es mejor que simplemente establezcas una bandera y en tu plantilla de Smarty verifique el indicador, lo demostraré en mi publicación principal. – Bjoern

+0

Tengo la idea. Una cosa que me preocupa un poco acerca de este enfoque es lo que anticipo que mi cliente preguntará a continuación, es decir, estos códigos se muestran en una tabla con la edición in situ de cada uno de ellos. En este caso, habrá varios códigos en la misma página, cada uno con su propia matriz de aplicaciones, y una matriz de 'all_applications'. Entonces se pondrá realmente desordenado ... Sin embargo, gracias de todos modos. –

2

puede hacerlo de esta manera:

<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

Esto fue lo primero que probé, pero el resultado fue bastante extraño, ya que se agregó mucho extraño dentro de la etiqueta

+0

Bueno, debería funcionar. ¿Cuál fue el resultado? ¿Y qué versión de Smarty usas? –

Cuestiones relacionadas