2016-04-12 6 views
0

Ich möchte die Formularfehler durchsuchen, aber ich es funktioniert nicht für mich.Wie die Formularfehler durchsuchen

Ich versuchte es ohne Ajax und ich dies ist der Fehler

An exception has been thrown during the rendering of a template ("Notice: Array to string conversion") 
in AppBundle:Admin:errors-form.html.twig at line 5. 

Ich denke, dass das Problem ist, wie diese Zeile Schleife Zweig mit:

'data' => $this->getErrorMessages($form), 

Dies ist der Code

protected function getErrorMessages(\Symfony\Component\Form\Form $form) 
{ 
    $errors = array(); 

    foreach ($form->getErrors() as $key => $error) { 
     $errors[] = $error->getMessage(); 
    } 

    foreach ($form->all() as $child) { 
     if (!$child->isValid()) { 
      $errors[$child->getName()] = $this->getErrorMessages($child); 
     } 
    } 

    return $errors; 
} 


public function addAction(Request $request) 
{ 
    if ($form->isValid()) { 
     //.. 
    } else { 

     $view = $this->renderView(
      'AppBundle:Admin:errors-form.html.twig', array(
       'data' => $this->getErrorMessages($form), 
      ) 
     ); 
     $response = new JsonResponse(array(
       'view' => $view, 
       'result' => 0, 
       'message' => 'Invalid form', 
      ) 
     ); 
     return $response; 

    } 


} 

Dies ist die mit JsonResponse zurückgegebene Ansicht im Falle von Fehlern, aber die Fehler werden nicht angezeigt, aber wenn ich einen statischen Text in dieser Ansicht legte es nach

<div id="error"> 

    {% for error in data %} 

     {{ error }} 

    {% endfor %} 
</div> 
+0

können Sie eine exapmle von nach, was 'getErrorMessages' zurückkehrt? – inaliahgle

+0

Das Formular ist mit Ajax, in der Konsole bekomme ich diesen Fehler: 500 (Interner Server Fehler) – hous

+0

@inaliahgle Ich habe es ohne Ajax versucht und ich dies ist der Fehler 'Eine Ausnahme wurde während des Renderns einer Vorlage geworfen ("Hinweis: Array zu String-Konvertierung") in AppBundle: Admin: errors-form.html.twig in Zeile 5. " – hous

Antwort

0

Es zwei {% for%} Schleife sein müssen, und ich habe es so festgelegt und jetzt funktioniert es gut.

<div id="error"> 

    {% for data in data %} 
     {% for error in data %} 
      {{ error }}<br> 
     {% endfor %} 

    {% endfor %} 

</div> 
2

einreichen erscheinen wird, wenn Sie nur wollen, um die Fehler bekommen und sie in den Zweig zeigen, keine Notwendigkeit für die getErrorMessages. Sie könnten die Form $form zur Ansicht übergeben:

public function addAction(Request $request) 
{ 
    if ($form->isValid()) { 
    //.. 
} else { 
    $view = $this->renderView(
     'AppBundle:Admin:erreurs-form.html.twig', array(
      'form' => $form, 
     ) 
    ); 
    $response = new JsonResponse(array(
      'view' => $view, 
      'result' => 0, 
      'message' => 'Invalid form', 
     ) 
    ); 
    return $response; 
    } 
} 

und verwenden Sie die form_errors in dem Zweig in gebauten Fehler zu holen und ihnen zeigen:

{% if form_errors(form) %} 
<div id="error"> 
    {{ form_errors(form) }} 
</div> 
{% endif %} 

Oder könnte die Fehler in der Steuerung erhalten, indem :

$view = $this->renderView(
     'AppBundle:Admin:erreurs-form.html.twig', array(
      'data' => $form->getErrors() 
     ) 
    ); 

und verwenden sie diese in den Zweig zu handhaben:

<div id="error"> 
{% for error in data %} 
    {{ error.message }}   
{% endfor %} 
</div> 
+0

geschrieben Es funktioniert nur so '$ view = $ this-> renderView ('AppBundle: Admin: erreurs-form.html.twig', array ('form' => $ form-> createView(),)); ' und in dieser Ansicht'

{{ form_errors(form) }} {% for children in form.children %} {% if not children.vars.valid %} {{ form_errors(children) }} {% endif %} {% endfor %}
' Aber ich bevorzuge, nicht wieder diese '' form '=> $ form-> createView(),', möchte ich nur zurückgeben Fehler – hous

0

Die Methode getErrors gibt nur die erste Ebene des Formulars zurück, das heißt das Formular selbst und nicht die untergeordneten Elemente.

Sie müssen die boolean Argument, um die Methode suchen tief in Form haben: getErrors(true)

protected function getErrorMessages(\Symfony\Component\Form\Form $form) 
{ 
    // ... 

    foreach ($form->getErrors(true) as $key => $error) { 
     $errors[] = $error->getMessage(); 
    } 

    // ... 

    return $errors; 
} 

Siehe Symfony Dokumentation http://symfony.com/doc/current/components/form/introduction.html#accessing-form-errors

EDIT

Ich habe nicht die Aufmerksamkeit auf die zahlen Anfang. Der Fehler bei der Sie Vorlage ist auf die folgende Stück Code:

foreach ($form->all() as $child) { 
    if (!$child->isValid()) { 
     $errors[$child->getName()] = $this->getErrorMessages($child); 
    } 
} 

$this->getErrorMessages($child) ist ein Array tatsächlich zurückkehrt, kein String. Sie tun müssen, wie folgt:

foreach ($form->all() as $child) { 
    if (!$child->isValid()) { 
     foreach ($this->getErrorMessages($child) as $error) { 
      $errors[$child->getName()] .= ' '.$error 
     } 

    } 
}