Forms 带有子窗体的Zend表单导致“提交”按钮停止工作

Forms 带有子窗体的Zend表单导致“提交”按钮停止工作,forms,zend-framework,zend-form,form-submit,zend-form-sub-form,Forms,Zend Framework,Zend Form,Form Submit,Zend Form Sub Form,我有一个表单,其中插入了3个子表单。如果需要的话,我可以发布它如何构建这些子表单的代码,但是因为它非常庞大,所以我将把最相关的部分放在这里 首先,表单的init()函数: public function init() { $redirect = new Zend_Form_Element_Hidden('redirect'); $categories = new HPU_Form_Element_TreeView('tree'); $categ

我有一个表单,其中插入了3个子表单。如果需要的话,我可以发布它如何构建这些子表单的代码,但是因为它非常庞大,所以我将把最相关的部分放在这里

首先,表单的
init()
函数:

public function init() {

        $redirect = new Zend_Form_Element_Hidden('redirect');

        $categories = new HPU_Form_Element_TreeView('tree');
        $categories->setMultiOptions($this->categoryList);
        $categories->setLabel('Home')
                    ->setValue($this->selectedCategoryList)
                    ->setRequired(true);

        $id = new Zend_Form_Element_Hidden('id');
        $id->addFilter('Int');

        $title = new Zend_Form_Element_Text('title');
        $title->setLabel('Title')
                ->setRequired(true);

        $subtitle = new Zend_Form_Element_Text('subtitle');
        $subtitle->setLabel('Subtitle')
                    ->setRequired(true);

        $language_id = new Zend_Form_Element_Select("language_id");
        $language_id->setLabel('Language')
                    ->setRequired(true)
                    ->addMultiOption( "" , "Choose a language");

        $table = new Content_Model_DbTable_Language();
        foreach ($table->fetchAll() as $language) {
            $language_id->addMultiOption($language->id, $language->name);
        }

        $start_date = new ZendX_JQuery_Form_Element_DatePicker('start_date');
        $start_date->setLabel('Start date')
                    ->setValue(date('j-m-Y'))
                    ->setRequired(true)
                    ->setAttrib('jQueryParams', array('dateFormat' => 'dd-mm-yy'));

        $expiration_date = new ZendX_JQuery_Form_Element_DatePicker('expiration_date'); 
        $expiration_date->setLabel('Expiration date')
                        ->setAttrib('jQueryParams', array('dateFormat' => 'dd-mm-yy'));

        $status = new Zend_Form_Element_Select("status");
        $status->setLabel('Status')
                ->setRequired(true)
                ->addMultiOptions(array("1" => "Concept", "2" => "Ready to publish", "3" => "Published",
                "4" => "Offline"));

        $meta_description = new Zend_Form_Element_Textarea('meta_description'); 
        $meta_description->setLabel('Meta description')
                            ->setAttrib('rows', '4');

        $meta_keywords = new Zend_Form_Element_Textarea('meta_keywords'); 
        $meta_keywords->setLabel('Meta keywords')
                        ->setAttrib('rows', '4');

        $introductory_text = new HPU_Form_Element_Tinymce('introductory_text'); 
        $introductory_text->setLabel('Introductory text');

        $content_text = new HPU_Form_Element_Tinymce('content_text'); 
        $content_text->setLabel('Follow up text');

        $submit_button = new Zend_Form_Element_Submit('submit_button');

        $this->setDecorators(array('ViewHelper'));
        $this->setElementDecorators(array('ViewHelper'));
        $this->setDecorators(array('FormElements', 'Form'));

        $this->addElements(array($redirect, $categories, $id, $title, $subtitle, $language_id, $start_date, $expiration_date, $status));

        $this->addEnclosedItems();
        $this->addEyecatcher();
        $this->addYoutubeItems();

        $this->addElements(array($meta_description, $meta_keywords, $introductory_text, $content_text, $submit_button));

    }
如您所见,我声明了许多元素,然后使用
addElements()
函数将它们添加到表单中。然而,我已经将其分为两部分,因为我想要我的3个子表单(由它们各自的函数
addencloseditions()
addYoutubeItems()
addyecatchers()
创建),然后我添加元素的最后一部分

因此,我得到了以下HTML:

<form id="content" enctype="multipart/form-data" action="" method="post">

<dt id="redirect-label">&#160;</dt>

<dd id="redirect-element">

<input type="hidden" name="redirect" value="" id="redirect" /></dd>

<dt id="tree-label"><label for="tree" class="required">Home</label></dt>

<dd id="tree-element">

<ul id="tree"><li><input  value="72" id="tree-72" name="tree[]" type="hidden" /><label for="tree-72" class="parent">Test Categorie 1</label><ul id="tree"><li><input checked="checked" value="75" id="tree-75" name="tree[]" type="checkbox" /><label for="tree-75" class="child">Test Categorie 1.1</label></li><li><input  value="76" id="tree-76" name="tree[]" type="checkbox" /><label for="tree-76" class="child">Test Categorie 1.2</label></li></ul></li><li><input  value="73" id="tree-73" name="tree[]" type="hidden" /><label for="tree-73" class="parent">Test Categorie 2</label><ul id="tree"><li><input  value="77" id="tree-77" name="tree[]" type="hidden" /><label for="tree-77" class="parent">Test Categorie 2.1</label><ul id="tree"><li><input  value="80" id="tree-80" name="tree[]" type="checkbox" /><label for="tree-80" class="child">Test category 2.1.1</label></li></ul></li><li><input checked="checked" value="78" id="tree-78" name="tree[]" type="checkbox" /><label for="tree-78" class="child">Test Categorie 2.2</label></li><li><input  value="79" id="tree-79" name="tree[]" type="checkbox" /><label for="tree-79" class="child">Test Categorie 2.3</label></li></ul></li><li><input  value="74" id="tree-74" name="tree[]" type="checkbox" /><label for="tree-74" class="child">Test Categorie 3</label></li><li><input  value="86" id="tree-86" name="tree[]" type="hidden" /><label for="tree-86" class="parent">Test Category 4</label><ul id="tree"><li><input  value="87" id="tree-87" name="tree[]" type="checkbox" /><label for="tree-87" class="child">Test Category 4.1</label></li></ul></li></ul></dd>

<dt id="id-label">&#160;</dt>

<dd id="id-element">

<input type="hidden" name="id" value="57" id="id" /></dd>

<dt id="title-label"><label for="title" class="required">Title</label></dt>

<dd id="title-element">

<input type="text" name="title" id="title" value="Test Content 2" /></dd>

<dt id="subtitle-label"><label for="subtitle" class="required">Subtitle</label></dt>

<dd id="subtitle-element">

<input type="text" name="subtitle" id="subtitle" value="Test Content 2" /></dd>

<dt id="language_id-label"><label for="language_id" class="required">Language</label></dt>

<dd id="language_id-element">

<select name="language_id" id="language_id">
    <option value="" label="Choose a language">Choose a language</option>
    <option value="1" label="Dutch" selected="selected">Dutch</option>
    <option value="2" label="Russian">Russian</option>
</select></dd>

<dt id="start_date-label"><label for="start_date" class="required">Start date</label></dt>

<dd>

<input type="text" name="start_date" id="start_date" value="0000-00-00 00:00:00" /></dd>

<dt id="expiration_date-label"><label for="expiration_date" class="optional">Expiration date</label></dt>

<dd>

<input type="text" name="expiration_date" id="expiration_date" value="0000-00-00 00:00:00" /></dd>

<dt id="status-label"><label for="status" class="required">Status</label></dt>

<dd id="status-element">

<select name="status" id="status">
    <option value="1" label="Concept" selected="selected">Concept</option>
    <option value="2" label="Ready to publish">Ready to publish</option>
    <option value="3" label="Published">Published</option>
    <option value="4" label="Offline">Offline</option>
</select></dd>

<dt id="enclosedItem-label">&#160;</dt><dd id="enclosedItem-element"><fieldset id="fieldset-enclosedItem"><dl>

<dt id="addEnclosedItem-label">&#160;</dt><dd id="addEnclosedItem-element">

<button name="enclosedItem[addEnclosedItem]" id="enclosedItem-addEnclosedItem" type="button">add enclosed item</button></dd></dl></fieldset></dd>

<div class="eyecatcher_item"><form id="eyecatcher" enctype="application/x-www-form-urlencoded" action="" method="post">

<dt id="eyecatcher-eyecatcher-label">&#160;</dt>

<dd id="eyecatcher-eyecatcher-element">

<img src='/fm/Tulips.jpg'/></dd>

<dt id="deleteEyecatcher59-label">&#160;</dt><dd id="deleteEyecatcher59-element">

<button name="eyecatcher[deleteEyecatcher59]" id="eyecatcher-deleteEyecatcher59" type="button" class="delete" itemid="59">delete</button></dd></form></div>

<dt id="youtube-label">&#160;</dt><dd id="youtube-element"><fieldset id="fieldset-youtube"><dl>

<dt id="addYoutube-label">&#160;</dt><dd id="addYoutube-element">

<button name="youtube[addYoutube]" id="youtube-addYoutube" type="button">add youtube item</button></dd></dl></fieldset></dd>

<dt id="meta_description-label"><label for="meta_description" class="optional">Meta description</label></dt>

<dd id="meta_description-element">

<textarea name="meta_description" id="meta_description" rows="4" cols="80"></textarea></dd>

<dt id="meta_keywords-label"><label for="meta_keywords" class="optional">Meta keywords</label></dt>

<dd id="meta_keywords-element">

<textarea name="meta_keywords" id="meta_keywords" rows="4" cols="80"></textarea></dd>

<dt id="introductory_text-label"><label for="introductory_text" class="optional">Introductory text</label></dt>

<dd id="introductory_text-element">

<textarea name="introductory_text" id="introductory_text" class="tinyMCE" rows="24" cols="80"></textarea></dd>

<dt id="content_text-label"><label for="content_text" class="optional">Follow up text</label></dt>

<dd id="content_text-element">

<textarea name="content_text" id="content_text" class="tinyMCE" rows="24" cols="80"></textarea></dd>

<dt id="submit_button-label">&#160;</dt><dd id="submit_button-element">

<input type="submit" name="submit_button" id="submit_button" value="Save" /></dd></form>

 
家
  • 测试类别1
    • 测试类别1.1
    • 测试类别1.2
    • 测试类别2
      • 测试类别2.1
        • 测试类别2.1.1
        • 测试类别2.2.2
        • 测试类别2.3
          • 测试类别4.1
          标题 字幕 语言 选择一种语言 荷兰的 俄语 开始日期 到期日期 地位 概念 准备出版 出版 离线     添加随附项目     删除     添加youtube项目 页面描述 页面关键词 导言 后续案文  
到目前为止,它工作得很好,唯一的例外是,自从我添加了子表单之后,它将不再提交

有人碰巧知道/看到问题所在吗?请提供任何建议:)

