Forms ZendFramework:验证失败后更改表单元素

Forms ZendFramework:验证失败后更改表单元素,forms,zend-framework,Forms,Zend Framework,因此,我以以下方式设置了一个表格: 在我的表单目录中: 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

因此,我以以下方式设置了一个表格:

在我的表单目录中:

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
}
好的,所以当提交调查时,如果验证失败,我需要将Address state元素从select更改为input type=text

因此,在我的控制器中,在检查验证的操作下,我有以下内容:

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类中创建一个方法,并以某种方式调用它以进行交换。我只是不知道该怎么做。

您将看到使用
removeElement()
删除select元素,然后使用
addElement()
替换为纯文本版本

您将遇到的问题是,当验证失败时,select元素将更改为文本元素,表单将重新显示。现在,在重新提交时,您需要在调用
isValid()
之前再次进行更改,因为表单使用文本输入作为状态,而不是选择。所以你需要做两次改变。在重新显示表单之前,验证失败后一次,在调用
isValid()
之前一次,但前提是之前提交失败

现在为什么如果表单验证失败,您希望state的select元素为text?对于select元素,它不能同样工作,而您只是为它们预先选择了正确的状态吗

编辑:

您可以使用form对象调用add/removeElement

$removed = $form->getSubForm('mailing')->removeElement('state_select');
$form->getSubForm('mailing')->addElement($text_state_element);
该调用可以从子窗体中删除元素

没有子窗体,它只是:

$form->removeElement('username');
$form->addElement($someNewElement);
如果需要从表单中获取元素以进行更改(例如,删除/添加验证器、更改描述、设置值),可以以类似的方式使用
getElement()


希望有帮助。

漂亮的化身。。。但是我该如何去除这些元素呢?我需要打什么电话才能这么做?Thx,我也会这么说你的。经过编辑的答案加上额外的解释。
$el = $form->getElement('username');
$el->addValidator($something)
   ->setLabel('Username:');