services_grid.blade.php 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. {{--
  2. Blade-шаблон блока «Сетка услуг».
  3. $data:
  4. label — надпись над заголовком
  5. heading — заголовок секции
  6. subtext — описание секции
  7. service_ids — массив ID конкретных услуг; если пусто — берутся последние N
  8. limit — максимум услуг при режиме «последние» (по умолчанию 8)
  9. Теги услуги — ID из таблицы dict_values (раздел countries + service_tags).
  10. Каждый элемент — ссылка на /services/{slug}.
  11. --}}
  12. @php
  13. use App\Models\DictValue;
  14. use App\Models\Service;
  15. $ids = array_filter(array_map('intval', $data['service_ids'] ?? []));
  16. $limit = max(1, (int) ($data['limit'] ?? 8));
  17. if (!empty($ids)) {
  18. $services = Service::active()
  19. ->whereIn('id', $ids)
  20. ->orderByRaw('FIELD(id, ' . implode(',', $ids) . ')')
  21. ->get();
  22. } else {
  23. $services = Service::active()
  24. ->orderBy('sort_order')
  25. ->orderBy('title')
  26. ->limit($limit)
  27. ->get();
  28. }
  29. // Собираем все нужные ID тегов одним запросом
  30. $allTagIds = $services->flatMap(fn ($s) => array_map('intval', $s->tags ?? []))->unique()->filter()->values();
  31. $tagDict = DictValue::whereIn('id', $allTagIds)->get(['id','value','flag'])
  32. ->keyBy('id');
  33. @endphp
  34. @if($services->isNotEmpty())
  35. <section class="section sec-alt">
  36. <div class="container">
  37. @if(($data['label'] ?? '') || ($data['heading'] ?? '') || ($data['subtext'] ?? ''))
  38. <div class="sh reveal">
  39. @if($data['label'] ?? '')
  40. <div class="sh-label">{{ $data['label'] }}</div>
  41. @endif
  42. @if($data['heading'] ?? '')
  43. <h2>{{ $data['heading'] }}</h2>
  44. @endif
  45. @if($data['subtext'] ?? '')
  46. <p>{{ $data['subtext'] }}</p>
  47. @endif
  48. </div>
  49. @endif
  50. <div class="svc-grid stagger">
  51. @foreach($services as $i => $svc)
  52. <a href="{{ route('services.show', $svc->slug) }}" class="svc-item">
  53. <div class="svc-n">{{ str_pad($i + 1, 2, '0', STR_PAD_LEFT) }}</div>
  54. <div class="svc-body">
  55. <h3>
  56. @if($svc->icon) {{ $svc->icon }} @endif
  57. {{ $svc->title }}
  58. </h3>
  59. @if($svc->excerpt)
  60. <p>{{ $svc->excerpt }}</p>
  61. @endif
  62. @php $tagIds = array_map('intval', $svc->tags ?? []); @endphp
  63. @if(!empty($tagIds))
  64. <div class="svc-tags">
  65. @foreach($tagIds as $tid)
  66. @if($tagDict->has($tid))
  67. <span class="svc-tag">
  68. {{ $tagDict[$tid]->flag }}
  69. {{ $tagDict[$tid]->value }}
  70. </span>
  71. @endif
  72. @endforeach
  73. </div>
  74. @endif
  75. </div>
  76. </a>
  77. @endforeach
  78. </div>
  79. </div>
  80. </section>
  81. @endif