Smarty: проверить, есть ли переменная в массиве - PullRequest
6 голосов
/ 11 ноября 2011

Я использую 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поле в первом массиве построено.То есть массив в 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 - но с тем же результатом.Какой лучший способ добиться того, чего я добиваюсь?

Ответы [ 3 ]

6 голосов
/ 11 ноября 2011

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

И это помогло.

3 голосов
/ 11 ноября 2011

Вы можете сделать это так:

<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 голосов
/ 11 ноября 2011

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

Мое решение состояло в том, чтобы изменить базовый массив (в вашем случае, $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>
...