Symfony getData 事件订阅者为空



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

我有三个事件订阅者,用于三个相互依赖的下拉列表。

所以在我的表单类型中,我说:

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

我的一个事件订阅者看起来像这样:

...
...
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"的未定义方法",并且(我认为(这是因为我在preSetData中的$data为空,但我不知道为什么它是空的。我是否看错了地方,或者我的错误在哪里?

preSetData

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

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

因此,在设置->之前,表单显然没有任何数据,事件数据也没有设置。这就是为什么$datanull在听众的onPreSetData方法中。

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

快速概览:

  • 在预提交:
    • $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
    • 您仍然可以添加/删除字段
  • 在帖子提交:
    • $form->isSubmitted()返回true
    • "您无法从提交的表单中删除儿童">
    • "您无法将子项添加到提交的表单中">
    • $form->get('someButton')->isClicked()返回true

在 preSetData 声明中,你得到的是错误的类。 试试这个:

public function preSetData(GenericEvent $event)

添加下一个用途:

use SymfonyComponentEventDispatcherGenericEvent;

相关内容

  • 没有找到相关文章

最新更新