簡単な登録フォームを作る場合など便利だと思い、私も少し加工したパッケージを作ったことがあります。
Fieldsetの例としては以下がコントローラのソースです。
classes/controller/test.php
<?php class Controller_Test extends Controller_Template { public function action_index() { $fieldset = Fieldset::forge(); $fieldset->add('name', 'Name') ->add_rule('required'); $opt = array( '1' => 'Man', '2' => 'Woman', ); $fieldset->add('gender', 'Gender', array( 'options' => $opt, 'type' => 'radio', )); $opt = array( 'PHP' => 'PHP', 'Ruby' => 'Ruby', 'Python' => 'Python', ); $fieldset->add('lang', 'Lang', array( 'options' => $opt, 'type' => 'checkbox', )); $this->template->content = View::forge('test/index'); $this->template->content->set_safe('form', $fieldset->build()); } }
これでView側(ここではview/test/index.php)は以下を記述するだけで登録フォームを生成してくれます。
<?php echo $form;
便利です。
populateやrepopulateを使うことでバリデーション後やモデルからデータを反映など実装してくれるので良いのですが、checkboxとradioを使った場合、現行バージョン(2013/01/19現在、1.4)ではソースを見ると以下のようになっています。
(langのcheckboxだけを抜粋)
<tr> <td class=""><label for="form_">Lang</label></td> <td class=""> <input type="checkbox" id="form_lang_0" name="lang[0]" value="PHP" /> <label for="form_form_lang_0">PHP</label><br /> <input type="checkbox" id="form_lang_1" name="lang[1]" value="Ruby" /> <label for="form_form_lang_1">Ruby</label><br /> <input type="checkbox" id="form_lang_2" name="lang[2]" value="Python" /> <label for="form_form_lang_2">Python</label><br /> <span></span> </td> <;/tr>
checkboxに紐づくはずのlabelのforが「form_form_xxx」となっています。
見た目は特に問題ですが、labelとcheckboxと紐付かないのはなかなか頂けません。
coreのプログラムを追ってたんですが、助言を頂いて1.5-devなら・・・ということで試してみました。
以下は1.5-devで実装した結果
<tr> <td class=""><label for="form_">Lang</label></td> <td class=""> <input type="checkbox" id="form_lang_0" name="lang[0]" value="PHP" /> <label for="form_lang_0">PHP</label><br /> <input type="checkbox" id="form_lang_1" name="lang[1]" value="Ruby" /> <label for="form_lang_1">Ruby</label><br /> <input type="checkbox" id="form_lang_2" name="lang[2]" value="Python" /> <label for="form_lang_2">Python</label><br /> <span></span> </td> </tr>
とりあえずはOK。確かになおってます。
今すぐどうにかしたい方はCoreの部分でdiffするとかやってみるといいかもしれませんね。
0 件のコメント:
コメントを投稿