[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 メーリングリストの案内