Inicio » Cursos » App para Pizzería con delivery

Curso App para Pizzería con delivery

Capitulo 5 ➜ Implementación CRUD Productos

Implementación del CRUD Productos Laravel 9

Modelo, Migración, relación con categorías, métodos para el controlador, vistas y rutas para gestionar los datos de la tabla 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

1031 visitas

Descarga el código del proyecto

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

Comprar

Indice

Empezando el Proyecto
1 Planteamiento del Proyecto 2 Instalación de Laravel y configuración inicial
Panel de Administración
3 Auth y Roles de Usuario: Admin y Cliente 4 Implementación del CRUD de Categorías 5 Implementación CRUD Productos 6 Implementación CRUD Precios 7 Implementación CRUD Pedidos 8 Implementación CRUD Clientes
FrontEnd Diseño
9 Diseño de la Portada con productos 10 Diseño e implementación del Catálogo 11 Diseño Detalle del Producto
Carrito de Compra
12 Instalación del paquete del carrito de compra 13 Diseño de Notificación en la barra de menú 14 Diseño Resumen Carrito Lateral 15 Diseño de la vista Ver Carrito 16 Implementación Agregar Item 17 Incrementar Cantidad del Item 18 Decrementar la cantidad de un item 19 Remover un item del Carrito 20 Eliminar el carrito de compra 21 Confirmar y procesar el carrito de compra
API Rest
22 Planteamiento de la API Rest 23 Registro 24 Login 25 Logout 26 Categorías 27 Productos
Diseño de la App Android
28 Mockups del Aplicativo
Autenticación Android
29 Introducción a la Autenticación 30 ApiService 31 RetrofitClient 32 SessionManager 33 MainActivity 34 LoginActivity 35 RegisterActivity 36 Logout
Catálogo de Productos
37 Categorías 38 Productos 39 Detalle del Producto
Carrito de Compra Android
40 Creación de la DB dbpizza 41 Métodos de consulta a la DB 42 CarritoActivity 43 CarritoAdapter 44 AddItem 45 CarritoAll 46 UpdateItem 47 Subtotal, Impuesto y Total 48 Preparar el Pedido y enviarlo al Servidor 49 Vincular a WhatsApp y clearItems
Extras
50 Optimizando el diseño y funcionalidades

Más cursos que pueden interesarte

Más cursos

Codea Applications

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

© Copyright Codea::App Cursos de Programación Online | LATAM | 2020 - 2024