我知道这个问题已经被问了几次,但实际上还没有一个答案帮我解决了我的问题。
我有三个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);
}
...
现在我收到了错误"试图调用名为" getChannel3s"的未定义方法。 class" Doctrine \ Common \ Collections \ ArrayCollection"。" (我认为)这是因为我的preSetData中的$data
为NULL,但我不知道为什么它为空。我在看错了地方或我的错误在哪里?
答案 0 :(得分:1)
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
答案 1 :(得分:0)
在preSetData声明中,你得到了坏类。试试这个:
public function preSetData(GenericEvent $event)
添加下一个用途:
use Symfony\Component\EventDispatcher\GenericEvent;