Zend Framework:将数组选项传递给自定义过滤器

时间:2009-08-11 14:59:58

标签: 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)));

我尝试了几种不同的方法,我只是设法将一个字符串作为选项发送给构造函数,但我需要能够发送一个数组。

2 个答案:

答案 0 :(得分: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的运行时反射并不完全以速度而闻名。这可能是也可能不是微观/过早的优化,我不建议任何一种方式,只列出相关的警告。

答案 1 :(得分:1)

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

传递的数组每个元素包含一个过滤器。如果该元素是字符串或Zend_Filter_Interface的实例,则将其传递给addFilter()而不包含'options'

如果元素是数组,则第一个元素成为过滤器名称,第二个元素成为选项。 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',
       ))),
   ),
);