У меня есть несколько вложенных форм с 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
Ведьма - это то, что ожидается, здесь нет проблем,
Но во втором дампе в 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 раз (по одному на каждое действие) с нулем ...
Не знаю, почему кажется, что данные передаются в последнюю встроенную форму, но событие не может их получить.