验证动态填充的选择字段

问题描述 投票:0回答:1

我有两个选择字段,一个取决于另一个。

构建表单时,依赖字段有一个空的选项数组。

然后,我在 JavaScript 中填写此字段,请求来自操作的一些数据。

问题来自于验证。当然它不会通过,因为单个或多个值对于空值无效。 为了解决这个问题,我创建了一个

PRE_BIND
侦听器,它基本上删除然后使用正确的值重新创建选择字段,但它仍然没有通过验证。

$form->getErrors()
不返回任何内容,但
$form->getErrorsAsString()
在我的选择字段上返回错误。

我的表格:

<?php

namespace Foo\BarBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class BarFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // other fields

        // This field is filled in ajax
        $builder->add('stores', 'choice', array(
            'label' => 'form.label.stores',
            'translation_domain' => 'FooBarBundle',
            'choices' => $options['storesList'],
            'required' => false,
            'multiple' => true,
            'auto_initialize' => false,
            'attr' => array(
                'class' => 'chzn-select',
                'placeholder' => 'form.placeholder.stores'
        )));

        $func = function (FormEvent $e) use ($options) {
            $data = $e->getData();
            $form = $e->getForm();
            if ($form->has('stores')) {
                $form->remove('stores');
            }

            $brand = isset($data['brand']) ? $data['brand'] : null;

            if ($brand !== null) {
                $choices = $options['miscRepo']->getStoresNameIndexedById($brand);
                $choices = array_keys($choices);
                $choices = array_map('strval', $choices);
            } else {
                $choices = array();
            }

            $form->add('stores', 'choice', array('choices' => $choices, 'multiple' => true, 'attr' => array('class' => 'chzn-select')));
        };

        $builder->addEventListener(FormEvents::PRE_SUBMIT, $func);
    }

    public function getName()
    {
        return 'bar_form_campaign';
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setRequired(array(
            'storesList',
            'miscRepo',
        ));
    }
}
php symfony validation symfony-forms
1个回答
0
投票

我遇到了和你一样的问题:通过javascript更新字段,但没有通过验证。在 PRE_SUBMIT 事件中,读取您使用 javascript 添加的值,查询并获取具有该 ID 的对象,然后更新字段选择。

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
    $data = $event->getData();
    $form = $event->getForm();
    $pageId = $data['page_id'];

    $page = $this->myManager->getPage($pageId);
    $options = array($page->getId() => $page->getTitle());

    $form->add('page_id', 'choice', array(
        'label'         => 'Select page',
        'choices'       => $options,
        'required'      => true,
        'placeholder'   => 'Select page'
    ));

    $form->getData()->setPageId($pageId);
});
© www.soinside.com 2019 - 2024. All rights reserved.