Smarty: проверьте, находится ли переменная в массиве
я использую php с smarty. В php у меня есть два массива:
$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
будет содержать подмножество ключей от $all_applications
массивы.
теперь, я назначаю эти два массива в шаблон:
$template->assign('code', $code);
$template->assign('apps', $all_applications);
и в шаблоне, я создаю форма для редактирования полей в $code
массив. Все работает нормально, за исключением выбора "приложения". Я хочу заранее выбрать те приложения, которые уже находятся в
3 ответов
после небольшой борьбы во всех возможных направлениях, мне, наконец, удалось вытащить его так (только smarty code)
<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>
и это сделало трюк.
вы можете сделать это так:
<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>
Я сделал что-то подобное несколько лет назад и наткнулся на тот же логический вызов.
моим решением было изменить базовый массив (в вашем случае, $all_applications
) при добавлении другого ключа (возможно,['opt_selected']
). Я оставил значение по умолчанию пустым ,и для данных, которые я хотел выбрать, я изменил значение на, угадайте, что... selected="selected"
.
это делает его довольно легким для вашего шаблона Smarty:
<option value="{$k}" {$a.opt_selected|default:''}>{$a|escape}</option>
это может быть не лучшее решение, но это помогает оставлять много кода из шаблона, где я обычно не хочу, слишком много логики программы.
обновление
чтобы противостоять HTML-части в вашем php-коде, вы можете просто пометить массив:
$all_applications['opt_selected'] = 1
...а потом устройте Smarty так:
<option value="{$k}" {if $a.opt_selected eq '1'}selected="selected"{/if}>
{$a|escape}
</option>