2016-04-15 64 views
0

我正在使用CollectionType字段。CollectionType元素验证错误消息位置

$builder->add('urls', CollectionType::class, [ 
    'allow_add'=>true, 
    'entry_type'=>UrlType::class, 
    'constraints'=>new All([ 
     'constraints'=>[ 
      new Url() 
     ] 
    ]) 
]); 

它按我的预期工作。除了字段包含无效内容的消息外。

验证程序有效,但错误消息有点令人困惑:Field.0 - This value is not a valid URL address。我需要什么是简单地使父域无效 - 将错误绑定到urls字段。

当然,我可以创建一个窗体监听器并在那里执行验证。但是 - 国际海事组织 - 这是一个解决方法。

如何以“纯”的方式实现这一目标?我尝试了很多方面玩error_bubbling,但它仍然不是令人满意的。

+0

你试过'error_mapping'选项吗? –

+0

@KamilAdryjanek - 十几次。你的意思是什么特别的表达? – eRIZ

回答

0

尝试,所以你对每个UrlType力验证,并把它泡向上的错误父窗体中,CollectionType

$builder->add('urls', CollectionType::class, [ 
    'allow_add'=>true, 
    'entry_type'=>UrlType::class, 
    'constraints'=>new All([ 
     'constraints'=>[ 
      new Url() 
     ] 
    ]), 
    'cascade_validation' => true, 
    'entry_options' => array('error_bubbling' => true) 
]); 
+0

不幸的是 - 我仍然得到''Field.0 - ...''消息。 – eRIZ

0

我认为你需要设置error_mapping:

$builder->add('urls', CollectionType::class, [ 
    'allow_add'=>true, 
    'entry_type'=>UrlType::class, 
    'constraints'=>new All([ 
     'constraints'=>[ 
      new Url() 
     ] 
    ]), 
    'cascade_validation' => true, 
    'error_bubbling' => false, 
    'error_mapping' => [ 
     'your_parent_form_alias.field_name' => 'field_name', 
    ] 
]); 

然后在UrlValidator中,当你在建造违规时添加atPath那样的:

 if (empty($form['field_name'])) { 
      $this->context->buildViolation($constraint->getMessageName()) 
       ->atPath('your_parent_form_alias.field_name') 
       ->addViolation(); 
     } 

我不确定error_mapping和error_bubbling不应该先映射Url(),然后再映射All()。

我希望它能帮到你

+0

#1 - 我正在使用Symfony 2.8/3.0,所以我担心别名可能无法正常工作。 #2 - 您的概念是否需要更改供应商UrlValidator? – eRIZ

+0

#1这个解决方案是为symfony 2.5,不知道它是否适用于最新版本 #2不,我打电话UrlValidator,因为我认为它是自定义验证程序而不是从symfony2 在文档[error_mapping](https: //symfony.com/doc/current/reference/forms/types/choice.html#error-mapping)也有symfony3的error_mapping。我认为这就是你应该如何尝试去做的方式。 – omenrpg

+0

我试过尝试''error_mapping'',但没有满意的结果,这就是为什么我问。 – eRIZ