2011-05-24 29 views
2

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

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

虽然平时我希望这所有的元素,也有一些场合它打破的东西,例如在文字区域(换行符也被删除),所以我正在寻找一种方法来禁用某些元素的默认过滤器。 我尝试这样做(不成功):

$element->clearFilters(); 

然而内的形式的init(),该过滤器还没有被设置($元素 - > getFilters()返回一个空数组)方法,调用等__toString方法只有当( )或isValid()它被应用,但我宁可不覆盖这些方法只是为了摆脱过滤器。一定会有更好的办法?!

最干净的解决方案可能会选择在该过滤器,并且默认情况下不应用 - 但我宁愿保持默认状态,并找到排除某些元素的方法。

+1

@skooli是否尝试过'$ element-> removeFilter('filterName');'也确定它实际上并不是一个验证器。如果它是使用'$ element-> removeValidator('validatorName');' – martynthewolf 2011-05-24 14:57:29

+1

结果与'clearFilters()'相同 - 因为过滤器没有在init()中设置,所以它没有任何作用。并且它绝对是一个过滤器:p'$ this-> setElementFilters(array('FixWhitespaces'))' – skooli 2011-05-24 15:02:24

+0

@skoolio true to form Zend Documentation is not up to scratch,but I did find find this。 '如果在任何时候你需要未经过滤的值,使用getUnfilteredValue()方法'也许它可能有用。 – martynthewolf 2011-05-24 15:08:58

回答

1

skooli,在OP,已经自我回答了这个问题:

报价:


解决!

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