Při použití CSS nebo JS je možné propojení, které je aplikováno u produktů možné zobrazit u produktů již v kategorii.
Video
Ukázka
https://www.webotvurci.com/obleceni/
Návod je určený pro pokročilé uživatele!
Jak vložit CSS kód do platformy Shoptet. – návod
Níže najdete ukázku obecných CSS nebo JS. Toto slouží k vytvoření defaultního vzhledu a je možné z tohoto vyjít. Případně si kód můžete upravit na míru podle Vašich potřeb s Vašim kodérem. V případě, že s nikým takovým nespolupracujete, budeme rádi, když napíšete přímo nám.
Pro zobrazení v kategorii je potřeba mít:
- Typ propojení musí být nastaven jako Obrázky nebo Barvy.
- U typu Obrázky je možné vložit libovolnou cestu k obrázku – doplněk si jej přizpůsobí automaticky. Pro nejlepší výsledky doporučujeme čtvercové obrázky.
- U typu Barvy je nutné vyplnit barvu pozadí (např. #FF0000 pro červenou).
- Ke každému propojení se automaticky přidává také title atribut, takže při najetí kurzorem na variantu se zobrazí její název jako tooltip.
💡 Poznámka k šablonám:
Zobrazení propojení v kategoriích je podporováno u následujících oficiálních šablon:
Samba, Disco, Step, Classic, Waltz, Tango, Techno, Pop.
U šablon Echo, Soul a Rock není zobrazení propojení v kategoriích podporováno, protože tyto šablony postrádají plnohodnotný detail produktu a jejich struktura obecné zobrazení neumožňuje. Na vyžádání lze tuto funkcionalitu doprogramovat na míru, standardně ji ale ve výchozím nastavení nenabízíme.
⚠️ Pozor na individuální úpravy šablon:
Pokud má e-shop vlastní zásahy do šablony, nemusí se propojení v kategoriích zobrazovat správně. V takovém případě je potřeba úpravu řešit individuálně, protože nelze garantovat univerzální funkčnost na upravených šablonách.
CSS:
.c-product-interconnection-custom-category-image {
flex-shrink: 0;
position: relative;
width: 100%;
height: auto;
margin-bottom: 10px;
overflow-y: hidden;
}
.c-product-interconnection-custom-category-image.template-samba {
order: 1;
}
.c-product-interconnection-custom-category-image__scroll {
display: flex;
justify-content: flex-start;
gap: 5px;
position: relative;
overflow-x: auto;
scroll-behavior: smooth;
scrollbar-width: none;
}
.c-product-interconnection-custom-category-image__item {
display: flex;
justify-content: center;
align-items: center;
flex: 0 0 auto;
width: calc(20% - 4px);
height: auto;
border: 1px solid #dedede;
border-radius: 5px;
box-sizing: border-box;
}
.c-product-interconnection-custom-category-image__item img {
aspect-ratio: 1/1;
object-fit: cover;
cursor: pointer;
border-radius: 3px;
}
.c-product-interconnection-custom-category-image__item.is-color a > span {
display: block;
width: 100%;
aspect-ratio: 1/1;
border-radius: 5px;
}
.c-product-interconnection-custom-category-image__item.is-color a {
width: 100%;
padding: 5px;
}
#products > div .c-product-interconnection-custom-category-image__scroll::-webkit-scrollbar {
display: none;
}
/*TANGO FIX*/
.highlight-product .c-product-interconnection-custom-category-image.template-tango {
display: none;
}
.products-block .product:not(.highlight-product):has(.c-product-interconnection-custom-category-image):hover .tools-wrap {
display: none;
}
/*ŠIPKY*/
.slider-arrow {
display: flex;
align-items: center;
justify-content: center;
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 16px;
height: 40px;
z-index: 2;
opacity: 1;
background: #f2f2f2;
border: none;
cursor: pointer;
transition: opacity 0.3s, background-color ease 300ms;
font-size: 16px;
pointer-events: auto;
border-radius: 2px;
}
.slider-arrow:hover {
background-color: #f9f9f9;
}
.slider-arrow.left {
left: 0px;
}
.slider-arrow.right {
right: 0px;
}
.slider-arrow.hidden {
opacity: 0;
pointer-events: none;
}
/*RESPO*/
@media (max-width: 1600px) and (min-width: 1440px) {
}
@media (max-width: 1600px) and (min-width: 992px) {
}
@media (max-width: 1600px) {
}
@media (max-width: 1439px) and (min-width: 1200px) {
}
@media (max-width: 1439px) {
}
@media (max-width: 1199px) and (min-width: 992px) {
}
@media (max-width: 1199px) {
}
@media (max-width: 991px) {
}
@media (max-width: 767px) {
}
@media (max-width: 499px) {
.columns-mobile-2 .c-product-interconnection-custom-category-image__item {
width: calc(33.333% - 3px);
}
.columns-mobile-2 .c-product-interconnection-custom-category-image__item img {
margin-bottom: 0 !important;
}
}
JS
// INICIALIZACE
if (getShoptetDataLayer("pageType") == "category") {
const eshop_id = dataLayer[0]["shoptet"]["projectId"];
var productElements;
if ($("#products").length) {
productElements = document.querySelectorAll("#products .product:not(.wt-load)");
} else {
productElements = document.querySelectorAll("#category-products-wrapper .product:not(.wt-load)");
}
let productIds = [];
productElements.forEach(product => {
var productId;
if ($(product).find(".p").length) {
productId = product.querySelector(".p").getAttribute("data-micro-identifier");
} else {
productId = product.getAttribute("data-micro-identifier");
}
if (productId) {
productIds.push(productId);
product.classList.add("wt-load");
}
});
fetch("https://shoptet.webotvurci.cz/eshop-endpoints/" + eshop_id + "/product-variants/setting-hash")
.then((response) => response.json())
.then((response) => {
var product_connections_setting = "https://cdn.myshoptet.com/usr/webotvurci.myshoptet.com/user/documents/product-variants/" + eshop_id + "/eshopSetting.json?" + response;
return fetch(product_connections_setting).then((response) => response.json());
})
.then((json) => {
// Array to hold all promises
let promises = [];
productIds.forEach((product_id) => {
let products = json.products[product_id];
if (products !== undefined) {
products.forEach((element) => {
let product_config_id = element;
let product_config_data = json.configs[product_config_id];
console.log(product_config_data);
if (product_config_data.type == "photos" || product_config_data.type == "colors") {
promises.push(new Promise((resolve) => {
WtShowProductInterconnectionsCategory(product_config_data, product_id);
resolve(); // Resolve each promise after function call
}));
}
});
}
});
return Promise.all(promises);
})
.then(() => {
$('.c-product-interconnection-custom-category-image').each(function () {
const container = $(this);
// Přidej šipky
const leftArrow = $('<span class="slider-arrow left" aria-label="Předchozí"><</span>');
const rightArrow = $('<span class="slider-arrow right" aria-label="Další">></span>');
container.append(leftArrow, rightArrow);
const scrollWrapper = container.find('.c-product-interconnection-custom-category-image__scroll');
let isDragging = false;
let startX;
let scrollStart;
let isClickAllowed = true;
// === DRAG SCROLL ===
scrollWrapper.on('mousedown', function (e) {
isDragging = true;
startX = e.pageX;
scrollStart = scrollWrapper.scrollLeft();
isClickAllowed = true;
scrollWrapper.addClass('active');
e.preventDefault();
});
$(document).on('mouseup', function () {
isDragging = false;
scrollWrapper.removeClass('active');
});
$(document).on('mousemove', function (e) {
if (!isDragging) return;
e.preventDefault();
const deltaX = e.pageX - startX;
scrollWrapper.scrollLeft(scrollStart - deltaX);
if (Math.abs(deltaX) > 5) {
isClickAllowed = false;
}
});
scrollWrapper.find('a').on('click', function (e) {
if (!isClickAllowed) {
e.preventDefault();
}
});
// === ARROWS SCROLL ===
const updateArrows = () => {
const scrollLeft = scrollWrapper.scrollLeft();
const maxScroll = scrollWrapper[0].scrollWidth - scrollWrapper.outerWidth();
leftArrow.toggleClass('hidden', scrollLeft <= 0);
rightArrow.toggleClass('hidden', scrollLeft >= maxScroll - 1);
};
const scrollByOne = (direction) => {
const item = scrollWrapper.find('.c-product-interconnection-custom-category-image__item').first();
const scrollAmount = item.outerWidth(true); // item width incl. margin
scrollWrapper[0].scrollTo({
left: scrollWrapper.scrollLeft() + direction * scrollAmount,
behavior: 'smooth'
});
// Doplníme kontrolu po mírném zpoždění
setTimeout(updateArrows, 350);
};
leftArrow.on('click', () => scrollByOne(-1));
rightArrow.on('click', () => scrollByOne(1));
scrollWrapper.on('scroll', updateArrows);
updateArrows(); // Initial call
});
})
.catch((error) => {
console.log(error);
});
}
// VYKRESLENI
function WtShowProductInterconnectionsCategory(product_config_data, product_id) {
var productData = product_config_data;
let container = document.querySelector(`.product .p[data-micro-identifier="${product_id}"] a.image`);
// Vytvoření kontejneru pro všechny položky
var wrapperContainer = document.createElement('div');
switch (shoptet.design.template.name) {
case "Step":
wrapperContainer.setAttribute('class', 'c-product-interconnection-custom-category-image template-step');
break;
case "Classic":
wrapperContainer.setAttribute('class', 'c-product-interconnection-custom-category-image template-classic');
break;
case "Waltz":
wrapperContainer.setAttribute('class', 'c-product-interconnection-custom-category-image template-waltz');
container = document.querySelector(`.product .p[data-micro-identifier="${product_id}"] a.p-image`);
console.log("aaa");
break;
case "Samba":
wrapperContainer.setAttribute('class', 'c-product-interconnection-custom-category-image template-samba');
break;
case "Disco":
wrapperContainer.setAttribute('class', 'c-product-interconnection-custom-category-image template-disco');
break;
case "Tango":
container = document.querySelector(`.product[data-micro-identifier="${product_id}"] .img`);
wrapperContainer.setAttribute('class', 'c-product-interconnection-custom-category-image template-tango');
break;
case "Techno":
wrapperContainer.setAttribute('class', 'c-product-interconnection-custom-category-image template-techno');
break;
case "Pop":
container = document.querySelector(`.product[data-micro-identifier="${product_id}"] .p-image`);
wrapperContainer.setAttribute('class', 'c-product-interconnection-custom-category-image template-pop');
break;
default:
wrapperContainer.setAttribute('class', 'c-product-interconnection-custom-category-imag template-default');
break;
}
if (container) {
var itemsContainer = document.createElement('div');
itemsContainer.setAttribute('class', 'c-product-interconnection-custom-category-image__scroll');
if (productData.type == "photos") {
for (var key in productData.productsSetting) {
var item = document.createElement('div');
item.setAttribute('class', 'c-product-interconnection-custom-category-image__item');
// Vytvoření obsahu položky
var image = productData.productsSetting[key].imageLink;
var name = productData.productsSetting[key].label;
var link = productData.productsSetting[key].link;
item.innerHTML = `<a href="${link}" title="${name}">
<img src="${image}" alt="${name}">
</a>`;
itemsContainer.appendChild(item);
}
}
if (productData.type == "colors") {
for (var key in productData.productsSetting) {
var item = document.createElement('div');
item.setAttribute('class', 'c-product-interconnection-custom-category-image__item is-color');
// Vytvoření obsahu položky
var color = productData.productsSetting[key].backgroundColor;
var name = productData.productsSetting[key].label;
var link = productData.productsSetting[key].link;
item.innerHTML = `<a href="${link}" title="${name}">
<span style="background: ${color}">
</a>`;
itemsContainer.appendChild(item);
}
}
// Iterace přes productsSetting a vytvoření položek
wrapperContainer.appendChild(itemsContainer);
if (container) {
container.parentNode.insertBefore(wrapperContainer, container.nextSibling);
}
}
}
document.addEventListener('ShoptetDOMContentLoaded', function () {
if (getShoptetDataLayer("pageType") == "category") {
const eshop_id = dataLayer[0]["shoptet"]["projectId"];
let productElements = document.querySelectorAll("#products .product:not(.wt-load)");
let productIds = [];
productElements.forEach(product => {
var productId;
if ($(this).find(".p").length) {
productId = product.querySelector(".p").getAttribute("data-micro-identifier");
} else {
productId = product.getAttribute("data-micro-identifier");
}
if (productId) {
productIds.push(productId);
product.classList.add("wt-load");
}
});
fetch("https://shoptet.webotvurci.cz/eshop-endpoints/" + eshop_id + "/product-variants/setting-hash")
.then((response) => response.json())
.then((response) => {
var product_connections_setting = "https://cdn.myshoptet.com/usr/webotvurci.myshoptet.com/user/documents/product-variants/" + eshop_id + "/eshopSetting.json?" + response;
return fetch(product_connections_setting).then((response) => response.json());
})
.then((json) => {
// Array to hold all promises
let promises = [];
productIds.forEach((product_id) => {
let products = json.products[product_id];
if (products !== undefined) {
products.forEach((element) => {
let product_config_id = element;
let product_config_data = json.configs[product_config_id];
console.log(product_config_data);
if (product_config_data.type == "photos" || product_config_data.type == "colors") {
promises.push(new Promise((resolve) => {
WtShowProductInterconnectionsCategory(product_config_data, product_id);
resolve(); // Resolve each promise after function call
}));
}
});
}
});
return Promise.all(promises);
})
.then(() => {
$('.c-product-interconnection-custom-category-image').each(function () {
const container = $(this);
// Přidej šipky
const leftArrow = $('<span class="slider-arrow left" aria-label="Předchozí"><</span>');
const rightArrow = $('<span class="slider-arrow right" aria-label="Další">></span>');
container.append(leftArrow, rightArrow);
const scrollWrapper = container.find('.c-product-interconnection-custom-category-image__scroll');
let isDragging = false;
let startX;
let scrollStart;
let isClickAllowed = true;
// === DRAG SCROLL ===
scrollWrapper.on('mousedown', function (e) {
isDragging = true;
startX = e.pageX;
scrollStart = scrollWrapper.scrollLeft();
isClickAllowed = true;
scrollWrapper.addClass('active');
e.preventDefault();
});
$(document).on('mouseup', function () {
isDragging = false;
scrollWrapper.removeClass('active');
});
$(document).on('mousemove', function (e) {
if (!isDragging) return;
e.preventDefault();
const deltaX = e.pageX - startX;
scrollWrapper.scrollLeft(scrollStart - deltaX);
if (Math.abs(deltaX) > 5) {
isClickAllowed = false;
}
});
scrollWrapper.find('a').on('click', function (e) {
if (!isClickAllowed) {
e.preventDefault();
}
});
// === ARROWS SCROLL ===
const updateArrows = () => {
const scrollLeft = scrollWrapper.scrollLeft();
const maxScroll = scrollWrapper[0].scrollWidth - scrollWrapper.outerWidth();
leftArrow.toggleClass('hidden', scrollLeft <= 0);
rightArrow.toggleClass('hidden', scrollLeft >= maxScroll - 1);
};
const scrollByOne = (direction) => {
const item = scrollWrapper.find('.c-product-interconnection-custom-category-image__item').first();
const scrollAmount = item.outerWidth(true); // item width incl. margin
scrollWrapper[0].scrollTo({
left: scrollWrapper.scrollLeft() + direction * scrollAmount,
behavior: 'smooth'
});
// Doplníme kontrolu po mírném zpoždění
setTimeout(updateArrows, 350);
};
leftArrow.on('click', () => scrollByOne(-1));
rightArrow.on('click', () => scrollByOne(1));
scrollWrapper.on('scroll', updateArrows);
updateArrows(); // Initial call
});
})
.catch((error) => {
console.log(error);
});
}
});