【问题标题】:Zend Framework Forms: while reusing forms, I call removeElement, but IsValid fails on the removed element... why?Zend 框架表单:在重用表单时,我调用了 removeElement,但 IsValid 在删除的元素上失败了......为什么?
【发布时间】:2012-05-10 15:01:23
【问题描述】:

我的一个表格有一些必填字段,有些则没有,假设“姓名”是必需的,但“注释”不是:

class Form_CompanyForm extends Zend_Form{
public function init(){
    // add element: ID textbox
    $ID = $this->createElement('hidden', 'id');
    $this->addElement($ID);

    // add element: name textbox
    $name = $this->createElement('text', 'name');
    $name->setLabel('name:');
    **$name->setRequired(TRUE);**
    $name->setAttrib('size',100);
    $name->setAttrib('maxlength',255);
    $name->addFilters(array(new Zend_Filter_StringTrim()));
    $this->addElement($name);

        // add element: note text area
    $note = $this->createElement('textarea', 'note');
    $note->setLabel('note:');
    **$note->setRequired(FALSE);**
    $note->setAttrib('cols',50);
    $note->setAttrib('rows',4);
    $note->addFilters(array(new Zend_Filter_StringTrim()));     
    $this->addElement($note);       

...

我的一个控制器调用此表单并使用其所有字段。这工作正常,并且会验证名称字段。

但是...另一个控制器使用相同的表单,只是为了更改注释...为此,我使用 removeElement() 从表单中删除名称:

public function editcompanynoteAction(){
    $mod = new Model_Company();
    $frm = new Form_CompanyForm();
    $frm->removeElement('name');        
    $frm->setAction('/companyland/editcompany');
    $frm->setMethod('post');
    if($this->getRequest()->isPost()){
        if($frm->isValid($_POST)){

...

表单显示正常,只有注释字段存在,如预期的那样

但是保存表单后,验证失败,因为“名称”字段是必需的...

我是 Zend 的新手,我不明白为什么表单验证会失败...在一个被删除的元素上。

网上有关于使用 removeElement 的示例...我尝试了 clearValidators() 没有成功,并查看了Zend form validation

评论说“您应该在调用 $form->isValid() 之前删除验证器。”

但是怎么做呢?

您能给我的任何帮助将不胜感激。

【问题讨论】:

  • 上面的代码有一个错误,要调用的控制器应该是 '/companyland/editcompanynote' 而不是 '/companyland/editcompany' 这就是我遇到这个问题的原因,一旦更正了在控制器中调用了正确的操作,我没有再遇到这个问题了。

标签: forms zend-framework


【解决方案1】:

放这条线

$frm->getElement('name')->setRequired(false);

之前

$frm->removeElement('name');  

【讨论】:

  • 嗨,还有一个错误(见上面的评论),一旦纠正,我就不再遇到这个问题了。感谢您的快速回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-21
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多