如何自定义EntityType选项文本?

Ign*_*kis 2 forms query-builder symfony

我想用DB中的选项显示选择.在这种情况下,我使用EntityTypequery_builder:

$builder
    ->add('internships', EntityType::class, array(
        'class' => 'IndexBundle\Entity\Internship',
        'property' => 'id',
        'empty_value' => 'Choose',
        'query_builder' => function (EntityRepository $er) use ($trainee) {
            return $er->createQueryBuilder('i')
                ->where('i.trainee = :trainee')
                ->andWhere('i.state = :state')
                ->setParameter('trainee', $trainee)
                ->setParameter('state', 'unverified');
        },
        'constraints' => array(
            new NotBlank(array(
                'message' => 'choice.not.blank'
            ))
        )
    ))
Run Code Online (Sandbox Code Playgroud)

现在一切都很好.我selectid值的文本获得了必要选项的元素.

<select>
    <option value="id">id</option>
    ...
</select>
Run Code Online (Sandbox Code Playgroud)

我该如何定制?

例如,我希望它是组合idtype表列:

<select>
    <option value="id">#id (type)</option>
    ...
</select>
Run Code Online (Sandbox Code Playgroud)

Vev*_*eve 5

您可以使用该choice_label选项自定义选项.
您可以传递一个函数来检索所需的文本,也可以在实体中添加一个getter,如果您在其他地方重复使用它.

具有功能:

$builder
    ->add('internships', EntityType::class, array(
        'class' => 'IndexBundle\Entity\Internship',
        'property' => 'id',
        'empty_value' => 'Choose',
        'query_builder' => function (EntityRepository $er) use ($trainee) {
            return $er->createQueryBuilder('i')
                ->where('i.trainee = :trainee')
                ->andWhere('i.state = :state')
                ->setParameter('trainee', $trainee)
                ->setParameter('state', 'unverified');
        },
        'choice_label' => function ($internship) {
            return '#'.$internship->getId().' ('.$internship->getType().')';
        },
        'constraints' => array(
            new NotBlank(array(
                'message' => 'choice.not.blank'
            ))
        )
    ))
Run Code Online (Sandbox Code Playgroud)

用吸气剂:

$builder
    ->add('internships', EntityType::class, array(
        'class' => 'IndexBundle\Entity\Internship',
        'property' => 'id',
        'empty_value' => 'Choose',
        'query_builder' => function (EntityRepository $er) use ($trainee) {
            return $er->createQueryBuilder('i')
                ->where('i.trainee = :trainee')
                ->andWhere('i.state = :state')
                ->setParameter('trainee', $trainee)
                ->setParameter('state', 'unverified');
        },
        'choice_label' => 'idAndType',
        'constraints' => array(
            new NotBlank(array(
                'message' => 'choice.not.blank'
            ))
        )
    ))
Run Code Online (Sandbox Code Playgroud)

Internship.php:

Class Internship
{
    //...
    public function getIdAndType()
    {
        return '#'.$this->id.' ('.$this->type.')';
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:
对于较旧的Symfony版本(<= 2.6),此选项已命名property并使用PropertyAccessor组件支持的内容,因此您不能使用函数,只能使用getter.