2013年1月20日日曜日

Fieldsetのcheckboxとradioのlabelについて #fuelphp

FuelPHPのFieldsetはFormを自動生成してくれる便利な機能のひとつです。
簡単な登録フォームを作る場合など便利だと思い、私も少し加工したパッケージを作ったことがあります。
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 件のコメント:

コメントを投稿