[英]Symfony3 pass form data to collection inside collection
我有一些帶有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
女巫是預期的,這里沒問題,
但是在第二個轉儲中,在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);
});
現在ActivityServiceCreationMultipleType中的dump()(您在上一個代碼片段中看到)顯示了活動數組。 直接活動。 ActivityServiceCreationType中的dump()執行36次(每個活動一次),帶有null ...不知道為什么它似乎將數據傳遞給最后一個嵌入的表單,但事件無法獲取它。
編輯
ActivityServiceCreationCollectionType的configurateOptions必須是:
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(array(
'data_class' => null,
'multipleActivities' => null
);
}
ActivityServiceCreationMultipleType的configureOptions。
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
));
}
ActivityServiceCreationType的configureOptions。
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中指明要傳遞給表單的每個外部屬性
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.