Problema: ¿Cómo valido el formulario y devuelvo los mensajes de validación en el cuadro modal sin actualizar la página?
Recién comencé a aprender Symfony 3 y tuve problemas para agregar datos usando AJAX. Sé cómo incluir el formulario de plantilla dentro del cuadro modal, pero no sé cómo mostrar los mensajes de error de $form->isValid() dentro del modal y persistir.
nuevo.html.ramita
ACTUALIZACIÓN: ahora puedo llamar a la acción del método en el controlador. Pero cuando validé el formulario, no recibí ningún error de validación dentro del cuadro modal.
<script> $(function () { $('.withdropdown').dropdown(); $('.add-company-launch').modal(); $('#company-form').submit(function(e) { var formUrl = "{{ path('monteal_backend_company_ajax') }}"; var formData = new FormData(this) $.ajax({ url: formUrl, type: 'POST', data: formData, contentType: false, cache: false, processData: false, success: function(data, textStatus, jqXHR) { if(data['status'] === 'success'){ alert('success'); } else { $('#add-company').html(data['html']); } }, error: function(jqXHR, textStatus, errorThrown) { } }); e.preventDefault(); }); }) </script>{% bloque final %}
CompanyController.php
ACTUALIZACIÓN: he creado dos métodos para AJAX, 1. Método para manejar un formulario. 2. Controlador Ajax.
public function newAction() { $company = new Company(); $form = $this->createForm(CompanyForm::class, $company); return $this->render('Admin/Backend/Company/new.html.twig', array( 'form'=>$form->createView() )); } public function ajaxAction(Request $request) { if (!$request->isXmlHttpRequest()) { return new JsonResponse(array('message' => 'You can access this only using Ajax!'), 400); } $company = new Company(); $form = $this->createForm(CompanyForm::class, $company); $form->handleRequest($request); if ($form->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($company); $em->flush(); return new JsonResponse(array( 'status' => 'success'), 200 ); } $html = $this->renderView("Admin/Backend/Company/new.html.twig", array( 'form' => $form->createView()) ); return new JsonResponse(['status' => 'error', 'html' => $html]); }1 - En su nueva acción, simplemente cree el formulario y pase la vista (createView) a su plantilla.
2 - escriba un ajaxFormHandlerAction y aquí cree el formulario, manéjelo, valídelo, represente una vista en una variable: $html = $this->renderView('yourTemplate.html.twig', array($form->createView() )); Editar: por supuesto, su ajax debe publicar el formulario en su nueva URL de ajax ... FIN Editar
3 - si no está validado, devuelve una JsonResponse (array ('html' => $ html, 'status' => 'error')); si se valida Devuelve una JsonResponse(array('status' => 'success'));
4 - En su devolución de llamada exitosa de ajax, presente el nuevo formulario si el estado es un error ... si el estado es exitoso, redirigir o lo que sea
Espero que esto ayude
Editar :
algo como esto para su controlador:
use Symfony\Component\HttpFoundation\JsonResponse; public function ajaxFormHandlerAction(Request $request) { $company = getYourCompany(); //get it from db? $form = $this->createForm(CompanyForm::class, $company)); $form ->handleRequest($request); if($form ->isValid()){ //do whatever you want, maybe persist, flush() return new JsonResponse(array( 'status' => 'success')); } $html = $this->renderView("yourModalTemplate.html.twig", array('form' => $form->createView())); return new JsonResponse(['status' => 'error', 'html' => $html]); }Y en su devolución de llamada exitosa ajax:
success: function(data, textStatus, jqXHR) { if(data['status'] === 'success'){ alert('success'); // maybe redirect the user ??? }else if(data['status' === 'error']){ $('#idOfYourModal').html(data['html']); //assuming you use jquery, or translate to javascript } },Tienes que crear una plantilla twig con solo el modal dentro...