Mostrando entradas con la etiqueta crud. Mostrar todas las entradas
Mostrando entradas con la etiqueta crud. Mostrar todas las entradas

CRUD en Laravel 8

php artisan make:controller Admin/CategoryController -r
En routes\admin.php:
use App\Http\Controllers\Admin\CategoryController;
...
Route::resource('Categories', CategoryController::class)->names('admin.categories');

En app\Http\Controllers\Admin\CategoryController.php:
use App\Models\Category;
Y en cada uno de los métodos cambiar el $id por: Category $category

Para personalizar los logos y menú en config\adminlte.php, por ejemplo:
'text' => 'Categorías',
// 'url' => 'admin/settings',
'route' => 'admin.categories.index',
icon' => 'fas fa-fw fa-user',

Para cualquier crud es muy útil instalar para el tema de los form:
composer require laravelcollective/html
Para el tema de generar automáticamente el slug usar el plugin:
https://leocaseiro.com.br/jquery-plugin-string-to-slug/ Descomprimir y la carpeta copiarla a la carpeta public/vendor y en nuestra view añadir:
@section('js')
    <script src="{{ asset('vendor/jQuery-Plugin-stringToSlug-1.3/jquery.stringToSlug.min.js') }}"></script>
@stop

Para usarlo por ejemplo:
<script>
        $(document).ready( function() {
            $("#name").stringToSlug({
                setEvents: 'keyup keydown blur',
                getPut: '#slug',
                space: '-'
            });
        });
    </script>

Si queremos que en vez del id use el slug en las urls poner en app\Models\Category.php:
public function getRouteKeyName() {
return "slug";
}

Crear un controller con todas los métodos del CRUD

php artisan make:controller admin/FileController -r
OJO: La carpeta admin se crea sola.

Para generar todas las ruta del CRUD:
NOTA: en las views sí que se tiene que crear a mano las subcarpetas (por ejemplo: admin)
// ojo: para los crud es names (en plural)
Route::resource('/admin/files', 'admin\FileController')->names('admin.files');

Para ver todas las rutas creadas:
php artisan r:l

CRUD: Borrar

{!! Form::open(['method' => 'DELETE','route' => ['users.destroy', encrypt($item->id)]]) !!}
  {{ csrf_field() }}
  <?php
$arrProp = array(
  'type' => 'submit',
  'class' => 'class="btn btn-danger"',
  'onclick' => 'return checkDelete("'.$item->name.'")'
);
  ?>
  {{ Form::submit('Borrar', $arrProp) }}
{!! Form::close() !!}

En nuestro lsg.js:
function checkDelete(qBorrar) {
   if (confirm("¿Seguro de borrar a "+qBorrar+"?")) {
       return true;
   }
   return false;
}

en el metodo destroy del controller:
$id = decrypt($id);
$user = User::find($id);
$user->delete();
return redirect()->route('users.index');

CRUD: Ejemplo general

<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\models\seguridad\Cineasta;
use App\models\seguridad\Pelicula;
use Faker\Provider\Image;
use Intervention\Image\ImageManagerStatic;
use Illuminate\Support\Facades\DB;

class PeliculasController extends Controller
{
    // ****************************************
    // ****************************************
    public function block($id, $value, Request $request) {
        Pelicula::find(decrypt($id))->update(['visible' => $value]);
        if ($value == 0) {
            $message = "Película desactivada";
        }
        else {
            $message = "Película activada";
        }
        return redirect()->back()->with('mensaje',$message);
    }

    // ****************************************
    // ****************************************
    public function create()  {
        $cineastas = Cineasta::orderBy('nombre')->get();
        return view('admin.pelicula.create', compact('cineastas'));
    }

    // ****************************************
    // ****************************************
    public function delete($id) {
        Pelicula::find(decrypt($id))->delete();
        // No hay que retornar nada pq se llama desde el funciones.js
        // return redirect()->back()->with('mensaje', "Borrado correctamente");
      }

    // ****************************************
    // ****************************************
    public function edit($id) {
        $cineastas = Cineasta::orderBy('nombre')->get();
        $pelicula = Pelicula::find(decrypt($id));
        $dirActivo = Cineasta::find($pelicula->id_director);
        $nomDirector = $dirActivo->nombre;
        return view('admin.pelicula.edit', compact('cineastas', 'pelicula','nomDirector'));
      }

    // ********************************
    // ********************************
    public function generarSlug($titulo) {
        $slug = str_slug($titulo);
        $arrAux = Pelicula::select('slug')->where('slug', $slug)->get();
        $cont = 1;
        while (count($arrAux) == 1) {
            $slug .= "-".$cont;
            $arrAux = Pelicula::select('slug')->where('slug', $slug)->get();
            $cont++;
        }
        return $slug;
    }

