Zend Frameworkには値のフィルタリングが出来るZend_Filterがあるわけですが、Zend_FormからZend_Filterにオプション値を渡す時に妙なクセがあったので
もろもろメモ。

まずは、クラス&メソッドを渡して使う汎用フィルタを作ってみたのでサンプル的に掲載。
※※コレを使うとフィルタの実働メソッドが各所に散らばるので、乱用するのは良くないかも

require_once 'Zend/Filter/Interface.php';
/**
 * わざわざクラスを作るまでもない非汎用フィルタのための汎用フィルタ
 * オプション配列にクラス名(orオブジェクト)&メソッド名を渡して、そのメソッドをフィルタとして使用する
 */
class Sample_Filter_General implements Zend_Filter_Interface
{
    protected $_options = array();

    public function __construct ($options = array())
    {
        // 単純にオプションをセット
        $this->_options = $options;
    }

    public function filter($value)
    {
        // この辺は適当に調整
        $params = array($value);

        if (isset($this->_options['class'])) {
            $function = array($this->_options['class'], $this->_options['function']);
        } else {
            $function = $this->_options['function'];
        }

        return call_user_func_array($function, $params);
    }
}

これをパスの通ったディレクトリの~/Sample/Filter/General.php あたりに配置する。(まぁ呼び出せればOKなので場所は適当に)

Zend_Formを継承したクラスのコンストラクタあたりに下記の記述を追加し、作成したフィルタを使えるようにする。

// フォームエレメントで使用する要素のプレフィックス・パスを指定。
$this->addElementPrefixPath('Sample_Filter', 'Sample/Filter/', Zend_Form_Element::FILTER);

あとは、Zend_Formで下記のように記載する。

class Test_Form extends Zend_Form
{
    public function init()
    {
        parent::init();
        ...省略...
        // 普通にフォームエレメントを追加
        $this->addElement('text', 'test', array(
            ...省略...
            'filters' => array(
                array('General', array(array('class' => $this, 'function' => 'testFilter'))),
            ),
            ...省略...
        ));
        ...省略...
    }

    /**
     * フィルタとして使う関数
     * @param string $value
     * @return string
     */
    public function testFilter($value)
    {
        // フォーム値末尾に必ず文字列hogehoge」を追加するフィルタ
        return $value . 'hogehoge';
    }

}

ポイントはココ。

'filters' => array(
    array('General', array(array('class' => $this, 'function' => 'testFilter'))),
),

‘filters’でフォームエレメントに複数のフィルタを一括で追加でき、ひとつのフィルタはひとつの配列で定義する。
配列内第一要素’General’のところが、使用するフィルタ名になる。
↑最初にZend_Formでプレフィックス(’Sample_Filter’)を指定したので、フィルタとして呼ばれるクラスは
「Sample_Filter_General」となる。

そして、第二要素でオプションを指定するわけなのだが、ここが変に詰まるところ。
上記の例では配列を2重にネストしているが、こうしないと配列をオプションとして渡せない。(Zend Framework Ver 1.10.8)
※例えば配列をネストせずarray(‘class’ => $this, ‘function’ => ‘testFilter’) を渡すと、配列から最初の要素だけ($this)が取り出されて、フィルタのコンストラクタに渡されてしまう。
何でこの仕様になってるのかよくわからんですが、ご注意をば。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Name *
Email *
Website

*