Zend Validate - несколько значений - PullRequest
2 голосов
/ 08 декабря 2011

Я хочу проверить элемент формы, который может содержать несколько адресов электронной почты, разделенных запятой и пробелом.

Вот код, который у меня есть:

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;
    }
}

Правильно проверяется, но если в списке более одного адреса электронной почты, который не проверяется, отображается только сообщение об ошибке для последнего. Я хотел бы видеть сообщение для каждого неверного адреса электронной почты.

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Я решил проблему с несколькими сообщениями, используя адрес электронной почты в качестве ключа сообщения в массиве $_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;
    }
}
2 голосов
/ 08 декабря 2011

Вы не можете сделать это в силу текущей реализации метода $ this -> _ error ().Но вы можете поместить все неподтвержденные письма в строку и затем передать их _error ().

    $wrong_emails = array ();
    foreach ($emails as $email) {
         if (!self::getValidatorEmailAddress()->isValid($email)) {
               $wrong_emails [] = $email;
         }
    }
    if ($wrong_emails)
    {
         $this->_error(self::MSG_INVALID, join (', ', $wrong_emails);
         return false;
    }

return true;
...