2011-05-24 75 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你自己的問題。請將它作爲真實答案發布,但不是在問題或評論中。作爲真正的答案發帖有助於保持「未答覆」清單更加清晰(避免讓其他人浪費時間)。