Использование Zend_Validate_Identical в проверке формы - PullRequest
1 голос
/ 16 мая 2011

Я пытаюсь использовать «Идентичный» валидатор, чтобы проверить, совпадают ли два пароля в моей регистрационной форме, но он продолжает пытаться проверять фактическое слово, введенное мной для токена, а не элемент формы, который я хочупроверить против.Код выглядит следующим образом: (Это мой конструктор модели формы ..)

    $password = new Zend_Form_Element_Password('password');
    $password->addValidator('Regex',false,array('pattern' => '/^.*(?=.{6,20})(?=.*[\d])(?=.*[a-zA-Z])/'))
             ->addValidator('StringLength',false,array('max'=>20))
             ->setRequired(true);

    $password2 = new Zend_Form_Element_Password('password2');
    $password2->setRequired(true);
    $password2->addValidator('Identical',false,array('token'=>'password'));       
    $register = new Zend_Form_Element_Submit('register');

    $this->setDecorators(array(
                                array('ViewScript', 
                                       array('viewScript' => '_form_registration.phtml'))  
                              )     
                        );

    $this->addElements(array($firstName,$lastName,$email,$city,$password,$password2,$register));

Вместо проверки по элементу формы, называемому «паролем», он пытается сопоставить фактическую строку «пароль»

Обходной путь, который у меня есть, заключается в том, что я создаю валидатор после того, как данные были отправлены в контроллер, и проверяю по данным поста, но если есть более модульный способ сделать это (AKA оставляет логику в формеконструктор) Хотелось бы узнать.

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

После добавления идентичного валидатора в ваш элемент 'password2'.

Попробуйте перегрузить функцию isValid () в объект формы следующим образом:



    public function isValid ($data)
    {
        $this->getElement('password2')    
             ->getValidator('Identical')
             ->setToken($data['password'])
             ->setMessage('Passwords don\'t match.');
        return parent::isValid($data);
    }

1 голос
/ 27 мая 2011

Вы правильно выводите свою форму?

Я вижу, что используемый вами декоратор - это ViewScript, поэтому я предполагаю, что вы сами кодируете HTML формы в другом скрипте.

Если это так, вы следуете Zendприсвоения имен и значений идентификаторов для ваших элементов?Если это не так, при передаче значений в форму контекст может быть настроен неправильно, и он не найдет элемент «пароль», с которым вам нужно проверить.

Мое предложение верноТеперь нужно вывести форму, используя декораторы формы по умолчанию, и посмотреть, как идентификаторы и имена выглядят для элементов.Затем попробуйте скопировать эти имена в используемый файл form.phtml.

0 голосов
/ 13 июня 2012

У меня точно такая же проблема. Это было исправлено путем переписывания кода с помощью внешней функции для проверки идентичности как таковой.

<?php
class RegisterForm extends Zend_Form
{
    /**
     * create your form
     */
    public function init()
    {
        $this->addElements(array(
            new Zend_Form_Element_Password('password',
                array( 'label' => 'Password:',
                           'required' => true,
                           'filters' => array('StringTrim', 'StripTags'),
                           'validators' => array(array(StringLength', false, array(5, 25)))
                )
            ),
            new Zend_Form_Element_Password('pass_twice',
                array('label' => 'Pass Twice',
                         'required' => true,
                         'filters' => array('StringTrim', 'StripTags'),
                         'validators' => array('Identical')
                )
            )
        );
    }

    public function isValid($data)
    {
        $passTwice = $this->getElement('pass_twice');
        $passTwice->getValidator('Identical')->setToken($data['password']);
        return parent::isValid($data);
    }
}
?>

Решение от: http://emanaton.com/node/38

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...