ActionformのフィルタにPHP関数を使えるようにしてみた
ActionFormのフィルターですが、結構便利なのだが、ActionFormクラスのメソッドとして定義しなければいけないのがちょっと使いずらいと思っていたので、Pluginと、さらにPHP関数も使えるようにしてみた。
Ethna/class/Ethna_ActionForm.php の _filterメソッドをごにょっと書き換え。
もしくは、各プロジェクト内の app/APPID_ActionForm.php 内でメソッドをオーバーライドしてもいいと思う。
<?php //色づけ /** * フォーム値に変換フィルタを適用する * * @access private * @param mixed $value フォーム値 * @param int $filter フィルタ定義 * @return mixed 変換結果 */ function _filter($value, $filter) { if (is_null($filter)) { return $value; } foreach (preg_split('/\s*,\s*/', $filter) as $f) { $params = preg_split('/\s*:\s*/', $f); $name = strtolower(array_shift($params)); $method = sprintf('_filter_%s', $name); if (method_exists($this, $method)) { $value = $this->$method($value); } elseif (function_exists($name)) { array_unshift($params, $value); $value = call_user_func_array($name, $params); } else { $formfilter_plugin =& $this->plugin->getPlugin('Formfilter', ucfirst($name)); if (method_exists($formfilter_plugin, 'filter')) { array_unshift($params, $value); $value = call_user_func_array(array($formfilter_plugin, 'filter'), $params); } else { $this->logger->log(LOG_WARNING, 'filter method is not defined [%s]', $method); continue; } } } return $value; }
で、プラグインを作る場合には、app/olugin の下に、Formfilterというディレクトリを作ってその中に作成します。
これで、ActionFormのfilterに以下のように書くことが出来るようになります。
<?php //色づけ var $form = array( 'sample' => array( // Form definition 'type' => VAR_TYPE_INT, 'form_type' => FORM_TYPE_TEXT, 'name' => 'Sample', // Validator (executes Validator by written order.) 'required' => true, 'min' => null, 'max' => null, 'regexp' => null, 'mbregexp' => null, 'mbregexp_encoding' => 'UTF-8', // Filter 'filter' => 'mbtrim,mb_convert_kana:A', ), );
mb_convert_kanaとか普通に素で呼べれば楽だよねーという感じで。