2015-02-20 3 views
3

В Symfony я создал собственный тип формы и contraint.Ограничение пользовательской формы Symfony записывает ошибку в родительскую форму

Ограничение прикрепляется к типу формы, как это:

->add('customField', 'customField', array(
      'required' => 
      'mapped' => false, 
      'constraints' => array(new CustomField()), 
     )) 

, где CustomField это класс ограничений.

Validate ограничения валидатора() метод выглядит следующим образом:

public function validate($value, Constraint $constraint) 
{ 
    //I know this will always fail, but it's just for illustration purposes 
    $this->context->addViolation($constraint->message); 
} 

Я изменил шаблон по умолчанию формы как это:

{% block form_row -%} 
<div class="form-group"> 
    {{- form_widget(form) -}} 
    {{- form_errors(form) -}} 
</div> 
{%- endblock form_row %} 

{% block customField_widget %} 
{% spaceless %} 
    <!-- actually different but you get the idea --> 
    <input type="text" name="customField" id="customField" /> 
{% endspaceless %} 
{% endblock %} 

{% block form_errors -%} 
    {% if errors|length > 0 -%} 
     {%- for error in errors -%} 
      <small class="help-block"> 
       {{ error.message }} 
      </small> 
     {%- endfor -%} 
    {%- endif %} 
{%- endblock form_errors %} 

И в шаблоне, где отображаются форма, I 'добавил код, чтобы отображать ошибки, связанные со всей формой, а не отдельные полевые ошибки:

{{ form_start(formAdd) }} 
        {% if formAdd.vars.valid is same as(false) -%} 
         <div class="alert alert-danger"> 
          <strong>Errors!</strong> Please correct the errors indicated below. 
          {% if formAdd.vars.errors %} 
           <ul> 
           {% for error in formAdd.vars.errors %} 
            <li> 
             {{ error.getMessage() }} 
            </li> 
           {% endfor %} 
           </ul> 
          {% endif %} 
         </div> 
        {%- endif %} 
... 

Проблема со всем этим, валидатором этого конкретного поля, связывает нарушение ограничения с объектом формы, а не с типом формы customField. Это приводит к тому, что ошибка окончательно отображается с общими ошибками формы, а не отображается как ошибка поля.

Теперь это не единственный настраиваемый тип формы и валидатор, который я добавил, но это единственный, который отображает это поведение, без меня, чтобы определить разницу между этим и остальными. Можете ли вы определить, что здесь не так?

+0

я смог сократить область поиска. Нет ничего плохого в ограничении или валидаторе. По-видимому, тип пользовательской формы вызывает эту проблему. – Zorrocaesar

ответ

3

Я отсортировали это сам. Это не имеет никакого отношения к противоречию или валидатору. Проблема заключалась в типе пользовательской формы (который я не описал в моем вопросе). Проблема заключалась в том, что этот тип формы имел «форму» в качестве родителя, который является составным типом. Это означает, что по умолчанию (в соответствии с docs) барботирование ошибок также верно и что, в свою очередь, означает, что «любые ошибки для этого поля будут привязаны к основной форме, а не к конкретному полю».

1

Вы должны specify path in your validator:

$this->context 
      ->buildViolation($constraint->message) 
      ->atPath('customField') 
      ->addViolation(); 
+1

Я пробовал, но не работает. Ошибка по-прежнему добавляется к форме вместо поля. Но для других валидаторов я не указываю путь вообще. Я просто прикрепляю валидатор к типу формы в определении формы, и они просто знают, где атташе ошибка. – Zorrocaesar

0

Вы должны установить «error_bubbling» ложь в пользовательском типе формы

class CustomFieldType extends AbstractType 
{ 
     public function getName() 
     { 
       return 'customField'; 
     } 
     public function configureOptions(OptionsResolver $resolver) 
     { 
       $resolver->setDefault('error_bubbling', false); 
     } 
} 
Смежные вопросы