我使用自己的类扩展了Zend_Form,并从中继承了我的所有表单。我的基类对所有删除双空格的表单元素应用默认过滤器,基本上是:
return trim(preg_replace('/\s+/', ' ', $value));
虽然我通常希望在每个元素上都有这个,但在某些情况下它会破坏东西,例如在textareas上(换行也会被删除)所以我正在寻找一种方法来禁用某些元素的默认过滤器。 我试过这个(失败了):
$element->clearFilters();
然而在表单init()方法中,尚未设置过滤器($ element-> getFilters()返回一个空数组),只有在调用__toString()或isValid()之类的方法时才会应用它,但是不要仅仅为了摆脱过滤器而覆盖这些方法。必须有更好的方法吗?!
最干净的解决方案可能是选择加入该过滤器而不是默认应用 - 但我宁愿保持默认并找到排除某些元素的方法。
答案 0 :(得分:1)
引用:
<强>解决!强>
setElementFilters()
方法将运行当前添加到表单的所有元素并应用过滤器,所以现在我只是覆盖了这个方法,就像这样:
public function setElementFilters(array $filters) {
foreach ($this->getElements() as $element) {
if(!($element instanceof Zend_Form_Element_Textarea)) {
$element->setFilters($filters);
}
}
return $this;
}
虽然这适用于所有textareas但我不能排除其他类型的任意字段。如果我需要,我可能会创建一个虚拟过滤器,它不会做什么,但可用于确定是否应省略fixWhitespaces
过滤器。
注意:这绝对是OK to self-answer你自己的问题。请将其作为真实答案发布,但在问题或评论中不。发布真实答案有助于更清楚地保持“未答复”清单(避免让其他人浪费时间)。