2013-12-04 3 views
6

На некоторых страницах я использую формы в моделях bootstrap. Я передаю форму с помощью Ajax и проверяется в контроллере. Большинство пользователей правильно заполнят форму, но если проверка не выполняется, форма повторно отображается и отправляется обратно пользователю. Мне это совсем не нравится, но я не могу найти лучший способ, потому что я не могу получить доступ к ошибкам проверки полей. У кого-то есть лучший подход для получения ошибок проверки, отправляемых обратно в JSON?Symfony2 форма проверки в Ajax

+0

Вы можете сделать валидация в JS, но лучший подход imho taht для проверки на стороне сервера. Данные Snding через JSON - хороший выбор. Что не так с этим подходом? – Pawel

+1

Нет, я не использую проверку JS, потому что не хочу определять валидации в двух отдельных местах. В настоящий момент я проверю серверную сторону, но не могу найти достойный способ получить все ошибки из свойств формы + объекта и валидаторов. –

+0

Просто взаимодействуйте с элементами из формы и получите ошибки каждого. – Pawel

ответ

2

если я правильно понял, у вас есть форма, и вам нужно получить ошибки для каждого поля отдельно. если да, то посмотрите на \ Symfony \ Component \ Form \ Form :: getErrorsAsString() & сделать что-л в виде:

function getFormErrors($form) 
{ 
    $errors = array(); 

    // get the form errors 
    foreach($form->getErrors() as $err) 
    { 
     // check if form is a root 
     if($form->isRoot()) 
      $errors['__GLOBAL__'][] = $err->getMessage(); 
     else 
      $errors[] = $err->getMessage(); 
    } 

    // check if form has any children 
    if($form->count() > 0) 
    { 
     // get errors from form child 
     foreach ($form->getIterator() as $key => $child) 
     { 
      if($child_err = getFormErrors($child)) 
       $errors[$key] = $child_err; 
     } 
    } 

    return $errors; 
} 
+0

Удивительный! Не могли бы вы объяснить, почему вам нужно проверить, является ли форма корнем? – rvaliev

3

Я создал функцию сам

public function getFormErrors(Form $form) { 
    $errors = $form->getErrors(); 
    foreach ($form->all() as $child) { 
     foreach ($child->getErrors() as $key => $error) { 
      $template = $error->getMessageTemplate(); 
      $parameters = $error->getMessageParameters(); 

      foreach ($parameters as $var => $value) { 
       $template = str_replace($var, $value, $template); 
      } 

      $errors[$child->getName()][] = $template; 
     } 
    } 
    return $errors; 
} 
1

У меня только есть такая же проблема сегодня!

Я отправил форму с помощью ajax, и если мой контроллер отправил мне не json 'OK', форма обновится с новой формой, отправленной контроллером, который содержит ошибки. Данные 'OK' отправляются, когда form-> isValid(), иначе он возвращает визуализацию формы.

HTML:

<div class="form_area"> 
    <form id="myform" action.... > 
      ...code form ... 
    </form> 
</div> 

Действие контроллера:

use Symfony\Component\HttpFoundation\JsonResponse; 

public function myEditAction(){ 
    ....... 
    if ($request->getMethod() == 'POST') { 
     $form->bind($request); 

     if ($form->isValid()) { 
      ... code whn valide ... 
      if ($request->isXmlHttpRequest()) { 
       return new JsonResponse('OK'); 
      } 
     } 
    } 

    return $form; 
} 

JS:

$('#myform').on('submit',function(e){ 
      var formdata = $('#myform').serialize(); 
      var href = $(this).attr('action'); 
      $.ajax({ 
       type: "POST", 
       url: href, 
       data: formdata, 
       cache: false, 
       success: function(data){ 
        if(data != "OK") { 
         $('.form_area').html(data); 
        } 
       }, 
       error: function(){}, 
       complete: function(){} 
      }); 
      return false; 
     }); 
+0

Это решение, которое мне не нравится. Это просто противно и непрактично. См. Мой собственный ответ в том, как я решил проблему. –

2

Я бы сказал, что самое чистое решение для реализации JMSSerializerBundle (http://jmsyst.com/bundles/JMSSerializerBundle), который использует следующий класс:

https://github.com/schmittjoh/serializer/blob/6bfebdcb21eb0e1eb04aa87a68e0b706193b1e2b/src/JMS/Serializer/Handler/FormErrorHandler.php

затем в вашем контроллер:

 // ... 
     if ($request->isXMLHttpRequest()) { 
     $jsonResponse = new JsonResponse(); 

     $serializer = $this->container->get('jms_serializer'); 
     $form = $serializer->serialize($form, 'json'); 

     $data = array('success' => false, 
         'errorList' => $form); 

     $jsonResponse->setData($data); 

     return $jsonResponse; 
    } 
+0

Действительно чистый подход. Должен быть ответ. –

+0

Не очень чистый IMO, потому что вам нужно разобрать JSON, содержащуюся в поле 'errorList' ответа. Это означает, что вы должны 'JSON.parse' строку, содержащуюся в ответе JSON ... – Cyrille

Смежные вопросы