2011-11-11 7 views
6

Я использую php с smarty. В PHP У меня есть два массива:Smarty: проверьте, есть ли переменная в массиве

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

и

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

Обратите внимание, что второй массив может - и будет - расти, это справочные данные, из которых n_applications поле массива в первом массиве является встроенный. То есть массив в n_applications будет содержать подмножество ключей из массивов $all_applications.

Теперь я задаю эти два массива в шаблон:

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

И в шаблоне, я создаю форму для редактирования полей в $code массиве. Все работает отлично, за исключением выбора «приложений». Я хочу предварительно выбрать те приложения, которые уже находятся в поле n_applications. Итак, в моем шаблоне у меня есть следующее:

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

Однако это не работает должным образом - и все опции в конечном итоге выбираются. Я пробовал использовать функцию in_array - но с тем же результатом. Каков наилучший способ добиться того, что мне нужно?

ответ

6

После недолгого изо всех сил во всех возможных направлениях, я, наконец, удалось вытащить его, как это (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> 

И это сделал трюк.

0

Я сделал что-то подобное несколько лет назад и наткнулся на один и тот же логический вызов.

Моим решением было изменить базовую матрицу (в вашем случае $all_applications), добавив еще один ключ (возможно, ['opt_selected']). Я оставил значение по умолчанию пустым, и для данных, которые я хотел бы выбрать, я изменил значение, угадаю, что ... selected="selected".

Это делает его довольно легко для шаблона Smarty:

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

Это может быть не лучшим решением, но это помогает оставляя много кода из шаблона, где я обычно не хочу слишком много программ логика.

Update

Для того, чтобы противостоять имея HTML часть в коде PHP, вы можете также просто флаг массива:

$all_applications['opt_selected'] = 1 

... а затем организовать Smarty так:

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

Я предполагаю, что это делает шаблон немного более чистым, но код PHP немного грязнее - и он помещает HTML-специфику в PHP, что тоже не самое лучшее решение., Но если оно работает ... –

+0

I полностью согласен с тобой там.Чтобы очистить это, вы могли бы просто установить флаг, а в вашем смарт-шаблоне проверить флаг, я продемонстрирую в своем основном сообщении. – Bjoern

+0

У меня есть идея. Одна вещь, которая меня немного волнует в этом подходе, - это то, что я ожидаю от моего клиента, чтобы спросить следующее, а именно, эти коды, отображаемые в таблице с редактированием на месте каждого из них. В этом случае на одной странице будет несколько кодов, каждый со своим собственным массивом приложений - и один массив из «all_applications». Тогда это будет очень грязно ... Тем не менее, спасибо в любом случае. –

2

Вы можете сделать это следующим образом:

<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

Это было первое, что я пробовал, но результат был скорее действительно бизарем, так как в теге было добавлено что-то странное. –

+0

Ну, это должно сработать. Каков был результат? И какую версию Smarty вы используете? –

Смежные вопросы