    // ****************************************
    // ****************************************
    public function index() {
        $arrPel = DB::table('peliculas')
                ->join('cineastas', 'cineastas.id', '=', 'peliculas.id_director')
                ->select('peliculas.*', 'cineastas.nombre as nomCineasta')
                ->get();
        return view('admin.pelicula.list', compact('arrPel'));
      }


    // ****************************************
    // ****************************************
    public function show($id) {
        $pelicula = DB::table('peliculas')
                ->join('cineastas', 'cineastas.id', '=', 'peliculas.id_director')
                ->select('peliculas.*', 'cineastas.nombre as nomCineasta')
                ->where('peliculas.id', decrypt($id))
                ->get();
        return view('admin.pelicula.show', compact('pelicula'));
    }

    // ***********************************
    // **********************************
    public function store(Request $request)  {
        $request->validate([
            'titulo'=>'required|max:50',
            'anno'=>'required|max:4',
            'nota'=>'required|max:2',
            'id_director'=>'required|integer',
            'numNom'=>'required|integer',
            'numOsc'=>'required|integer',
            'foto_pelicula'=>'image|mimes:jpeg,png,jpg,gif|max:2048'
        ]);

        $slug = $this->generarSlug($request->get("titulo")." ".$request->get("anno"));

        $pelicula = new Pelicula([
            'titulo' => $request->get("titulo"),
            'slug' => $slug,
            'anno' => $request->get("anno"),
            'nota' => $request->get("nota"),
            'id_director' => $request->get("id_director"),
            'numNom' => $request->get("numNom"),
            'numOsc' => $request->get("numOsc"),
            'foto_pelicula' => 'default.jpg',
            'visible' => 1
        ]);

        if ($request->has('foto_pelicula')) {
            $foto_pelicula = $request->file('foto_pelicula');
            // $filename = time().'.'.request()->foto_pelicula->getClientOriginalExtension();
            $filename = substr($slug,0,25).'.'.request()->foto_pelicula->getClientOriginalExtension();
            $img = ImageManagerStatic::make($foto_pelicula)->resize(64, 64);
            $img->save('assets/fotos_peliculas/'.$filename);
            $pelicula->foto_pelicula = $filename;
        }
        $id = $pelicula->save();

        return redirect()->route('peliculas_list')->with('success', 'Película guardado correctamente!');
    }

     // ****************************************
    // ****************************************
    public function update(Request $request, $id)  {
        $pelicula = Pelicula::find(decrypt($id));

        $request->validate([
          'titulo' => 'required',
          'anno' => 'required',
          'nota' => 'required',
          'id_director' => 'required',
          'numNom' => 'required',
          'numOsc' => 'required',
          'foto_pelicula'=>'image|mimes:jpeg,png,jpg|max:2048'
        ]);

        // Lo primero ver si el título ha cambiado para generar un nuevo slug
        $arr = Pelicula::select('titulo')->where('id', decrypt($id))->get();
        $slug = "";
        if ($arr[0]->titulo != request('titulo')) {
            $slug = $this->generarSlug($request->get("titulo")." ".$request->get("anno"));
            $pelicula->slug = $slug;
        }

        $pelicula->titulo = request('titulo');
        $pelicula->anno = request('anno');
        $pelicula->nota = request('nota');
        $pelicula->id_director = request('id_director');
        $pelicula->numNom = request('numNom');
        $pelicula->numOsc = request('numOsc');

        if ($request->has('foto_pelicula')) {
            $foto_pelicula = $request->file('foto_pelicula');
            $filename = substr($pelicula->slug,0,25).'.'.request()->foto_pelicula->getClientOriginalExtension();
            $img = ImageManagerStatic::make($foto_pelicula)->resize(64, 64);
            $img->save('assets/fotos_peliculas/'.$filename);
            $pelicula->foto_pelicula = $filename;
        }

        $pelicula->save();
        return redirect()->route('peliculas_list', ['id' => $id])->with('success','Registro actualizado correctamente.');
      }
}


Una forma quizás más fácil de guardar las imágenes en store sería:
$user = $request->all();
if ($request->has('foto_id')) {
$nomFoto = time()."_".request()->foto_id->getClientOriginalName();
$request->file('foto_id')->move("images", $nomFoto);
$fotoAux = Foto::create(['ruta_foto'=>$nomFoto]);
$user["foto_id"] = $fotoAux->id;
}
$user["password"] = bcrypt(request()->password);
User::create($user);

