Forms ZendFramework:验证失败后更改表单元素
因此,我以以下方式设置了一个表格: 在我的表单目录中: Address.phpForms 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
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:');