2011-11-11 14 views
6

私はsmartyでphpを使用しています。 PHPで私は2つの配列を有する: - となります -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

そこにあなたに完全に同意する。これをきれいにするにはフラグだけを設定し、スマートなテンプレートにフラグをチェックして、私のメインポストでデモンストレーションします。 – Bjoern

+0

私は考えを得る。私がこのアプローチについて少し心配していることの1つは、クライアントが次に質問するもの、つまりこれらのコードがそれぞれのインプレース編集のあるテーブルに表示されることです。この場合、同じページに複数のコードがあり、それぞれに独自のアプリケーション配列があり、「all_applications」という配列が1つあります。そしてそれは本当に乱雑になるでしょう...しかし、とにかくおかげさまです。 –

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のどのバージョンを使用していますか? –

関連する問題