簡體   English   中英

Symfony3將表單數據傳遞給集合內的集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM