我不明白如何将带有选项的数组发送到我的自定义过滤器。你能帮我吗?
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)));
我尝试了几种不同的方法,我只是设法将一个字符串作为选项发送给构造函数,但我需要能够发送一个数组。
答案 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',
))),
),
);