Проверить набор полей / группу полей в Zend Form - PullRequest
0 голосов
/ 03 августа 2010

Есть ли хорошее решение для следующих требований:

  • Форма с одним полем для почтового индекса и валидаторы по умолчанию, такие как число, длина и т. Д.
  • После отправкиФорма сверяется с базой данных.
  • Если почтовый индекс не является уникальным, мы должны запросить город.

Примеры:

Случай 1: Почтовый индекс с указаниемуникален в базе данных.Все хорошо.Форма процесса

Случай 2: представленный почтовый индекс не является уникальным.Добавьте второе поле для города в форму.Вернитесь к форме.

Мы хотим обработать это в общем виде (не внутри контроллера).Нам нужна эта логика для многих форм.Первой мыслью было добавить его в isValid () для каждой формы или написать валидатор с логикой для добавления полей в форму.Подформы не возможны для нас, потому что это нужно для разных полей (например, название и улица).

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

В настоящее время я использую метод isValid в своих формах для формы пользователя, чтобы проверить пароль и подтвердить поле пароля.Кроме того, когда форма отображается в новом действии, никаких изменений нет, но при отображении в действии редактирования новое поле добавляется в форму.

Я думаю, что это хороший вариант работы надМетод isValid и добавьте поле, когда валидация вернет false, и если вы хотите что-то более обслуживаемое, вы должны написать для этого свой собственный валидатор.

Взгляните на мой код:

class Admin_Form_User extends Zf_Form 
{
    public function __construct($options = NULL)
    {
        parent::__construct($options);
        $this->setName('user');

        $id = new Zend_Form_Element_Hidden('id');

        $user = new Zend_Form_Element_Text('user');
        $user->setLabel('User:')
        ->addFilter('stripTags')
        ->addFilter('StringTrim')
        ->setAllowEmpty(false)
        ->setRequired(true);

        $passwordChange = new Zend_Form_Element_Radio('changePassword');
        $passwordChange->setLabel('Would you like to change the password?')
        ->addMultiOptions(array(1 => 'Sim', 2 => 'Não'))
        ->setValue(2)
        ->setSeparator('');

        $password = new Zend_Form_Element_Password('password');
        $password->setLabel('Password:')
        ->addFilter('stripTags')
        ->addFilter('StringTrim')
        ->setRequired(true);

        $confirm_password = new Zend_Form_Element_Password('confirm_password');
        $confirm_password->setLabel('Confirm the password:')
        ->addFilter('stripTags')
        ->addFilter('StringTrim')
        ->addValidator('Identical')
        ->setRequired(true);

        $submit = new Zend_Form_Element_Submit('submit');
        $submit->setLabel('Save');

        $this->addElements(array($id,$name,$lastname,$group,$user,$passwordChange,$password,$confirm_password,$submit));

        $this->addDisplayGroup(array('password','confirm_password'),'passwordGroup');
        $this->submit->setOrder(8);

        $this->setDisplayGroupDecorators(array(
            'FormElements',
            array('HtmlTag', array('tag' => 'div','id' => 'div-password'))
            )
        );

        $passwordChange->clearDecorators();

    }

    public function addPasswordOption()
    {
        $this->changePassword->loadDefaultDecorators();

        $this->getDisplayGroup('passwordGroup')
        ->addDecorators(array(
            array('HtmlTag', array('tag' => 'div','id' => 'div-password'))
            )
        );

        $this->password->setRequired(false);
        $this->confirm_password->setRequired(false);
    }

    public function setPasswordRequired($flag = true)
    {
        $this->password->setRequired($flag);
        $this->confirm_password->setRequired($flag);
    }

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

}

Итак, в моем контроллере:

public function newAction()
    {
        $this->view->title = "New user";
        $this->view->headTitle($this->view->title, 'PREPEND');

        $form = $this->getForm();

        if($this->getRequest()->isPost()) 
        {
            $formData = $this->_request->getPost();

            if($form->isValid($formData))
            {
                $Model = $this->getModel();
                $id = $Model->insert($formData);

                $this->_helper->flashMessenger('The user data has beed updated.');
                $this->_helper->redirector('list');
            }
        }

        $this->view->form = $form;
    }

    public function editAction()
    {       
        $this->view->title = "Edit user";
        $this->view->headTitle($this->view->title, 'PREPEND');

        $id = $this->getRequest()->getParam('id');

        $form = $this->getForm();

        // Add yes or no password change option
        $form->addPasswordOption();

        $Model = $this->getModel();

        if($this->getRequest()->isPost()) 
        {
            $formData = $this->getRequest()->getPost();

            // Change password?
            if($formData['changePassword'] == 2) $form->setPasswordRequired(false);

            if($form->isValid($formData)) 
            {
                $Model->update($formData);

                $this->_helper->flashMessenger('The user data has beed updated.');
                $this->_helper->redirector('list');
            } 

        }

        $data = $Model->getById($id)->toArray();

        $form->populate($data);

        $this->view->form = $form;
    }
1 голос
/ 03 августа 2010

Для этого вам, вероятно, понадобится валидатор Javascript. В функции отправки выполните вызов AJAX, чтобы проверить, является ли почтовый индекс уникальным. Если нет, покажите дополнительное поле города.

Но вы все равно должны выполнить проверку на стороне сервера: никогда не доверяйте вводу пользователя, даже если он проверен на стороне клиента.

...