templates/areas/keyvisual/view.html.twig line 46

Open in your IDE?
  1. {% set brandStyles = document.getProperty('brandStyles') | default('none') %}
  2. {% set slideCount = pimcore_numeric('slideCount').getData() | default(3) %}
  3. {% set autoplayDelay = pimcore_numeric('autoplay_delay').getData() | default(5000) %}
  4. {# Check if any slides are active #}
  5. {% set hasActiveSlides = false %}
  6. {% for i in 1..10 %}
  7.     {% if pimcore_checkbox('slide_active_' ~ i).isChecked() %}
  8.         {% set hasActiveSlides = true %}
  9.     {% endif %}
  10. {% endfor %}
  11. {% if hasActiveSlides %}
  12.     {# New structure with multiple slides #}
  13.     {% set slides = [] %}
  14.     {% for i in 1..10 %}
  15.         {% if pimcore_checkbox('slide_active_' ~ i).isChecked() %}
  16.             {% set currentLink = pimcore_link('content_link_' ~ i) %}
  17.             {% set slides = slides|merge([{
  18.                 desktop_image: pimcore_image('slide_image_' ~ i),
  19.                 mobile_image: pimcore_image('slide_mobile_image_' ~ i),
  20.                 headline: brandStyles == 'Mini' 
  21.                     ? pimcore_wysiwyg('content_headline_' ~ i).getData()
  22.                     : pimcore_input('content_headline_' ~ i).getData(),
  23.                 headline_color: pimcore_select('content_headline_color_' ~ i).getData() | default('text-white'),
  24.                 text: pimcore_input('content_text_' ~ i).getData(),
  25.                 text_color: pimcore_select('content_text_color_' ~ i).getData() | default('text-white'),
  26.                 link: currentLink.isEmpty() ? null : {
  27.                     'path': currentLink.getHref(),
  28.                     'text': currentLink.getText() ?: 'Mehr erfahren'
  29.                 },
  30.                 consumption_notice: {
  31.                     active: pimcore_checkbox('consumption_notice_active_' ~ i).isChecked(),
  32.                     text: pimcore_input('consumption_notice_text_' ~ i).getData(),
  33.                     color: pimcore_select('consumption_notice_color_' ~ i).getData() | default('white'),
  34.                     transparent: pimcore_checkbox('consumption_notice_transparent_' ~ i).isChecked()
  35.                 }
  36.             }]) %}
  37.         {% endif %}
  38.     {% endfor %}
  39. {% else %}
  40.     {# Legacy structure with single slide #}
  41.     {% set slides = [{
  42.         desktop_image: pimcore_image('kv-image'),
  43.         mobile_image: pimcore_image('kv-mobile-image'),
  44.         headline: brandStyles == 'Mini' 
  45.             ? pimcore_wysiwyg('kv-headline').getData()
  46.             : pimcore_input('kv-headline').getData(),
  47.         headline_color: 'text-white',
  48.         text: pimcore_input('kv-text').getData(),
  49.         text_color: 'text-white',
  50.         link: pimcore_link('kv-link').isEmpty() ? null : {
  51.             'path': pimcore_link('kv-link').getHref(),
  52.             'text': pimcore_link('kv-link').getText() ?: 'Mehr erfahren'
  53.         },
  54.         consumption_notice: {
  55.             active: pimcore_checkbox('show_consumption_notice').isChecked(),
  56.             text: pimcore_textarea('consumption_notice_text').getData(),
  57.             color: pimcore_select('consumption_notice_color').getData() | default('white'),
  58.             transparent: pimcore_checkbox('consumption_notice_transparent').isChecked()
  59.         }
  60.     }] %}
  61. {% endif %}
  62. {# Get design settings #}
  63. {% set keyvisualDesign = pimcore_select('keyvisual_design').getData() | default('fullscreen') %}
  64. {% set keyvisualMobileDesign = pimcore_select('keyvisual_mobile_design').getData() | default('inherit') %}
  65. {% set mobileDesign = keyvisualMobileDesign == 'inherit' ? keyvisualDesign : keyvisualMobileDesign %}
  66. {% set keyvisualHeight = pimcore_numeric('keyvisual_height').getData() | default(70) %}
  67. {# Check for consumption notice #}
  68. {% set hasConsumptionNotice = false %}
  69. {% for slide in slides %}
  70.     {% if slide.consumption_notice.active and slide.consumption_notice.text %}
  71.         {% set hasConsumptionNotice = true %}
  72.     {% endif %}
  73. {% endfor %}
  74. {# Get consumption notice settings #}
  75. {% set showConsumptionNotice = pimcore_checkbox('show_consumption_notice').isChecked() %}
  76. {% set consumptionNoticeText = pimcore_textarea('consumption_notice_text').getData() %}
  77. {% set consumptionNoticeColor = pimcore_select('consumption_notice_color').getData() | default('white') %}
  78. {% set consumptionNoticeTransparent = pimcore_checkbox('consumption_notice_transparent').isChecked() %}
  79. {# Add design class based on selected layout #}
  80. <div class="keyvisual keyvisual--{{ keyvisualDesign }} keyvisual-mobile--{{ mobileDesign }}
  81.     {% if slides|length > 1 %}has-multiple-slides{% endif %}
  82.     {% if hasConsumptionNotice %}has-consumption-notice{% endif %}"
  83.     {% if keyvisualDesign == 'minimal' %}style="min-height: {{ keyvisualHeight }}vh"{% endif %}>
  84.     <!-- Slider main container -->
  85.     <div class="swiper keyvisual-swiper">
  86.         <!-- Additional required wrapper -->
  87.         <div class="swiper-wrapper">
  88.             <!-- Slides -->
  89.             {% for slide in slides %}
  90.                 {% set isClickable = hasActiveSlides ? pimcore_checkbox('slide_clickable_' ~ loop.index).isChecked() and not pimcore_link('slide_link_' ~ loop.index).isEmpty() : not pimcore_link('kv-link').isEmpty() %}
  91.                 {% set showButton = hasActiveSlides ? pimcore_checkbox('show_button_' ~ loop.index).isChecked() : not pimcore_link('kv-link').isEmpty() %}
  92.                 {% set isSplitView = hasActiveSlides and pimcore_checkbox('split_view_' ~ loop.index).isChecked() %}
  93.                 {% set splitRatio = isSplitView ? pimcore_select('split_ratio_' ~ loop.index).getData() | default('50-50') : '50-50' %}
  94.                 {% set splitLeftLink = pimcore_link('split_left_link_' ~ loop.index) %}
  95.                 {% set splitRightLink = pimcore_link('split_right_link_' ~ loop.index) %}
  96.                 
  97.                 <div class="swiper-slide{% if isClickable and not isSplitView %} cursor-pointer{% endif %}{% if isSplitView %} split-view split-{{ splitRatio }}{% endif %}"
  98.                     {% if isClickable and not isSplitView %}data-href="{{ hasActiveSlides ? pimcore_link('slide_link_' ~ loop.index).getHref() : pimcore_link('kv-link').getHref() }}"{% endif %}>
  99.                     {% if isSplitView %}
  100.                         <div class="split-overlay">
  101.                             {% if not splitLeftLink.isEmpty() %}
  102.                                 <div class="split-left" data-href="{{ splitLeftLink.getHref() }}" title="Link: {{ splitLeftLink.getHref() }}">
  103.                                     <div class="split-hover-indicator"></div>
  104.                                 </div>
  105.                             {% endif %}
  106.                             {% if not splitRightLink.isEmpty() %}
  107.                                 <div class="split-right" data-href="{{ splitRightLink.getHref() }}" title="Link: {{ splitRightLink.getHref() }}">
  108.                                     <div class="split-hover-indicator"></div>
  109.                                 </div>
  110.                             {% endif %}
  111.                         </div>
  112.                     {% endif %}
  113.                     <picture>
  114.                         {% if not slide.desktop_image.isEmpty() %}
  115.                             <source media="(min-width:768px)" srcset="{{ slide.desktop_image.getSrc() }}">
  116.                         {% endif %}
  117.                         {% if not slide.mobile_image.isEmpty() %}
  118.                             <img src="{{ slide.mobile_image.getSrc() }}"
  119.                                  alt="{{ slide.mobile_image.getAlt() }}"/>
  120.                         {% else %}
  121.                             <img src="{{ slide.desktop_image.getSrc() }}" 
  122.                                  alt="{{ slide.desktop_image.getAlt() }}"/>
  123.                         {% endif %}
  124.                     </picture>
  125.                     <div class="keyvisual-inner">
  126.                         {% set slideAlignment = pimcore_select('content_text_alignment_' ~ loop.index).getData() %}
  127.                         <div class="keyvisual-inner-text {{ slideAlignment == 'inherit' ? pimcore_select('content_text_alignment').getData() | default('text-start') : slideAlignment }}">
  128.                             {% if slide.headline is not empty %}
  129.                                 <h1 class="{{ slide.headline_color }}">
  130.                                     {{ slide.headline|raw }}
  131.                                 </h1>
  132.                             {% endif %}
  133.                             {% if slide.text is not empty %}
  134.                                 <h2 class="{{ slide.text_color }}">
  135.                                     {{ slide.text }}
  136.                                 </h2>
  137.                             {% endif %}
  138.                             {% if showButton %}
  139.                                 {% if hasActiveSlides %}
  140.                                     {% set buttonLink = pimcore_link('button_link_' ~ loop.index) %}
  141.                                     {% if not buttonLink.isEmpty() %}
  142.                                         <a href="{{ buttonLink.getHref() }}" class="btn {{ pimcore_select('button_style_' ~ loop.index).getData() | default('btn-secondary') }}">
  143.                                             {{ buttonLink.getText() ?: 'Mehr erfahren' }}
  144.                                         </a>
  145.                                     {% endif %}
  146.                                 {% else %}
  147.                                     <a href="{{ pimcore_link('kv-link').getHref() }}" class="btn {{ pimcore_select('button_style').getData() | default('btn-secondary') }}">
  148.                                         {{ pimcore_link('kv-link').getText() ?: 'Mehr erfahren' }}
  149.                                     </a>
  150.                                 {% endif %}
  151.                             {% endif %}
  152.                         </div>
  153.                     </div>
  154.                     {% if slide.consumption_notice.active and slide.consumption_notice.text %}
  155.                         <div class="keyvisual-consumption-notice {% if slide.consumption_notice.transparent %}keyvisual-consumption-notice--transparent{% endif %} keyvisual-consumption-notice--{{ slide.consumption_notice.color }} keyvisual-consumption-notice--{{ keyvisualDesign }} {{ pimcore_select('consumption_notice_alignment_' ~ loop.index).getData() | default('text-center') }}">
  156.                             {{ slide.consumption_notice.text|raw }}
  157.                         </div>
  158.                     {% endif %}
  159.                 </div>
  160.             {% endfor %}
  161.         </div>
  162.         
  163.         {# Show navigation only if we have more than 1 active slide #}
  164.         {% if slides|length > 1 %}
  165.             <div class="swiper-button-prev"></div>
  166.             <div class="swiper-button-next"></div>
  167.             <div class="swiper-pagination"></div>
  168.         {% endif %}
  169.     </div>
  170.     {% if pimcore_checkbox('show_widget').isChecked() %}
  171.         <div class="keyvisual-searchbox">
  172.             <form action="/fahrzeugboerse" method="get" id="keyvisual-search-form">
  173.                 <div class="d-flex flex-column flex-md-row">
  174.                     <div class="row flex-grow-1">
  175.                         <div class="col-md-4">
  176.                             <select name="car_list_filter_form[car_type]" id="keyvis-search-car-type"
  177.                                     class="update-trigger">
  178.                                 <option value="" disabled selected hidden>Fahrzeugart</option>
  179.                                 {% for category in vehicleCategories %}
  180.                                     <option value="{{ category }}">{{ category }}</option>
  181.                                 {% endfor %}
  182.                             </select>
  183.                         </div>
  184.                         <div class="col-md-4">
  185.                             <select name="car_list_filter_form[car_make]" id="keyvis-search-car-make"
  186.                                     class="update-trigger">
  187.                                 <option value="" disabled selected hidden>Marke</option>
  188.                                 {% for make in vehicleMakes %}
  189.                                     <option value="{{ make }}">{{ make }}</option>
  190.                                 {% endfor %}
  191.                             </select>
  192.                         </div>
  193.                         <div class="col-md-4">
  194.                             <select name="car_list_filter_form[car_model]" id="keyvis-search-car-model">
  195.                                 <option value="" disabled selected hidden>Modell</option>
  196.                                 <option value="" disabled hidden>bitte wähler Sie erst eine Marke</option>
  197.                             </select>
  198.                         </div>
  199.                     </div>
  200.                     <button type="submit" class="btn btn-primary justify-content-center mt-3 mb-2 my-md-0">Suchen
  201.                     </button>
  202.                 </div>
  203.             </form>
  204.             {% set kvLink = pimcore_link('kv-link') %}
  205.             {% if not kvLink.isEmpty() %}
  206.                 <a href="{{ kvLink.getHref() }}" class="btn btn-primary">{{ kvLink.getText() ?: 'Mehr erfahren' }}</a>
  207.             {% endif %}
  208.         </div>
  209.     {% endif %}
  210. </div>
  211. <script>
  212.     /* Do things after DOM has fully loaded */
  213. //     if (typeof ready !== 'undefined') {
  214. //         let ready = (callback) => {
  215. //             if (document.readyState !== 'loading') callback();
  216. //             else document.addEventListener('DOMContentLoaded', callback);
  217. //         };
  218. //     }
  219.     let loaded = () => {
  220.         let keyvisualSearchForm = document.getElementById('keyvisual-search-form');
  221.         let typeSelect = keyvisualSearchForm ? keyvisualSearchForm.querySelector('#keyvis-search-car-type') : null;
  222.         let makeSelect = keyvisualSearchForm ? keyvisualSearchForm.querySelector('#keyvis-search-car-make') : null;
  223.         if (keyvisualSearchForm) {
  224.             makeSelect.addEventListener('change', (e) => {
  225.                 updateModelsForMake(makeSelect.value)
  226.             });
  227.             keyvisualSearchForm.querySelectorAll('select').forEach(filterSelect => {
  228.                 filterSelect.addEventListener('change', (e) => {
  229.                     console.log('updated: ' + filterSelect.name);
  230.                     getQueryFilter();
  231.                     let models = fetchData();
  232.                     console.log(models);
  233.                 });
  234.             });
  235.         }
  236.         function getQueryFilter() {
  237.             let queryFilter = [];
  238.             console.log("type: " + typeSelect.value);
  239.             console.log("make: " + makeSelect.value);
  240.             if (typeSelect.value !== undefined && typeSelect.value.length >= 1) {
  241.                 queryFilter.push('\\\"vehicleBaseData.kategorie\\\": \\\"' + typeSelect.value + '\\\"')
  242.             }
  243.             if (makeSelect.value !== undefined && makeSelect.value.length >= 1) {
  244.                 queryFilter.push('\\\"vehicleBaseData.marke\\\": \\\"' + makeSelect.value + '\\\"')
  245.             }
  246.             let filter = queryFilter.join(",")
  247.             return "filter: \"{" + filter + "}\""; //"filter: {\"" + filter + "\"}"
  248.         }
  249.         function updateModelsForMake(make) {
  250.             let result = '';
  251.             fetch('/pimcore-graphql-webservices/vehicles', {
  252.                 method: 'POST',
  253.                 headers: {
  254.                     'Accept-Encoding': 'gzip, deflate, br',
  255.                     'Content-Type': 'application/json',
  256.                     'Accept': 'application/json',
  257.                     'Connection': 'keep-alive',
  258.                     'DNT': '1',
  259.                     // 'Origin': 'https://timmermanns.test',
  260.                     'X-API-Key': 'a406e0ce0d5d7281fd92d81b9cb1aae0'
  261.                 },
  262.                 body: JSON.stringify({
  263.                     query: '{ getVehicleMake(fullpath: "/Gebrauchte/Marken/' + make + '") { makeName, makeModels }}',
  264.                     variables: {
  265.                         now: new Date().toISOString(),
  266.                     },
  267.                 }),
  268.             })
  269.                 .then((res) => res.json())
  270.                 .then((result) => {
  271.                     let rawModels = JSON.parse(result.data['getVehicleMake']['makeModels']);
  272.                     let modelSelect = document.getElementById('keyvis-search-car-model');
  273.                     while (modelSelect.options.length > 0) {
  274.                         modelSelect.remove(modelSelect.options.length - 1);
  275.                     }
  276.                     let option = document.createElement('option');
  277.                     option.text = 'Modell';
  278.                     option.value = '';
  279.                     modelSelect.add(option);
  280.                     for (let i in rawModels) {
  281.                         console.log(rawModels[i][0]);
  282.                         option = document.createElement('option');
  283.                         option.text = rawModels[i][0];
  284.                         option.value = rawModels[i][0];
  285.                         modelSelect.add(option);
  286.                     }
  287.                 })
  288.                 .catch(error => {
  289.                     console.log(error);
  290.                 });
  291.         }
  292.         function fetchData() {
  293.             fetch('/pimcore-graphql-webservices/vehicles', {
  294.                 method: 'POST',
  295.                 headers: {
  296.                     'Accept-Encoding': 'gzip, deflate, br',
  297.                     'Content-Type': 'application/json',
  298.                     'Accept': 'application/json',
  299.                     'Connection': 'keep-alive',
  300.                     'DNT': '1',
  301.                     // 'Origin': 'https://timmermanns.test',
  302.                     'X-API-Key': 'a406e0ce0d5d7281fd92d81b9cb1aae0'
  303.                 },
  304.                 body: JSON.stringify({
  305.                     query: `
  306.         {
  307.   getVehicleListing(
  308.     `+ getQueryFilter() +`
  309.     published: true
  310.   ) {
  311.     totalCount
  312.     edges {
  313.       node {
  314.         interneNummer
  315.         id
  316.         marke
  317.         modell
  318.         modellbasis
  319.         kategorie
  320.       }
  321.     }
  322.   }
  323. }
  324.       `,
  325.                     variables: {
  326.                         now: new Date().toISOString(),
  327.                     },
  328.                 }),
  329.             })
  330.                 .then((res) => res.json())
  331.                 .then((result) => console.log(result));
  332.         }
  333.     };
  334.     if (document.readyState === 'loading'){
  335.         document.addEventListener("DOMContentLoaded", loaded);
  336.     } else {
  337.         loaded();
  338.     }
  339.     document.addEventListener('DOMContentLoaded', function() {
  340.         const swiper = new Swiper('.keyvisual-swiper', {
  341.             loop: {{ slides|length > 1 ? 'true' : 'false' }},
  342.             {% if slides|length > 1 %}
  343.             navigation: {
  344.                 nextEl: '.swiper-button-next',
  345.                 prevEl: '.swiper-button-prev',
  346.             },
  347.             pagination: {
  348.                 el: '.swiper-pagination',
  349.                 clickable: true
  350.             },
  351.             {% endif %}
  352.             autoplay: {% if pimcore_checkbox('enable_autoplay').isChecked() and pimcore_numeric('autoplay_delay').getData() > 0 %}{
  353.                 delay: {{ pimcore_numeric('autoplay_delay').getData() }},
  354.                 disableOnInteraction: false,
  355.             }{% else %}false{% endif %}
  356.         });
  357.         const splitElements = document.querySelectorAll('.split-left, .split-right');
  358.         // Add click handler for split view sections
  359.         splitElements.forEach(section => {
  360.             
  361.             section.addEventListener('click', function(e) {
  362.                 e.stopPropagation(); // Prevent slide click
  363.                 const href = this.getAttribute('data-href');
  364.                 if (href) {
  365.                     window.location.href = href;
  366.                 }
  367.             });
  368.         });
  369.         // Add click handler for clickable slides (only for non-split-view slides)
  370.         document.querySelectorAll('.keyvisual-swiper .swiper-slide[data-href]').forEach(slide => {
  371.             slide.addEventListener('click', function(e) {
  372.                 // Only trigger if not clicking a button, link or split section
  373.                 if (!e.target.closest('a') && !e.target.closest('button') && !e.target.closest('.split-left') && !e.target.closest('.split-right')) {
  374.                     const href = this.getAttribute('data-href');
  375.                     if (href) {
  376.                         window.location.href = href;
  377.                     }
  378.                 }
  379.             });
  380.         });
  381.     });
  382. </script>