我正在使用symfony表单,我在字段中使用select2作为ajax请求,我听 PRE_SUBMIT
事件获取选项列表并给出 choices
选项
$opts = $config->getOptions();
$opts['choices'] = $listImages; //array of Image object
但是在var_dump中的 PRE_SUBMIT
事件中,我在表单中获取所选值,并在闭包中使用它,并且当持久化时该字段具有空值,所以我在 POST_SUBMIT
事件中执行var_dump该字段实际上为null作为值 . 我不明白我错过了什么
My FormType below:
class ArticleType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('image', ChoiceType::class, array(
'expanded' => false,
'multiple' => false))
//other field
;
$formModifier = function (FormInterface $form, $image) use ($options) {
$listImages = $options['em']->getRepository('AlmotivAppBundle:Image')->findBy(array(
'id' => $image
));
if (!$listImages) {
$form->add('image')->addError(new FormError(
'Nous n\'avons pas p trouver l\'image, veuiller choisir une autre'
));
}
//die(var_dump($listImages)); //array of Image object
$config = $form->get('image')->getConfig();
$opts = $config->getOptions();
$opts['choices'] = $listImages;
$typeName = get_class($config->getType()->getInnerType());
$form->add('image', $typeName, $opts);
//die(var_dump($form->get('image')->getConfig()->getData())); //return null
};
$builder->get('image')->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) use ($formModifier) {
$image = $event->getData();
//die(var_dump($image)); //return 10
$formModifier($event->getForm()->getParent(), $image);
}
);
我正在使用框架的v3.1 . 如果您需要更多,请询问 .
1 回答
这似乎是在那个时间点返回的完全有效的值 .
在
PRE_SUBMIT
期间,您获得父表单并将其传递给$formModifier
,这没关系 . 但是,该修饰符执行以下操作:碰巧您已经在表单中有一个名为
image
的字段,但重新添加它会完全覆盖其上下文(包括数据) . 在你看一下Form.php
,你会看到:Form.php第873行
也就是说,一旦与表单字段重叠,就无法检索数据 .
重新添加字段后,为什么需要检索数据?