表单字段和父级上的Symfony2错误

时间:2014-08-18 13:24:56

标签: php forms symfony

是否可以对表单进行验证,但同时将其保留在字段上?我试图将所有错误显示在页面顶部,但我还希望在错误字段周围有一个红色边框。此外,我在顶部的每个错误都应该有一个链接,重点关注具有该错误的字段。

如果我使用{{ form_errors(form.title) }},则无法访问{{ form_errors(form) }}。如果我在该字段上使用error_bubbling => true,则我无法访问{{ form_errors(form.title) }}。我正在考虑在我的控制器中构建我的错误显示,但如果我这样做,我将失去Twig的功能。

2 个答案:

答案 0 :(得分:0)

  1. 自定义form_row块以显示错误

    {% block form_row %}
    <div class="form-group{% if errors|length == 1 %} has-error{% endif %}">
            {{ form_label(form, label|default(null)) }}
            {{ form_widget(form, { 'attr' : { 'class' : 'form-control' } } ) }}
    </div>
    {% endblock form_row %}
    
  2. 自定义form_errors可点击。您可以创建一个jQuery函数来监听li上的点击。在该函数中,获取所点击的id删除 RelatedField li以获取字段ID

    {% block form_errors -%}
    {% if errors|length > 0 -%}
    <ul id="allErrors">
    {%- for error in errors -%}
    <li id="RelatedField{{ error.id }}">{{ error.message }}</a></li>
    {%- endfor -%}
    </ul>
    {%- endif %}
    {%- endblock form_errors %}
    
  3. <强>参考

答案 1 :(得分:0)

这是我目前正在使用的解决方案,我不知道它是否是一个好的解决方案。 Personnaly我宁愿在Twig做这一切,但我找不到更好的方法。

DefaultController.php :我将$ errors传递给了我的观点。

$errors = array();
if ($request->getMethod() == 'POST') {
    $form->bind($this->getRequest());
    if ($form->isValid()) {
        ...
    } else {
        foreach ($form->all() as $child) {
            if (!$child->isValid()) {
                $errors[$form->getName().'_'.$child->getName()] = substr($child->getErrorsAsString(),7);
            }
        }
    }
}

<强> template.html.twig

{% if errors|length > 0 %}
    <ul>
    {% for key, error in errors %}
        <li><a href="javascript:void(0);" data-id="{{ key }}" class="errorClick">{{ error }}</a></li>
    {% endfor %}
    </ul>
{% endif %}

{% block form_widget_simple %}
{% spaceless %}
    {% set type = type|default('text') %}
    <input type="{{ type }}" {{ block('widget_attributes') }} {% if value is not empty %}value="{{ value }}" {% endif %} {% if errors|length > 0 %}class="error"{% endif %} />
{% endspaceless %}
{% endblock form_widget_simple %}

<强>的script.js

$('.errorClick').click(function() {
    $('#'+$(this).attr('data-id')).focus();
});