templates/photo/photos_by_genre.html.twig line 1

Open in your IDE?
  1. {% extends 'base.html.twig' %}
  2. {% block title %}
  3.   {{ meta_title }}
  4. {% endblock %}
  5. {% block meta_description %}
  6.   <meta name="description" content="{{ meta_description }}">
  7. {% endblock %}
  8. {% block body %}
  9.   <h1 class="text-3xl font-semibold my-8 text-center mx-auto uppercase">{{ genre }}</h1>
  10.   {% if description %}
  11.     <p class="text-lg text-center mx-auto mb-4 max-w-2xl">{{ description }}</p>
  12.   {% endif %}
  13.   <div class="flex items-center justify-center py-4 md:py-8 flex-wrap mb-8">
  14.     {% set selectedGenreSlug = selectedGenre %}
  15.     {% set allActive = selectedGenreSlug == 'all' %}
  16.     <button type="button" class="{% if allActive %}text-blue-700 hover:text-white border-2 border-blue-600 bg-white hover:bg-blue-700 focus:ring-4 focus:outline-none focus:ring-blue-300 rounded-full text-base font-medium px-5 py-2.5 text-center mr-3 mb-3{% else %}hover:text-white hover:bg-blue-700 text-gray-900 border-2 border-white hover:border-gray-200 bg-white focus:ring-4 focus:outline-none focus:ring-gray-300 rounded-full text-base font-medium px-5 py-2.5 text-center mr-3 mb-3{% endif %}">
  17.       <a href="{{ path('photo_gallery') }}">Все жанры</a>
  18.     </button>
  19.     {% for genre in genres %}
  20.       {% set genreSlug = genre %}
  21.       {% set isActive = selectedGenreSlug == genreSlug %}
  22.       <button type="button" class="{% if isActive %}text-blue-700 hover:text-white border-2 border-blue-600 bg-white hover:bg-blue-700 focus:ring-4 focus:outline-none focus:ring-blue-300 rounded-full text-base font-medium px-5 py-2.5 text-center mr-3 mb-3{% else %}hover:text-white hover:bg-blue-700 text-gray-900 border-2 border-white hover:border-gray-200 bg-white focus:ring-4 focus:outline-none focus:ring-gray-300 rounded-full text-base font-medium px-5 py-2.5 text-center mr-3 mb-3{% endif %}">
  23.         <a href="{{ path('photos_by_genre', {'genre': genreSlug}) }}">{{ genre }}</a>
  24.       </button>
  25.     {% endfor %}
  26.   </div>
  27.   <div class="container mx-auto px-4 pb-2">
  28.     <div class="masonry">
  29.       {% for photo in photos %}
  30.         <div class="masonry-item">
  31.           <a href="{{ path('photo_show', {'genre': photo.genre, 'id': photo.id}) }}">
  32.             <div class="image-container">
  33.               {% if photo.path %}
  34.                 <img class="h-auto max-w-full rounded-lg" src="{{ asset('photos/' ~ photo.path) }}" alt="{{ photo.title }}">
  35.               {% else %}
  36.                 <img class="h-auto max-w-full rounded-lg" src="{{ asset('photos/default.jpg') }}" alt="Изображение по умолчанию">
  37.               {% endif %}
  38.               <div class="image-overlay">
  39.                 <p class="image-text">Посмотреть</p>
  40.               </div>
  41.             </div>
  42.           </a>
  43.         </div>
  44.       {% endfor %}
  45.     </div>
  46.   </div>
  47.   <style>
  48.     .masonry {
  49.       column-count: 3;
  50.       column-gap: 20px;
  51.     }
  52.     .masonry-item {
  53.       break-inside: avoid;
  54.       padding: 1rem;
  55.       background-color: #f0f0f0;
  56.       border: 1px solid #ccc;
  57.       display: inline-block;
  58.       margin-bottom: 1rem;
  59.       width: 100%;
  60.       box-sizing: border-box;
  61.     }
  62.     .image-container {
  63.       position: relative;
  64.     }
  65.     .image-overlay {
  66.       position: absolute;
  67.       top: 0;
  68.       left: 0;
  69.       width: 100%;
  70.       height: 100%;
  71.       background-color: rgba(0, 0, 0, 0.5);
  72.       display: flex;
  73.       justify-content: center;
  74.       align-items: center;
  75.       opacity: 0;
  76.       transition: opacity 0.3s ease;
  77.     }
  78.     .image-text {
  79.       color: #fff;
  80.       font-size: 18px;
  81.       font-weight: bold;
  82.     }
  83.     .image-container:hover .image-overlay {
  84.       opacity: 1;
  85.     }
  86.   </style>
  87.   <script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
  88.   <script>
  89.      window.addEventListener('load', () => {
  90.     // Функция для обновления количества колонок в masonry в зависимости от ширины экрана
  91.     function updateMasonryColumns() {
  92.         const masonry = document.querySelector('.masonry');
  93.         if (!masonry) {
  94.             console.warn('Masonry layout container not found.');
  95.             return;
  96.         }
  97.         const screenWidth = window.innerWidth;
  98.         if (screenWidth > 1200) {
  99.             masonry.style.columnCount = 4;
  100.         } else if (screenWidth > 768) {
  101.             masonry.style.columnCount = 3;
  102.         } else {
  103.             masonry.style.columnCount = 2;
  104.         }
  105.         console.log('Column count:', masonry.style.columnCount);
  106.     }
  107.     // Проверка каждого изображения внутри masonry, чтобы убедиться, что src определен
  108.     const images = document.querySelectorAll('.masonry-item img');
  109.     images.forEach((img) => {
  110.         if (!img.src) {
  111.             console.warn('Image src is undefined or empty.');
  112.         }
  113.     });
  114.     // Начальная настройка и обновление masonry при изменении размера окна
  115.     updateMasonryColumns();
  116.     window.addEventListener('resize', updateMasonryColumns);
  117. });
  118.   </script>
  119. {% endblock %}