Как динамически добавлять варианты в элемент EntityType формы SymfonyPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как динамически добавлять варианты в элемент EntityType формы Symfony

Сообщение Anonymous »

Я разрабатываю приложение (с помощью Doctrine) для управления планированием и выставлением счетов для психологической практики.
Счет-фактура объекта имеет отношение один-ко-многим с объектом

Код: Выделить всё

Session. Итак, мой класс формы имеет элемент EntityType
, и по умолчанию Symfony извлекает все сеансы в базе данных для заполнения элемента множественного выбора. Это большой объем данных, который мне не понадобится, и, кроме того, существует неприятная проблема N+1 (которую я еще не придумал, как ее оптимизировать). Я хочу не отображать этот элемент EntityType вообще и (очевидно) не заполнять его какими-либо параметрами. Вместо этого пользователи выбирают объект Patient из раскрывающегося списка, а затем с помощью вызова xhr мы извлекаем сеансы, принадлежащие этому пациенту и которые еще не связаны ни с одним счетом (гораздо меньший объем данных), и отображаем параметры в виде флажков. Итак, в классе формы:

Код: Выделить всё

        public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder
->add('invoice_date', DateType::class, ['widget'=>'single_text',])
->add('payer',HiddenType::class)
->add('sessions',null, [
// this does not solve N+1
/*'query_builder'=>function(SessionRepository $repository)
{return $repository->createQueryBuilder('s')->leftJoin('s.invoice','invoice')
->join('s.patients','patients')
->leftJoin('patients.payer','payer')
->andWhere('s.invoice is null')
->addSelect('patients','payer');},
*/
// ...but with this, it does not assign our input to the form
'choices'=>[],
])
->add('patient',EntityType::class,[
'placeholder'=>'',
'class'=>Patient::class,
'mapped'=>false,
'constraints' =>[
new Assert\NotBlank(['message'=>'patient is required']),
],
'query_builder'=>$this->accountService->getActivePatientQueryBuilder(),
'choice_attr' => function($patient){
$payer = $patient->getPayer();
return $payer === null ? [] :[
'data-payer_id'=>$payer->getId(),

];
},
])
// other elements etc omitted for brevity

;
}
}

Когда я позволяю Symfony заполнить элемент Sessions/EntityType вариантами, все работает, но проблема с лишними запросами остается. Когда я делаю это по-своему, то есть определяю ключ выбора как пустой массив и динамически добавляю варианты в форму, кажется, что это должно работать, но Symfony жалуется на ошибку проверки «Выбранный выбор недействителен» и не присваивает отправленные значения элементу. Глядя на сообщение об исключении в профилировщике, мы видим

Выборы «4714», «4743», «4772», «4801», «4830», «4859», «4888»,
»4917», «4946» не существуют в списке выбора.

Достаточно справедливо. Итак, вопрос: как мне добавить эти варианты в свой элемент EntityType после отправки формы?
Я читал о EventListeners в документации, и FormEvents::PRE_SUBMIT выглядит как хорошее событие для подключения. Но после долгой борьбы с этим ничего не работает, и я не могу найти ничего об этом в документации.
Другое возможное решение, которое должно сработать, - сделать это в два этапа, где сначала они выбирают пациента, затем я динамически отображаю форму с сеансами-кандидатами, отфильтрованными до тех, которые принадлежат этому пациенту и не связаны со счетом. Но я
упрям ​​и хочу, чтобы Symfony позволила этому элементу принимать мои данные.

Подробнее здесь: https://stackoverflow.com/questions/735 ... pe-element
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»