ma-100140 @ ウィキ HTML_QuickForm

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

HTML_QuickFormのネタを整理

addFormRule

クラスの関数を渡す

HTML_QuickFormを使ってvalidationにaddFormRuleを使っています。 今までは単に関数しか渡してなかったのですが、 mojavi3を使っていて関数の中でModelをコールしたくなりました。 具体的には

$context =& $this->getContext();
$model = $context->getController()->getGlobalModel('Ps');

を呼び出したかった。 しかし、addFormRuleにクラスを渡す方法がわからなくて苦労しました。 解決法はcall_user_funcの使い方を見て納得。以下のように

$va = new _vA();
$va->initialize($this->context);
$form->addFormRule(array(&$va,'_validate_Action'));

するとクラスで定義した関数が渡せました。 自作した_vAクラスはMojaviObjectを継承して、initialize関数でcontextを受取ます。 こうすると自作クラスでも値の取得が簡単になりました。

select element

書き方

今までは何となく以下のように書いていました。$this->getArray_nendo()はテーブルを読んで配列を返す関数です。

$form->addElement('select','nendo','年度',$this->getArray_nendo());

これだと、selectedオプションが使えません。今までは配列を返す関数の中でデフォルトで選びたい値を一番最初にすることで対処していましたが、ソースを覗くとあるじゃないですか色々と...そこで以下のように書き直しです。

$s1 = & $form->createElement('select','nendo','年度');
$s1->loadArray($this->getArray_nendo());
$s1->setSelected('2012');
$form->addElement($s1);

これで解決しました。便利です。以下はselectedが機能している結果

<th>年度</th>
    <td>
       <select name="nendo">
          <option value="2013">2013</option>
          <option value="2012" selected="selected">2012</option>
          <option value="2011">2011</option>
       </select>
   </td>

バグ?

HTML_QuickFormのselect elementでバグがありますね。 select項目に渡す配列の中に例えばarray('0'=>'例題0','1'=>'例題1')というふうに '0'が入っていると値は1を渡していても、表示が例題0となります。 常に'0'の表示がされるようです。 select.phpのfunction getFrozenHtml()をみると、ありました問題の部分 515行目あたりに

if ($val == $this->_options[$i]['attr']['value']) {

$valはselectに渡された値で、$this->options[$i]['attr']['value']は先ほどの配列。 比較を==で行っているので問題があったようですね。 ==を===に修正したら、ちゃんと動くようになりました。 もしかしたら、私が使っているHTML_QuickFormのバージョンが低いのかもしれません? 1時間ほど考えました。