{% set brandStyles = document.getProperty('brandStyles') | default('none') %}
{% set slideCount = pimcore_numeric('slideCount').getData() | default(3) %}
{% set autoplayDelay = pimcore_numeric('autoplay_delay').getData() | default(5000) %}
{# Check if any slides are active #}
{% set hasActiveSlides = false %}
{% for i in 1..10 %}
{% if pimcore_checkbox('slide_active_' ~ i).isChecked() %}
{% set hasActiveSlides = true %}
{% endif %}
{% endfor %}
{% if hasActiveSlides %}
{# New structure with multiple slides #}
{% set slides = [] %}
{% for i in 1..10 %}
{% if pimcore_checkbox('slide_active_' ~ i).isChecked() %}
{% set currentLink = pimcore_link('content_link_' ~ i) %}
{% set slides = slides|merge([{
desktop_image: pimcore_image('slide_image_' ~ i),
mobile_image: pimcore_image('slide_mobile_image_' ~ i),
headline: brandStyles == 'Mini'
? pimcore_wysiwyg('content_headline_' ~ i).getData()
: pimcore_input('content_headline_' ~ i).getData(),
headline_color: pimcore_select('content_headline_color_' ~ i).getData() | default('text-white'),
text: pimcore_input('content_text_' ~ i).getData(),
text_color: pimcore_select('content_text_color_' ~ i).getData() | default('text-white'),
link: currentLink.isEmpty() ? null : {
'path': currentLink.getHref(),
'text': currentLink.getText() ?: 'Mehr erfahren'
},
consumption_notice: {
active: pimcore_checkbox('consumption_notice_active_' ~ i).isChecked(),
text: pimcore_input('consumption_notice_text_' ~ i).getData(),
color: pimcore_select('consumption_notice_color_' ~ i).getData() | default('white'),
transparent: pimcore_checkbox('consumption_notice_transparent_' ~ i).isChecked()
}
}]) %}
{% endif %}
{% endfor %}
{% else %}
{# Legacy structure with single slide #}
{% set slides = [{
desktop_image: pimcore_image('kv-image'),
mobile_image: pimcore_image('kv-mobile-image'),
headline: brandStyles == 'Mini'
? pimcore_wysiwyg('kv-headline').getData()
: pimcore_input('kv-headline').getData(),
headline_color: 'text-white',
text: pimcore_input('kv-text').getData(),
text_color: 'text-white',
link: pimcore_link('kv-link').isEmpty() ? null : {
'path': pimcore_link('kv-link').getHref(),
'text': pimcore_link('kv-link').getText() ?: 'Mehr erfahren'
},
consumption_notice: {
active: pimcore_checkbox('show_consumption_notice').isChecked(),
text: pimcore_textarea('consumption_notice_text').getData(),
color: pimcore_select('consumption_notice_color').getData() | default('white'),
transparent: pimcore_checkbox('consumption_notice_transparent').isChecked()
}
}] %}
{% endif %}
{# Get design settings #}
{% set keyvisualDesign = pimcore_select('keyvisual_design').getData() | default('fullscreen') %}
{% set keyvisualMobileDesign = pimcore_select('keyvisual_mobile_design').getData() | default('inherit') %}
{% set mobileDesign = keyvisualMobileDesign == 'inherit' ? keyvisualDesign : keyvisualMobileDesign %}
{% set keyvisualHeight = pimcore_numeric('keyvisual_height').getData() | default(70) %}
{# Check for consumption notice #}
{% set hasConsumptionNotice = false %}
{% for slide in slides %}
{% if slide.consumption_notice.active and slide.consumption_notice.text %}
{% set hasConsumptionNotice = true %}
{% endif %}
{% endfor %}
{# Get consumption notice settings #}
{% set showConsumptionNotice = pimcore_checkbox('show_consumption_notice').isChecked() %}
{% set consumptionNoticeText = pimcore_textarea('consumption_notice_text').getData() %}
{% set consumptionNoticeColor = pimcore_select('consumption_notice_color').getData() | default('white') %}
{% set consumptionNoticeTransparent = pimcore_checkbox('consumption_notice_transparent').isChecked() %}
{# Add design class based on selected layout #}
<div class="keyvisual keyvisual--{{ keyvisualDesign }} keyvisual-mobile--{{ mobileDesign }}
{% if slides|length > 1 %}has-multiple-slides{% endif %}
{% if hasConsumptionNotice %}has-consumption-notice{% endif %}"
{% if keyvisualDesign == 'minimal' %}style="min-height: {{ keyvisualHeight }}vh"{% endif %}>
<!-- Slider main container -->
<div class="swiper keyvisual-swiper">
<!-- Additional required wrapper -->
<div class="swiper-wrapper">
<!-- Slides -->
{% for slide in slides %}
{% 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() %}
{% set showButton = hasActiveSlides ? pimcore_checkbox('show_button_' ~ loop.index).isChecked() : not pimcore_link('kv-link').isEmpty() %}
{% set isSplitView = hasActiveSlides and pimcore_checkbox('split_view_' ~ loop.index).isChecked() %}
{% set splitRatio = isSplitView ? pimcore_select('split_ratio_' ~ loop.index).getData() | default('50-50') : '50-50' %}
{% set splitLeftLink = pimcore_link('split_left_link_' ~ loop.index) %}
{% set splitRightLink = pimcore_link('split_right_link_' ~ loop.index) %}
<div class="swiper-slide{% if isClickable and not isSplitView %} cursor-pointer{% endif %}{% if isSplitView %} split-view split-{{ splitRatio }}{% endif %}"
{% if isClickable and not isSplitView %}data-href="{{ hasActiveSlides ? pimcore_link('slide_link_' ~ loop.index).getHref() : pimcore_link('kv-link').getHref() }}"{% endif %}>
{% if isSplitView %}
<div class="split-overlay">
{% if not splitLeftLink.isEmpty() %}
<div class="split-left" data-href="{{ splitLeftLink.getHref() }}" title="Link: {{ splitLeftLink.getHref() }}">
<div class="split-hover-indicator"></div>
</div>
{% endif %}
{% if not splitRightLink.isEmpty() %}
<div class="split-right" data-href="{{ splitRightLink.getHref() }}" title="Link: {{ splitRightLink.getHref() }}">
<div class="split-hover-indicator"></div>
</div>
{% endif %}
</div>
{% endif %}
<picture>
{% if not slide.desktop_image.isEmpty() %}
<source media="(min-width:768px)" srcset="{{ slide.desktop_image.getSrc() }}">
{% endif %}
{% if not slide.mobile_image.isEmpty() %}
<img src="{{ slide.mobile_image.getSrc() }}"
alt="{{ slide.mobile_image.getAlt() }}"/>
{% else %}
<img src="{{ slide.desktop_image.getSrc() }}"
alt="{{ slide.desktop_image.getAlt() }}"/>
{% endif %}
</picture>
<div class="keyvisual-inner">
{% set slideAlignment = pimcore_select('content_text_alignment_' ~ loop.index).getData() %}
<div class="keyvisual-inner-text {{ slideAlignment == 'inherit' ? pimcore_select('content_text_alignment').getData() | default('text-start') : slideAlignment }}">
{% if slide.headline is not empty %}
<h1 class="{{ slide.headline_color }}">
{{ slide.headline|raw }}
</h1>
{% endif %}
{% if slide.text is not empty %}
<h2 class="{{ slide.text_color }}">
{{ slide.text }}
</h2>
{% endif %}
{% if showButton %}
{% if hasActiveSlides %}
{% set buttonLink = pimcore_link('button_link_' ~ loop.index) %}
{% if not buttonLink.isEmpty() %}
<a href="{{ buttonLink.getHref() }}" class="btn {{ pimcore_select('button_style_' ~ loop.index).getData() | default('btn-secondary') }}">
{{ buttonLink.getText() ?: 'Mehr erfahren' }}
</a>
{% endif %}
{% else %}
<a href="{{ pimcore_link('kv-link').getHref() }}" class="btn {{ pimcore_select('button_style').getData() | default('btn-secondary') }}">
{{ pimcore_link('kv-link').getText() ?: 'Mehr erfahren' }}
</a>
{% endif %}
{% endif %}
</div>
</div>
{% if slide.consumption_notice.active and slide.consumption_notice.text %}
<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') }}">
{{ slide.consumption_notice.text|raw }}
</div>
{% endif %}
</div>
{% endfor %}
</div>
{# Show navigation only if we have more than 1 active slide #}
{% if slides|length > 1 %}
<div class="swiper-button-prev"></div>
<div class="swiper-button-next"></div>
<div class="swiper-pagination"></div>
{% endif %}
</div>
{% if pimcore_checkbox('show_widget').isChecked() %}
<div class="keyvisual-searchbox">
<form action="/fahrzeugboerse" method="get" id="keyvisual-search-form">
<div class="d-flex flex-column flex-md-row">
<div class="row flex-grow-1">
<div class="col-md-4">
<select name="car_list_filter_form[car_type]" id="keyvis-search-car-type"
class="update-trigger">
<option value="" disabled selected hidden>Fahrzeugart</option>
{% for category in vehicleCategories %}
<option value="{{ category }}">{{ category }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-4">
<select name="car_list_filter_form[car_make]" id="keyvis-search-car-make"
class="update-trigger">
<option value="" disabled selected hidden>Marke</option>
{% for make in vehicleMakes %}
<option value="{{ make }}">{{ make }}</option>
{% endfor %}
</select>
</div>
<div class="col-md-4">
<select name="car_list_filter_form[car_model]" id="keyvis-search-car-model">
<option value="" disabled selected hidden>Modell</option>
<option value="" disabled hidden>bitte wähler Sie erst eine Marke</option>
</select>
</div>
</div>
<button type="submit" class="btn btn-primary justify-content-center mt-3 mb-2 my-md-0">Suchen
</button>
</div>
</form>
{% set kvLink = pimcore_link('kv-link') %}
{% if not kvLink.isEmpty() %}
<a href="{{ kvLink.getHref() }}" class="btn btn-primary">{{ kvLink.getText() ?: 'Mehr erfahren' }}</a>
{% endif %}
</div>
{% endif %}
</div>
<script>
/* Do things after DOM has fully loaded */
// if (typeof ready !== 'undefined') {
// let ready = (callback) => {
// if (document.readyState !== 'loading') callback();
// else document.addEventListener('DOMContentLoaded', callback);
// };
// }
let loaded = () => {
let keyvisualSearchForm = document.getElementById('keyvisual-search-form');
let typeSelect = keyvisualSearchForm ? keyvisualSearchForm.querySelector('#keyvis-search-car-type') : null;
let makeSelect = keyvisualSearchForm ? keyvisualSearchForm.querySelector('#keyvis-search-car-make') : null;
if (keyvisualSearchForm) {
makeSelect.addEventListener('change', (e) => {
updateModelsForMake(makeSelect.value)
});
keyvisualSearchForm.querySelectorAll('select').forEach(filterSelect => {
filterSelect.addEventListener('change', (e) => {
console.log('updated: ' + filterSelect.name);
getQueryFilter();
let models = fetchData();
console.log(models);
});
});
}
function getQueryFilter() {
let queryFilter = [];
console.log("type: " + typeSelect.value);
console.log("make: " + makeSelect.value);
if (typeSelect.value !== undefined && typeSelect.value.length >= 1) {
queryFilter.push('\\\"vehicleBaseData.kategorie\\\": \\\"' + typeSelect.value + '\\\"')
}
if (makeSelect.value !== undefined && makeSelect.value.length >= 1) {
queryFilter.push('\\\"vehicleBaseData.marke\\\": \\\"' + makeSelect.value + '\\\"')
}
let filter = queryFilter.join(",")
return "filter: \"{" + filter + "}\""; //"filter: {\"" + filter + "\"}"
}
function updateModelsForMake(make) {
let result = '';
fetch('/pimcore-graphql-webservices/vehicles', {
method: 'POST',
headers: {
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/json',
'Accept': 'application/json',
'Connection': 'keep-alive',
'DNT': '1',
// 'Origin': 'https://timmermanns.test',
'X-API-Key': 'a406e0ce0d5d7281fd92d81b9cb1aae0'
},
body: JSON.stringify({
query: '{ getVehicleMake(fullpath: "/Gebrauchte/Marken/' + make + '") { makeName, makeModels }}',
variables: {
now: new Date().toISOString(),
},
}),
})
.then((res) => res.json())
.then((result) => {
let rawModels = JSON.parse(result.data['getVehicleMake']['makeModels']);
let modelSelect = document.getElementById('keyvis-search-car-model');
while (modelSelect.options.length > 0) {
modelSelect.remove(modelSelect.options.length - 1);
}
let option = document.createElement('option');
option.text = 'Modell';
option.value = '';
modelSelect.add(option);
for (let i in rawModels) {
console.log(rawModels[i][0]);
option = document.createElement('option');
option.text = rawModels[i][0];
option.value = rawModels[i][0];
modelSelect.add(option);
}
})
.catch(error => {
console.log(error);
});
}
function fetchData() {
fetch('/pimcore-graphql-webservices/vehicles', {
method: 'POST',
headers: {
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/json',
'Accept': 'application/json',
'Connection': 'keep-alive',
'DNT': '1',
// 'Origin': 'https://timmermanns.test',
'X-API-Key': 'a406e0ce0d5d7281fd92d81b9cb1aae0'
},
body: JSON.stringify({
query: `
{
getVehicleListing(
`+ getQueryFilter() +`
published: true
) {
totalCount
edges {
node {
interneNummer
id
marke
modell
modellbasis
kategorie
}
}
}
}
`,
variables: {
now: new Date().toISOString(),
},
}),
})
.then((res) => res.json())
.then((result) => console.log(result));
}
};
if (document.readyState === 'loading'){
document.addEventListener("DOMContentLoaded", loaded);
} else {
loaded();
}
document.addEventListener('DOMContentLoaded', function() {
const swiper = new Swiper('.keyvisual-swiper', {
loop: {{ slides|length > 1 ? 'true' : 'false' }},
{% if slides|length > 1 %}
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
pagination: {
el: '.swiper-pagination',
clickable: true
},
{% endif %}
autoplay: {% if pimcore_checkbox('enable_autoplay').isChecked() and pimcore_numeric('autoplay_delay').getData() > 0 %}{
delay: {{ pimcore_numeric('autoplay_delay').getData() }},
disableOnInteraction: false,
}{% else %}false{% endif %}
});
const splitElements = document.querySelectorAll('.split-left, .split-right');
// Add click handler for split view sections
splitElements.forEach(section => {
section.addEventListener('click', function(e) {
e.stopPropagation(); // Prevent slide click
const href = this.getAttribute('data-href');
if (href) {
window.location.href = href;
}
});
});
// Add click handler for clickable slides (only for non-split-view slides)
document.querySelectorAll('.keyvisual-swiper .swiper-slide[data-href]').forEach(slide => {
slide.addEventListener('click', function(e) {
// Only trigger if not clicking a button, link or split section
if (!e.target.closest('a') && !e.target.closest('button') && !e.target.closest('.split-left') && !e.target.closest('.split-right')) {
const href = this.getAttribute('data-href');
if (href) {
window.location.href = href;
}
}
});
});
});
</script>