2009-08-11 62 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 2009-08-13 12:04:25

1

Zend_Form_Element::addFilters()函数可以帮助你理解这个过程。

传递数组包含每个元素一个过滤器。如果该元素是用一个字符串或一个instanceof Zend_Filter_Interface它并将它传递到addFilter()方法无“选项”

如果元素是一个数组,的第一元件成为过滤器的名称,所述第二元件将成为选项。 options数组用于_loadFilter(),它将选项数组传递给过滤器的构造函数。使用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', 
     ))), 
    ), 
); 
相关问题