我正在处理symfony表单,我在字段中使用select2作为ajax请求,我听取PRE_SUBMIT
事件以获取选项列表并提供choices
选项< / p>
$opts = $config->getOptions();
$opts['choices'] = $listImages; //array of Image object
但是在var_dump中的PRE_SUBMIT
事件中,我在表单中获取所选值,并在闭包中使用它,并且当持久化时,字段具有空值,因此我在执行var_dump POST_SUBMIT
事件该字段实际上为null值。而且我也不知道我错过了什么
我的FormType如下:
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。 如果您需要更多,请询问。
答案 0 :(得分:1)
这似乎是在那个时间点返回的完全有效的值。
在PRE_SUBMIT
您获得父表单并将其传递给$formModifier
时,这是正常的。但是,该修饰符执行以下操作:
$typeName = get_class($config->getType()->getInnerType());
$form->add('image', $typeName, $opts);
您的表单中已经有一个名为image
的字段,但重新添加它会覆盖其上下文(包括数据)。在你看一眼Form.php
时,你会看到:
Form.php第873行
$this->children[$child->getName()] = $child;
也就是说,一旦与表单字段重叠,就无法检索数据。
为什么在重新添加字段后需要检索数据?