为了账号安全,请及时绑定邮箱和手机立即绑定

使用带有文本输入的 EntityType

使用带有文本输入的 EntityType

PHP
慕码人8056858 2022-05-27 14:45:20
我创建了一个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。
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

正如Cerad所建议的,dataTransformer是解决方案。


所以只是为了position,我创建了一个dataTransformer


class 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);

    }

}

它就像一个魅力!


查看完整回答
反对 回复 2022-05-27
?
富国沪深

TA贡献1790条经验 获得超9个赞

查询生成器链接: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',

]);


查看完整回答
反对 回复 2022-05-27
  • 2 回答
  • 0 关注
  • 155 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号