Inicio » Cursos » App para Pizzería con delivery

Empezando el Proyecto

Panel de Administración

FrontEnd Diseño

Carrito de Compra

API Rest

Diseño de la App Android

Autenticación Android

Catálogo de Productos

Carrito de Compra Android

Extras

Curso App para Pizzería con delivery

Lección: 5 ➜ Implementación CRUD Productos

Modelo, Migración, relación con categorías, métodos para el controlador, vistas y rutas para gestionar los datos de la tabla productos.

Lección 5: Implementación CRUD Productos

Modelo, Migración, relación con categorías, métodos para el controlador, vistas y rutas para gestionar los datos de la tabla productos.

App\Models\Producto.php

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Producto extends Model
{
    use HasFactory;
    protected $fillable = [
        'slug',
        'nombre',
        'descripcion',
        'urlfoto',
        'precio',
        'stock',
        'presentacion',
        'publicado', //boolean
        'orden',
        'visitas',
        'portada',  // boolean
        'categoria_id'
    ];
    public function categoria(){
        return $this->belongsTo(Categoria::class);
    }

    public function precios(){
        return $this->hasMany(Precio::class);
    }
}

 

Migración 

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
    public function up()
    {
        Schema::create('productos', function (Blueprint $table) {
            $table->id();
            $table->string('slug',50)->nullable();
            $table->string('nombre',50)->nullable();
            $table->text('descripcion')->nullable();
            $table->string('urlfoto',60)->nullable();
            $table->decimal('precio',7,2)->nullable();
            $table->integer('stock')->default(0.0);   
            $table->boolean('publicado')->default(0);
            $table->integer('orden')->default(0);
            $table->integer('visitas')->default(0);
            $table->boolean('portada')->default(0);
            $table->foreignId('categoria_id')->references('id')->on('categorias');
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::dropIfExists('productos');
    }
};

App\Http\Controllers\ProductoController.php

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Producto;
use App\Models\Categoria;
use Illuminate\Support\Str;
use Session;

class ProductoController extends Controller
{
    public function index(){
        if(Session::get("categoria_id")!=null){
            $productos = Producto::whereCategoria_id(Session::get("categoria_id"))->get(["id","nombre","urlfoto","precio"]);
            $categoria = Categoria::find(Session::get("categoria_id"));
            return view("admin.producto.index",compact("productos","categoria"));
        }
    }
    public function create(){
        $categorias =   Categoria::orderBy('nombre','ASC')->pluck('nombre','id');
        return view('admin.producto.create',compact("categorias"));
    }

    public function store(Request $request){
        $producto          =   new Producto($request->all());
        // tratamiento de imagenes
        if ($request->hasFile('urlfoto')){
            $file       =   $request->file('urlfoto');
            $nombre     =   $file->getClientOriginalName();
            $file->move(public_path('/img/'),$nombre);
            $producto->urlfoto  =   $nombre;
        }
        // fin tratamiento de imagenes
        $producto->publicado= $request->publicado   ? 1 : 0;
        $producto->portada  = $request->portada     ? 1 : 0;
        $producto->slug = Str::slug($request->nombre);
        $producto->save();
        return redirect('admin/producto');
    }
    public function edit($id){
        $producto   =   Producto::find($id);
        $categorias =   Categoria::orderBy('nombre','ASC')->pluck('nombre','id');
        return view('admin.producto.edit',compact("producto","categorias"));
    }
    public function update(Request $request, $id){
        $producto           =   Producto::findOrFail($id);
        $urlfotoanterior    =   $producto->urlfoto;
        $producto->fill($request->all());
         // tratamiento de imagenes
        if ($request->hasFile('urlfoto')){
            $rutaAnterior   =   public_path("/img/".$urlfotoanterior);
            if ((file_exists($rutaAnterior)) && ($urlfotoanterior!=null)){   unlink (realpath($rutaAnterior));   }
            $file       =   $request->file('urlfoto');
            $nombre     =   $file->getClientOriginalName();
            $file->move(public_path('/img/'),$nombre);
            $producto->urlfoto      =   $nombre;
        }
        // fin tratamiento de imagenes
        $producto->publicado= $request->publicado   ? 1 : 0;
        $producto->portada  = $request->portada     ? 1 : 0;
        $producto->slug = Str::slug($request->nombre);
        $producto->save();
        return redirect('admin/producto');
    }
    public function destroy($id){
        $producto=Producto::findOrFail($id);
        $rutaAnterior = public_path("/img/".$producto->urlfoto);
        if ((file_exists($rutaAnterior)) && ($producto->urlfoto!=null)){   unlink (realpath($rutaAnterior));   }
        $producto->delete();
        return redirect('admin/producto');
    }

    public function show($id){
        Session::put("producto_id",$id);
        return redirect('admin/precio');
    }
}

 

resources/views/admin/index.blade.php

@extends('layouts.admin')
@section('content')
<div class="container">
    <div class="row justify-content-center">
    @include("admin.menu")
        <div class="col-sm-8">
            <a href="/admin/categoria">{{$categoria->nombre}}</a> <br>
            <a href="{{route("admin.producto.create")}}" class="btn btn-success">CREAR PRODUCTO</a>
            <table class="table table-bordered">
                <tr>
                    <th>ID</th>
                    <th>FOTO</th>
                    <th>NOMBRE</th>
                    <th>PRECIO</th>                    
                    <th>ACCIÓN</th>
                </tr>
                @forelse ($productos as $c)
                <tr>
                    <td>{{$c->id}}</td>
                    <td><img src="/img/{{$c->urlfoto}}" width="100" class="border">  </td>
                    <td>
                        {{$c->nombre}}
                        <ul>
                        @forelse ($c->precios as $p)
                            <li>{{$p->nombre}} : {{$p->precio}}</li>
                        @empty
                        @endforelse
                        </ul>
                    </td>
                    <td>{{$c->precio}}</td>
                    <td>                        
                        <a href="{{route("admin.producto.show",$c->id)}}" class="btn btn-success">PRECIOS</a>
                        <a href="{{route("admin.producto.edit",$c->id)}}" class="btn btn-success">EDITAR PRODUCTO</a>
                        {!! Form::open(['method' => 'DELETE','route' => ['admin.producto.destroy', $c->id],'style'=>'display:inline']) !!}
                        {!! Form::submit('ELIMINAR PRODUCTO', ['class' => 'btn btn-success','onclick'=>'return confirm("¿Eliminar producto?")']) !!}
                        {!! Form::close() !!}
                    </td>
                </tr>
                @empty
                    <tr><td></td></tr>
                @endforelse
            </table>
        </div>
    </div>
</div>
@endsection

 

resources/views/admin/create.blade.php

@extends('layouts.admin')
@section('content')
<div class="container">
    <div class="row justify-content-center">
    @include("admin.menu")
        <div class="col-sm-8">
            {!! Form::open(['route'=>'admin.producto.store','method'=>'POST','files'=>true]) !!}
            <div class="form-group mt-3">
                {!! Form::label('nombre','Nombre') !!}
                {!! Form::text('nombre',null,['class'=>'form-control','required']) !!}
            </div>
            <div class="form-group mt-3">
                {!! Form::label('descripcion','Descripción') !!}
                {!! Form::textarea('descripcion',null,['class'=>'form-control','rows'=>3,'maxlength'=>'500']) !!}
            </div>
            <div class="form-group row mt-3">
                <div class="col-sm-3">
                    {!! Form::label('precio','Precio') !!}
                    {!! Form::text('precio',null,['class'=>'form-control']) !!}
                </div>
                <div class="col-sm-3">
                    {!! Form::label('stock','Stock') !!}
                    {!! Form::text('stock',null,['class'=>'form-control','required']) !!}
                </div>
                <div class="col-sm-3">
                    {!! Form::label('orden','Orden') !!}
                    {!! Form::text('orden',null,['class'=>'form-control','required']) !!}
                </div>
                <div class="col-sm-3">
                    {!! Form::label('categoria_id', 'Categoría ') !!}
                    {!! Form::select('categoria_id', $categorias, null, ['class' => 'form-control', 'required'])!!}
                </div>                
            </div>
            <div class="form-group mt-3">
                <div class="row">
                    <div class="col-md-3">
                        <div class="form-check form-switch">
                            {!! Form::checkbox('publicado',null,null,["class"=>"form-check-input"]) !!}
                            {!! Form::label('publicado','Publicado',["class"=>"form-check-label"]) !!}                    
                        </div>
                    </div>                    
                    <div class="col-md-3">
                        <div class="form-check form-switch">
                            {!! Form::checkbox('portada',null,null,["class"=>"form-check-input"]) !!}
                            {!! Form::label('portada','Portada',["class"=>"form-check-label"]) !!}                    
                        </div>
                    </div>
                </div>
            </div>
            <div class="form-group mt-3">
                {!! Form::label('urlfoto','Imagen',['class'=>'control-label']) !!}<br>
                {!! Form::file('urlfoto',['class'=>'form-control']) !!}
            </div>
            <div class="form-group mt-3">
                <a href="javascript: history.go(-1)" class="btn btn-outline-primary">Regresar</a>
                {{ Form::submit('CREAR PRODUCTO',['class'=>'btn btn-success']) }}
            </div>
            {!! Form::close() !!}
        </div>
    </div>
</div>
@endsection

resources/views/admin/edit.blade.php

@extends('layouts.admin')
@section('content')
<div class="container">
    <div class="row justify-content-center">
    @include("admin.menu")
        <div class="col-sm-8">
            {!! Form::open(['route'=>['admin.producto.update',$producto],'method'=>'PUT',"files"=>true]) !!}
            <div class="form-group mt-3">
                {!! Form::label('nombre','Nombre') !!}
                {!! Form::text('nombre',$producto->nombre,['class'=>'form-control','required']) !!}
            </div>
            <div class="form-group mt-3">
                {!! Form::label('descripcion','Descripcion') !!}
                {!! Form::textarea('descripcion',$producto->descripcion,['class'=>'form-control','rows'=>3,'maxlength'=>'500']) !!}
            </div>
            <div class="form-group row mt-3">
                <div class="col-sm-3">
                    {!! Form::label('precio','Precio') !!}
                    {!! Form::text('precio',$producto->precio,['class'=>'form-control']) !!}
                </div>
                <div class="col-sm-3">
                    {!! Form::label('stock','Stock') !!}
                    {!! Form::text('stock',$producto->stock,['class'=>'form-control','required']) !!}
                </div>
                <div class="col-sm-3">
                    {!! Form::label('orden','Orden') !!}
                    {!! Form::text('orden',$producto->orden,['class'=>'form-control','required']) !!}
                </div>
                <div class="col-sm-3">
                    {!! Form::label('categoria_id', 'Categoría ') !!}
                    {!! Form::select('categoria_id', $categorias, $producto->categoria_id, ['class' => 'form-control', 'required'])!!}
                </div>                
            </div>
            <div class="form-group mt-3">
                <div class="row">
                    <div class="col-md-3">
                        <div class="form-check form-switch">
                            {!! Form::checkbox('publicado',null,$producto->publicado,["class"=>"form-check-input"]) !!}
                            {!! Form::label('publicado','Publicado',["class"=>"form-check-label"]) !!}                    
                        </div>
                    </div>
                    <div class="col-md-3">
                        <div class="form-check form-switch">
                            {!! Form::checkbox('portada',null,$producto->portada,["class"=>"form-check-input"]) !!}
                            {!! Form::label('portada','Portada',["class"=>"form-check-label"]) !!}                    
                        </div>
                    </div>
                </div>
            </div>
            <div class="form-group mt-3">
                {!! Form::label('urlfoto','Imagen',['class'=>'control-label']) !!}<br>
                <img src="/img/{{$producto->urlfoto}}">
                {!! Form::file('urlfoto',['class'=>'form-control']) !!}
            </div>
            <div class="form-group mt-3">
                <a href="javascript: history.go(-1)" class="btn btn-outline-primary">Regresar</a>
                {{ Form::submit('ACTUALIZAR PRODUCTO',['class'=>'btn btn-success']) }}
            </div>
            {!! Form::close() !!}
        </div>
    </div>
</div>
@endsection

405 visitas

Descarga el código del proyecto

Descarga el código fuente del proyecto adquiriendo el curso completo

Descargar ahora

Más cursos que pueden interesarte

Más cursos

Codea Codea App

México, Colombia, España, Venezuela, Argentina, Bolivia, Perú

© Todos los derechos reservados Codea App | ...de frente al código!!! | 2020 - 2023