Php 如何显示用户全名并在SF表单中保存用户id,而不使用select

Php 如何显示用户全名并在SF表单中保存用户id,而不使用select,php,symfony,autocomplete,symfony-forms,Php,Symfony,Autocomplete,Symfony Forms,在symfony项目中,我有一个注册表,其中,除其他字段外,我必须显示所选用户。该用户来自用户实体 我需要在注册实体中保存用户id我保存用户id,但在表单字段中显示用户全名。 如果没有select字段,我如何管理它 我的结论是使用 非表单标记span中的名称 隐藏输入中的id 但在这种情况下,我不知道如何实现它 我的用户实体: class User extends BaseUser { ... public function __toString() { retu

在symfony项目中,我有一个注册表,其中,除其他字段外,我必须显示所选用户。该用户来自用户实体

我需要在注册实体中保存用户id我保存用户id,但在表单字段中显示用户全名。 如果没有select字段,我如何管理它

我的结论是使用

非表单标记span中的名称 隐藏输入中的id 但在这种情况下,我不知道如何实现它

我的用户实体:

class User extends BaseUser
{
...
    public function __toString()
    {
        return ($this->lastName . " " . $this->firstName. " [".$this->getId()."]");
    }
}
我的注册实体:

class Registration
{
    /**
     * @var \MyBundle\Entity\User
     *
     * @ORM\ManyToOne(targetEntity="MyBundle\Entity\User")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="userId", referencedColumnName="id")
     * })
     */
    private $user;
...
}
我的第一个明显的尝试是将用户字段作为一个实体放在注册表单中

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('user', EntityType::class, [
                'label' => 'user.name',
                'attr' => [
                    'class' => 'reguser',
                ],
                'class' => 'MyBundle\Entity\User',
            ]);
    }
}
我有一个选择,显示用户名,id作为值。这其中最大的问题是能量学:我可能有几千个用户。我不能显示那么大的列表

所以我想到了一个自动完成字段

    $builder
        ->add('user', TextType::class, [
            'label' => 'user.name',
            'attr' => [
                'class' => 'reguser userpicker',
            ],
        ]);
这里的问题是多方面的: 在“自动完成”字段中,我显然会显示最终用户搜索名称时使用的名称,而不是id,但在保存时这将是无用的,因为我需要用户id


因此,我开始玩弄autocomplete js,在一个额外的范围内显示名称,并用id替换autocomplete的值。这是有问题的,不可用,因为当我编辑时,我在文本字段中显示了来自用户的u toString值。

实现这一点的一种方法是在您的字段中添加一个

整个文档都是可用的

一,。创建数据转换器

此类将把您的用户名(字符串)转换为用户

二,。将数据转换器连接到您的类型

您必须使用服务获取EntityManager作为参数,或者使用正确的参数将用户名ToUserTransformer声明为服务

$builder
        ->add('user', EntityType::class, [
            'label' => 'user.name',
            'attr' => [
                'class' => 'reguser',
            ],
            'class' => 'MyBundle\Entity\User',
        ]);

$builder
     ->get('user')
     ->addModelTransformer(new UsernameToUserTransformer($this->em))
     ;

您可以尝试注册和用户之间的一对多关系。我有:注册[1,1]-[0,n]用户。对不起,我看不出你的回答有什么暗示。谢谢。这确实是一条路要走:我还添加了自动完成的选择功能。我唯一的问题是我不能使用用户名,因为其中一些是计算机生成的,所以最终用户猜不到。因此,在datatransformer中,我使用了lastname firstname:id格式,并通过分解字符串和按id查找用户实体来还原它。因此,这并不是100%理想的做法:如果最终用户秘书想要手动更改格式,则不会注册用户。但无论如何都很好。@user29296谢谢你的评论。我很高兴我的回答能有所帮助。
$builder
        ->add('user', EntityType::class, [
            'label' => 'user.name',
            'attr' => [
                'class' => 'reguser',
            ],
            'class' => 'MyBundle\Entity\User',
        ]);

$builder
     ->get('user')
     ->addModelTransformer(new UsernameToUserTransformer($this->em))
     ;