Php Zend验证-多个值
我想验证允许包含多个电子邮件地址的表单元素,这些地址由逗号和空格分隔 以下是我的代码:Php Zend验证-多个值,php,zend-framework,zend-validate,Php,Zend Framework,Zend Validate,我想验证允许包含多个电子邮件地址的表单元素,这些地址由逗号和空格分隔 以下是我的代码: class My_Validate_EmailAddresses extends Zend_Validate_Abstract { const MSG_INVALID = 'msgInvalid'; /** @var Zend_Validate_EmailAddress */ protected static $_validatorEmailAddress; /** @va
class My_Validate_EmailAddresses extends Zend_Validate_Abstract
{
const MSG_INVALID = 'msgInvalid';
/** @var Zend_Validate_EmailAddress */
protected static $_validatorEmailAddress;
/** @var array */
protected $_messageTemplates = array(
self::MSG_INVALID => "'%value%' is not a valid email address",
);
/**
*
* @return Zend_Validate_EmailAddress
*/
public static function getValidatorEmailAddress()
{
if (is_null(self::$_validatorEmailAddress)) {
self::$_validatorEmailAddress = new Zend_Validate_EmailAddress();
}
return self::$_validatorEmailAddress;
}
/**
* 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 (!self::getValidatorEmailAddress()->isValid($email)) {
$this->_error(self::MSG_INVALID, $email);
$valid = false;
}
}
return $valid;
}
}
它正确验证,但如果列表中有多个电子邮件地址未验证,则只显示最后一个电子邮件地址的错误消息。我希望看到每个无效电子邮件地址的消息。由于$this->\u error()方法的当前实现,您无法做到这一点。 但是您可以将所有未验证的电子邮件放入一个字符串中,然后将其传递给_error()
我使用电子邮件地址作为
$\u 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_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;
}
}
谢谢你,阿康!我想我必须走这条路,但我找到了另一条我更喜欢的路。我很快就会发布的。刚刚发布。再次感谢您的解决方案,对于不同的情况,这可能是一个更好的解决方案。