我的收藏有问题。我一直在关注示例教程(https://github.com/doctrine/DoctrineModule/blob/master/docs/hydrator.md#a-complete-example-using-zendform)并成功创建了一个Blogpost
和Tag
实体。在我的控制器中,我有一个添加操作和编辑操作。我的添加和编辑视图包含以下代码:
<?php
echo $this->formElement($blogpost->get('addTag'));
$tag = $blogpost->get('tags');
?>
<fieldset id="tagFieldset">
<?php
echo $this->formCollection($tag);
?>
</fieldset>
该视图有一个用于动态添加标签的按钮(如本例中:http: //zf2.readthedocs.org/en/latest/modules/zend.form.collections.html#adding-new-elements-dynamically),该按钮有效在编辑操作中很好。当同时添加一个Blogpost
带有2个标签的新时,它只会Tag
在数据库中添加1(count选项设置为1。当我增加这个数字时,它可以根据选项添加标签)。当我编辑它Blogpost
并添加 2 个标签(总共三个)时,2 个标签被添加到数据库中。
在调试 addTags() 函数时,该参数在 add-action 处仅保存 1 个 Tag 对象。在编辑操作中,它包含所有已添加的新标签(在我的情况下,是 2 个新标签)。
BlogpostFieldset 看起来像:
$this->add(array(
'name' => 'addTag',
'type' => 'button',
'options' => array(
'label' => 'Add more tags',
),
'attributes' => array(
'id' => 'addTag'
)
));
$tagFieldset = new TagFieldset($serviceManager);
$this->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'tags',
'options' => array(
'count' => 1,
'target_element' => $tagFieldset,
'should_create_template' => true,
'allow_add' => true,
)
));
用于添加字段集的 Javascript:
$('#addTag').click(function(e) {
var currentCount = $('form > #tagFieldset > label').length;
alert(currentCount);
//Set datatemplate (generated by the arraycollection)
var template = $('form > #tagFieldset > span').data('template');
//Replace the template to other addressfieldset
template = template.replace(/__index__/g, currentCount);
//Set new fieldset
$('form > #tagFieldset').append(template);
});
它正确呈现我的模板。在我的编辑操作中工作正常,但我的添加操作只添加了 1 个标签。通过添加输入过滤器或验证器,我的控制器中存在问题。在添加新标签的情况下,我想要一些特定的过滤器/验证器。
以下代码已用于将过滤器/验证器添加到它们必须放在的表单/字段集中:
public function addAction()
{
$form = new Form($this->serviceLocator);
$entity= new Entity();
$form->bind($entity);
if ($this->request->isPost()) {
$data = $this->request->getPost();
$form->getInputFilter()->get('fieldset')->get('input')->setRequired(true);
$form->getInputFilter()->get('fieldset')->get('input')->allowEmpty(false);
$form->setData($data);
if ($form->isValid()) {
// Handle the rest off this action.
}
}
return array(
'form' => $form
)
}
从控制器中删除以下行时 - addAction()
:
$form->getInputFilter()->get('fieldset')->get('input')->setRequired(true);
$form->getInputFilter()->get('fieldset')->get('input')->allowEmpty(false);
它能够添加比我创建的Tags
选项中设置的给定选项更多的内容。count
tagFieldset
我在 中设置的那些输入过滤器不在addAction()
集合字段集中。通过添加(使用新的输入过滤器)我的基本字段集,集合字段集无法添加比给定count
选项更多的标签。在这种情况下,用 Javascript 函数添加标签字段集是没有用的,因为它们不会被添加。