Symfony3 передает данные формы в коллекцию внутри коллекции - PullRequest
0 голосов
/ 14 июня 2019

У меня есть несколько вложенных форм с CollectionType, и кажется, что данные из конструктора не передаются на второй уровень вложенности.

Я упростила свои классы форм, просто потому, что я считаю это важным (если вы хотите больше информации, просто скажите мне в комментариях).

Форма нижнего уровня полностью генерируется в зависимости от Activity класса сущности:

class ActivityServiceCreationType extends AbstractType {
  public function buildForm(FormBuilderInterface $builder, array $options) {

    $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($options, $router) {
      $activity = $event->getData();
      dump($activity); //JUST TO TEST

      $form = $event->getForm();
      ... //$form->add of all necessary fields
    }
  }

  public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Activity',
      ...
    );
  }
}

Над ActivityServiceCreationType У меня есть следующая форма, которая является просто набором предыдущей:

class ActivityServiceCreationMultipleType extends AbstractType {

  public function buildForm(FormBuilderInterface $builder, array $options) {

    $builder
      ->add('activities', CustomCollectionType::class, [
        'entry_type'    => ActivityServiceCreationType::class,
        'entry_options' => $options,
        'mapped'        => true,
        'allow_add'     => true,
        'show_add_link' => true,
      ])
    ;

    $builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($options) {
      $data = $event->getData();
      dump($data); //To test the data arriving to this form

    });
  }

  public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
      'data_class' => null,
      ...
    ));
  }
}

Тогда у меня есть «основная» форма, с которой я создаю из контроллера:

class ActivityServiceCreationCollectionType extends AbstractType {
  public function buildForm(FormBuilderInterface $builder, array $options) {
  $builder
    ->add('selectAll', CheckboxType::class, [...])
    ...
  ;

  $builder->add('multipleActivities', CustomCollectionType::class, [
    'entry_type'    => ActivityServiceCreationMultipleType::class,
    'entry_options' => [
      "router"     => $options["router"],
      "em"         => $options['em'],
      "basePeriod" => $options['basePeriod'],
      'fit'        => $options['fit'],
      'periods'    => $options['periods'],
      'activities' => $options['activities']
    ],
    'mapped'        => true
    ])
  ;
}

Из контроллера я хочу установить объекты Activity в форме ActivityServiceCreationType, чтобы можно было создавать поля. И я делаю это так:

$form = $this->createForm(ActivityServiceCreationCollectionType::class,
  ["multipleActivities" => ["activities" => $activities]],
  [
    "router"     => $this->get("router"),
    "em"         => $this->getEm(),
    "periods"    => $periods,
    "basePeriod" => $basePeriod,
    'fit'        => $fit
  ]);

Как видите, данные для формы:

["multipleActivities" => ["activities" => $activities]]

Результаты для дампов, которые я вставил в код, следующие: Для первого дампа в ActivityServiceCreationMultipleType я получаю ArrayCollection of Activities enter image description here

Ведьма - это то, что ожидается, здесь нет проблем,

Но во втором дампе в ActivityServiceCreationType я получаю null . Здесь то, что я ожидал, является сущностью Activity для каждой из форм в коллекции, верно?

Можете ли вы сказать мне, где я не прав?

- Отредактировано, чтобы добавить больше информации: Я пытался узнать, когда данные «потерялись», и добавил некоторый код к событию в типе коллекции. В ActivityServiceCreationMultipleType изменил POST_SET_DATA следующим образом:

$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) use ($options) {
  $data = $event->getData();
  dump($data);

  $form = $event->getForm();
  $form->get('activities')->setData($data);
});

Теперь dump () в ActivityServiceCreationMultipleType (который вы видите в последнем фрагменте кода) показывает массив действий. Непосредственно деятельность. И dump () в ActivityServiceCreationType выполняется 36 раз (по одному на каждое действие) с нулем ... Не знаю, почему кажется, что данные передаются в последнюю встроенную форму, но событие не может их получить.

1 Ответ

0 голосов
/ 14 июня 2019

РЕДАКТИРОВАТЬ

Настраиваемые параметры ActivityServiceCreationCollectionType должны быть:

  public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
      'data_class' => null,
      'multipleActivities' => null
    );
  }

configureOptions ActivityServiceCreationMultipleType.

public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
      'data_class' => null,
      'entry_options' => null,
      'router" => null,
      'em" => null,
      'basePeriod" => null,
      'fit' => null,
      'periods'=>null,
      'activities' => null
    ));
  }

ConfigurationOptions of ActivitySyviceCre.

public function configureOptions(OptionsResolver $resolver) {
    $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Activity',
      'entry_options' => null,
      'router" => null,
      'em" => null,
      'basePeriod" => null,
      'fit' => null,
      'periods'=>null,
      'activities' => null
    ));
  }

В заключение, вы всегда должны указывать каждое внешнее свойство, которое вы хотите передать в форму, в configureOptions

...