El update tb se puede hacer más fácil:
$id = decrypt($id);
$user = User::find($id);
$arrAux = $request->all();
if ($request->has('foto_id')) {
$nomFoto = time()."_".request()->foto_id->getClientOriginalName();
$request->file('foto_id')->move("images", $nomFoto);
$fotoAux = Foto::create(['ruta_foto'=>$nomFoto]);
$arrAux["foto_id"] = $fotoAux->id;
}
$user->update($arrAux);
return redirect()->route('users.index');

Crud: Borrar

En routes->web
Route::resource('cineastas', 'CineastasController');
Route::get('/borrar-cineasta/{id}', 'CineastasController@borrarCineasta')->name('borrar-cineasta');

En CineastasController:
public function destroy($id) { // solo si viene por POST
   Cineasta::find($id)->delete();
   return redirect()->route('cineastas.index')
            ->with('success','El actor se ha borrado correctamente');
}

public function borrarCineasta($id) { // para cuando viene por GET
   Cineasta::find($id)->delete();
   return redirect()->route('cineastas.index')
            ->with('success','El cineasta se ha borrado correctamente');
}

Crud: Modificar

En routes->web
Route::resource('cineastas', 'CineastasController');

En CineastasController:
public function edit($id) {
  $cineasta = Cineasta::find($id);
  return view('cineastas.edit',compact('cineasta'));
}

public function update(Request $request, $id) {
        request()->validate([
            'nombre' => 'required'
        ]);

        if (!isset(request()->es_oscar_winner)) { // si el checkbox no se marca no envia nada
            request()->es_oscar_winner = 0;
        }

        if (!isset(request()->decada_oscar)) { // si el radio no se marca no envia nada
            request()->decada_oscar = 0;
        }

        if (isset(request()->fotoCineasta)) { // puede que no elija nada en el campo file
            request()->validate([
                'fotoCineasta' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
            ]);

            $nomImagen = rand(1, 999) . '_' . request()->fotoCineasta->getClientOriginalName();
            request()->fotoCineasta->move(public_path('images'), $nomImagen);

            Cineasta::find($id)->update([
                'nombre' => $request->all()["nombre"],
                'fotoCineasta' => $nomImagen,
                'es_oscar_winner' => request()->es_oscar_winner,
                'decada_oscar' => request()->decada_oscar
            ]);
        }
        else {
            Cineasta::find($id)->update([
                'nombre' => $request->all()["nombre"],
                'es_oscar_winner' => request()->es_oscar_winner,
                'decada_oscar' => request()->decada_oscar
            ]);
        }
        return redirect()->route('cineastas.index')
            ->with('success','Se ha modificado correctamente el cineasta');
}

En la vista cineastas/edit.blade.php:
@include('header_edc')

<h2>Editar Cineasta</h2>

@if (count($errors) > 0)
    echo "No existe ese registro";
@endif

<?php
$arrDecada = array('1920', '1930', '1940', '1950', '1960', '1970', '1980', '1990', '2000', '2010');
?>

{!! Form::model($cineasta, ['method' => 'PATCH','route' => ['cineastas.update', $cineasta->id], 'files' => true]) !!}
<div class="row">
    <div class="col-xs-12 col-sm-12 col-md-12">
        <div class="form-group">
            <strong>Nombre:</strong>
            {!! Form::text('nombre', null, array('placeholder' => 'Nombre','class' => 'form-control')) !!}
        </div>
        <div class="form-group">
            <strong>Es ganador del Oscar:</strong>
            {{ Form::checkbox('es_oscar_winner', '1') }}
        </div>
        <div class="form-group">
            <strong>Década de su primer Oscar:</strong><br>
            @foreach ($arrDecada as $item)
                {{ Form::radio('decada_oscar', $item) }} {{ $item }}<br>
            @endforeach
        </div>
    </div>
    <div class="form-group">
        <p><img class="imgCineasta" src="{!! asset('images/'.$cineasta->fotoCineasta) !!}"></p>
        {{ Form::file('fotoCineasta', $attributes = array('enctype' => 'multipart/form-data')) }}
    </div>

    <div class="col-xs-12 col-sm-12 col-md-12 text-center">
        {{ Form::button('Modificar Cineasta', array('type' => 'submit', 'class' => 'btn btn-default btn-sm', 'onclick' => 'return checkFormCineasta()')) }}
    </div>
</div>
{!! Form::close() !!}

@include('footer_edc')

Crud: Mostrar detalle

En routes->web
Route::resource('cineastas', 'CineastasController');

En CineastasController:
public function show($id) {
  $cineasta = Cineasta::find($id);
  return view('cineastas.show',compact('cineasta'));
}

