簡単な登録フォームを作る場合など便利だと思い、私も少し加工したパッケージを作ったことがあります。
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 件のコメント:
コメントを投稿