我正在使用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
函数 - 但结果相同。实现我追求目标的最佳途径是什么?
答案 0 :(得分:6)
在一切可能的方向上挣扎之后,我终于设法将它拉下来(仅限智能代码)
<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>
这就是诀窍。
答案 1 :(得分:3)
你可以这样做:
<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>
答案 2 :(得分:0)
几年前我做了类似的事情,偶然发现了同样的逻辑挑战。
我的解决方案是修改基本数组(在您的情况下为$all_applications
),同时在那里添加另一个键(可能是['opt_selected']
)。我将默认值保留为空,对于我想要选择的数据,我已将值更改为,猜猜是什么,... selected="selected"
。
这使您的Smarty模板变得相当容易:
<option value="{$k}" {$a.opt_selected|default:''}>{$a|escape}</option>
它可能不是最好的解决方案,但它有助于将大量代码从模板中删除,而我通常不需要太多的程序逻辑。
<强>更新强>
要在PHP代码中使用HTML部分,您可能只需标记数组:
$all_applications['opt_selected'] = 1
......然后像这样安排Smarty:
<option value="{$k}" {if $a.opt_selected eq '1'}selected="selected"{/if}>
{$a|escape}
</option>