带有null id的集合表单返回实体的DataTransformer

时间:2017-01-10 16:19:20

标签: php forms symfony

我尝试使用具有自动完成系统的集合制作表单。 可以添加或删除项目。 enter image description here

如果存在“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的时间。可能是因为它被视为集合中的新项目。

0 个答案:

没有答案