4

我知道这个问题已经被问过好几次了,但还没有真正帮助我解决问题的答案。

我有三个 EventSubscribers 用于三个相互依赖的下拉菜单。

所以在我的 FormType 中我说:

  public function buildForm(FormBuilderInterface $builder, array $options)
{
  // solution showmethecode
  $pathToAgencies = 'agencies';
  //
  $builder
    ->addEventSubscriber(new AddChannel1Subscriber($pathToAgencies))
    ->addEventSubscriber(new AddChannel3Subscriber($pathToAgencies))
    ->addEventSubscriber(new AddAgencySubscriber($pathToAgencies));

}

我的一个 EventSubscribers 看起来像这样:

    ...
...

        public static function getSubscribedEvents() {
            return array(
              FormEvents::PRE_SET_DATA  => 'preSetData',
              FormEvents::PRE_SUBMIT    => 'preSubmit'
            );
          }

          private function addChannel1Form($form, $channel1s = null) {
            $formOptions = array(
              'class' => 'AppBundle:Channel1',
                'property' => 'name',
                'label' => 'label.channel1s',
                'empty_value' => 'label.select_channel1s',
                'mapped' => false,
                'expanded' => false,
                'translation_domain' => 'UploadProfile',
                'multiple' => true,
                'required' => false,
                'attr' => array(
                  'class' => 'channel1s'
                ),
            );

            if ($channel1s){
              $formOptions['data'] = $channel1s;
            }
            $form->add('channel1s', 'entity', $formOptions);
          }

          public function preSetData(FormEvent $event) {
            $data = $event->getData();
            $form = $event->getForm();

                if (null === $data) {
                    return;
                }

            $accessor = PropertyAccess::createPropertyAccessor();
            $agency = $accessor->getValue($data, $this->pathToAgency);
            $channel1s = ($agency) ? $agency->getChannel3s()->getChannel1s() : null;
            $this->addChannel1Form($form, $channel1s);
          }

          public function preSubmit(FormEvent $event) {
            $form = $event->getForm();
            $this->addChannel1Form($form);
          }
    ...

现在我收到错误“尝试调用类“Doctrine\Common\Collections\ArrayCollection”的名为“getChannel3s”的未定义方法。” 并且(我认为)这是因为我$data在我的 preSetData 中为 NULL,但我不知道为什么它为 null。我看错了地方还是我的错误在哪里?

4

2 回答 2

3

preSetData在原始数据(如果给定,则应修改)绑定到表单(然后存储在)之前执行$options['data']

preSetData 中的“数据”是您提供给createForm($type, $data = null, array $options = array()).

所以在设置之前 - >表单显然没有任何数据并且事件数据也没有设置。$data这就是为什么null在你的听众的onPreSetData方法里面。

你使用了错误的事件。preSubmit围绕用户提交的数据使用和构建您的逻辑 ( $event->getData())。这将解决您的问题。

快速概览:

  • onPreSubmit:
    • $form->get('someButton')->isClicked()返回false
    • $event->getForm()->getData()返回($options['data']如果有)或 $options['empty_data']
    • $event->getData返回提交的数据(数组)
    • 您可以使用setData()
    • 您可以添加/删除字段
  • 提交:
    • 您不能setData()在此处使用,因为数据已经绑定到表单
    • $form->isSubmitted()仍然返回false
    • $form->get('someButton')->isClicked()返回true
    • 您仍然可以添加/删除字段
  • onPost提交:
    • $form->isSubmitted()返回true
    • “您不能从提交的表单中删除孩子”
    • “您不能将孩子添加到提交的表单中”
    • $form->get('someButton')->isClicked()返回true
于 2017-08-24T12:19:27.197 回答
0

在 preSetData 声明中,您得到了错误的类。尝试这个 :

public function preSetData(GenericEvent $event)

添加下一个使用:

use Symfony\Component\EventDispatcher\GenericEvent;
于 2017-08-24T12:16:36.610 回答