Editar productos
Comprar curso

32. Editar productos


2 comentarios

Inicia sesión para comentar

Comentarios:

  • Pit

    Pit hace 2 semanas

    Por silo están haciendo en Laravel 12 .
    dejo  visa y componente
    <div>

        <form wire:submit="store">

         

    <figure class="mb-4 relative">

        <div class="absolute top-8 right-8">

            <label class="flex items-center px-4 py-2 rounded-lg bg-white cursor-pointer text-gray-700">

                <i class="fas fa-camera mr-2"></i>

                Actualizar imagen

                <input type="file"

                    class="hidden"

                    accept="image/*"

                    wire:model="image">

            </label>

        </div>

       

        @if ($image)

            <img class="aspect-[16/9] object-cover object-center w-full"

                src="{{$image->temporaryUrl()}}"

                alt="Preview"

                key="temp-image">

        @elseif (!empty($productEdit['image_path']))

            <img class="aspect-[16/9] object-cover object-center w-full"

                src="/storage/{{$productEdit['image_path']}}"

                alt="Imagen del producto"

                wire:key="product-image-{{ $productEdit['image_path'] }}">

        @else

            <img class="aspect-[16/9] object-cover object-center w-full"

                src="{{asset('img/no-image.png')}}"

                alt="No image">

        @endif

    </figure>



     

           

            <x-validation-errors class="mb-4"/>

           

            <div class="card">

                <div class="mb-4">

                    <x-label>Código:</x-label>

                    <x-input wire:model="productEdit.sku" class="w-full"

                        placeholder="Digite el código del producto" />

                </div>

               

                <div class="mb-4">

                    <x-label>Nombre:</x-label>

                    <x-input wire:model="productEdit.name" class="w-full"

                        placeholder="Digite el nombre del producto" />

                </div>

               

                <div class="mb-4">

                    <x-label>Descripción:</x-label>

                    <x-textarea wire:model="productEdit.description" class="w-full"

                        placeholder="Digite descripción del producto" />

                </div>

               

                <div class="mb-4">

                    <x-label>Precio:</x-label>

                    <x-input

                        class="w-full"

                        type="number"

                        step="0.01"

                        wire:model="productEdit.price"

                        placeholder="Digite precio del producto" />

                </div>

               

                <div class="mb-4">

                    <x-label>Familias:</x-label>

                    <x-select class="w-full" wire:model.live="family_id">

                        <option value="">Seleccione una familia</option>

                        @foreach ($families as $family)

                            <option value="{{$family->id}}">{{$family->name}}</option>

                        @endforeach

                    </x-select>

                </div>

               

                <div class="mb-4">

                    <x-label>Categorías:</x-label>

                    <x-select class="w-full" wire:model.live="category_id">

                        <option value="">Seleccione una Categoría</option>

                        @foreach ($this->categories as $category)

                            <option value="{{$category->id}}">{{$category->name}}</option>

                        @endforeach

                    </x-select>

                </div>

               

                <div class="mb-4">

                    <x-label>Subcategorías:</x-label>

                    <x-select class="w-full" wire:model="productEdit.subcategory_id">

                        <option value="">Seleccione una subcategoría</option>

                        @foreach ($this->subcategories as $subcategory)

                            <option value="{{$subcategory->id}}">{{$subcategory->name}}</option>

                        @endforeach

                    </x-select>

                </div>

            </div>

           

            <div class="flex justify-end mt-4 gap-2">

                <x-button type="submit">

                    Actualizar producto

                </x-button>

                <x-danger-button type="button" onclick="confirmDelete()">

                    Eliminar

                </x-danger-button>

            </div>

        </form>

       

        <form action="{{route('admin.products.destroy', $product)}}"

            method="POST"

            id="delete-form">

            @csrf

            @method('DELETE')

        </form>

    </div>


     

    @push('js')

    <script>

        document.addEventListener('livewire:init', () => {

            Livewire.on('swal', (event) => {

                Swal.fire({

                    icon: event[0].icon,

                    title: event[0].title,

                    text: event[0].text,

                });

            });

        });

       

        function confirmDelete(){

            Swal.fire({

                title: "¿Está seguro?",

                text: "El producto será eliminado de forma permanente!",

                icon: "warning",

                showCancelButton: true,

                confirmButtonColor: "#3085d6",

                cancelButtonColor: "#d33",

                confirmButtonText: "Sí, eliminar!",

                cancelButtonText: "Cancelar"

            }).then((result) => {

                if (result.isConfirmed) {

                    document.getElementById('delete-form').submit();

                }

            });

        }

    </script>

    @endpush


    //componente Livewire
    <?php


     

    namespace App\Livewire\Admin\Products;


     

    use Livewire\Component;

    use Livewire\WithFileUploads;

    use Livewire\Attributes\Computed;

    use App\Models\Family;

    use App\Models\Category;

    use App\Models\Subcategory;

    use App\Models\Product;

    use Illuminate\Support\Facades\Storage;


     

    class ProductEdit extends Component

    {

        use WithFileUploads;

       

        public $product;

        public $productEdit;

        public $families;

        public $family_id = '';

        public $category_id = '';

        public $image;

       

        public function mount($product)

        {

            $this->product = $product;

            $this->productEdit = $product->only('sku', 'name', 'description', 'price', 'image_path', 'subcategory_id');

            $this->families = Family::all();

           

            if ($product->subcategory) {

                $this->category_id = $product->subcategory->category->id;

                $this->family_id = $product->subcategory->category->family_id;

            }

        }

       

        public function boot()

        {

            $this->withValidator(function($validator) {

                if ($validator->fails()) {

                    $this->dispatch('swal', [

                        'icon' => 'error',

                        'title' => '¡Error!',

                        'text' => 'El formulario contiene errores'

                    ]);

                }

            });

        }

       

        // Estos métodos detectan los cambios en los selects

        public function updatedFamilyId()

        {

            $this->category_id = '';

            $this->productEdit['subcategory_id'] = '';

        }

       

        public function updatedCategoryId()

        {

            $this->productEdit['subcategory_id'] = '';

        }

       

        #[Computed()]

        public function categories()

        {

            if (empty($this->family_id)) {

                return collect();

            }

            return Category::where('family_id', $this->family_id)->get();

        }

       

        #[Computed()]

        public function subcategories()

        {

            if (empty($this->category_id)) {

                return collect();

            }

            return Subcategory::where('category_id', $this->category_id)->get();

        }

        #[Computed()]

    public function imageUrl()

    {

        if ($this->image) {

            return $this->image->temporaryUrl();

        }

       

        if (!empty($this->productEdit['image_path'])) {

            return Storage::url($this->productEdit['image_path']);

        }

       

        return asset('img/no-image.png');

    }



     

       public function store()

    {

        $this->validate([

            'image' => 'nullable|image|max:1024',

            'productEdit.sku' => 'required|unique:products,sku,' . $this->product->id,

            'productEdit.name' => 'required|max:255',

            'productEdit.description' => 'required',

            'productEdit.price' => 'required|numeric|min:0',

            'family_id' => 'required|exists:families,id',

            'category_id' => 'required|exists:categories,id',

            'productEdit.subcategory_id' => 'required|exists:subcategories,id',

        ]);

       

        if ($this->image) {

            // Eliminar imagen anterior si existe

            if (!empty($this->productEdit['image_path'])) {

                Storage::disk('public')->delete($this->productEdit['image_path']);

            }

            // Guardar nueva imagen

            $this->productEdit['image_path'] = $this->image->store('products', 'public');

        }

       

        $this->product->update($this->productEdit);

        $this->product->refresh();

       

        // Actualizar productEdit con los datos más recientes

        $this->productEdit = $this->product->only('sku', 'name', 'description', 'price', 'image_path', 'subcategory_id');

       

        // Resetear imagen temporal

        $this->image = null;

       

        session()->flash('swal', [

            'icon' => 'success',

            'title' => '¡Actualizado!',

            'text' => 'El producto se actualizó correctamente'

        ]);

       

        return $this->redirectRoute('admin.products.edit', $this->product->id);

    }


     

       

        public function render()

        {

            return view('livewire.admin.products.product-edit');

        }

    }



     

  • Víctor Daniel Dorantes Chay

    Víctor Daniel Dorantes Chay hace 2 años

    Que librerias utilizas para livewire y poder llamar a los modelos en laravel con solo escribir

    • Victor Arana Flores hace 2 años

      Hola, no es una libreria es una extensión de VSC llamada Git Hub y tiene un costo mensual de 10 usd (Que a mi parecer lo vale)

    • Emmanuel hace 2 años

      hay una extensión de VSCode llamada Codeium que hace lo mismo y es gratis.

    • Víctor Daniel Dorantes Chay hace 2 años

      Bueno me puedes ayudar indicando el nombre de las extesiones que utilizas en VSC

    • Emmanuel hace 2 años

      si te refieres al auto completado que sale en los videos, es la exten: Codeium que hace lo mismo que la de github 

    • Víctor Daniel Dorantes Chay hace 2 años

      gracias amigo ya lo instale esta super genial, no me agrega los modelos, pero mas sin embargo me ayuda mucho