Skip to content
MiniShop3
MiniShop3
Современный компонент интернет-магазина для MODX 3
  1. Компоненты
  2. MiniShop3
  3. Сниппеты
  4. msGallery

msGallery

Сниппет для вывода галереи изображений товара.

Параметры

ПараметрПо умолчаниюОписание
productтекущий ресурсID товара
tpltpl.msGalleryЧанк оформления галереи
limit0Количество изображений (0 = все)
offset0Пропустить указанное количество
sortbypositionПоле сортировки
sortdirASCНаправление сортировки
whereJSON с дополнительными условиями
filetypeФильтр по типу файла (через запятую)
thumbnailsФильтр превью по именам (через запятую)
showInactivefalseПоказывать неактивные файлы
toPlaceholderСохранить результат в плейсхолдер
showLogfalseПоказать лог выполнения
returndataФормат: data, tpl, json, sql

Примеры

Базовый вывод

fenom
{'msGallery' | snippet : [
    'return' => 'tpl'
]}

Для конкретного товара

fenom
{'msGallery' | snippet : [
    'product' => 15,
    'return' => 'tpl'
]}

Первые 5 изображений

fenom
{'msGallery' | snippet : [
    'limit' => 5,
    'return' => 'tpl'
]}

Только изображения (без видео и документов)

fenom
{'msGallery' | snippet : [
    'filetype' => 'image',
    'return' => 'tpl'
]}

Только определённые превью

fenom
{'msGallery' | snippet : [
    'thumbnails' => 'small,medium',
    'return' => 'tpl'
]}

Сортировка по имени

fenom
{'msGallery' | snippet : [
    'sortby' => 'name',
    'sortdir' => 'ASC',
    'return' => 'tpl'
]}

Получение данных для обработки

fenom
{set $files = 'msGallery' | snippet}

{foreach $files as $file}
    <img src="{$file['url']}" alt="{$file['name']}">
{/foreach}

return=data по умолчанию

По умолчанию сниппет возвращает массив данных (return=data). Для вывода через чанк укажите return=tpl.

Плейсхолдеры в чанке

В чанк передаются:

ПлейсхолдерОписание
{$files}Массив файлов галереи
{$scriptProperties}Параметры вызова сниппета

Поля каждого файла

ПолеОписание
{$file['id']}ID файла
{$file['product_id']}ID товара
{$file['name']}Имя файла
{$file['description']}Описание
{$file['url']}URL оригинала
{$file['path']}Путь к файлу
{$file['file']}Имя файла на диске
{$file['type']}Тип файла (image, video, document и т.д.)
{$file['createdon']}Дата добавления
{$file['createdby']}ID пользователя
{$file['position']}Позиция в галерее
{$file['active']}Активен (1/0)
{$file['hash']}Хеш файла

Превью изображений

Превью добавляются как дополнительные поля с именем папки:

ПолеОписание
{$file['small']}URL маленького превью
{$file['medium']}URL среднего превью
{$file['large']}URL большого превью

Имена превью

Имена превью зависят от настроек медиа-источника товаров. По умолчанию создаются small, medium, large.

Служебные переменные цикла

В Fenom доступны переменные итерации:

fenom
{foreach $files as $file}
    {$file@index}     {* Индекс с 0 *}
    {$file@iteration} {* Номер с 1 *}
    {$file@first}     {* true для первого *}
    {$file@last}      {* true для последнего *}
{/foreach}

Чанк по умолчанию

Стандартный чанк tpl.msGallery использует Splide.js для слайдера и GLightbox для просмотра:

fenom
{* tpl.msGallery *}
{if $files?}
    {* Splide Slider + GLightbox CSS/JS *}
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@splidejs/splide@4.1.4/dist/css/splide.min.css">
    <script src="https://cdn.jsdelivr.net/npm/@splidejs/splide@4.1.4/dist/js/splide.min.js"></script>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css">
    <script src="https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js"></script>

    <div class="ms3-gallery">
        {* Основной слайдер *}
        <div class="splide ms3-gallery-main" id="ms3-gallery-main">
            <div class="splide__track">
                <ul class="splide__list">
                    {foreach $files as $file}
                        <li class="splide__slide">
                            <a href="{$file['url']}"
                               class="glightbox"
                               data-gallery="ms3-product-gallery"
                               data-title="{$file['name']}"
                               data-description="{$file['description']}">
                                <img src="{$file['medium'] ?: $file['url']}"
                                     alt="{$file['description'] ?: $file['name']}"
                                     loading="{$file@first ? 'eager' : 'lazy'}">
                            </a>
                        </li>
                    {/foreach}
                </ul>
            </div>
        </div>

        {* Слайдер миниатюр *}
        {if ($files | length) > 1}
            <div class="splide ms3-gallery-thumbs" id="ms3-gallery-thumbs">
                <div class="splide__track">
                    <ul class="splide__list">
                        {foreach $files as $file}
                            <li class="splide__slide">
                                <img src="{$file['small'] ?: $file['medium'] ?: $file['url']}"
                                     alt="{$file['description'] ?: $file['name']}">
                            </li>
                        {/foreach}
                    </ul>
                </div>
            </div>
        {/if}
    </div>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            var main = new Splide('#ms3-gallery-main', {
                type: 'fade',
                rewind: true,
                pagination: false,
                arrows: true,
            });

            var thumbsEl = document.getElementById('ms3-gallery-thumbs');
            if (thumbsEl) {
                var thumbs = new Splide('#ms3-gallery-thumbs', {
                    fixedWidth: 100,
                    fixedHeight: 80,
                    gap: 10,
                    rewind: true,
                    pagination: false,
                    arrows: false,
                    isNavigation: true,
                    focus: 'center',
                });
                main.sync(thumbs);
                main.mount();
                thumbs.mount();
            } else {
                main.mount();
            }

            GLightbox({ selector: '.glightbox', loop: true });
        });
    </script>
{else}
    <div class="ms3-gallery ms3-gallery-empty">
        <img src="{'assets_url' | option}components/minishop3/img/web/ms3_medium.png" alt="">
    </div>
{/if}

Простой чанк

Минимальный пример без внешних библиотек:

fenom
{* tpl.msGallery.simple *}
{if $files?}
    <div class="product-gallery">
        {foreach $files as $file}
            <a href="{$file['url']}" target="_blank">
                <img src="{$file['medium'] ?: $file['url']}"
                     alt="{$file['name']}"
                     loading="{$file@first ? 'eager' : 'lazy'}">
            </a>
        {/foreach}
    </div>
{/if}

Работа с видео

Если в галерее есть видео:

fenom
{set $files = 'msGallery' | snippet}

{foreach $files as $file}
    {if $file['type'] == 'video'}
        <video controls>
            <source src="{$file['url']}" type="video/{$file['file'] | pathinfo : 'extension'}">
        </video>
    {else}
        <img src="{$file['medium'] ?: $file['url']}" alt="{$file['name']}">
    {/if}
{/foreach}

Фильтрация по типу

fenom
{* Только изображения *}
{'msGallery' | snippet : ['filetype' => 'image']}

{* Только видео *}
{'msGallery' | snippet : ['filetype' => 'video']}

{* Изображения и видео *}
{'msGallery' | snippet : ['filetype' => 'image,video']}