Embed Form и EntityType, чтобы выбрать связанный объект в Embed Form - PullRequest
0 голосов
/ 09 апреля 2020

У меня небольшая проблема, и я не могу найти решение, чтобы решить ее, мне пришлось пропустить шаг или метод, вот контекст:

У меня есть объект регистрации, связанный с заведением (регистрация связана с одним учреждением)

В моей форме первое поле позволяет мне выбрать учреждение с помощью выбора, затем другие поля, связанные с учреждением, такие как его участие или нет, но уже отображенные :

Вот как это выглядит:

Establishment: <select>
Participates: Yes / No
AdditionalInfo: Textarea

В этой форме я, следовательно, wi sh для восстановления во время отправки, объекта регистрации с выбранным учреждением, а также полей с правильные значения в Учреждении

Я пытался в Регистрационном типе поставить:

$builder
    ->add('establishment', EstablishmentType::class)
;

А в Учреждении Тип:

$builder
    ->add('id', EntityType::class, [
        'class' => Establishment::class,
        'choice_label' => 'name',
        'query_builder' => function (EstablishmentRepository $repository) {
            return $repository->findAllQueryBuilder($user);
        },
    ])
    ->add('participate', ChoiceType::class, [
        'expanded' => true,
        'multiple' => false,
        'choices' => [
            'front.form.establishment.participate.yes' => true,
            'front.form.establishment.participate.no' => false,
        ],
    ])
    ->add('comment', TextAreaType::class)
    ;

Но без большего удивления это не работать, он пытается установить учреждение, а не идентификатор учреждения, что довольно логично ...

У вас есть какие-либо идеи для этого? s? несопоставленное поле в RegistrationType, позволяющее правильно сопоставить учреждение? Есть еще идеи? Нужна дополнительная информация?

1 Ответ

0 голосов
/ 10 апреля 2020

Я нашел решение своей проблемы, я не мог использовать DataTransformer, потому что моя сущность перезаписывалась, поэтому я добавляю прослушиватель PreSubmit, чтобы установить мое учреждение с правильным объектом, восстановленным из БД.

Вот Слушатель добавил в RegistrationType:

/** @var EntityManagerInterface $em */
$em = $this->entityManager;

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (PreSubmitEvent $event) use ($em) {
    $data = $event->getData();

    $id = isset($data['establishment']) && isset($data['establishment']['id']) ? $data['establishment']['id'] : null ;

    if(!empty($id)){
        $establishment = $em->getRepository(Establishment::class)->find($id);
        $event->getForm()->get('establishment')->setData($establishment);
    }
});

Конечно, необходимо внести улучшения в код или другой метод, в любом случае, этот только что разблокировал меня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...