在文本输入中使用EntityType

时间:2019-11-27 20:29:17

标签: php symfony formbuilder

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

为简单起见,我想使用一个简单的textType,我的JavaScript可以在其​​中输入一个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

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

2 个答案:

答案 0 :(得分:0)

查询构建器的链接: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',
]);

答案 1 :(得分:0)

根据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);
    }
}

它就像一种魅力!