2011-09-12 15 views
4

我有一個Multiselect Zend Form元素,它有很多選項。 我必須驗證所選選項的數量(至少有N個選項,並且至多選擇了M個選項)。我想要將錯誤消息打印在表單中,就像常規的Zend Validate錯誤消息一樣。驗證Zend Form Multiselect中的選項數量

什麼是最簡單的(也是最簡單的)方法來做到這一點?

定期驗證器不能這樣做,因爲每個選定的值都是單獨驗證的。

我試着覆蓋窗體的isValid方法並在那裏添加邏輯(如果數字超出允許的範圍,則返回false並添加錯誤消息),但會導致多次打印錯誤消息(對於每個選定的值)。我覺得試圖解決這個問題會導致非常黑客的代碼。

感謝您的幫助

回答

0

我決定創建我的自定義錯誤元素的裝飾,其丟棄非唯一的錯誤消息:

<?php 
class Element_Decorator_Errors extends Zend_Form_Decorator_Abstract 
{ 
    /** 
    * Render errors 
    * 
    * @param string $content 
    * @return string 
    */ 
    public function render($content) 
    { 
     $element = $this->getElement(); 
     $view = $element->getView(); 
     if (null === $view) { 
      return $content; 
     } 

     // The array_unique is the only difference in comparison to the default Error decorator 
     $errors = array_unique($element->getMessages()); 
     if (empty($errors)) { 
      return $content; 
     } 

     $separator = $this->getSeparator(); 
     $placement = $this->getPlacement(); 
     $errors = $view->formErrors($errors, $this->getOptions()); 

     switch ($placement) { 
      case self::APPEND: 
       return $content . $separator . $errors; 
      case self::PREPEND: 
       return $errors . $separator . $content; 
     } 
    } 
} 
?> 
1

不知道這對您來說太過於無奈。

$element = new Zend_Form_Element_Multiselect('CheckThis'); 
$options = array(
    1 => 'Option One', 
    2 => 'Option Two', 
    3 => 'Option Three', 
    4 => 'Option Four', 
    5 => 'Option Five', 
    6 => 'Option Six', 
    7 => 'Option Seven', 
    8 => 'Option Eight', 
); 
$element->addMultiOptions($options); 
$betweenOptions = array('min' => 2, 'max' => 4); 
$betweenValidator = new Zend_Validate_Between($betweenOptions); 
$betweenValidator->setMessage("The number of submitted values '%value%' is not between '%min%' and '%max%', inclusively",'notBetween'); 
if (true === $this->getRequest()->isPost()) { 
    if (true === $betweenValidator->isValid(count($_POST['CheckThis']))) { 
     $form->isValid($_POST); 
    } else { 
     $messages = $betweenValidator->getMessages(); 
     $element->addError($messages['notBetween']); 
     $form->setDefaults($_POST);     
    } 
} 

UPDATE
注意避免重複的錯誤消息。
如果您不能在表單或元素上調用isValid;就像我的示例中,我只添加錯誤消息並設置默認值。問題是isValid($value)將調用_getErrorMessages(),該方法會根據這些值檢查錯誤消息。

如果您無法避開對isValid的調用,我會擴展Multiselect元素並使用我的一個邏輯覆蓋該方法_ getErrorMessages()。您可以在Zend/Form/Element.php類的底部找到該方法。

+0

的問題是,錯誤信息將被複製爲每個選定的項目。 –

+0

@mzabsky看到我的更新 –

+0

是的,覆蓋_getErrorMessages會工作。我決定重載錯誤裝飾器(它比重寫整個元素更小)。 –