使用带有文本输入的 EntityType

我创建了一个EntityType表格,您可以在其中添加您对活动的参与字段和您的职位。不幸的是,字段的数量和名称在页面上动态更新,因此在创建表单时,我没有所有可用的字段(或者更糟糕的是一些不再存在)


为简单起见,我想使用一个简单的 textType,我的 javascripts 可以在其中输入一个Id数字并链接数据库中的相应元素。


代码很简单


class FieldPositionType extends AbstractType

{

    public function buildForm(FormBuilderInterface $builder, array $options)

    {

        $builder

            ->add('position', EntityType::class, [

                'class' => Position::class,

                'choice_label' => 'name'

            ])

            ->add('field', EntityType::class, [

                'class' => Field::class,

                'choice_label' => 'id'

            ])

        ;

    }


    public function configureOptions(OptionsResolver $resolver)

    {

        $resolver->setDefaults([

            'data_class' => Participation::class,

        ]);

    }

}

但不是EntityType,我更喜欢TextType。


我想我需要对我的设置器进行一些修改,但我不知道如何将 Id 转换为实体EntityType。


慕码人8056858
浏览 156回答 2
2回答

喵喵时光机

正如Cerad所建议的,dataTransformer是解决方案。所以只是为了position,我创建了一个dataTransformerclass PositionToIdTransformer implements DataTransformerInterface{    private $em;    public function __construct(EntityManagerInterface $em)    {        $this->em = $em;    }    public function transform($position)    {        if (null === $position) {            return '';        }        return $position->getId();    }    public function reverseTransform($id)    {        if (!$id){            return;        }         $position = $this->em->getRepository(Position::class)->find($id);        if (null === $position){            throw new TransformationFailedException(sprintf("the position '%s' does not exist!", $id));        }        return $position;    }}我在我的formBuilder:class FieldPositionType extends AbstractType{    private $pt; //PositionToIdTransformer    public function __construct(PositionToIdTransformer $pt)    {        $this->pt = $pt;    }    public function buildForm(FormBuilderInterface $builder, array $options)    {        $builder            ->add('position', TextType::class)        ;        $builder->get('position')->addModelTransformer($this->pt);    }}它就像一个魅力!

富国沪深

查询生成器链接:https ://symfony.com/doc/current/reference/forms/types/entity.html#ref-form-entity-query-builder如评论中所述,尝试使用它。我无法进一步阻止您,因为我看不到您的其余逻辑,但为了限制实体字段中显示的条目,它看起来像这样:$builder->add('users', EntityType::class, [    'class' => User::class,    'query_builder' => function (EntityRepository $er) {        return $er->createQueryBuilder('u')            ->orderBy('u.username', 'ASC');    },    'choice_label' => 'username',]);
打开App,查看更多内容
随时随地看视频慕课网APP