En la vista cineastas/show.blade.php:
@include('header_edc')

<h1>Datos del cineasta</h1>
<h2>
<p><img class="imgCineasta" src="{!! asset('images/'.$cineasta->fotoCineasta) !!}"></p>
<p>Nombre: {{ $cineasta->nombre }}</p>

</h2>
@include('footer_edc')

CRUD: Altas

En routes->web
Route::resource('cineastas', 'CineastasController');

En CineastasController:
public function create() {
        return view('cineastas/formCreate');
    }

    public function store(Request $request) {
        request()->validate([
            'nombre' => 'required'
        ]);

        if (!isset(request()->es_oscar_winner)) { // si el checkbox no se marca no envia nada
            request()->es_oscar_winner = 0;
        }
        if (!isset(request()->decada_oscar)) { // si el radio no se marca no envia nada
            request()->decada_oscar = 0;
        }

        if (isset(request()->fotoCineasta)) { // puede que no elija nada en el campo file
            request()->validate([
                'fotoCineasta' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
            ]);

            $nomImagen = rand(1, 999) . '_' . request()->fotoCineasta->getClientOriginalName();
            request()->fotoCineasta->move(public_path('images'), $nomImagen);

            Cineasta::create([
                'nombre' => $request->nombre,
                'fotoCineasta' => $nomImagen,
                'es_oscar_winner' => $request->es_oscar_winner,
                'decada_oscar' => $request->decada_oscar
            ]);
        }
        else {
            Cineasta::create([
                'nombre' => $request->all()["nombre"],
                'es_oscar_winner' => $request->all()["es_oscar_winner"]
            ]);
        }

        return redirect()->route('cineastas.index')
            ->with('success','Se ha insertado correctamente el actor');
}

Si no se quiere usar create tb se puede hacer:
$cineastaAux = new Cineasta;
$cineastaAux->nombre = $request->nombre;
$cineastaAux->loquesea = $request->loquesea;
$cineastaAux->save();

En la vista cineastas/formCreate.blade.php:
@include('header_edc')

<?php
$arrDecada = array('1920', '1930', '1940', '1950', '1960', '1970', '1980', '1990', '2000', '2010');
?>
<h1>Alta Cineasta</h1>
{!! Form::open(array('route' => 'cineastas.store', 'files'=>true)) !!}
    {{ csrf_field() }}
    <p>Nombre: <input type="text" name="nombre"></p>
    <p>Es oscar winner: {{ Form::checkbox('es_oscar_winner', '1') }}</p>
    <p>Década del Oscar:<br>
        @foreach ($arrDecada as $item)
            {{ Form::radio('decada_oscar', $item) }} {{ $item }}<br>
        @endforeach
    </p>

    <p>{!! Form::file('fotoCineasta', array('class' => 'form-control')) !!}</p>

    <p><input type="submit" value="Dar de alta cineasta"></p>
{!! Form::close() !!}

@include('footer_edc')

CRUD: Listar

En routes->web
Route::resource('cineastas', 'CineastasController');

En CineastasController:
public function index() {
    $cineastas = Cineasta::orderBy('nombre', 'asc')->paginate(6);
    return view('cineastas.list',compact('cineastas'));
}

En la vista cineastas/list.blade.php:
@include('header_edc')

@if ($message = Session::get('success'))
    <div class="alert alert-success">
        <p>{{ $message }}</p>
    </div>
@endif

<table class="table table-bordered">
    <tr>
        <th>Nombre</th>
        <th>Ganador del Oscar</th></tg>
        <th>Década de su Primer Oscar</th>
        <th>Imagen</th>
        <th width="280px"></th>
    </tr>
    @foreach ($cineastas as $cineasta)
        <tr>
            <td>{{ $cineasta->nombre}}</td>
            <td>
                @if ( $cineasta->es_oscar_winner == 1)
                    Sí
                @else
                    No
                @endif
            </td>
            <th>{{ $cineasta->decada_oscar}}</th>
            <td><img class="imgCineasta" src="{!! asset('images/'.$cineasta->fotoCineasta) !!}"></td>
            <td>

                <a href="{{ route('cineastas.show',$cineasta->id) }}">Mostrar</a>
                <a href="{{ route('cineastas.edit',$cineasta->id) }}">Editar</a>
                <a onclick="checkConfirmDelete('{{ route('borrar-cineasta',$cineasta->id) }}', '{{ $cineasta->nombre}}');" href="javascript:void(0);">Borrar</a>
            </td>
        </tr>
    @endforeach
</table>

{{ $cineastas->links() }}

@include('footer_edc')