custom/plugins/WynTheme/src/Resources/views/storefront/element/cms-element-image-gallery.html.twig line 1

Open in your IDE?
  1. {% sw_extends '@Storefront/storefront/element/cms-element-image-gallery.html.twig' %}
  2. {% set sliderButtonVariant = 'tertiary' %}
  3. {% set sliderButtonAttrs = 'icon-button' %}
  4. {% block element_image_gallery %}
  5.   {# cms element data and configs #}
  6.   {% if element.fieldConfig is defined and element.data is defined %}
  7.     {% set sliderConfig = element.fieldConfig.elements %}
  8.     {% set mediaItems = [] %}
  9.     {% for item in element.data.sliderItems %}
  10.       {% set mediaItems = mediaItems|merge([item.media]) %}
  11.     {% endfor %}
  12.     {#  added by wyn to have an additional image on position 0 #}
  13.     {% set variantMediaId = page.product.customFields.wyn_product_additional_information_additional_product_image %}
  14.     {% if variantMediaId %}
  15.       {% set variantMedia = searchMedia([variantMediaId], context.context).elements|first %}
  16.       {% set tmpVariantMediaArray = [variantMedia] %} {# necessary to have the image on position 0 #}
  17.       {% set mediaItems = tmpVariantMediaArray|merge(mediaItems) %}
  18.     {% endif %}
  19.     {# end of wyn part #}
  20.     {% set zoom = sliderConfig.zoom.value %}
  21.     {% set gutter = sliderConfig.gutter.value %}
  22.     {% set magnifierOverGallery = true %}
  23.     {% set zoomModal = sliderConfig.fullScreen.value %}
  24.     {% set minHeight = sliderConfig.minHeight.value %}
  25.     {% set displayMode = sliderConfig.displayMode.value %}
  26.     {% set navigationArrows = sliderConfig.navigationArrows.value %}
  27.     {% set navigationDots = sliderConfig.navigationDots.value %}
  28.     {% set galleryPosition = sliderConfig.galleryPosition.value %}
  29.     {% set verticalAlign = sliderConfig.verticalAlign.value %}
  30.     {% set zoomImageContainerSelector = sliderConfig.zoomImageContainerSelector.value %}
  31.   {% endif %}
  32.   {% if fallbackImageTitle is not defined %}
  33.     {% set fallbackImageTitle = '' %}
  34.   {% endif %}
  35.   {# @var mediaItems \Shopware\Core\Content\Media\MediaCollection #}
  36.   {% set imageCount = mediaItems|length %}
  37.   {# too many underneath thumbs or slider dots make them hard to see #}
  38.   {% set maxItemsToShowMobileNav = 5 %}
  39.   {% set maxItemsToShowNav = 8 %}
  40.   {% set magnifierOptions = [] %}
  41.   {% if magnifierOverGallery %}
  42.     {% set magnifierOptions = magnifierOptions|merge({
  43.       'magnifierOverGallery': true,
  44.       'cursorType': 'crosshair'
  45.     }) %}
  46.   {% endif %}
  47.   {% if zoomImageContainerSelector %}
  48.     {% set magnifierOptions = magnifierOptions|merge({
  49.       'zoomImageContainerSelector': zoomImageContainerSelector
  50.     }) %}
  51.   {% endif %}
  52.   <div
  53.     class="cms-element-{{ element.type }}{% if displayMode == "standard" and verticalAlign %} has-vertical-alignment{% endif %}"
  54.   >
  55.     {% block element_image_gallery_alignment %}
  56.       {% if config.verticalAlign.value %}
  57.         <div class="cms-element-alignment{% if verticalAlign == "center" %} align-self-center{% elseif verticalAlign == "flex-end" %} align-self-end{% else %} align-self-start{% endif %}">
  58.       {% endif %}
  59.       {% set gallerySliderOptions = {
  60.         slider: {
  61.           navPosition: 'bottom',
  62.           speed: 500,
  63.           gutter: gutter ? gutter : 0,
  64.           controls: navigationArrows ? true : false,
  65.           autoHeight: false,
  66.           startIndex: startIndexThumbnails ? startIndexThumbnails : null
  67.         },
  68.         thumbnailSlider: {
  69.           items: (galleryPosition == "underneath") ? 6 : 5,
  70.           slideBy: (galleryPosition == "underneath") ? 5 : 4,
  71.           controls: true,
  72.           startIndex: startIndexThumbnails ? startIndexThumbnails : null,
  73.           responsive: {
  74.             xs: {
  75.               enabled: false,
  76.               controls: false
  77.             },
  78.             sm: {
  79.               enabled: false,
  80.               controls: false
  81.             }
  82.           }
  83.         }
  84.       } %}
  85.       {% if galleryPosition == "left" %}
  86.         {% set gallerySliderOptions = gallerySliderOptions|replace_recursive({
  87.           thumbnailSlider: {
  88.             responsive: {
  89.               md: {
  90.                 axis: 'vertical'
  91.               },
  92.               lg: {
  93.                 axis: 'vertical'
  94.               },
  95.               xl: {
  96.                 axis: 'vertical'
  97.               }
  98.             }
  99.           }
  100.         }) %}
  101.       {% endif %}
  102.       {% block element_image_gallery_inner %}
  103.         <wyn-carousel
  104.           type="slide"
  105.           per-page="1"
  106.           per-move="1"
  107.           class="media-carousel"
  108.           no-pagination
  109.           auto-hide-controls
  110.           update-on-move
  111.           {% if imageCount > 1 %}
  112.             sync-with="#product-image-gallery-thumbnails-{{ element.id }}"
  113.           {% endif %}
  114.         >
  115.           {% for image in mediaItems %}
  116.             {% block element_image_gallery_inner_item %}
  117.               <div
  118.                 class="media-carousel__slide is-{{ displayMode }}"
  119.                 {% if minHeight and  (displayMode == "cover" or displayMode == "contain" ) %}
  120.                   style="min-height: {{ minHeight }}"
  121.                 {% endif %}
  122.               >
  123.                 {% set attributes = {
  124.                   'class': 'img-fluid gallery-slider-image magnifier-image js-magnifier-image',
  125.                   'alt': (image.translated.alt ?: fallbackImageTitle),
  126.                   'title': (image.translated.title ?: fallbackImageTitle),
  127.                   'data-full-image': image.url
  128.                 } %}
  129.                 {% if displayMode == 'cover' or displayMode == 'contain' %}
  130.                   {% set attributes = attributes|merge({ 'data-object-fit': displayMode }) %}
  131.                 {% endif %}
  132.                 {% if isProduct %}
  133.                   {% set attributes = attributes|merge({ 'itemprop': 'image' }) %}
  134.                 {% endif %}
  135.                 {% sw_thumbnails 'gallery-slider-image-thumbnails' with {
  136.                   media: image,
  137.                   attributes: {
  138.                     class: 'gallery-slider-image js-zoom'
  139.                   }
  140.                 } %}
  141.               </div>
  142.             {% endblock %}
  143.           {% endfor %}
  144.           {% if imageCount > 1 and navigationDots %}
  145.             <wyn-carousel-pagination
  146.               {% if navigationDots == "inside" %}class="pagination-inside"{% endif %}
  147.             ></wyn-carousel-pagination>
  148.           {% endif %}
  149.           {% block element_image_gallery_swiper_prev_next_buttons %}
  150.             <div class="splide__arrows">
  151.               <wyn-button
  152.                 variant="{{ sliderButtonVariant }}"
  153.                 {{ sliderButtonAttrs }}
  154.                 class="splide__arrow splide__arrow--prev"
  155.               >
  156.                 {% sw_icon 'arrow-slider' style { 'slotAttr': 'icon', 'class': 'rotate-180' } %}
  157.               </wyn-button>
  158.               <wyn-button
  159.                 variant="{{ sliderButtonVariant }}"
  160.                 {{ sliderButtonAttrs }}
  161.                 class="splide__arrow splide__arrow--next"
  162.               >
  163.                 {% sw_icon 'arrow-slider' style { 'slotAttr': 'icon' } %}
  164.               </wyn-button>
  165.             </div>
  166.           {% endblock %}
  167.         </wyn-carousel>
  168.         {% block element_image_gallery_inner_col %}
  169.         {% endblock %}
  170.         {% block element_image_gallery_inner_thumbnails_col %}
  171.           {% if imageCount > 1 %}
  172.             {# Thumbnails are not shown in viewports < 1200px width #}
  173.             {% set breakpoints = thumbnailBreakpoints ?? {
  174.               1200: {perPage: 4, perMove: 4},
  175.               1536: {perPage: 5, perMove: 5}
  176.             } %}
  177.             <wyn-carousel
  178.               id="product-image-gallery-thumbnails-{{ element.id }}"
  179.               class="thumbnail-carousel"
  180.               type="slide"
  181.               per-page="{{ thumbnailPerPage ?? 4 }}"
  182.               per-move="{{ thumbnailPerMove ?? 4 }}"
  183.               breakpoints="{{ breakpoints|json_encode }}"
  184.               auto-hide-controls
  185.               update-on-move
  186.               no-pagination
  187.               is-navigation
  188.             >
  189.               {% block element_image_gallery_inner_thumbnails %}
  190.                 {% block element_image_gallery_inner_thumbnails_items %}
  191.                   {% for image in mediaItems %}
  192.                     {% block element_image_gallery_inner_thumbnails_item %}
  193.                       {% block element_image_gallery_inner_thumbnails_item_inner %}
  194.                         {% set attributes = {
  195.                           'class': 'gallery-slider-thumbnails-image',
  196.                           'alt': (image.translated.alt ?: fallbackImageTitle),
  197.                           'title': (image.translated.title ?: fallbackImageTitle)
  198.                         } %}
  199.                         {% if isProduct %}
  200.                           {% set attributes = attributes|merge({ 'itemprop': 'image' }) %}
  201.                         {% endif %}
  202.                         {% sw_thumbnails 'gallery-slider-thumbnails-image-thumbnails' with {
  203.                           media: image,
  204.                           sizes: {
  205.                             'default': '200px'
  206.                           }
  207.                         } %}
  208.                       {% endblock %}
  209.                     {% endblock %}
  210.                   {% endfor %}
  211.                 {% endblock %}
  212.               {% endblock %}
  213.               {% block element_image_gallery_inner_thumbnails_controls %}
  214.                 <div class="splide__arrows">
  215.                   <wyn-button
  216.                       variant="{{ sliderButtonVariant }}"
  217.                       {{ sliderButtonAttrs }}
  218.                     class="splide__arrow splide__arrow--prev"
  219.                   >
  220.                     {% sw_icon 'arrow-slider' style { 'slotAttr': 'icon', 'class': 'rotate-180' } %}
  221.                   </wyn-button>
  222.                   <wyn-button
  223.                       variant="{{ sliderButtonVariant }}"
  224.                       {{ sliderButtonAttrs }}
  225.                     class="splide__arrow splide__arrow--next"
  226.                   >
  227.                     {% sw_icon 'arrow-slider' style { 'slotAttr': 'icon' } %}
  228.                   </wyn-button>
  229.                 </div>
  230.               {% endblock %}
  231.             </wyn-carousel>
  232.           {% endif %}
  233.         {% endblock %}
  234.         {% block element_image_gallery_inner_zoom_modal_wrapper %}
  235.           {% if zoomModal %}
  236.             <div class="zoom-modal-wrapper">
  237.               {% block element_image_gallery_inner_zoom_modal %}
  238.                 <div
  239.                   class="modal is-fullscreen zoom-modal js-zoom-modal{% if imageCount is same as(1) %} no-thumbnails{% endif %}"
  240.                   data-image-zoom-modal="true"
  241.                   tabindex="-1"
  242.                   role="dialog"
  243.                 >
  244.                   {% block element_image_gallery_inner_zoom_modal_dialog %}
  245.                     <div
  246.                       class="modal-dialog"
  247.                       role="document"
  248.                     >
  249.                       {% block element_image_gallery_inner_zoom_modal_content %}
  250.                         <div class="modal-content"{% if imageCount > 1 %} data-modal-gallery-slider="true"{% endif %}>
  251.                           {% block element_image_gallery_inner_zoom_modal_close_button %}
  252.                             <button
  253.                               type="button"
  254.                               class="modal-close close"
  255.                               data-dismiss="modal"
  256.                               aria-label="Close"
  257.                             >
  258.                               {% block element_image_gallery_inner_zoom_modal_close_icon %}
  259.                                 <span aria-hidden="true">
  260.                                     {% sw_icon 'x' style { 'size': 'sm' } %}
  261.                                   </span>
  262.                               {% endblock %}
  263.                             </button>
  264.                           {% endblock %}
  265.                           {% block element_image_gallery_inner_zoom_modal_body %}
  266.                             <div class="modal-body">
  267.                               {% block element_image_gallery_inner_zoom_modal_action_buttons %}
  268.                                 <div
  269.                                   class="zoom-modal-actions btn-group"
  270.                                   role="group"
  271.                                   aria-label="zoom actions"
  272.                                 >
  273.                                   {% block element_image_gallery_inner_zoom_modal_action_zoom_out %}
  274.                                     <button class="btn btn-light image-zoom-btn js-image-zoom-out">
  275.                                       {% block element_image_gallery_inner_zoom_modal_action_zoom_out_icon %}
  276.                                         {% sw_icon 'minus-circle' %}
  277.                                       {% endblock %}
  278.                                     </button>
  279.                                   {% endblock %}
  280.                                   {% block element_image_gallery_inner_zoom_modal_action_zoom_reset %}
  281.                                     <button class="btn btn-light image-zoom-btn js-image-zoom-reset">
  282.                                       {% block element_image_gallery_inner_zoom_modal_action_zoom_reset_icon %}
  283.                                         {% sw_icon 'screen-minimize' %}
  284.                                       {% endblock %}
  285.                                     </button>
  286.                                   {% endblock %}
  287.                                   {% block element_image_gallery_inner_zoom_modal_action_zoom_in %}
  288.                                     <button class="btn btn-light image-zoom-btn js-image-zoom-in">
  289.                                       {% block element_image_gallery_inner_zoom_modal_action_zoom_in_icon %}
  290.                                         {% sw_icon 'plus-circle' %}
  291.                                       {% endblock %}
  292.                                     </button>
  293.                                   {% endblock %}
  294.                                 </div>
  295.                               {% endblock %}
  296.                               {% block element_image_gallery_inner_zoom_modal_slider %}
  297.                                 <div
  298.                                   class="gallery-slider"
  299.                                   data-gallery-slider-container="true"
  300.                                 >
  301.                                   {% block element_image_gallery_inner_zoom_modal_slider_items %}
  302.                                     {% for image in mediaItems %}
  303.                                       {% block element_image_gallery_inner_zoom_modal_slider_item %}
  304.                                         <div class="gallery-slider-item">
  305.                                           {% block element_image_gallery_inner_zoom_modal_slider_item_zoom_container %}
  306.                                             <div
  307.                                               class="image-zoom-container"
  308.                                               data-image-zoom="true"
  309.                                             >
  310.                                               {% block element_image_gallery_inner_zoom_modal_slider_item_image %}
  311.                                                 {% sw_thumbnails 'gallery-slider-image-thumbnails' with {
  312.                                                   media: image,
  313.                                                   attributes: {
  314.                                                     'class': 'gallery-slider-image js-image-zoom-element js-load-img',
  315.                                                     'alt': (image.translated.alt ?: fallbackImageTitle),
  316.                                                     'title': (image.translated.title ?: fallbackImageTitle)
  317.                                                   },
  318.                                                   load: false,
  319.                                                   loadOriginalImage: true,
  320.                                                   autoColumnSizes: false
  321.                                                 } %}
  322.                                               {% endblock %}
  323.                                             </div>
  324.                                           {% endblock %}
  325.                                         </div>
  326.                                       {% endblock %}
  327.                                     {% endfor %}
  328.                                   {% endblock %}
  329.                                 </div>
  330.                               {% endblock %}
  331.                               {% block element_image_gallery_inner_zoom_modal_slider_controls %}
  332.                                 {% if imageCount > 1 %}
  333.                                   <div
  334.                                     class="gallery-slider-controls"
  335.                                     data-gallery-slider-controls="true"
  336.                                   >
  337.                                     {% block element_image_gallery_inner_zoom_modal_slider_control_prev %}
  338.                                       <button
  339.                                         class="base-slider-controls-prev gallery-slider-controls-prev btn-icon btn-icon--light btn-icon--with-shadow"
  340.                                         aria-label="{{ 'general.previous'|trans|striptags }}"
  341.                                       >
  342.                                         {% block element_image_gallery_inner_zoom_modal_slider_control_prev_icon %}
  343.                                           {% sw_icon 'arrow-head-left' %}
  344.                                         {% endblock %}
  345.                                       </button>
  346.                                     {% endblock %}
  347.                                     {% block element_image_gallery_inner_zoom_modal_slider_control_next %}
  348.                                       <button
  349.                                         class="base-slider-controls-next gallery-slider-controls-next btn-icon btn-icon--light btn-icon--with-shadow"
  350.                                         aria-label="{{ 'general.next'|trans|striptags }}"
  351.                                       >
  352.                                         {% block element_image_gallery_inner_zoom_modal_slider_control_next_icon %}
  353.                                           {% sw_icon 'arrow-head-right' %}
  354.                                         {% endblock %}
  355.                                       </button>
  356.                                     {% endblock %}
  357.                                   </div>
  358.                                 {% endif %}
  359.                               {% endblock %}
  360.                             </div>
  361.                           {% endblock %}
  362.                           {% if imageCount > 1 %}
  363.                             {% block element_image_gallery_inner_zoom_modal_footer %}
  364.                               <div class="modal-footer">
  365.                                 {% block element_image_gallery_inner_zoom_modal_thumbnails_controls %}
  366.                                   <div class="gallery-slider-modal-controls">
  367.                                     <div
  368.                                       data-thumbnail-slider-controls="true"
  369.                                       class="gallery-slider-modal-thumbnails"
  370.                                     >
  371.                                       <button
  372.                                         class="base-slider-controls-prev gallery-slider-thumbnails-controls-prev"
  373.                                         aria-label="{{ 'general.previous'|trans|striptags }}"
  374.                                       >
  375.                                         {% sw_icon 'arrow-head-left' %}
  376.                                       </button>
  377.                                       <button
  378.                                         class="base-slider-controls-next gallery-slider-thumbnails-controls-next"
  379.                                         aria-label="{{ 'general.next'|trans|striptags }}"
  380.                                       >
  381.                                         {% sw_icon 'arrow-head-right' %}
  382.                                       </button>
  383.                                     </div>
  384.                                   </div>
  385.                                 {% endblock %}
  386.                                 {% block element_image_gallery_inner_zoom_modal_thumbnails %}
  387.                                   <div
  388.                                     class="gallery-slider-thumbnails"
  389.                                     data-gallery-slider-thumbnails=true
  390.                                   >
  391.                                     {% block element_image_gallery_inner_zoom_modal_thumbnails_items %}
  392.                                       {% for image in mediaItems %}
  393.                                         {% block element_image_gallery_inner_zoom_modal_thumbnails_item %}
  394.                                           <div class="gallery-slider-thumbnails-item">
  395.                                             {% block element_image_gallery_inner_zoom_modal_thumbnails_item_inner %}
  396.                                               <div class="gallery-slider-thumbnails-item-inner">
  397.                                                 {% sw_thumbnails 'gallery-slider-thumbnails-image-thumbnails' with {
  398.                                                   media: image,
  399.                                                   sizes: {
  400.                                                     'default': '200px'
  401.                                                   },
  402.                                                   attributes: {
  403.                                                     'class': 'gallery-slider-thumbnails-image js-load-img',
  404.                                                     'alt': (image.translated.alt ?: fallbackImageTitle),
  405.                                                     'title': (image.translated.title ?: fallbackImageTitle)
  406.                                                   },
  407.                                                   load: false
  408.                                                 } %}
  409.                                               </div>
  410.                                             {% endblock %}
  411.                                           </div>
  412.                                         {% endblock %}
  413.                                       {% endfor %}
  414.                                     {% endblock %}
  415.                                   </div>
  416.                                 {% endblock %}
  417.                               </div>
  418.                             {% endblock %}
  419.                           {% endif %}
  420.                         </div>
  421.                       {% endblock %}
  422.                     </div>
  423.                   {% endblock %}
  424.                 </div>
  425.               {% endblock %}
  426.             </div>
  427.           {% endif %}
  428.         {% endblock %}
  429.       {% endblock %}
  430.       {% if config.verticalAlign.value %}
  431.         </div>
  432.       {% endif %}
  433.     {% endblock %}
  434.   </div>
  435. {% endblock %}