更新: 在适当扩展Zend_Form_子表单之后,我更新了返回的HTML代码。我还发现问题出在addEyecatcher函数中的某个地方,因为只要不执行该函数,表单就会工作

以下是创建子窗体的addEyecatcher函数:

公共函数addEyecatcher(){ $eyecatcher_form=新Zend_form_子表单()

if(!$this->eyecatcher\u图像){
$eyecatcher=新的Zend_表单_元素_文件('eyecatcher');
$eyecatcher->setLabel('eyecatcher'))
->addValidator('Extension',false,'jpg')
->setDestination(Zend_注册表::get('config')->content->tempFysicalLocation);
$eyecatcher\u form->addElement($eyecatcher);
}否则{
$this->addPrefixPath('HPU_Form_Element','HPU/Form/Element/','Element');
$eyecatcher=新HPU表格元素注释(“eyecatcher”);
$source=Zend_Registry::get('config')->content->imageRelativeLocation.$this->eyecatcher_image['image_url'];
$eyecatcher->setValue(“”);
$eyecatcher\u form->addElement($eyecatcher);
$eyecatcher\u form->addElement('button','deleteEyecatcher{$this->eyecatcher\u image['id']}),数组('label'=>'delete','class'=>'delete','itemid'=>$this->eyecatcher\u image['id']);
}
$eyecatcher_form->setDecorators(数组(“ViewHelper”);
$eyecatcher\u form->setDecorators(数组(“FormElements”,“form”,数组('HtmlTag',数组('tag'=>'div','class'=>'eyecatcher\u item')));
$this->addSubForm($eyecatcher_form,'eyecatcher');
返回$eyecatcher_表单;
}


感谢到目前为止的帮助,我已经进一步解决了这个问题:)

子表单不应该包含自己的
标记。这就是打破提交按钮的原因。您能否再次检查您的子窗体是否扩展了Zend\u Form\u子窗体?如果是这样,请发布其中一个子表单方法的代码(或相关部分)

编辑:您的引人注目的表单还有第二个表单标记,因为您正在手动将表单装饰器添加到子表单中(它用
将其包装。
)。尝试将集合装饰器行更改为:

$eyecatcher_form->setDecorators(array("FormElements", array('HtmlTag', array('tag'=>'div' , 'class' => 'eyecatcher_item'))));

我确实把事情搞砸了,但现在我把它改成了扩展Zend_Form_子表单,它仍然拒绝工作,正如你所说,它确实删除了子表单的标记。当然,我不能相信我错过了。现在可以了:)非常感谢!
$eyecatcher_form->setDecorators(array("FormElements", array('HtmlTag', array('tag'=>'div' , 'class' => 'eyecatcher_item'))));