templates/home/products.html.twig line 1
{% extends 'base.html.twig' %}{% block stylesheets %}{{ parent() }}<style>.cms-photo-group {position: relative;display: inline-block;}.cms-photo-wrapper {display: none;}.cms-photo-wrapper.active {display: block;}.cms-arrow {position: absolute;top: 50%;transform: translateY(-50%);background: rgba(0, 0, 0, 0.4);color: white;border: none;cursor: pointer;padding: 0.4rem 0.7rem;font-size: 1.2rem;border-radius: 50%;}.cms-arrow.left {left: 5px;}.cms-arrow.right {right: 5px;}</style>{% endblock %}{% block title %}{% for cms_copy in cms_copy_array %}{% if cms_copy.ranking == 1 %}{% if cms_copy.tabTitle is defined %}{{ attribute(cms_copy,'tabTitle'~LanguagesService.getSelectedLanguageCode)|raw }}{% else %}{% if CompanyDetails.getCompanyDetails is not null %}{{ CompanyDetails.getCompanyDetails.companyName }}{% else %}{{ product~Languages.getSelectedLanguageCode }}{% endif %}{% endif %}{% endif %}{% endfor %}{% endblock %}{% block body %}<section id="my-service-section" class="default-bg-white"><div class="default-space"></div><div class="container"><div class="row"><div class="col-lg-12 col-md-12 col-sm-12 col-12"><div class="default-title">{% include 'home/products_page/title.html.twig' %}</div></div></div>{% include 'template_parts_project_specific/home_page_project_specific.html.twig' %}{# ------------------ 1) Group photos by NON-NUMERIC rank key ------------------ #}{% set photos_by_rank = {} %}{% for p in cms_photo_array %}{% set rank_str = 'r_' ~ (attribute(p, 'ranking')|default(0)) %}{% set bucket = photos_by_rank[rank_str]|default([]) %}{% set bucket = bucket|merge([p]) %}{% set photos_by_rank = photos_by_rank|merge({ (rank_str): bucket }) %}{% endfor %}{# ------------------ 2) Render each CMS block by its rank ------------------ #}<div class="row">{% for cms_copy in cms_copy_array|sort((a, b) => a.ranking <=> b.ranking) %}{% set rank_str = 'r_' ~ (attribute(cms_copy, 'ranking')|default(0)) %}{% set photos = photos_by_rank[rank_str]|default([]) %}<div class="col-12"><div class="row">{# Left column: CMS copy (full-width if no photo, half if photo exists) #}<div class="{% if photos is not empty %}col-md-6 col-12{% else %}col-12{% endif %}">{% if is_granted('ROLE_ADMIN') %}<a target="_blank" href="{{ path('cms_copy_edit', {'id': cms_copy.id}) }}"><i style="color: red" class="fa fa-pen"> ({{ cms_copy.ranking }})</i></a>{% if cms_copy.product is not null %}<a target="_blank"href="{{ path('cms_copy_new', {'product': cms_copy.product.id, 'ranking': (cms_copy.ranking + 1)}) }}"><i style="color: blue" class="fa fa-plus"></i></a>{% endif %}{% if photos is empty and cms_copy.product is not null%}<a target="_blank"href="{{ path('cms_photo_new', {'product': cms_copy.product.id,'ranking': (cms_copy.ranking )}) }}"><i style="color: blue" class="fa fa-camera"></i></a>{% endif %}{% endif %}{% if cms_copy.pageLayout is not null %}{% if cms_copy.getPageLayout.name == "Accordion" %}{% include 'home/products_page/formats/accordion.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Card Layout" %}{% include 'home/products_page/formats/card_layout.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Carousel/Slider" %}{% include 'home/products_page/formats/carousel_slider.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Fullscreen Sections" %}{% include 'home/products_page/formats/fullscreen_sections.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Grid Layout" %}{% include 'home/products_page/formats/grid_layout.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Hero Banner" %}{% include 'home/products_page/formats/hero_banner.html.twig' %}{% elseif cms_copy.getPageLayout.name == "List/Stacked Content" %}{% include 'home/products_page/formats/list_stacked_content.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Masonry Layout" %}{% include 'home/products_page/formats/masonry_layout.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Parallax Scrolling" %}{% include 'home/products_page/formats/parallax_scrolling.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Sidebar Layout" %}{% include 'home/products_page/formats/sidebar_layout.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Single Page Scroll" %}{% include 'home/products_page/formats/single_page_scroll.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Split Screen" %}{% include 'home/products_page/formats/split_screen.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Sticky Header/Footer" %}{% include 'home/products_page/formats/sticky_header_footer.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Tabbed Interface" %}{% include 'home/products_page/formats/tabbed_interface.html.twig' %}{% elseif cms_copy.getPageLayout.name == "Timeline Layout" %}{% include 'home/products_page/formats/timeline_layout.html.twig' %}{% else %}{% include 'home/products_page/formats/accordion.html.twig' %}{% endif %}{% else %}{% include 'home/products_page/formats/accordion.html.twig' %}{% endif %}</div>{# Right column: matching photos for this rank #}{% if photos is not empty %}<div class="col-md-6 col-12">{% for cms_photo in photos %}<div class="d-inline-block justify-content-center py-1 p-sm-2 product-image-container"><div class="image-wrapper">{% include 'home/products_page/photo_or_video.html.twig' %}</div></div>{% endfor %}</div>{% endif %}</div></div>{% endfor %}</div>{# ------------------ Sub Pages ------------------ #}<div class="row mt-3"><div class="col-12">{% for sub_page in sub_pages %}<ul><a target="_blank" href="{{ path('sub_page_show', {id: sub_page.id}) }}">{{ sub_page.title }}</a></ul>{% endfor %}</div></div></section>{% include 'home/parts/contact_form_and_qr_code.html.twig' %}{% endblock %}{% block additionaljs %}{% if include_contact_form == 1 %}<script>$(document).ready(function () {$("input[name='website_contacts[status]']").closest(".form-group").remove();$("input[name='website_contacts[dateTime]']").closest(".form-group").remove();$("input[name='website_contacts[dateResponded]']").closest(".form-group").remove();});</script>{% endif %}{% endblock %}{% block javascripts %}{{ parent() }}<script>document.addEventListener('DOMContentLoaded', function () {const wrappers = Array.from(document.querySelectorAll('.cms-photo-wrapper'));const groups = {};// Group photos by rankingwrappers.forEach(w => {const rank = w.getAttribute('data-rank');if (!groups[rank]) groups[rank] = [];groups[rank].push(w);});// Initialize groupsObject.keys(groups).forEach(rank => {const photos = groups[rank];if (photos.length <= 1) {// Single photo: keep normal behaviour (including cms_photo_view link)photos[0].classList.add('active');return;}// >>> Multiple photos with the same rank// 1) Disable cms_photo_view links in this groupphotos.forEach(wrapper => {const viewLink = wrapper.querySelector('a.cms-photo-view-link');if (viewLink) {// Option A: just prevent navigationviewLink.addEventListener('click', function (e) {e.preventDefault();});// If you prefer to completely remove the link wrapper, use this instead:// const img = viewLink.querySelector('img');// if (img) {// wrapper.insertBefore(img, viewLink);// viewLink.remove();// }}});// 2) Wrap them in a containerconst container = document.createElement('div');container.classList.add('cms-photo-group');const parent = photos[0].parentNode;parent.insertBefore(container, photos[0]);photos.forEach(p => container.appendChild(p));// Show first imagelet index = 0;photos[index].classList.add('active');// Add navigation arrowsconst leftArrow = document.createElement('button');leftArrow.className = 'cms-arrow left';leftArrow.innerHTML = '❮'; // ‹const rightArrow = document.createElement('button');rightArrow.className = 'cms-arrow right';rightArrow.innerHTML = '❯'; // ›container.appendChild(leftArrow);container.appendChild(rightArrow);function show(i) {photos.forEach(p => p.classList.remove('active'));photos[i].classList.add('active');}leftArrow.addEventListener('click', () => {index = (index - 1 + photos.length) % photos.length;show(index);});rightArrow.addEventListener('click', () => {index = (index + 1) % photos.length;show(index);});});});</script>{% endblock %}