- Implementada nueva funcion para crear productos destacados por etiquetas, mostrando carrusel con los mismos en la pagina welcome.
This commit is contained in:
Bryam105
2026-06-02 09:46:53 -03:00
parent 63f91bdd6d
commit 902b8433d9
17 changed files with 480 additions and 33 deletions
+11 -2
View File
@@ -15,9 +15,10 @@ class CatalogoController extends Controller
// 1. Atrapamos lo que el usuario escribió o seleccionó
$query = $request->input('search');
$type = $request->input('type');
$tagFilter = $request->input('tag');
// --- CONSULTA PARA LA GRILLA (PAGINADA) ---
$productsQuery = Product::query();
$productsQuery = Product::with('tags');
$productsQuery->when($query, function ($q) use ($query) {
return $q->where('name', 'like', "%{$query}%");
@@ -29,6 +30,12 @@ class CatalogoController extends Controller
$productsQuery->where('type', '!=', 'service');
}
if ($tagFilter) {
$productsQuery->whereHas('tags', function($q) use ($tagFilter) {
$q->where('name', $tagFilter);
});
}
//mostrar si tiene stock mayor a 0
$productsQuery->where('stock_quantity', '>', 0);
@@ -40,8 +47,10 @@ class CatalogoController extends Controller
->orderBy('name', 'asc')
->get();
$allTags = \App\Models\Tag::orderBy('name')->get();
// Devuelve la vista
return view('catalogo.index', compact('products', 'allProducts'));
return view('catalogo.index', compact('products', 'allProducts', 'allTags'));
}
public function show(Product $product)
+12 -11
View File
@@ -9,17 +9,18 @@ class HomeController extends Controller
{
public function __invoke(Request $request)
{
// Si tuvieras un campo 'sales_count', podrías usar ->orderByDesc('sales_count')
$destacados = Product::where('type', 'bike')
->latest() // Las más nuevas
->take(5)
->get();
// Traer todas las etiquetas con sus productos
$tagsConProductos = \App\Models\Tag::with('products')->get()
->filter(function ($tag) {
// Solo mantener etiquetas que tengan al menos 1 producto
return $tag->products->count() > 0;
})
->map(function ($tag) {
// Limitar a 7 productos como máximo para el carrousel
$tag->setRelation('products', $tag->products->take(7));
return $tag;
});
// Si no hay bicis, traemos cualquier cosa para que no se rompa
if ($destacados->isEmpty()) {
$destacados = Product::take(5)->get();
}
return view('welcome', compact('destacados'));
return view('welcome', compact('tagsConProductos'));
}
}
+16 -3
View File
@@ -4,6 +4,7 @@ namespace App\Http\Controllers;
use App\Models\Product;
use App\Models\Supplier;
use App\Models\Tag;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Storage;
@@ -55,7 +56,8 @@ class ProductosController extends Controller
public function create()
{
$suppliers = Supplier::orderBy('name')->get();
return view('productos.create', compact('suppliers'));
$tags = Tag::orderBy('name')->get();
return view('productos.create', compact('suppliers', 'tags'));
}
public function store(Request $request)
@@ -79,7 +81,11 @@ class ProductosController extends Controller
}
unset($validated['image']);
Product::create($validated);
$product = Product::create($validated);
if ($request->has('tags')) {
$product->tags()->sync($request->tags);
}
return redirect()->route('productos.index')
->with('success', 'Producto creado correctamente.');
@@ -93,7 +99,8 @@ class ProductosController extends Controller
public function edit(Product $product)
{
$suppliers = Supplier::orderBy('name')->get();
return view('productos.edit', compact('product', 'suppliers'));
$tags = Tag::orderBy('name')->get();
return view('productos.edit', compact('product', 'suppliers', 'tags'));
}
public function update(Request $request, Product $product)
@@ -123,6 +130,12 @@ class ProductosController extends Controller
$product->update($validated);
if ($request->has('tags')) {
$product->tags()->sync($request->tags);
} else {
$product->tags()->detach();
}
return redirect()->route('productos.index')
->with('success', 'Producto actualizado exitosamente.');
}
+44
View File
@@ -0,0 +1,44 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Tag;
class TagController extends Controller
{
public function index()
{
$tags = Tag::orderBy('name')->get();
return view('tags.index', compact('tags'));
}
public function store(Request $request)
{
$validated = $request->validate([
'name' => 'required|string|max:50|unique:tags,name'
]);
Tag::create($validated);
return redirect()->route('tags.index')->with('success', 'Etiqueta creada correctamente.');
}
public function update(Request $request, Tag $tag)
{
$validated = $request->validate([
'name' => 'required|string|max:50|unique:tags,name,' . $tag->id
]);
$tag->update($validated);
return redirect()->route('tags.index')->with('success', 'Etiqueta actualizada correctamente.');
}
public function destroy(Tag $tag)
{
$tag->delete();
return redirect()->route('tags.index')->with('success', 'Etiqueta eliminada.');
}
}
+5
View File
@@ -42,6 +42,11 @@ class Product extends Model
{
return $this->belongsToMany(Sale::class, 'sale_details');
}
public function tags()
{
return $this->belongsToMany(Tag::class);
}
}
/**$user->sales: Te da la lista de todas las compras de ese usuario.
+18
View File
@@ -0,0 +1,18 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Factories\HasFactory;
class Tag extends Model
{
use HasFactory;
protected $fillable = ['name'];
public function products()
{
return $this->belongsToMany(Product::class);
}
}