2

コンマとスペースで区切られた複数の電子メール アドレスを含めることが許可されているフォーム要素を検証したいと考えています。

ここに私が持っているコードがあります:

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

正しく検証されますが、リストに検証されない電子メール アドレスが複数ある場合は、最後のアドレスのエラー メッセージのみが表示されます。無効な電子メール アドレスごとにメッセージが表示されるようにします。

4

2 に答える 2

3

$_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;
    }
}
于 2011-12-08T17:56:21.050 に答える
2

$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;
于 2011-12-08T17:08:11.157 に答える