Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

[SOLUCIONADO] Validación mediante FormRequest y ajax Laravel 5

Estas en el tema de Validación mediante FormRequest y ajax Laravel 5 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola amigos, Quiero hacer la validación de campos en Laravel 5 utilizando FormRequest pero ocupando ajax, normalmente solo con FormRequest los errores se muestran en ...
  #1 (permalink)  
Antiguo 10/02/2015, 09:25
 
Fecha de Ingreso: diciembre-2006
Mensajes: 213
Antigüedad: 17 años, 3 meses
Puntos: 3
Validación mediante FormRequest y ajax Laravel 5

Hola amigos,

Quiero hacer la validación de campos en Laravel 5 utilizando FormRequest pero ocupando ajax, normalmente solo con FormRequest los errores se muestran en el formulario recorriendo el array $errors mediante un foreach pero lo que quiero hacer es que mediante ajax me liste en un mensaje los errores del formulario o sino hay errores me muestre un mensaje indicando que la operación se realizó con éxito en el mismo formulario, sin necesidad de recargar todo el formulario o enviar a otra página. Estos mensajes se mostraría en un div con class="alert alert-danger" o div="alert alert-success"


He trabajado lo siguiente:

En rutas tengo:

Código PHP:
Ver original
  1. Route::post('proceso/registrar','ProcesoController@registrar');

En la vista tengo:

Código PHP:
Ver original
  1. <!-- El formulario -->
  2. <div class="col-xs-offset-2 col-xs-10" id="mensajes">
  3.                  
  4. </div>
  5.  
  6. <!-- resto de la vista -->

En el div anterior se van a mostrar los mensajes de error en un "alert alert-danger" o el mensaje de éxito "alert alert-success"

Mi FormRequest esta así:

Código PHP:
Ver original
  1. <?php namespace App\Http\Requests;
  2.  
  3. use App\Http\Requests\Request;
  4.  
  5. class ProcesoFormRequest extends Request {
  6.  
  7.     public function authorize()
  8.     {
  9.         return true;
  10.     }
  11.  
  12.     public function rules()
  13.     {
  14.         return [
  15.             'dato'=>'required'
  16.         ];
  17.     }
  18.    
  19.     public function response(array $errors)
  20.     {
  21.         if ($this->ajax() || $this->wantsJson())
  22.         {
  23.             return new JsonResponse($errors, 422);
  24.         }
  25.         return $this->redirector->to($this->getRedirectUrl())
  26.                                         ->withInput($this->except($this->dontFlash))
  27.                                         ->withErrors($errors, $this->errorBag);
  28.     }
  29. }

El método en mi controlador esta así:

Código PHP:
Ver original
  1. <!-- resto del controlador -->
  2. public function registrar(ProcesoFormRequest $request)
  3.     {
  4.         if (count($request->errors)==0)    {
  5.             $input=$request->get('dato');
  6.             return '1';
  7.         }else{
  8.             return '2';
  9.         }                  
  10.     }


Nota: Este método lo he simplificado bastante retornando 1 en caso de éxito o 2 en caso de error, la idea al final es armar un string con todos los errores y devolverlos en lugar del 2.

En la vista tengo el método ajax así:

Código Javascript:
Ver original
  1. $("#formulario").submit(function(e)
  2.             {                
  3.                 var postData = $(this).serialize();
  4.                 var formURL = $(this).attr("action");                                      
  5.                 $.ajax(
  6.                 {
  7.                     url : formURL,
  8.                     type: "POST",
  9.                     data : postData,
  10.                     success:function(data, textStatus, jqXHR)
  11.                     {                        
  12.                         alert(data);
  13.                     },
  14.                     error: function(jqXHR, textStatus, errorThrown)
  15.                     {
  16.                         alert(errorThrown);  
  17.                     }
  18.                 });
  19.                e.preventDefault();
  20.             });

Volviendo al tema, el punto es que hago el envío desde la vista llenando el campo del formulario sí me devuelve 1, pero si lo dejo en blanco me devuelve el error 500 "Internal Server Error"

Me pueden orientar por favor? La idea es que al caso de haber éxito muestre el respectivo mensaje y sino muestre los errores pero en el mismo formulario dentro del div con id="mensajes", sin tener que recargarlo todo o enviarlo a otra página, a mí solo se me ocurre ajax.

Gracias desde ya por su ayuda
  #2 (permalink)  
Antiguo 10/02/2015, 11:37
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Validación mediante FormRequest y ajax Laravel 5

La documentación dice:
Cita:
If the incoming request was an AJAX request, no redirect will be generated. Instead, an HTTP response with a 422 status code will be returned to the browser containing a JSON representation of the validation errors.
Así que solo requieres capturar el error desde jquery y obtener el json.
La otra forma es hacer la validación desde el controlador.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 10/02/2015, 14:31
 
Fecha de Ingreso: diciembre-2006
Mensajes: 213
Antigüedad: 17 años, 3 meses
Puntos: 3
Respuesta: Validación mediante FormRequest y ajax Laravel 5

Gracias por la aclaración, leí eso en la doc pero en realidad no comprendí muy bien que se diga pero ya casi lo tengo, ahora tomo los errores. Tengo entendido que lo que viene es una cadena no un objeto, así que lo hago así:

Código Javascript:
Ver original
  1. error: function(xhr, textStatus, thrownError)
  2.                     {
  3.                         $.each($.parseJSON(xhr.responseText), function (ind, elem) {
  4.                   alert(elem);
  5.             });
  6.                     }

Fue la que se me ocurrió y funciona.

Obligatoriamente debo transformar a objeto?

Saludos
  #4 (permalink)  
Antiguo 10/02/2015, 15:20
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Validación mediante FormRequest y ajax Laravel 5

No es obligatorio.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: ajax, laravel, mediante, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:58.