13

我有一个下拉表单元素。最初它一开始是空的,但在用户进行了一些交互后,它通过 javascript 填充了值。这一切正常。但是,当我提交它时,它总是返回一个验证错误This value is not valid.

如果我将项目添加到表单代码中的选择列表中,它将验证确定,但是我试图动态填充它并将项目预先添加到选择列表中是行不通的。

我认为的问题是因为表单正在验证一个空的项目列表。我根本不希望它根据列表进行验证。我已将所需的验证设置为 false。我将 chocie 类型切换为文本,并且始终通过验证。

这将仅针对添加到选项列表的空行或项目进行验证

$builder->add('verified_city', 'choice', array(
  'required' =>  false
));

这里没有回答类似的问题。
在 Symfony 2 中验证动态加载的选项

假设您不知道所有可用的选择是什么。它可以从外部网络源加载吗?

4

5 回答 5

6

经过很多时间试图找到它。您基本上需要添加一个PRE_BIND侦听器。在绑定值以供验证之前添加一些额外的选择。

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;


public function buildForm(FormBuilderInterface $builder, array $options)
{

  // .. create form code at the top

    $ff = $builder->getFormFactory();

    // function to add 'template' choice field dynamically
    $func = function (FormEvent $e) use ($ff) {
      $data = $e->getData();
      $form = $e->getForm();
      if ($form->has('verified_city')) {
        $form->remove('verified_city');
      }


      // this helps determine what the list of available cities are that we can use
      if ($data instanceof  \Portal\PriceWatchBundle\Entity\PriceWatch) {
        $country = ($data->getVerifiedCountry()) ? $data->getVerifiedCountry() : null;
      }
      else{
        $country = $data['verified_country'];
      }

      // here u can populate choices in a manner u do it in loadChoices use your service in here
      $choices = array('', '','Manchester' => 'Manchester', 'Leeds' => 'Leeds');

      #if (/* some conditions etc */)
      #{
      #  $choices = array('3' => '3', '4' => '4');
      #}
      $form->add($ff->createNamed('verified_city', 'choice', null, compact('choices')));
    };

    // Register the function above as EventListener on PreSet and PreBind

    // This is called when form first init - not needed in this example
    #$builder->addEventListener(FormEvents::PRE_SET_DATA, $func); 

    // called just before validation 
    $builder->addEventListener(FormEvents::PRE_BIND, $func);  

}
于 2013-08-14T09:01:42.163 回答
0

验证由 Validator 组件处理:http ://symfony.com/doc/current/book/validation.html 。

Form 层中的required选项是用来控制 HTML5required属性的,所以它不会为你改变任何东西,这很正常。

您应该在这里做的是根据上面链接的文档配置验证层。

于 2013-08-13T13:14:30.807 回答
0

找到了我在此处发布的更好的解决方案:禁用 Symfony 2 类型中的选择字段的后端验证

老答案:

只花了几个小时处理这个问题。这种选择-类型真的很烦人。我的解决方案与您的类似,可能会更短一些。当然这是一个黑客,但你能做什么......

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('place', 'choice'); //don't validate that

    //... more form fields

   //before submit remove the field and set the submitted choice as
   //"static" choices to make "ChoiceToValueTransformer" happy
   $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
        $data = $event->getData();
        $form = $event->getForm();
        if ($form->has('place')) {
            $form->remove('place');
        }

        $form->add('place', 'choice', array(
            'choices' => array($data['place']=>'Whatever'),
        ));
    });
}
于 2015-08-05T11:03:16.297 回答
0

在您的表单类型类中添加这个内部buildForm方法,以便您可以验证输入字段值而不是选择字段值中的选择;

$builder->addEventListener(
    FormEvents::PRE_SUBMIT,

    function (FormEvent $event) {
        $form = $event->getForm();

        if ($form->has('verified_city')) {
            $form->remove('verified_city');
            $form->add(
                'verified_city', 
                'text', 
                ['required' => false]
            )
        }
    }
);
于 2017-08-23T01:01:31.353 回答
-1

Validations.yml 中的更新

请按以下格式更新 Validation.yml 文件:在每个字段中设置组名

 
         password:
            - NotBlank: { message: Please enter password ,groups: [Default]}
表单类型更新 /** * @param OptionsResolverInterface $resolver */ public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'RegistrationBundle\Entity\sf_members', 'validation_groups' => function(FormInterface $form){
$data = $form->getData();
$member_id = $data->getMemberId();

// Block of code; // starts Here :

if( condition == 'edit profile') { return array('edit'); } else { return array('Default'); } },

实体中的更新 /** * @var string * * @ORM\Column(name="password", type="text") * @Assert\Regex( * pattern="/(?i)^(?=.[a-zA-Z])(?=.\d).{8,}$/", * match=true, * message="Your password must be at least 8 characters, including at least one number and one letter", * groups={"Default","edit"} * ) */
private $password;

于 2016-03-28T13:30:50.900 回答