Zend_Form:从一个元素中删除默认过滤器

时间:2011-05-24 14:49:17

标签: php filter zend-form

我使用自己的类扩展了Zend_Form,并从中继承了我的所有表单。我的基类对所有删除双空格的表单元素应用默认过滤器,基本上是:

return trim(preg_replace('/\s+/', ' ', $value));

虽然我通常希望在每个元素上都有这个,但在某些情况下它会破坏东西,例如在textareas上(换行也会被删除)所以我正在寻找一种方法来禁用某些元素的默认过滤器。 我试过这个(失败了):

$element->clearFilters();

然而在表单init()方法中,尚未设置过滤器($ element-> getFilters()返回一个空数组),只有在调用__toString()或isValid()之类的方法时才会应用它,但是不要仅仅为了摆脱过滤器而覆盖这些方法。必须有更好的方法吗?!

最干净的解决方案可能是选择加入该过滤器而不是默认应用 - 但我宁愿保持默认并找到排除某些元素的方法。

1 个答案:

答案 0 :(得分:1)

OP的{p> skooli已经自我回答了这个问题:

引用:


<强>解决!

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你自己的问题。请将其作为真实答案发布,但在问题或评论中。发布真实答案有助于更清楚地保持“未答复”清单(避免让其他人浪费时间)。