Adquiere este curso para tener acceso a todas las lecciones
Comprar curso32. Editar productos
2 comentarios
Inicia sesión para comentar
Comentarios:
-
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 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
-