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とか普通に素で呼べれば楽だよねーという感じで。