Хорошее решение для рассмотрения - написать собственный валидатор для элементов.
В вашем методе isValid
вы должны будете проверить на основе $context
других значений. Что-то вроде:
EDIT
/** /library/Application/Form/Validate/ContactMethodSelected.php **/
class Application_Form_Validate_ContactMethodSelected
extends Zend_Validate_Abstract
{
const INVALID = 'invalid';
protected $_messageTemplates = array(
self::INVALID => 'Must select at least one contact method'
);
public function isValid($value, $context = array())
{
// You need to use your element names, consider making these dynamic
$checkFields = array('phone','email','address');
// Check if all are empty
foreach ( $checkFields as $field ) {
if (isset($context[$field]) && !empty($context[$field])) {
// Only one value needs to return true..skip the rest
return true;
}
}
// All were empty, set your own error message
$this->_error(self::INVALID);
return false;
}
}
Теперь вы должны указать элементам использовать этот валидатор. Итак, внесите изменения в свои формы init()
метод.
$mail->addValidator(new Application_Form_Validate_ContactMethodSelected());
$telephone->addValidator(new Application_Form_Validate_ContactMethodSelected());
Не забудьте: После того, как вы получите свой собственный валидатор, вам придется удалить isRequired()
с каждого элемента.
EDIT2
Вы должны установить пользовательский валидатор в качестве первого валидатора в цепочке и прервать работу при ошибке. Кроме того, вы должны setAllowEmpty()
в ложь.
$telefoon = $this->createElement('text', 'telefoon');
$telefoon->setLabel('Telefoon:')
->setAttrib('size', 50)->setAllowEmpty(false)
->addValidator(new Application_Form_Validate_ContactMethodSelected(),true)
->addValidator('StringLength', false,array(10,10));
$mobiel = $this->createElement('text', 'mobiel');
$mobiel->setLabel('Mobiel:')
->setAttrib('size', 50)->setAllowEmpty(false)
->addValidator(new Application_Form_Validate_ContactMethodSelected(),true)
->addValidator('StringLength', false,array(10,10));
$mail = $this->createElement('text', 'mail');
$mail->setLabel('E-mail:')
->setAttrib('size', 50)->setAllowEmpty(false)
->addValidator(new Application_Form_Validate_ContactMethodSelected(),true)
->addValidator('StringLength', false,array(6,40))->addValidator('EmailAddress', true);
Далее вам необходимо обновить метод isValid
следующим образом:
public function isValid($value, $context = array())
{
// You need to use your element names, consider making these dynamic
$checkFields = array('telefoon','mobiel','mail');
// Check if all are empty
foreach ( $checkFields as $field ) {
if (isset($context[$field]) && !empty($context[$field])) {
if (!empty($value)) {
// This is the element with content... validate as true
return true;
}
// we are going to return false and no error
// to break validation chain on other empty values
// This is a quick hack, don't have time to invest in this
return false;
}
}
// All were empty, set your own error message
$this->_error(self::INVALID);
return false;
}
Теперь вам нужно добавить еще одно условие в ваш код, который использует этот валидатор. Мы должны требовать, чтобы в форме не было сообщений об ошибках.
if ($form->isValid($_POST) || !count($form->getMessages())) {
/** Valid, now you can process **/
} else {
/** Not valid **/
}