【问题标题】:One error message instead of few for Zend validatorZend 验证器的一条错误消息而不是几条
【发布时间】:2011-05-17 19:26:28
【问题描述】:

我有下一个元素:

$email = new Zend_Form_Element_Text('email');
$email->setAttribs(array('class' => 'input-text', 'id' => 'email'))
        ->setLabel($this->view->translate('Email'))
        ->setValue(null)
        ->setRequired(true)
        ->addValidator(new Zend_Validate_EmailAddress())
        ->setDecorators($emailMessageDecorators);

如果电子邮件地址有多个错误,则会显示一些错误。像这样:

'fff.fgdf' is no valid hostname for email address 'as@fff.fgdf'
'fff.fgdf' appears to be a DNS hostname but cannot match TLD against known list
'fff.fgdf' appears to be a local network name but local network names are not allowed

如何只设置 1 条消息?我尝试了 setMessage(string),但它显​​示了 3 个相同的错误。谢谢。对不起我的英语不好。和平与爱)

【问题讨论】:

    标签: php zend-framework validation email


    【解决方案1】:

    过去,我必须为此制作一个自定义验证器:

    /**
     * The standard email address validator with a single, simple message
     */
    class App_Validate_EmailAddressSimpleMessage extends Zend_Validate_EmailAddress
    {
        const COMMON_MESSAGE = 'Invalid email address';
    
        protected $_messageTemplates = array(
            self::INVALID            => self::COMMON_MESSAGE,
            self::INVALID_FORMAT     => self::COMMON_MESSAGE,
            self::INVALID_HOSTNAME   => self::COMMON_MESSAGE,
            self::INVALID_MX_RECORD  => self::COMMON_MESSAGE,
            self::INVALID_SEGMENT    => self::COMMON_MESSAGE,
            self::DOT_ATOM           => self::COMMON_MESSAGE,
            self::QUOTED_STRING      => self::COMMON_MESSAGE,
            self::INVALID_LOCAL_PART => self::COMMON_MESSAGE,
            self::LENGTH_EXCEEDED    => self::COMMON_MESSAGE,
        );
    
    }
    

    然后使用:

    $email->addValidator(new App_Validate_EmailAddressSimpleMessage());

    如果你只想像往常一样使用相同的语法:

    $email->addValidator('EmailAddress');

    但是让它使用这个验证器,然后你可以将类名/文件名从 EmailAddressSimpleMessage 更改为简单的 EmailAddress 并使用表单/元素注册前缀 App_Validate_

    更好的办法可能是允许这个类为你想要的消息接受一个可选的构造函数参数,但我当时又快又脏。

    【讨论】:

    • 不是一个好的解决方案,因为除了电子邮件地址验证器之外还有许多验证器。
    • 确实,解决方案仅限于Zend_Validate_EmailAddress,这是OP的问题。
    【解决方案2】:

    如果我没记错的话,您可以调用 setErrorMessages() 在表单元素上设置一条错误消息,而不是在每个单独的验证器上调用 setMessages():

    $form->addElement('password', 'password', array(
        'label' => 'New password:',
        'required' => true,
        'validators' => array(
            array('StringLength', false, 6),
            // more validators
        ),
        'errorMessages' => array('Invalid password.')
    ));
    

    【讨论】:

    • 我知道。我的元素(NotEmpty 和电子邮件)也有验证器。我想得到 2 种类型的错误消息(“需要值”和“无效电子邮件”)。
    【解决方案3】:

    这是一个例子(希望对你有帮助):

    $email = new Zend_Form_Element_Text('emailid');
    
    $email->setLabel("Email-Adress :* ")
          ->setOptions(array('size' => 20))
          ->setRequired(true)
          ->addFilter('StripTags')
          ->addFilter('StringTrim')
          ->addValidator('EmailAddress')
          ->getValidator('EmailAddress')->setMessage("Please enter a valid e-mail address.");
    

    【讨论】:

    • 没有。我也成功了。看我的问题。它显示 3 条相同的消息。
    【解决方案4】:

    这是答案,使用 $breakChainOnFailure = true:

    addValidator($nameOrValidator, $breakChainOnFailure = false, array $options = null);
    

    引用:http://framework.zend.com/manual/1.12/en/zend.form.elements.html#zend.form.elements.validators.errors

    【讨论】:

      【解决方案5】:

      你使用这个例子:

      $email_validator = new Zend_Validate_EmailAddress();
      $email = new Zend_Form_Element_Text('email');
      $email->setRequired('true')
            ->setLabel('Email: ')
            ->setDecorators(array(array('ViewHelper'), array('Errors')))
            ->addValidator($email_validator);
      

      【讨论】:

      • 然后呢?你的回答没用。 Zend_Validate_EmailAddress 创建 3 个验证器。每个验证者都有自己的错误。如果我们这样做 ->setErrorMessage('bla bla bla') 它会产生 3 个相同的错误。
      猜你喜欢
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 2021-02-24
      • 2011-02-03
      • 2011-09-21
      相关资源
      最近更新 更多