ZendFramework: изменение элемента формы после неудачной проверки - PullRequest
0 голосов
/ 23 ноября 2011

Таким образом, у меня есть форма, настроенная следующим образом:

В моем каталоге форм:

Address.php

class Address extends Zend_Form{
    // Creates an address input box including address/country/state/zip
    // The states is created as a drop down menu 
    public function init() {
         // relevant code to question
         $this->addElements(array(
            array('select', $names['state'], array(
                'label'        => "State",
                'class'        => 'state',
                'multiOptions' => array('' => '') + AddressHelper::stateList(),
                'required'     => $this->_required,
            )),
         ));
    }
}

MyForm.php:

class MyForm extends Zend_Form {
  public function init() {
    //set-up some general form info 

    // this is the relevant part for my question
    // $opt is a predefined variable
    $this->addSubForms(array(
            'info' => new SubForm($opts),
            'mailing' => new Address($opts + array(
                'legend' => 'Address', 
                'isArray' => false, 
                'required' => true,
        )),
    ));  
   }
}

Survey.php

class Survey extends MyForm{
    // initialize parent (MyForm) and add additional info for the Survey form
}

Хорошо, поэтому при отправке опроса, если он не проходит проверку, мне нужно изменить элемент состояния адреса с выбора на тип ввода = текст.

Итак, в моем контроллере под действием, которое проверяет проверку, у меня есть следующее:

public function createAction(){
     if ($this->_form->isValid($post)) {
        $this->_saveDraft($post, $this->_submissionType);
        $this->addSessionMessage('Submission created!');
        return $this->redirector->gotoRouteAndExit(array(), 'home', true);
     }else{
        /* IMPORTANT */
        // I need to change the Address select field to a text field here!

        $errors[] = 'There was a problem';
        $this->view->assign(compact('form', 'errors', 'submission'));
        $this->_viewRenderer->renderScript('update.phtml');
     }
}

Итак, я бы просто создал метод в классе Address и каким-то образом вызывал его для обменаиз.Я просто не знаю, как это сделать.

1 Ответ

2 голосов
/ 24 ноября 2011

Вы бы хотели использовать removeElement() для удаления элемента select, а затем addElement() для его замены текстовой версией.

Проблема, с которой вы столкнетесь, состоит в том, что, когда проверка завершается неудачей, элемент select заменяется на текстовый элемент, и форма отображается повторно. Теперь, после повторной отправки, вам нужно снова внести изменения до вызова isValid(), потому что форма использует текстовый ввод для состояния вместо выбора. Так что вам нужно внести изменения дважды. Один раз после неудачной проверки перед повторным отображением формы и один раз перед вызовом isValid(), но только если ранее была неудачная отправка.

Теперь, почему же, если форма не проходит проверку, вы хотите, чтобы элемент select для state был текстом? Разве это не может работать точно так же с элементом select, и вы просто предварительно выбираете для него правильное состояние?

EDIT:

Вы используете объект формы для вызова add / removeElement.

$removed = $form->getSubForm('mailing')->removeElement('state_select');
$form->getSubForm('mailing')->addElement($text_state_element);

Этот вызов должен работать для удаления элемента из подчиненной формы.

Без подчиненных форм это просто:

$form->removeElement('username');
$form->addElement($someNewElement);

Вы можете использовать getElement() аналогичным образом, если вам нужно получить элемент из формы для внесения изменений (например, удалить / добавить валидаторы, описание изменения, установить значения)

$el = $form->getElement('username');
$el->addValidator($something)
   ->setLabel('Username:');

Надеюсь, это поможет.

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