Пользовательская опция в EntityType (Symfony 3) - PullRequest
1 голос
/ 23 апреля 2020

У меня есть этот код:

$form = $this->createFormBuilder()
    ->add('client_id', EntityType::class, [
        'class' => 'AppBundle:WebClient',
        'query_builder' => function (EntityRepository $er) {
            return $er
                ->createQueryBuilder('w_client')
                ->where('w_client.is_removed = 0');
        },
        'choice_label' => function ($w_client) {
            return $w_client->getCompanyName();
        },
    ])
->getForm();

Как добавить пользовательский элемент stati c в Select для получения этого результата?

<select>
    <option value="add">Add</option>
    <optgroup label="Group">
        <option value="2">2</option>
        <option value="1">1</option>
    </optgroup>
</select>

Желаемый результат

1 Ответ

2 голосов
/ 23 апреля 2020

Поле EntityType ожидает, что все варианты выбора будут экземпляром этой сущности, поэтому не стоит добавлять пользовательский параметр, являющийся строковым значением. Конечно, вы можете добавить параметр динамически с помощью JS на стороне клиента после визуализации формы, но я бы не рекомендовал это делать.

Вместо этого я бы использовал ChoiceType и вручную создавал варианты :

$choices = [
    'add' => 'Add'
];

foreach ($er->findBy(['is_removed' => 0]) as $client) {
    $choices[$client->getId()] = $client->getCompanyName();
}

$form = $this->createFormBuilder()
    ->add('client_id', ChoiceType::class, [
        'choices' => $choices
    ])
->getForm();

В выходных примерах вы показываете сгруппированные варианты. Вы можете сделать это с помощью многомерного массива:

foreach ($er->findBy(['is_removed' => 0]) as $client) {
    if (!array_key_exists($client->getGroup()) {
        $choices[$client->getGroup()] = [];
    }
    $choices[$client->getGroup()][$client->getId()] = $client->getCompanyName();
}

при условии, что WebClient имеет свойство $group, вы, очевидно, можете изменить его на любое, которое вы хотите сгруппировать, по

...