2016-08-11 30 views
2

我已经将表单错误应用于表单集合字段(自定义字段集)。Symfony表格字段即使有错误也有效吗?

if ($this->isFieldset($form, $field) && !empty($error)) { 
    $form->get($field)->addError(
     new FormError(
      ucfirst(str_replace('_', ' ', $field)) . ' is invalid.') 
     ); 
} 

该窗体有错误适用于它,但仍被标记为有效?

enter image description here

当您在控制器的形式对的isValid前about_you孩子的错误,看到的是叫什么名字?

enter image description here

任何建议,为什么?

+2

你以前添加您的阵列或者调用'$ form-> isValid()'后? –

+0

是的,当我第一次创建窗体时,我添加了它们(在重写的窗体因子类中,它从Redis中提取错误并将它们添加回窗体)。 – Kal

+1

您是否尝试为自定义字段集编写测试或仅从该字段创建表单,然后在控制器中调用getErrors()/ isValid()? – dbrumann

回答

2

我通过代码挖掘,发现这个片断:

public function buildView(FormView $view, FormInterface $form, array $options) 
{ 
    //... 

    $view->vars = array_replace($view->vars, array(
     'errors' => $form->getErrors(), 
     'valid' => $form->isSubmitted() ? $form->isValid() : true, //<=== HERE 
     'value' => $form->getViewData(), 
     'data' => $form->getNormData(), 
     'required' => $form->isRequired(), 
     'size' => null, 
     'label_attr' => $options['label_attr'], 
     'compound' => $form->getConfig()->getCompound(), 
     'method' => $form->getConfig()->getMethod(), 
     'action' => $form->getConfig()->getAction(), 
     'submitted' => $form->isSubmitted(), 
    )); 
} 

这似乎是唯一地方valid设置。请注意,它发生在buildView!之后的一切都不会影响valid的价值。

然而,并非一切都是徒劳的,你可以简单地使用$form->isValid()来检查,如果表单目前有效的,因为我们可以在下面的摘要中看到:

public function isValid() 
{ 
    if (!$this->submitted) { 
     return false; 
    } 

    if ($this->isDisabled()) { 
     return true; 
    } 

    return 0 === count($this->getErrors(true)); 
} 
+0

所以我可以覆盖我的形式buildView和手动设置它?我正在做一些奇怪的事情,这就是为什么我会出现意想不到的行为。 – Kal

+1

我认为这个答案有误导性。问题绝对不在FormView中,因为可以在附件中看到问题。在调用createView()之前设置断点,并显示带有错误的Element \ Form(不是FormView)。在那一行,调用'isValid()'。当跳到下一行时,应该跳过if块。 @卡尔你能证实这种情况吗? – dbrumann

+1

老实说,我不知道..我刚刚看到你更新的问题,在我看来,你真的*在最后调用'createView()'。你之前的输出是? –

相关问题