{{-- resources/views/search/_hostel_card.blade.php --}} @php $minPrice = $hostel->prices->min('price_ttc'); $typeLabel = match($hostel->type ?? 'hostel') { 'camping' => 'πŸ• Camping', 'mixed' => '🌿 Mixte', default => '🏨 Hostel', }; /* * ───────────────────────────────────────────────────────────────────── * RΓ©solution intelligente du chemin de l'image de couverture. * ───────────────────────────────────────────────────────────────────── * HostelFlow stocke les images dans 2 emplacements possibles : * * 1) public/images/... * β†’ assets statiques semΓ©s par DemoHostelImagesSeeder * β†’ cover_image en BD : "images/Tabarka.jpg" * β†’ URL finale : asset("images/Tabarka.jpg") * * 2) storage/app/public/uploads/... * β†’ uploads dynamiques depuis le formulaire owner * β†’ cover_image en BD : "uploads/abc123.jpg" * β†’ URL finale : asset("storage/uploads/abc123.jpg") * (via le symlink créé par `php artisan storage:link`) * * DΓ©tection : si le chemin commence par "images/" β†’ asset public, * sinon β†’ storage symlink. * * Pattern PFE : "Storage Resolution Strategy" β€” la vue est agnostique * de la source des assets, ce qui permet de mixer seeds et uploads * sans dupliquer la logique d'affichage. */ $coverUrl = null; if ($hostel->cover_image) { $coverUrl = str_starts_with($hostel->cover_image, 'images/') ? asset($hostel->cover_image) : asset('storage/' . $hostel->cover_image); } @endphp
@if($coverUrl) {{ $hostel->name }} @else
{{ $hostel->type === 'camping' ? 'πŸ•' : '🏨' }}
@endif
@if($hostel->rating >= 4.5) ⭐ Top notΓ© @elseif($hostel->total_reviews === 0) πŸ†• Nouveau @else πŸ”₯ Populaire @endif
{{ $hostel->region?->name ?? ($hostel->city ?? 'Tunisie') }}
{{ $hostel->name }}
@if($hostel->rating > 0)
β˜… {{ number_format($hostel->rating, 1) }} @if($hostel->total_reviews > 0) ({{ $hostel->total_reviews }}) @endif
@endif {{ $typeLabel }}