Zend Framework中的自定义验证程序问题

时间:2012-01-21 20:40:49

标签: php zend-form zend-validate

我有一个名为LoginForm的表单,它扩展了RecipeForm,后者又扩展了Zend_Form。 RecipeFrom只返回我的装饰者。

提交表单时,出现以下错误:“消息:方法addValidator不存在”。

class Recipe_Form_LoginForm extends Recipe_Form_RecipeForm {
    public function init()
    {
        parent::init();
        $this->setName('loginform')
             ->setAction('/login');


        //  Add Email Element
        $email = $this->addElement('text', 'email', array(
            'label' => 'Email Addresses',
            'required'=> true,
            'size'=>12,
            'filters'=>array('StringTrim'),
            'decorators' => $this->getElementDecorator('email'),

        ));
       $email->addValidator(new Recipe_Validate_EmailAddress(), true, array(
           'messages' => array(
               Recipe_Validate_EmailAddress::INVALID => 
               'Please enter email in correct format',
               Recipe_Validate_EmailAddress::EMAILISEMPTY =>
               'Please enter email address'
       )));
}

class Recipe_Validate_EmailAddress extends Zend_Validate_Abstract
{
    const INVALID           =   'notvalid';
    const EMAILISEMPTY      =   'isempty';

     protected $_messageTemplates = array(
             self::INVALID => "Email is in invalid format",
             self::EMAILISEMPTY => "You have to fill email field"
        );

    public function isValid($value){
        $response = parent::isValid($value);
        if(!$response){
            $this->_message = array(self::INVALID => "Please enter a valid email address");
        }
        return $response;
    }
}
?>

1 个答案:

答案 0 :(得分:1)

当您从Zend_Form对象中调用$this->addElement()时,它将返回表单对象本身,而不是您刚刚创建的元素。

您可以进行以下更改之一:

$this->addElement('text', 'email', ...);
$email = $this->getElement('email');
$email->addValidator(...);

// or

$email = new Zend_Form_Element_Text('email');
$email->addValidator(...)
      ->setLabel(...)
      ->setRequired(...);
$this->addElement($email);

要设置错误消息,我认为您应该这样做,而不是设置$ this-> _message。

$this->_error(self::INVALID);

由于您的类看起来只是扩展Zend的电子邮件验证程序来覆盖该消息,因此您可以覆盖Zend的消息,而不需要扩展该类。这是从我的一个项目中的验证器获取的,所以忽略额外的东西,只关注EmailAddress验证器的消息。

$this->addElement('text', 'email', array(
        'label' => 'Email Address:',
        'required' => false,
        'filters' => array('StringTrim', 'StringToLower'),
        'validators' => array(
            array('EmailAddress', true, array(
                'messages' => array(
                    Zend_Validate_EmailAddress::INVALID_FORMAT =>
                    "'%value%' is not a valid email address. Example: you@yourdomain.com",
                    Zend_Validate_EmailAddress::INVALID_HOSTNAME =>
                    "'%hostname%' is not a valid hostname for email address '%value%'"
                )
            )),
            array('Db_RecordExists', true, array(
                'table' => 'accounts', 'field' => 'email',
                'messages' => array(
                    Zend_Validate_Db_RecordExists::ERROR_NO_RECORD_FOUND =>
                    "No account with that email address was found"
                )
            ))
        ),
        'decorators' => $this->elementDecorators
    ));