[PHP-users 27889] Re: HTML_QuickForm + Smarty による 可変数のテキストボックス出力

T Kammori kammoridensya @ yahoo.co.jp
2005年 12月 21日 (水) 14:28:55 JST


お世話になっております。
TKです。

ohguma様、ありがとうございました!
アドバイスいただいた方法で、
スマートに実現できました!!

苦し紛れの実装に逃げなくてよかったです(汗)
心から感謝いたします。


[報告]

---HTML_QuickForm----
for ($i = 1; $i <= $room_cnt; $i++) {
   $form->addElement('text', "usr_nm[{$i}]", null, null);
}

↑ ここで[]内に数字を振ってあげることがミソですね!


----Smarty----
{foreach from=$form.usr_nm key='i' item='usr_nm'}
    {$usr_nm.html}  {$i}人目
{/foreach}


[参考]

----Smarty----
※ section で検証
{section name=i loop=$form.guest_nm}
    {$form.guest_nm[i].html}
{/section}

では i が 0から始まるので、(当然ですが)
テキストボックスが一つ足りない状態になりました。

HTML_QuickForm 側で i に入る数を調整するか、
smarty側で +1 する処理が必要になりますね。

ソースの見通し的にも、ohguma様のように
foaeach で取るのがいいと思いました。



ちなみに、ruleについても
同様の方法で実装でき、メッセージの出力に成功しました。

---HTML_QuickForm----
$explain = '';
for ($i = 1; $i <= $room_cnt; $i++) {
    $explain = "{$i}人目:";
    $form->addRule("usr_nm[{$i}]", "{$explain}氏名は必ず
入力\n", 'required');
}


環境 (書き忘れておりました。)
PHP:4.4.1
Smarty:2.6.10
HTML_QuickForm:3.2.5


ありがとうございました!!

返信ここまで---------------------


>ohgumaです。
>
>私はこんな形で処理しています。
>他の方がどのようにしているのか私も興味があります。
>freeze時にはhiddenに値が入っています。
>
>---HTML_QuickForm----
>for($i=1; $i<= $num; $i++) {
>  $form->addElement('text', 'text[' . $i . ']', null,
null);
>}
>
>----Smarty----
>{foreach key=no item=row from=$form.text}
>テキスト{$no}:{$form.text[$no].html}<br>
>{/foreach}
>
>
>入力されたデータは配列として取得しています。
>----
>$text =& $form->getSubmitValue('text');
>
>
>(環境)
>PHP:4.4.1
>Smarty:2.6.11
>HTML_QuickForm:3.2.5

> いつもお世話になっております。
> TKと申します。
> 
> HTML_QuickForm + Smarty を使用し、
> ・ユーザーの選択値によって
> ・テキストボックスの数が変動する
> 入力フォームを作成しております。
> 
> その実装方法について(主にSmarty側の記述方法)、悩んでお
り
> ます。
> 同じようなことを悩まれた方がおられましたら、
> ご教授願えないでしょうか。
> 
> 
> ・実装例1
> 
>  -------- HTML_QuickForm作成側 -----------
>  for ($i = 1; $i <= $usr_cnt; $i++) {
>     $o_form->addElement('text', "usr_name{$i}", null,
> null);
>  }
> 
>  ※ テキストボックス名に連番をつけています。
> 
>  -------- Smarty側 -----------
>  {if $book_info.room_cnt >= 1}
>     {$form.usr_name1.html}
>  {/if}
>  {if $book_info.room_cnt >= 2}
>     {$form.usr_name2.html}
>  {/if}
>     ・・・以下略
> 
>  -------- 結果 -----------
>  意図した動作はしますが、 
>  どう考えてもスマートな方法ではない気がします。
>  
> 
> 
> ・実装例2
> 
>  -------- HTML_QuickForm作成側 -----------
>  for ($i = 1; $i <= $usr_cnt; $i++) {
>     $o_form->addElement('text', "usr_name[]", null,
null);
>  }
> 
>  ※ テキストボックス名に [] を付け、配列にしています。
> 
>  -------- Smarty側 -----------
>  {section name=i loop=$form.usr_name}
>     {$form.usr_name[i].html}
>  {/section}
> 
>  -------- 結果 -----------
>  ・入力画面には 意図どおりの数のテキストボックスが出力
さ
> れます。
>  ・確認画面へ遷移した際、freezeする・しないにかかわら
ず
> 、入力値をセットできません。
> 
>  ※ freeze しない場合、値なしのテキストボックスが 指定
数
> 分出力されます。
>  ※ freeze した場合、  値なしのhiddenが出力されていま
す
>> 
>  ※ var_dump($o_form) を確認したところ、
>     [submit_values]の中に入力値が入っていました。
> 
>  ※ 単独のテキストボックスでの正常動作は確認済みです。
> 
> 
> 
> ***
> ループ + echo では、HTML_QuickForm を使用する意味がな
く
> なってしまうと
> 思いますし・・
> 
> HTML_QuickForm + Smartyをお使いの皆様は、
> どのような方法を用いておられるのでしょうか。




PHP-users メーリングリストの案内