NEW:
- Implementada nueva funcion para crear productos destacados por etiquetas, mostrando carrusel con los mismos en la pagina welcome.
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.');
|
||||
}
|
||||
|
||||
@@ -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.');
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user