我知道这个问题已经被问过几次了,但没有一个答案能真正帮助我解决问题。
我有三个事件订阅者,用于三个相互依赖的下拉列表。
所以在我的表单类型中,我说:
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())
的"数据"。
因此,在设置->之前,表单显然没有任何数据,事件数据也没有设置。这就是为什么$data
null
在听众的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;