不知道这对你来说是否太hacky。
$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);
}
}
更新
注意避免重复的错误消息。
如果您不能调用isValid
表单或元素;就像在我的示例中,我只添加错误消息并设置默认值。问题是isValid($value)
它将调用_getErrorMessages()
并且该方法根据值检查错误消息。
如果您无法避免调用isValid
我将扩展 Multiselect 元素并getErrorMessages()
用我的一个逻辑覆盖该 _ 方法。您可以Zend/Form/Element.php
在底部的类中找到该方法。