Zend_Form не отображает сообщение об ошибке при вызове addError - PullRequest
2 голосов
/ 23 января 2012

Я реализую действие updatePasswordAction, и в нем не отображается ошибка с неверным текущим паролем.Я не мог реализовать это с помощью класса Zend_Validate для использования с предоставленным record-> паролем, поэтому я просто проверил на данный момент в своем действии контроллера и, если не удалось, то добавляю сообщение об ошибке в элемент формы.это как раз перед тем, как я бегу $form->isValid.В любом случае, это работает.но когда проверка завершается неудачно, на этом элементе не отображается сообщение об ошибке.любая помощь будет принята с благодарностью.

К вашему сведению: Когда я отправляю пустой текущий пароль, он показывает подтверждение

class Admin_Form_UserPassword extends Katana_Form
{
    public function init()
    {
    $element = $this->createElement('hidden', 'id');
    $this->addElement($element);

    $element = $this->createElement('password','password');
    $element->setLabel('Current Password:');
    $element->setRequired(true);        
    $this->addElement($element);

    $element = $this->createElement('password','new_password');     
    $element->setLabel('New Password:');
    $element->addValidator('StringLength', false, array(6,24));     
    $element->setRequired(true);
    $element->addValidator('NotEmpty');     
    $this->addElement($element);

    $element = $this->createElement('password','new_password_confirm');
    $element->setLabel('Confirm:');
    $element->addValidator('StringLength', false, array(6,24));
    $element->addValidator('IdenticalField', false, array('new_password', 'Confirm Password'));
    $element->setRequired(true);
    $this->addElement($element);

    $this->addElement('submit', 'submit', array('label' => 'Submit'));
}

}

public function updatePasswordAction()
{
    $resourceModel  = new Core_Model_Resource_User();       
    $form           = new Admin_Form_UserPassword();
    $form->setMethod(Katana_Form::METHOD_POST);
    $form->setAction($this->getActionUrl('update-password'));
    if($this->getRequest()->isPost()){
        $id             = $this->getRequest()->getParam('id');
        $record         = $resourceModel->find($id)->current();
        $currPassword   = $record->password;
        $typedPassword  = md5($this->getRequest()->getParam('password'));           
        if($currPassword !== $typedPassword){               
            $form->getElement('password')->addError('Current password is incorrect.');
        }
        if($form->isValid($_POST)){
            $data       = $form->getValues();
            $result     = $resourceModel->updatePassword($id, $data['new_password']);
            if($result){
                $this->redirectSimple('list');
            }
        }
    } else {
        $id     = $this->getRequest()->getParam('id');          
        $recordData = array(
            'id' => $id
        );
        $form->populate($recordData);           
    }
    $this->getView()->form = $form;     
}

Ответы [ 2 ]

6 голосов
/ 24 января 2012

Добавление ошибки к элементу не приводит к тому, что сама форма становится недействительной.

Есть как минимум 2 метода, которые я использую, чтобы обойти это:

if($currPassword !== $typedPassword){               
    $form->getElement('password')->addError('Current password is incorrect.');
    $form->markAsError();
}

// or

if ($form->isValid($_POST) && 0 == sizeof($form->getMessages()) {
    // form was valid, and no errors were set on elements
}

Чтобы уточнить, когда вы добавляете ошибку в форму ELEMENT, к этому элементу присоединяется ошибка, но Zend_Form :: isValid только запускает валидаторы и устанавливает соответствующие ошибки, он не проверяет, установили ли вы ошибка на конкретном элементе.

Однако вы можете вызвать $form->getMessages(), чтобы получить все сообщения об ошибках, прикрепленные к форме или ее дочерним элементам. Если это 0 и вы подтвердили свою форму, это означает, что ошибок не было. Если ваша форма прошла isValid, но вы добавили ошибку в элемент, она будет содержать добавленное вами сообщение об ошибке.

0 голосов
/ 12 октября 2012

Я заставил это работать таким образом.

Контроллер:

if ($trial->getKind() != 'debt' && $_POST['kind'] == 'debt')
{
    $editForm->getElement('kind')->markAsError();
}

if ($editForm->isValid($_POST)) { ... }

Форма:

public function isValid($data)
{
    $valid = parent::isValid($data);

    if ($this->getElement('kind')->hasErrors()) {
        $this->getElement('kind')->addError($this->_translate->translate('You can\'t change trial kind to debt.'));
        $valid = false;
    }

    return $valid;
}

И этот комментарий помог мне.

...