У меня есть форма 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()
кодом, но я попробовал, и я не смог получить его. Если кто-то может объяснить мне, что это стоит того, я благодарю вас, потому что я новичок во всем этом.
вы ищете способ flattern сообщения об ошибках, включая вложенные формы? –
Привет @ b.b3rn4rd, мне нужно проверить форму и вернуть с помощью JsonResponse Ajax-вызов, а затем указать недопустимые поля формы, не обновляя экран. Это было решение, но я не могу получить ошибки встроенных форм. – Joseph
имеет смысл, я делал подобную вещь для проверки ajax, разместил решение, которое работает для меня –