我在symfony2中有3种表单类型
FaultType,它是所有下一个集合的父级
<?php
namespace My\FaultBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class FaultType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('title')
->add('steps', 'collection', array(
'type' => new StepType(),
'allow_add' => true,
'prototype' => true,
'by_reference' => false,
))
->add('created')
->add('updated')
;
}
public function getDefaultOptions()
{
return array(
'data_class' => 'My\FaultBundle\Entity\Fault'
);
}
public function getName()
{
return 'my_fault_fault';
}
}
步骤类型:
<?php
namespace My\FaultBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class StepType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('body')
->add('photos', 'collection', array(
'type' => new PhotoType(),
'allow_add' => true,
'allow_delete' => true,
'prototype' => true,
'by_reference' => false,
))
;
}
public function getDefaultOptions()
{
return array(
'data_class' => 'My\FaultBundle\Entity\Step'
);
}
public function getName()
{
return 'my_fault_step';
}
}
和最后一个PhotoType:
<?php
namespace My\FaultBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
class PhotoType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('name')
->add('description')
->add('filename')
;
}
public function getDefaultOptions()
{
return array(
'data_class' => 'My\FaultBundle\Entity\Photo'
);
}
public function getName()
{
return 'my_fault_photo';
}
}
我找到了关于原型的优秀文章link,并且有一个嵌套的表单类型非常好,但是当我想要使用第三个嵌套时,我有一个问题意味着PhotoType ...照片在收藏中步骤,这是故障的集合...,我如何动态添加/删除照片的步骤与这个例子...?
答案 0 :(得分:3)
我制作了一个可以在这里提供帮助的JS片段。你只需要添加两个按钮[添加新的,删除最后一个]。 https://gist.github.com/juanmf/10483041
它可以处理递归/嵌套原型。 它与中介器(与Symfony事件Dispatcher相同)相结合,允许您将生成的控件绑定到事件。如果你不需要调解员删除这些行:
docdigital.mediatorInstance.send(
docdigital.constants.mediator.messages.clonePrototype_prototypeAdded,
$clone
);
答案 1 :(得分:0)
你必须让自己成为原型。
有两种解决方案:
使用正则表达式查找property_path
的所有数字段,并将其替换为占位符
$segments_found = preg_match('/\[(\d+)\]/', $prototype, $matches);
您是否尝试重新排序商品?这是彻底的灾难;)