Проблема с пользовательским валидатором в Zend Framework - PullRequest
0 голосов
/ 22 января 2012

У меня есть форма с именем 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 Ответ

1 голос
/ 22 января 2012

Когда вы вызываете $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);

Поскольку, похоже, ваш класс только расширяет валидатор электронной почты 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
    ));
...