2015-12-06 4 views
2

У меня есть форма Parents, встроенная в другую форму Student, содержащую данные родителей учащегося. Мне нужно проверить встроенную форму, потому что в моем коде просто выполняется проверка другой формы.Проверка встроенных форм с помощью Symfony2

StudentType.php

//... 
    ->add('responsible1', new ParentsType(),array('label' => 'Mother')) 
    ->add('responsible2', new ParentsType(),array('label'=> 'Father')) 

/** 
* @param OptionsResolverInterface $resolver 
*/ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'BackendBundle\Entity\Student' 
    )); 
} 

Entity Родители

//... 
/** 
* @ORM\OneToMany(targetEntity="Student", mappedBy="$responsible1") 
* @ORM\OneToMany(targetEntity="Student", mappedBy="$responsible2") 
*/ 
private $students; 

Entity Student

//... 
/** 
* 
* @ORM\ManyToOne(targetEntity="Parents", inversedBy="students", cascade={"persist"}) 
*/ 
private $responsible1; 

/** 
* 
* @ORM\ManyToOne(targetEntity="Parents", inversedBy="students", cascade={"persist"}) 
*/ 
private $responsible2; 

Используя следующий код в контроллере я получил имя и сообщение об ошибке все недействительны поля в основной форме (Student), но я получаю ошибки ошибок вложений (Родители), просто получите имя объекта (ответственный1 или ответственный2) и сообщение, которое я получаю [объект объекта].

StudentController.php

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; 
} 
/** 
* Creates a new Student entity. 
* 
*/ 
public function createAction(Request $request) 
{ 
// if request is XmlHttpRequest (AJAX) but not a POSt, throw an exception 
if ($request->isXmlHttpRequest() && !$request->isMethod('POST')) { 
    throw new HttpException('XMLHttpRequests/AJAX calls must be POSTed'); 
} 

    $entity = new Student(); 
    $form = $this->createCreateForm($entity); 
    $form->handleRequest($request); 

    if ($form->isValid()) { 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($entity); 
     $em->flush(); 

     if ($request->isXmlHttpRequest()) { 
     return new JsonResponse(array('message' => 'Success!'), 200); 
    } 

     return $this->redirect($this->generateUrl('student_show', array('id' => $entity->getId()))); 
    } 

    if ($request->isMethod('POST')) { 
        return new JsonResponse(array(
     'result' => 0, 
     'message' => 'Invalid form', 
     'data' => $this->getErrorMessages($form)),400); 
    } 

    return $this->render('BackendBundle:Student:new.html.twig', array(
     'entity' => $entity, 
     'form' => $form->createView(), 
    )); 
} 

Я попытался выше код с функцией getErrorsAsString() ошибок в строке и поэтому, если они появляются все, так что я думаю, я должен добавить что-то в приведенном выше коде проверять объекты, когда «ответственный1» или «ответственный2» проверяют все поля.

мне нужно, чтобы получить все эти ошибки являются недействительными поля на обоих forms.I читать что-то добавить 'cascade_validation' => true, validation_group или @Assert\Valid() кодом, но я попробовал, и я не смог получить его. Если кто-то может объяснить мне, что это стоит того, я благодарю вас, потому что я новичок во всем этом.

+0

вы ищете способ flattern сообщения об ошибках, включая вложенные формы? –

+0

Привет @ b.b3rn4rd, мне нужно проверить форму и вернуть с помощью JsonResponse Ajax-вызов, а затем указать недопустимые поля формы, не обновляя экран. Это было решение, но я не могу получить ошибки встроенных форм. – Joseph

+0

имеет смысл, я делал подобную вещь для проверки ajax, разместил решение, которое работает для меня –

ответ

2

Следуя примеру flatterns формы и субформы ошибок в массив ДООС, дайте мне знать, если это то, что вы пытаетесь достичь

<?php 
namespace Example\Bundle\UtilityBundle\Form; 
use Symfony\Component\Form\Form; 
class FormErrors 
{ 
    public function getArray(Form $form, $style = 'KO') 
    { 
     $method = sprintf('get%sErrors', $style); 

     $messages = $this->$method($form->all()); 

     return $messages; 
    } 

    private function getKOErrors(Form $children) 
    { 
     $errors = array(); 

     /* @var $child \Symfony\Component\Form\Form */ 
     foreach ($children as $child) { 
      $type = $child->getConfig()->getType()->getName(); 
      if ($child->count() && ($type !== 'choice')) { 
       $childErrors = $this->getKOErrors($child->all()); 
       if (sizeof($childErrors)) { 
        $errors = array_merge($errors, $childErrors); 
       } 
      } else { 
       if (!$child->isValid()) { 
        // I need only one error message per field 
        $errors[$child->getName()] = $child->getErrors()->current()->getMessage(); 
       } 
      } 
     } 

     return $errors; 
    } 
} 
+0

Привет @ b.b3rn4rd, С вашим кодом я мог бы получить ошибки формы, но не было, но в моем случае форма встроена в главный дважды. Для меня я понимаю, что у меня есть форма регистрации для студентов, и во мне появляется форма регистрации от отца и другие данные матери (оба имеют один тип). И что, если я получаю какое-либо поле, является недопустимым, оба формы являются первыми полями. Вам нужно как-то отличить полученные ошибки, например ответственное имя_имя или ответственное имя_2. Надеюсь, я хорошо объяснил и поблагодарил вас за ваш ответ. – Joseph

+0

@Joseph, просто добавьте второй параметр '$ name' в' getKOErrors (Form $ children, $ name) 'и конкатенируйте' $ errors [$ name .'_ '. $ Child-> getName()] 'и don' t забыть передать его '-> getName()' при вызове –

+0

теперь все работает отлично, я считаю, что мне нужно было отличать их, большое спасибо, мне очень помогла. – Joseph

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