Я решил проблему с несколькими сообщениями, используя адрес электронной почты в качестве ключа сообщения в массиве $_messageTemplates
.Я также создал один класс проверки электронной почты, а затем расширил его для многократной проверки.
Один адрес электронной почты
class My_Validate_EmailAddress extends Zend_Validate_Abstract
{
const MSG_INVALID = "'%value%' is not a valid email address";
/** @var Zend_Validate_EmailAddress */
protected static $_validatorEmailAddress;
/** @var array */
protected $_messageTemplates = array();
/**
*
* @return Zend_Validate_EmailAddress
*/
public static function getValidatorEmailAddress()
{
if (is_null(self::$_validatorEmailAddress)) {
self::$_validatorEmailAddress = new Zend_Validate_EmailAddress();
}
return self::$_validatorEmailAddress;
}
/**
*
* @param string $value
* @return boolean
*/
public function isValid($value)
{
$valid = true;
if (!self::getValidatorEmailAddress()->isValid($value)) {
$this->_messageTemplates[$value] = self::MSG_INVALID;
$this->_error($value, $value);
$valid = false;
}
return $valid;
}
}
Несколько адресов электронной почты
class My_Validate_EmailAddresses extends My_Validate_EmailAddress
{
/**
* Values passed in here should be filterd by My_Filter_CommaSpaceSeparated first
*
* @param string $value
* @return boolean
*/
public function isValid($value)
{
$valid = true;
$emails = explode(', ', $value);
foreach ($emails as $email) {
if (!parent::isValid($email)) {
$valid = false;
}
}
return $valid;
}
}
Фильтр запятой и пробел
class My_Filter_CommaSpaceSeparated implements Zend_Filter_Interface
{
/**
*
* @param string $value
* @return string
*/
public function filter($value)
{
// normalize delimiters
$value = str_replace(array(' ', ';'), ',', $value);
// explode values
$values = explode(',', $value);
// remove empty values
$values = array_filter($values);
// implode
$value = implode(', ', $values);
// return filtered value
return $value;
}
}