Affamative Way

前向きにグダグダいいながらコード書く

フォーム定義のフィルタを追加する方法

PHPでtrim+全角スペースを取り除く時のベンチマークを取って見たEthnaに組み込んでみた。

組み込み済みのフィルタはどこに定義されているかというと。
以下のように定義されている。

Ethna/class/Ethna_ActionForm.php L1025〜

<?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) {
            $method = sprintf('_filter_%s', $f);
            if (method_exists($this, $method) == false) {
                $this->logger->log(LOG_WARNING,
                    'filter method is not defined [%s]', $method);
                continue;
            }
            $value = $this->$method($value);
        }

        return $value;
    }

    /**
     *  フォーム値変換フィルタ: 全角英数字->半角英数字
     *
     *  @access protected
     *  @param  mixed   $value  フォーム値
     *  @return mixed   変換結果
     */
    function _filter_alnum_zentohan($value)
    {
        return mb_convert_kana($value, "a");
    }
・・・

$this([PROJECT_ID]_Action_Formクラス)の _filter_[フォームにて指定されているフィルタ名]というルールにて記載されている。


なので、[PROJECT_ID]/app/直下の[PROJECT_ID]_ActionForm.phpにて以下のようにカスタムフィルタの定義をしてやればよい。

<?php
class [PROJECT_ID]_ActionForm extends Ethna_ActionForm
{

・・・・
    /* @custom filter defined */
    /**
     *  フォーム値変換フィルタ: 全角スペースを半角スペースに変換してtrimしる。
     *
     *  @access protected
     *  @param  mixed   $value  フォーム値
     *  @return mixed   変換結果
     */
    protected function _filter_mb_trim( $value)
    {
        return trim( mb_convert_kana( $value, "s"));
    }


これで、あとは通常のフィルタと同様にフォーム定義内の'filter'にて'mb_trim'と指定してあげればいい。

簡単〜♪