{{-- resources/views/zapatera/catalogo/index.blade.php --}} @extends('layouts.app') @section('content') @php use App\Models\Category; // Estado actual $categorySlug = request('category_slug'); $search = request('search'); $attrFilters = (array) request('attr', []); // ej: ['color'=>'negro','talla'=>'41'] // Categorías para el sidebar (puedes moverlo al controlador si prefieres) $categories = Category::orderBy('name')->get(); // Helper para construir URL manteniendo query, cambiando/parchando pares function qurl(array $merge = [], array $forget = []) { $q = request()->query(); foreach ($forget as $k) unset($q[$k]); $q = array_merge($q, $merge); // eliminar null/'' explícitos $q = array_filter($q, fn($v) => !is_null($v) && $v!==''); return route('catalogo', $q); } @endphp

Catálogo de Productos

Filtra por categoría y atributos. Haz clic en la imagen para ver la galería.

{{-- SIDEBAR --}} {{-- GRID productos --}}
@if($products->count())
@php // Normaliza cualquier path a una URL navegable $toUrl = function($raw) { $raw = trim($raw ?? ''); if ($raw === '') return null; if (preg_match('~^https?://~i', $raw)) return $raw; // URL absoluta if (str_starts_with($raw, 'public/storage/')) return asset(substr($raw,7)); if (str_starts_with($raw, 'storage/')) return asset($raw); // /storage/... if (\Storage::disk('public')->exists($raw)) return \Storage::url($raw); if (file_exists(public_path($raw))) return asset($raw); return null; }; $placeholder = asset('img/placeholder_zapato_detalle.svg'); @endphp @foreach ($products as $p) @php $isArr = is_array($p); $id = $isArr ? ($p['id'] ?? null) : $p->id; $name = $isArr ? ($p['name'] ?? '') : $p->name; $sku = $isArr ? ($p['sku'] ?? null) : $p->sku; // Precio (array => price o base_price; modelo => price o base_price) $priceN = $isArr ? ($p['price'] ?? ($p['base_price'] ?? 0)) : ($p->price ?? ($p->base_price ?? 0)); // Imagen (si vienes del controlador con 'image' absoluta, úsala tal cual) $image = $isArr ? ($p['image'] ?? asset('img/placeholder_zapato_detalle.svg')) : ( // Fallbacks por si llega modelo ($toUrl($p->primaryImage->url ?? $p->primaryImage->path ?? null) ?: asset('img/placeholder_zapato_detalle.svg')) ); // Stock (array => 'stock' ya calculado; modelo => suma de stocks) $stock = $isArr ? ($p['stock'] ?? 0) : ($p->stocks?->sum('qty') ?? 0); // Pedido (WhatsApp) y galería $orderUrl = $id ? route('whatsapp.order', $id) : '#'; $galleryUrl = $id ? route('catalogo.gallery', ['product'=>$id, 'i'=>0]) : null; @endphp @endforeach
{{-- Paginación (usa tu componente). Fallback a links() si no existe --}} @isset($products) @if (class_exists(\Illuminate\Pagination\Paginator::class)) @if (View::exists('components.ui.pagination')) @else
{{ $products->links() }}
@endif @endif @endisset @else
No hay productos.
@endif
{{-- ===== Modal de Galería (mismo que en Productos admin) ===== --}} @endsection @push('styles') @endpush @push('scripts') @endpush