不知道這對您來說太過於無奈。
$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
類的底部找到該方法。
的問題是,錯誤信息將被複製爲每個選定的項目。 –
@mzabsky看到我的更新 –
是的,覆蓋_getErrorMessages會工作。我決定重載錯誤裝飾器(它比重寫整個元素更小)。 –