0

我有一个名为 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;
    }
}
?>
4

1 回答 1

1

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

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

$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);

Since it looks like your class is only extending Zend's email validator to override the message, you can override Zend's messages like this and not need to extend the class. This is taken from a validator in one of my projects, so ignore the extra stuff and just pay attention to the messages for the EmailAddress validator.

$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
    ));
于 2012-01-21T21:02:17.050 回答