2011-11-11 33 views
6

我用smarty使用php。在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> 

它可能不是最好的解決辦法,但它有助於留下的代碼進行了很多的模板,我通常不希望太多的程序邏輯。

更新

爲了對付在你的PHP代碼的HTML部分,你可能也僅僅旗數組:

$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? –