2009-08-11 17 views
2

カスタムフィルターにオプションを指定して配列を送信する方法がわかりません。手伝ってくれませんか?Zend_Framework:配列オプションをカスタムフィルターに渡す

class Core_Filter_MyFilter implements Zend_Filter_Interface 

{ 
    public function __construct($options = null) 
    ... 
} 
class Blog_Form_Comment extends Zend_Form 
{ 
    public function init() 
    { 
     $this->setMethod('post'); 
     $this->addElementPrefixPath('Core_Filter', 'Core/Filter/', 'filter'); 
     $this->addElement('textarea', 'entry', array(
      'filters' => array(MyFilter))); 

私はいくつかの異なる方法を試してみました、私は唯一のコンストラクタにオプションとして文字列を送信するために管理しているが、私は配列を送信できるようにする必要があります。

答えて

4

PluginLoaderを使用して、文字列名の表現からフィルタクラスを読み込むのではなく、フィルタのインスタンスを要素に直接渡すことができます。

$this->addElement('textarea', 'entry', array(
      'filters' => array(new Core_Filter_MyFilter($filterOptions)) 
    )); 

これはaddFilter()メソッドでも機能します。

また、リファレンスマニュアルには記載されていませんが、フィルタはバリデータと同様の構文をサポートしています。そのため、プラグインローダーを利用して、あなたはそうのように、コンストラクタに渡すために、短い名前、および引数の配列を使用することができます。

$this->addElement('textarea', 'entry', array(
      'filters' => array(
       array('MyFilter', array($filterOptions) 
      ) 
    )); 

しかし、この方法でプラグインローダーに頼ることは不要作り出すことができることに注意してくださいパフォーマンスが重大な状況にある場合はオーバーヘッド。フォーム要素はPHPのリフレクションシステムを利用してフィルタインスタンスを作成し、オプションを渡します。 PHPのランタイムリフレクションは、速度に関して正確には分かっていません。これはマイクロ/早すぎる最適化である場合とそうでない場合がありますが、私はいずれの方法も示唆していません。関連する警告をリストするだけです。

+0

は素晴らしい答えをありがとう。 – unkownt

1

Zend_Form_Element::addFilters()機能は、このプロセスを少し理解するのに役立ちます。

渡された配列には、要素ごとに1つのフィルタが含まれています。その要素が文字列かZend_Filter_Interfaceのインスタンスの場合、オプションなしのaddFilter()に渡します

要素が配列の場合、その要素の最初の要素がフィルタ名になり、2番目の要素がオプションになります。 options配列は_loadFilter()で使用され、options配列をフィルタのコンストラクタに渡します。 PregReplaceフィルタを使用する例:

// Zend_Filter_PregReplace::__construct($matchPattern = null, $replacement = null) 
$this->addElement('textarea', 'entry', array(
    'filters' => array(
    array('PregReplace', array('/test/', 'passed')) 
    ), 
); 
// equivalent to: 
$this->addElement('textarea', 'entry', array(
    'filters' => array(
    new Zend_Filter_PregReplace('/test', 'passed'); 
    ), 
); 

あなたが最初の引数として配列を渡したい場合は、別の配列にそれをラップする必要があります:

$this->addElement('textarea', 'entry', array(
    'filters'=>array(
     array('MyFilter', array(array(
      'option1'=>'test', 
      'option2'=>'test', 
     ))), 
    ), 
); 
関連する問題