viernes, 27 de noviembre de 2015

16 - Tutorial de Laravel 5 - CRUD Delete (Sistema de comentarios)




Bienvenid@s, en este capítulo del Tutorial de Laravel 5 continuamos con el sistema CRUD aplicándolo al sistema de comentarios, concretamente agregaremos la opción de eliminar en los comentarios realizados por el usuario.

Si el usuario está autenticado agregaremos un formulario con un campo oculto "id_comment" para que el usuario lo pueda eliminar. Esto lo haremos en la vista "home" que es la cual estamos utilizando como muro para cargar los comentarios, el código completo de la vista "home" es el siguiente:

@extends('layouts.home')

@section('content')
<h1>Bienvenid@s a la aplicación Laravel</h1>
<hr />
@if (Session::has('status'))
 <div class="bg-success" style="padding: 20px;">
  {{Session::get('status')}}
 </div>
 <hr />
@endif
@if (Session::has('error'))
 <div class="bg-danger" style="padding: 20px;">
  {{Session::get('error')}}
 </div>
 <hr />
@endif
@if (Auth::check())
 <form method="post" action="{{url('user/createcomment')}}">
  {{csrf_field()}}
  <div class="form-group">
   <div class="row">
    <div class="col-md-1">
     <img src="{{url(Auth::user()->perfiles)}}" class='img-responsive' style='max-width: 60px' />
     <strong>{{Auth::user()->name}}</strong>
    </div>
    <div class="col-md-6">
     <textarea name="comment" class="form-control"></textarea>
     <br />
     <button type="submit" class="btn btn-primary">Publicar</button>
    </div>
   </div>
  </div>
 </form>
 <hr />
        <?php 
        $comments = App\Comments::select()->orderBy('id', 'desc')->get();
        foreach($comments as $comment):
            $user = App\User::select()->where('id', '=', $comment->id_user)->first();
        ?>
        <div class="row">
            <div class="col-md-1">
                <img src='{{url($user->perfiles)}}' class='img-responsive' style='max-width: 60px' />
                <strong>{{$user->name}}</strong>
            </div>
            <div class='col-md-6'>
               {{$comment->comment}} 
               <br />
               <i>Fecha: {{$comment->date}} · Hora: {{$comment->time}}</i>
               @if($comment->id_user == Auth::user()->id)
               <form method="post" action="{{url('user/deletecomment')}}">
                   {{csrf_field()}}
                   <input type="hidden" name="id_comment" value="{{$comment->id}}" />
                   <button type="submit" class="btn btn-danger">Eliminar</button>
               </form>
               @endif
            </div>
        </div>
        <hr />
        <?php endforeach ?>
@else
 <hr />
 <p class="bg-info" style="padding: 20px;">Para poder publicar comentarios tienes que <a href="{{url('auth/login')}}">iniciar sesión</a></div>
 <hr />
@endif
@stop


A continuación crearemos una nueva acción en UserController que maneje la petición del formulario, código de la acción deleteComment:

    public function deleteComment(Request $request){
        $rules = ['id_comment' => 'integer'];
        $validator = Validator::make($request->only('id_comment'), $rules);
        if ($validator->fails()){
            return redirect('home')->with('error', 'Ha ocurrido un error');
        }
        else
        {
            if(Comments::where('id', '=', $request->id_comment)
                    ->where('id_user', '=', Auth::user()->id)->delete()
                    ){
                return redirect('home')->with('status', 'Enhorabuena comentario eliminado con éxito');
            }
            else{
                return redirect('home')->with('error', 'Ha ocurrido un error');  
            }
        }
    }


En esta acción validamos en input hidden "id_comment" para permitir sólo números enteros, si la validación falla lo redireccionamos a "home" con un mensaje flash "error" (esta es otra de las modificaciones de la vista "home"), si la validación pasa, entonces incluimos una condición, si el registro es eliminado con éxito, redireccionamos a home con un "status", de los contrarios, redireccionamos con un "error".

A continuación en routes.php asociamos la acción a la ruta indicada en el "action" del formulario:

Route::post('user/deletecomment', 'UserController@deleteComment');


Finalmente, prueben a publicar y eliminar comentarios con distintos usuarios.