我尝试使用具有自动完成系统的集合制作表单。 可以添加或删除项目。
如果存在“Actes”,则单击该提议,其他两个字段将自动填充。我添加了一个隐藏字段“num”,它也自动填充了实体的id。 “Actes”可能不存在,需要创建。在这种情况下,隐藏字段“num”将不会被填充。
我在“num”字段上有一个DataTansformer。提交后,它返回正确的实体,但在绑定($form->bind($request)
)后在控制器中,实体具有空ID并在数据库中再次创建。
我的主要表格:
class FamilyType extends AbstractType
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name')
->add('acts', 'collection', array(
'type' => new ActType($this->manager),
'label' => false,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Catalogue\MainBundle\Entity\Family'
));
}
public function getBlockPrefix()
{
return 'catalogue_mainbundle_family';
}
}
ActType.php:
class ActType extends AbstractType
{
private $manager;
public function __construct(ObjectManager $manager)
{
$this->manager = $manager;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('title','text')
->add('description', 'textarea', array(
'attr' => array(
'row' => 5
)
))
->add('typeProcessus', 'entity', array(
'class' => 'CatalogueMainBundle:TypeProcessus',
'choice_label' => 'name'
))
->add('num', 'hidden', array(
'invalid_message' => "Ce numéro n'est pas valide",
'mapped' => false
))
;
$builder->get('num')->addModelTransformer(new ActToNumberTransformer($this->manager));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Catalogue\MainBundle\Entity\Act'
));
}
public function getBlockPrefix()
{
return 'catalogue_mainbundle_act';
}
}
我的DataTansformer:
class ActToNumberTransformer implements DataTransformerInterface {
private $manager;
public function __construct(ObjectManager $manager) {
$this->manager = $manager;
}
public function transform($act) {
if(null == $act){
return '';
}
return $act->getId();
}
public function reverseTransform($actNumber) {
if(!$actNumber){
return;
}
$act = $this->manager->getRepository("CatalogueMainBundle:Act")->find($actNumber);
if(null == $act){
throw new TransformationFailedException(sprintf('Acte "%s" inexistant', $actNumber));
}
return $act;
}
}
当我在我的控制器中转储$form->get('acts')->getData()
时,entites具有空ID。我不明白删除ID的时间。可能是因为它被视为集合中的新项目。