
Hola, bienvenido(a), al Post 10 del Taller de Desarrollo de una Tienda en línea con Bootstrap, Laravel 5.1 y la API de Paypal.
Seguimos desarrollando el Panel de Administración de nuestra tienda en línea.
Hoy vamos a crear el CRUD para nuestros usuarios, por lo que necesitamos:
Crear nuestro controlador, esto lo hacemos desde la línea de comandos:
1 |
php artisan make:controller Admin/UserController |
Ahora registramos el controller en nuestro router:
1 |
Route::resource('user', 'UserController'); |
Hacemos una inyección de dependencias para trabajar de forma mas adecuado los métodos de nuestro controlador:
1 2 3 4 |
// User dependency injection Route::bind('user', function($user){ return App\User::find($user); }); |
READ
Para crear el Read de nuestro CRUD, en el método index de nuestro controller obtenemos los usuarios, ordenados por nombre de forma ascendente y de 5 en 5 (para realizar la paginación), se los pasamos a la vista index:
1 2 3 4 5 |
public function index() { $users = User::orderBy('name')->paginate(5); return view('admin.user.index', compact('users')); } |
Creamos en la carpeta admin dentro de views una carpeta llamada user y dentro el archivo index.blade.php, en la que mostraremos una tabla con todos nuestros usuarios:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
@extends('admin.template') @section('content') <div class="container text-center"> <div class="page-header"> <h1> <i class="fa fa-shopping-cart"></i> USUARIOS <a href="{{ route('admin.user.create') }}" class="btn btn-warning"> <i class="fa fa-plus-circle"></i> Usuario </a> </h1> </div> <div class="page"> <div class="table-responsive"> <table class="table table-striped table-bordered table-hover"> <thead> <tr> <th>Editar</th> <th>Eliminar</th> <th>Nombre</th> <th>Apellidos</th> <th>Usuario</th> <th>Correo</th> <th>Tipo</th> <th>Activo</th> </tr> </thead> <tbody> @foreach($users as $user) <tr> <td> <a href="{{ route('admin.user.edit', $user) }}" class="btn btn-primary"> <i class="fa fa-pencil-square-o"></i> </a> </td> <td> {!! Form::open(['route' => ['admin.user.destroy', $user]]) !!} <input type="hidden" name="_method" value="DELETE"> <button onClick="return confirm('Eliminar registro?')" class="btn btn-danger"> <i class="fa fa-trash-o"></i> </button> {!! Form::close() !!} </td> <td>{{ $user->name }}</td> <td>{{ $user->last_name }}</td> <td>{{ $user->user }}</td> <td>{{ $user->email }}</td> <td>{{ $user->type }}</td> <td>{{ $user->active == 1 ? "Si" : "No" }}</td> </tr> @endforeach </tbody> </table> </div> <hr> <?php echo $users->render(); ?> </div> </div> @stop |
Con esto nuestra vista index se vera así:
CREATE
Ahora para implementar nuestro Create del CRUD, en el método create de nuestro controller mostramos la vista create:
1 2 3 4 |
public function create() { return view('admin.user.create'); } |
Creamos la vista create dentro de la carpeta user y en ella el código del formulario de creación de un nuevo usuario:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
@extends('admin.template') @section('content') <div class="container text-center"> <div class="page-header"> <h1> <i class="fa fa-user"></i> USUARIOS <small>[ Agregar usuario ]</small> </h1> </div> <div class="row"> <div class="col-md-offset-3 col-md-6"> <div class="page"> @if (count($errors) > 0) @include('admin.partials.errors') @endif {!! Form::open(['route'=>'admin.user.store']) !!} <div class="form-group"> <label for="name">Nombre:</label> {!! Form::text( 'name', null, array( 'class'=>'form-control', 'placeholder' => 'Ingresa el nombre...', 'autofocus' => 'autofocus', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="last_name">Apellidos:</label> {!! Form::text( 'last_name', null, array( 'class'=>'form-control', 'placeholder' => 'Ingresa los apellidos...', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="email">Correo:</label> {!! Form::text( 'email', null, array( 'class'=>'form-control', 'placeholder' => 'Ingresa el correo...', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="user">Usuario:</label> {!! Form::text( 'user', null, array( 'class'=>'form-control', 'placeholder' => 'Ingresa el nombre de usuario...', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="password">Password:</label> {!! Form::password( 'password', array( 'class'=>'form-control', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="confirm_password">Confirmar Password:</label> {!! Form::password( 'password_confirmation', array( 'class'=>'form-control', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="type">Tipo:</label> {!! Form::radio('type', 'user', true) !!} User {!! Form::radio('type', 'admin') !!} Admin </div> <div class="form-group"> <label for="address">Dirección:</label> {!! Form::textarea( 'address', null, array( 'class'=>'form-control' ) ) !!} </div> <div class="form-group"> <label for="active">Active:</label> {!! Form::checkbox('active', null, true) !!} </div> <div class="form-group"> {!! Form::submit('Guardar', array('class'=>'btn btn-primary')) !!} <a href="{{ route('admin.user.index') }}" class="btn btn-warning">Cancelar</a> </div> {!! Form::close() !!} </div> </div> </div> </div> @stop |
Probamos en el navegador y nuestro formulario se verá así:
La información del formulario se enviará al método store de nuestro controller, este método hará uso de un Request, que crearemos así:
1 |
php artisan make:request SaveUserRequest |
En este archivo pondremos las reglas de validación:
1 2 3 4 5 6 7 8 9 10 11 |
public function rules() { return [ 'name' => 'required|unique:users|max:100', 'last_name' => 'required|max:100', 'email' => 'required|email|unique:users', 'user' => 'required|unique:users|min:4|max:20', 'password' => 'required|confirmed', 'type' => 'required|in:user,admin', ]; } |
Incluimos el SaveUserRequest en nuestro controller y ya lo podemos utilizar en nuestro método store, en donde se validará y se almacenará el nuevo usuario en la base de datos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public function store(SaveUserRequest $request) { $data = [ 'name' => $request->get('name'), 'last_name' => $request->get('last_name'), 'email' => $request->get('email'), 'user' => $request->get('user'), 'password' => $request->get('password'), 'type' => $request->get('type'), 'active' => $request->has('active') ? 1 : 0, 'address' => $request->get('address') ]; $user = User::create($data); $message = $user ? 'Usuario agregado correctamente!' : 'El ususario NO pudo agregarse!'; return redirect()->route('admin.user.index')->with('message', $message); } |
UPDATE
Ahora para implementar el Update del CRUD, en el método edit de nuestro controller llamamos a la vista edit y le pasamos el objeto $user:
1 2 3 4 |
public function edit(User $user) { return view('admin.user.edit', compact('user')); } |
Creamos la vista edit dentro de la carpeta user y en ella el código del formulario de edición de usuario:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
@extends('admin.template') @section('content') <div class="container text-center"> <div class="page-header"> <h1> <i class="fa fa-user"></i> USUARIOS <small>[ Editar usuario ]</small> </h1> </div> <div class="row"> <div class="col-md-offset-3 col-md-6"> <div class="page"> @if (count($errors) > 0) @include('admin.partials.errors') @endif {!! Form::model($user, array('route' => array('admin.user.update', $user))) !!} <input type="hidden" name="_method" value="PUT"> <div class="form-group"> <label for="name">Nombre:</label> {!! Form::text( 'name', null, array( 'class'=>'form-control', 'placeholder' => 'Ingresa el nombre...', 'autofocus' => 'autofocus', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="last_name">Apellidos:</label> {!! Form::text( 'last_name', null, array( 'class'=>'form-control', 'placeholder' => 'Ingresa los apellidos...', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="email">Correo:</label> {!! Form::text( 'email', null, array( 'class'=>'form-control', 'placeholder' => 'Ingresa el correo...', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="user">Usuario:</label> {!! Form::text( 'user', null, array( 'class'=>'form-control', 'placeholder' => 'Ingresa el nombre de usuario...', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="type">Tipo:</label> {!! Form::radio('type', 'user', $user->type=='user' ? true : false) !!} User {!! Form::radio('type', 'admin', $user->type=='admin' ? true : false) !!} Admin </div> <div class="form-group"> <label for="address">Dirección:</label> {!! Form::textarea( 'address', null, array( 'class'=>'form-control' ) ) !!} </div> <div class="form-group"> <label for="active">Active:</label> {!! Form::checkbox('active', null, $user->active == 1 ? true : false) !!} </div><hr> <fieldset> <legend>Cambiar password:</legend> <div class="form-group"> <label for="password">Nuevo Password:</label> {!! Form::password( 'password', array( 'class'=>'form-control', //'required' => 'required' ) ) !!} </div> <div class="form-group"> <label for="confirm_password">Confirmar Nuevo Password:</label> {!! Form::password( 'password_confirmation', array( 'class'=>'form-control', //'required' => 'required' ) ) !!} </div> </fieldset><hr> <div class="form-group"> {!! Form::submit('Actualizar', array('class'=>'btn btn-primary')) !!} <a href="{{ route('admin.user.index') }}" class="btn btn-warning">Cancelar</a> </div> {!! Form::close() !!} </div> </div> </div> </div> @stop |
Probamos en el navegador y nuestro formulario se verá así:
La información del formulario se enviará al método update de nuestro controller, en donde se validará y se actualizará la información del usuario en la base de datos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public function update(Request $request, User $user) { //return $request->all(); $this->validate($request, [ 'name' => 'required|max:100', 'last_name' => 'required|max:100', 'email' => 'required|email', 'user' => 'required|min:4|max:20', 'password' => ($request->get('password') != "") ? 'required|confirmed' : "", 'type' => 'required|in:user,admin', ]); $user->name = $request->get('name'); $user->last_name = $request->get('last_name'); $user->email = $request->get('email'); $user->user = $request->get('user'); $user->type = $request->get('type'); $user->address = $request->get('address'); $user->active = $request->has('active') ? 1 : 0; if($request->get('password') != "") $user->password = $request->get('password'); $updated = $user->save(); $message = $updated ? 'Usuario actualizado correctamente!' : 'El Usuario NO pudo actualizarse!'; return redirect()->route('admin.user.index')->with('message', $message); } |
DELETE
Por ultimo para implementar el Delete del CRUD, en el index de nuestro crud modificamos el código del botón eliminar para que quede de la siguiente forma:
1 2 3 4 5 6 |
{!! Form::open(['route' => ['admin.user.destroy', $user]]) !!} <input type="hidden" name="_method" value="DELETE"> <button onClick="return confirm('Eliminar registro?')" class="btn btn-danger"> <i class="fa fa-trash-o"></i> </button> {!! Form::close() !!} |
Y el método destroy de nuestro controller quedará así:
1 2 3 4 5 6 7 8 |
public function destroy(User $user) { $deleted = $user->delete(); $message = $deleted ? 'Usuario eliminado correctamente!' : 'El Usuario NO pudo eliminarse!'; return redirect()->route('admin.user.index')->with('message', $message); } |
De esta forma quedará finalizado el crud para nuestros usuarios.
Todos los detalles y mas los puedes ver en el vídeo de la clase:
En el siguiente post desarrollaremos el crud para nuestros pedidos y usaremos un poco de ajax mediante jquery.
Eso es todo para este post, compártelo por favor.
Espero tus comentarios y nos vemos en el siguiente 🙂