W tym artykule dowiesz się jak zmodyfikować swój szablon Topaz, aby obsługiwał wyszukiwarkę zaawansowaną.
Wskazówka
Niniejsza instrukcja przeznaczona jest dla sklepów w wersji 2020.2 lub nowszej!
Wskazówka
Kopiowanie fraz, które należy wyszukać w kodzie, może powodować problemy. Frazy do wyszukania najlepiej przepisać ręcznie, lub skopiować, ale po skopiowaniu podmienić znaki typu - _ ' " itp. W przeciwnym wypadku, fraza może nie zostać odnaleziona w kodzie!
Wskazówka
W tym artykule trzeba będzie wprowadzać zmiany w plikach js i css. Z tego artykułu dowiesz się jak je minifikować
Pierwszym krokiem jest dodanie obiektu wykorzystywanego w wyszukiwarce. Aby to zrobić, otwórz Panel Administracyjny, a następnie zakładkę Wygląd sklepu -> Ustawienia. Kliknij w prawym górnym rogu na ikonkę z trzema kwadratami i z rozwiniętego menu wybierz opcję Edytuj ustawienia zaawansowane. Przejdź do zakładki Obiekty. Kliknij przycisk Dodaj. W polu Typ wybierz Menu producentów i marek a w polu Nazwa podaj manufacturer-brand, po czym kliknij Dodaj. W ten sposób utworzony został obiekt, dzięki któremu wyszukiwarka będzie mogła wybierać spośród producentów i marek.
Następnie należy przypisać obiekt do wyszukiwarki. Podobnie jak przed chwilą, otwórz Panel Administracyjny, a następnie zakładkę Wygląd sklepu -> Ustawienia -> Edytuj ustawienia zaawansowane. Wybierz zakładkę Strony. Znajdź stronę Wyszukiwanie zaawansowane (18). W tym samym wierszu, w kolumnie z nazwą pliku, wpisz advanced-search.html, a następnie zapisz. Kliknij na pole z napisem Wyszukiwanie zaawansowane (18). Pojawi się lista dostępnych obiektów. Kliknij kwadrat przy utworzonym wcześniej obiekcie manufacturer-brand, by pokazał się znak wyboru (tzw. "ptaszek"). A następnie zapisz.
Kolejnym krokiem jest utworzenie nowego pliku o nazwie advanced-search.html w głównym katalogu z plikami Twojego szablonu Topaz. Treść tego pliku powinna wyglądać następująco:
{% extends '_layout.html' -%}
{% block pageContent -%}
{% include 'elements/advanced-search/advanced-search.html' -%}
{% endblock -%}
Następnie, przejdź do katalogu elements. Utwórz w nim nowy katalog pod nazwą advanced-search. Przejdź do nowo utworzonego katalogu, a następnie utwórz w nim plik o nazwie advanced-search.html. Do nowo utworzonego pliku wklej poniższy kod:
{% include 'partials/common/breadcrumbs.html' -%}
{% assign filters = products.FilteringOptions.Filters %}
{% assign i = 1 -%} {% for manufacturer in manufacturer-brand.Manufacturers -%}
{{manufacturer.Name}} {% assign i = i | Plus: 1 -%} {% endfor -%}
{% endif -%} {% if manufacturer-brand.Brand != 0 -%}
{{translations.Brand}}
{% assign i = 1 -%} {% for brand in manufacturer-brand.Brands -%}
{{brand.Name}} {% assign i = i | Plus: 1 -%} {% endfor -%}
{% endif -%}
{% include 'partials/newsletter-global.html' -%}
Wskazówka
W przypadku problemów z narzędziem Liquid Sync, pliki należy dodać bezpośrednio przez Panel Administracyjny, w zakładce Wygląd sklepu -> Ustawienia -> Edytuj ustawienia zaawansowane -> Edytuj HTML.
Kolejny krok to dodanie odpowiedniej treści do plików .css, odpowiedzialnych za wygląd zaawansowanej wyszukiwarki towarów. W tym celu wróć do głównego katalogu z plikami Topaza, a następnie otwórz katalog css. Do znajdującego się w nim pliku layout.css Wklej na samym dole następujący, już zminifikowany kod:
*{line-height:1.5em}.advancedSearch{max-width:1100px;height:auto;margin:40px auto;user-select:none}.advancedSearch select{-webkit-appearance:none;-moz-appearance:none;text-indent:1px;text-overflow:""}.advancedSearch input[type="checkbox"]{visibility:hidden;width:0;height:0}.advancedSearch .form__invalid-input{visibility:hidden}.advancedSearch .title{font-size:17px;font-weight:600;color:{{settings.primaryFontColor}};margin-bottom:20px;text-transform:uppercase}.advancedSearch .search{width:100%;height:40px;display:flex}.advancedSearch .search .searchInput{width:50%;height:42px;padding-left:20px;font-size:14px;color:{{settings.secondaryFontColor}};border:1px solid {{settings.inputLabelColor}};border-right:none}.advancedSearch .search .searchCategory{width:30%;height:42px;font-size:14px;color:{{settings.secondaryFontColor}};border:1px solid {{settings.inputLabelColor}};border-right:none;padding:0 10px;background-color:{{settings.primaryPageBgColor}};-webkit-appearance:none;-moz-appearance:none;appearance:none;text-indent:5px;background-position-x:97%;transition:200ms}.advancedSearch .search .searchCategory option:checked{color:#000000 !important}.advancedSearch .search .searchCategory:hover{background-image:url("https://static.comarchesklep.pl/files/fonts/fontawesome-pro-5.6.3-web/svgs/solid/caret-up.svg") !important}.advancedSearch .search .searchButton{width:20%;height:22px;background-color:{{settings.primaryBtnBgColor}};color:{{settings.primaryBtnFontColor}};border:1px solid {{settings.primaryBtnBorderColor}};text-align:center;text-decoration:none;text-transform:uppercase;padding:11px 0 7px;font-size:14px;cursor:pointer;transition:200ms}.advancedSearch .search .searchButton:hover{background-color:{{settings.primaryBtnHoverBgColor}};color:{{settings.primaryBtnHoverFontColor}};border:1px solid {{settings.primaryBtnHoverBorderColor}};transition:200ms}.advancedSearch .searchType{padding:30px 0 30px 15px;border-bottom:1px solid {{settings.borderColor}};display:block;flex-direction:row;width:calc(100% - 15px);list-style:none}.advancedSearch .searchType li{display:inline}.advancedSearch .searchType li>*{cursor:pointer}.advancedSearch .searchType li input{visibility:hidden;display:none}.advancedSearch .searchType li .option{font-size:14px;color:{{settings.primaryFontColor}};border-radius:50%;background-color:{{settings.primaryPageBgColor}};border:80% solid {{settings.primaryFontColor}}}.advancedSearch .searchType li label{margin:0 30px 0 5px;font-size:14px}.advancedSearch .searchType li label:before{height:15px;width:16px;margin-right:10px;border-radius:50%;border:1px solid #0000005e;content:"";display:inline-block}.advancedSearch .searchType li.selected label:before{border-color:#000000;-webkit-box-shadow:inset 0 0 0 5px #000000;-moz-box-shadow:inset 0 0 0 5px #000000;box-shadow:inset 0 0 0 5px #000000}.advancedSearch .propertyContainer{width:100%;padding:30px 0;border-bottom:1px solid {{settings.borderColor}}}.advancedSearch .propertyContainer .checkboxContainer{width:100%;display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap}.advancedSearch .propertyContainer .checkboxContainer span{flex:0 1 25%;margin:10px 0;font-size:14px;color:{{settings.primaryFontColor}}}.advancedSearch .propertyContainer .checkboxContainer span .checkIcon{position:relative;top:-14px;left:-25px;fill:{{settings.checkColor}}}.advancedSearch .propertyContainer .checkboxContainer span .checkIcon svg{width:12px;height:12px}.advancedSearch .propertyContainer .checkboxContainer span label{margin-left:10px;display:inline-flex;height:20px}.advancedSearch .propertyContainer .checkboxContainer span input:checked+label:before{text-align:center;background-color:{{settings.checkActiveBgColor}};overflow:hidden;border:solid 1px {{settings.checkActiveBgColor}}}.advancedSearch .propertyContainer .checkboxContainer span input+label:before{content:" ";display:inline-block;cursor:pointer;position:relative;width:15px;height:15px;border-radius:4px;background-color:transparent;color:{{settings.borderColor}};border:1px solid {{settings.borderColor}};transition:all 200ms ease;margin-right:10px}.advancedSearch .propertyContainer .checkboxContainer span:hover,.advancedSearch .propertyContainer .checkboxContainer input:hover,.advancedSearch .propertyContainer .checkboxContainer label:hover{cursor:pointer}.advancedSearch .propertyContainer .checkboxContainer:after{content:"";flex:1 0 25%}.advancedSearch .propertyContainer .productFeaturesContainer{display:flex;width:100%;flex-direction:row;flex-wrap:wrap}.advancedSearch .propertyContainer .productFeaturesContainer .priceContainer{width:25%}.advancedSearch .propertyContainer .productFeaturesContainer .priceContainer span{display:block}.advancedSearch .propertyContainer .productFeaturesContainer .priceContainer span .price{width:100%;font-size:14px;margin-bottom:10px;color:{{settings.primaryFontColor}};display:block}.advancedSearch .propertyContainer .productFeaturesContainer .priceContainer span input[type="number"]{height:40px;width:60%;font-size:14px;color:{{settings.secondaryFontColor}};border:1px solid {{settings.inputLabelColor}};margin-bottom:20px;text-align:right;padding-right:42px;box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box}.advancedSearch .propertyContainer .productFeaturesContainer .priceContainer span .currency{position:relative;top:0;left:-40px;width:fit-content;margin:0;color:{{settings.secondaryFontColor}};font-size:14px}.advancedSearch .propertyContainer .productFeaturesContainer .productFeatures{width:75%;margin-top:15px}.advancedSearch .propertyContainer .productFeaturesContainer .productFeatures span{flex:0 1 33%;margin:10px 0;font-size:14px;color:{{settings.primaryFontColor}}}.advancedSearch .propertyContainer .productFeaturesContainer .productFeatures span label{margin-left:10px}.advancedSearch .propertyContainer .productFeaturesContainer .productFeatures:after{content:"";flex:0 1 33%}.advancedSearch .propertyContainer .productFeaturesContainer .hidePricesFeatures{width:100%}.advancedSearch .lastProperty{border:none}
Do pliku layout-m.css wklej poniższy kod:
@media only screen and (max-width: 768px){.advancedSearch{width:calc(100% - 40px);margin:0 auto}.advancedSearch input[type="checkbox"]{position:fixed}.advancedSearch .search{margin-top:20px;display:block;width:100%}.advancedSearch .search .searchInput{width:100%;display:block;border-right:1px solid {{settings.inputLabelColor}};margin-bottom:20px}.advancedSearch .search .searchCategory{width:100%;display:block;border-right:1px solid {{settings.inputLabelColor}};margin-bottom:20px}.advancedSearch .search .searchButton{display:block;width:100%}.advancedSearch .search .scrollingButton{display:block;width:100%;position:fixed;top:0;left:0;z-index:1}.advancedSearch .searchType{margin-top:110px;padding-left:0;display:flex;flex-direction:row;flex-wrap:wrap;justify-content:space-between}.advancedSearch .searchType li{display:inline-block;flex:50%;margin-bottom:10px}.advancedSearch .searchType li>label{margin:0}.advancedSearch .propertyContainer{margin:10px 0}.advancedSearch .propertyContainer .checkboxContainer span{flex:0 1 100%}.advancedSearch .propertyContainer .productFeaturesContainer .priceContainer{width:100%;display:flex;flex-direction:row;justify-content:space-between;flex-wrap:wrap}.advancedSearch .propertyContainer .productFeaturesContainer .priceContainer span{flex:1 0 50%}.advancedSearch .propertyContainer .productFeaturesContainer .priceContainer span input[type="number"]{width:75%}.advancedSearch .propertyContainer .productFeaturesContainer .productFeatures{width:100%;display:flex;flex-direction:row;justify-content:space-between}.advancedSearch .propertyContainer .productFeaturesContainer .productFeatures span{flex:0 1 100%}}
Do pliku layout-d.css wklej poniższy kod:
@media only screen and (min-width: 768px) and (max-width: 1150px){.advancedSearch{width:calc(100% - 40px);margin:0 auto}.advancedSearch .search{margin-top:20px}}@media only screen and (min-width: 768px) and (max-width: 1000px){.advancedSearch .propertyContainer .productFeaturesContainer .productFeatures span{flex:0 1 43%}}
W ten sposób w Topazie znalazł się kod odpowiedzialny za wygląd wyszukiwarki zaawansowanej.
Kolejny krok to dodanie tłumaczeń. W tym celu należy w Panelu Administratora wejść w Wygląd sklepu -> Ustawienia i wybrać zakładkę Tłumaczenia. Przycisk Dodaj pozwala na dodanie nowego tłumaczenia. Aby tłumaczenie zostało dodane, należy wprowadzić odpowiednie Id oraz frazę (Tekst). Lista Id oraz fraz do wprowadzenia:
1. AllCategories - Wszystkie kategorie
2. SearchElement - Szukaj towaru...
3. WithSequence - Wyrażenie
4. WithAllWords- Wszystkie słowa
5. WithAnyWord - Dowolne ze słów
6. WithPartOfWord - Część słowa
7. SearchIn - Szukaj w
8. EanCode - Kod EAN
9. PriceFrom - Cena od
10. PriceTo - Cena do
11. PricesDifference - Cena maksymalna musi być większa od ceny minimalnej
12. WithPhoto - Tylko ze zdjęciem
13. NewProduct - Nowość
14. Prize - Nagroda
15. ExtraQuality - Superjakość
16. ExtraPrice - Supercena
17. ProductFromNewsletter - Towar z gazetki
18. Promotion - Promocja
19. RecommendedProduct - Towar polecany
20. SellerRecomendation - Rekomendacja sprzedawcy
21. Sale - Wyprzedaż
22. BestReviewed - Najlepiej oceniany
23. Manufacturer - Producent
24. Brand - Marka
Wskazówka
<strong.Uwaga! Kopiując Id z powyższej instrukcji do Panelu Administracyjnego, upewnij się, że po danym Id nie została skopiowana żadna spacja.
Następnie należy dodać odpowiedni kod do plików js. W tym celu, w plikach Topaza, otwórz folder js a następnie plik layout0.js. Odszukaj linijkę z frazą productListFunctions.init();. Pod znalezioną linijką znajduje się linia ze znakiem }. Pod nią wklej następujący kod:
if($('body').find('.advancedSearch').index() >= 0) {
advancedSearchFunctions.init();
}
Następnie otwórz plik layout1.js znajdujący się w tym samym katalogu. Poniższy kod możesz wkleić na samym początku pliku:
var advancedSearchFunctions = {
init: function () {
this.events();
},
events: function () {
$('body').on('click', '.js-search-item', function (e) {
$(e.currentTarget).closest('.searchType').children('.selected').removeClass('selected');
$(e.currentTarget).parent().addClass('selected');
});
$('body').on('click', '.checkboxContainer > span', function (e) {
var input = $(this).children('input');
if(input.prop("checked") == true) {
input.prop( "checked", false);
} else {
input.prop("checked", true);
}
});
$('body').on('click','.search-radio', function(e) {
if ($('.search-radio[value=searchAll]').is(":checked")) {
$('.advanced-search-input').attr('name', 'searchAll');
} else if ($('.search-radio[value=searchWild]').is(":checked")) {
$('.advanced-search-input').attr('name', 'searchWild');
} else if ($('.search-radio[value=searchAny]').is(":checked")) {
$('.advanced-search-input').attr('name', 'searchAny');
} else {
$('.advanced-search-input').attr('name', 'name');
}
});
$('body').on('change', '#priceTo, #priceFrom', function(e) {
var priceTo = Number($('#priceTo').val());
var priceFrom = Number($('#priceFrom').val());
if(priceTo != '') {
$('#priceTo').val(parseInt(priceTo));
}
if(priceFrom != '') {
$('#priceFrom').val(parseInt(priceFrom));
}
if(priceFrom > priceTo) {
$('.form__invalid-input').css('visibility', 'visible');
$('.searchButton').prop('disabled', true);
} else {
$('.form__invalid-input').css('visibility', 'hidden');
$('.searchButton').prop('disabled', false);
}
});
$(window).scroll(function(){
let scrollBottom = $(document).height() - $(window).height() - $(window).scrollTop();
if($('.newsletter1-wrapper')[0]) {
if ($(this).scrollTop() > 300 && scrollBottom > 20 ) {
$('.searchButton').addClass('scrollingButton');
} else {
$('.searchButton').removeClass('scrollingButton');
}
} else {
if ($(this).scrollTop() > 300 ) {
$('.searchButton').addClass('scrollingButton');
} else {
$('.searchButton').removeClass('scrollingButton');
}
}
});
$(function(){
$('body').on('click', '.searchButton', function(e) {
var t=$(this).parents('.advancedSearch'),hasValue=false,arr=$('#SearchAdvancedForm input[type!=hidden],#SearchAdvancedForm select').serializeArray(),i, data = t.find('input:not([disabled]), select:not([disabled]), textarea:not([disabled])').serializeArray();
var tab = [];
for(i in arr) if(arr[i].value) {hasValue=true;break;}
data.push({name: "__csrf", value: __CSRF});
$.post(null, data, function (d) {
if (d.action.Redirect302) location.href = d.action.Redirect302;
});
});
});
}
}
Ostatnim krokiem jest dodanie możliwości otwarcia wyszukiwarki zaawansowanej przy pomocy linku umieszczonego w stopce sklepu. Aby to zrobić, przejdź do pliku elements -> footer -> footer-1.html (jeśli w Kreatorze wybrałeś drugi rodzaj stopki, plik będzie nazywał się footer-2.html). Następnie wyszukaj linijkę z frazą advanced-search-link. W linijce tej znajduje się fragment href="#". Zamień znak # na {{config.DefinedPages.AdvancedSearch.Url}}. W ten sposób z poziomu stopki będzie można w prosty sposób otworzyć zaawansowane wyszukiwanie.
Ustawienia paska nawigacji w szablonie Szafir
Ustawienia paska nawigacji w szablonie Szafir
W tym artykule dowiesz się jak ustawić pasek nawigacji w swoim szablonie. Zmiany te pozwolą na dodanie m.in. przycisku importu koszyka i przycisku do pobrania przykładowego pliku CSV.
Wskazówka
W tym artykule trzeba będzie wprowadzać zmiany w plikach js i css. Z tego artykułu dowiesz się jak je minifikować
Uwaga
Zapis nazwa_folderu/nazwa_pliku.rozszerzenie oznacza, że aby znaleźć dany plik należy udać się do folderu o nazwie podanej przed ukośnikiem. Przykładowo: order/thx.html oznacza plik thx.html w folderze order
Po wykonaniu powyższych instrukcji należy wyszukać frazy </style> i wkleić następujący kod bezpośrednio nad wyszukaną linijką:
#lg-settings-content #tab1Content fieldset {
width: calc(100% - 50px);
}
#lg-settings-content .row {
border-bottom: 1px solid #ddd;
}
#lg-settings-content .row:first-child {
border-top: 1px solid #ddd;
border-bottom: 2px solid #ddd;
font-weight: 700;
}
#lg-settings-content .row::after {
display: block;
clear: both;
content: '';
}
#lg-settings-content .cell {
border-left: 1px solid #ddd;
display: inline-block;
vertical-align: middle;
width: calc((100% - 308px)/4);
min-height: 20px;
padding: 10px;
float: left;
}
#lg-settings-content .cell:last-child {
border-right: 1px solid #ddd;
}
#lg-settings-content .cell input {
width: 100%;
height: 20px;
}
#lg-settings-content .cell.available {
width: 70px;
}
#lg-settings-content .cell.available input {
display: block;
margin: 0;
cursor: pointer;
}
#lg-settings-content .cell.no {
width: 50px;
}
#lg-settings-content .cell.no input {
width: 40px;
height: 14px;
}
#lg-settings-content .cell.delete {
width: 40px;
text-align: center;
}
#lg-settings-content .cell.delete .fa {
cursor: pointer;
}
#lg-settings-content .yellow-box {
padding: 20px;
border: 1px solid #fec42f;
font-size: 14px;
font-weight: 400 !important;
position: relative;
}
#lg-settings-content .yellow-box:after {
content: '';
width: 30px;
height: 30px;
position: absolute;
top: 10px;
right: 15px;
background: url(../../Content/Images/all/important.png) no-repeat;
}
Ostatnią zmianą w pliku będzie dodanie kodu bezpośrednio nad wyszukaną frazą }</script>:
$('#lg-settings-content').on('click', '.fa-trash', function(e){
$(e.currentTarget).parents('.row').remove();
});
function addCustomerLinksArr(name, o){
var customerLinks = [];
$('#lg-settings-content .'+name).each(function(i,el) {
var index = $(this).data('index');
var available = $(this).find('[name='+name+index+']').prop('checked');
var no = $(this).find('[name='+name+'No'+index+']').val();
var icon = $(this).find('[name='+name+'Icon'+index+']').val();
var label = $(this).find('[name='+name+'Label'+index+']').val();
var translation = $(this).find('[name='+name+'Translation'+index+']').val();
var link = $(this).find('[name='+name+'Link'+index+']').val();
if(no && (label || translation) && link){
var obj = {available: available, no: no, icon: icon, label: label, translation: translation, link: link};
customerLinks.push(obj);
}
});
if(customerLinks.length > 0){
o[name+'s'] = customerLinks;
}
}
function __SaveLiquidSettings(){
var o = {};
$('#lg-settings-content input[name]').each(function(i,el) {
if($(el).attr('type') == 'radio' || $(el).attr('type') == 'checkbox') {
if($(el).is(':checked')) {
o[el.name] = el.value;
}
} else {
o[el.name] = el.value;
}
});
addCustomerLinksArr('authenticatedCustomerLink', o);
addCustomerLinksArr('notAuthenticatedCustomerLink', o);
return o;
}
Następnie przechodzimy do pliku scss/desktop2.scss i na jego końcu wklejamy kod:
.main-navigation-bar-ui{
background: $bgColor;
.manufacturer-container-ui{
border-top: none;
border-bottom: none;
li{
margin-right: -1px;
border-bottom: 1px solid $lightBorderColor;
}
.categories-opened-ui{
vertical-align: bottom;
float: none;
display: inline-block;
margin-right: -5px;
border-top: 1px solid $lightBorderColor;
margin-bottom: 0px;
height: 68px;
}
.main-navigation-bar-links-ui{
width: calc(100% - 320px);
vertical-align: bottom;
background: $menuBackgroundColor;
float: none;
display: inline-block;
border-left: 1px solid $lightBorderColor;
border-top: 1px solid $lightBorderColor;
border-bottom: none;
border-right: none;
ul{
display: flex;
flex-wrap: wrap;
}
}
}
}
Teraz przejdź do Panelu Administratora. Wybierz Wygląd Sklepu/ Ustawienia i przejdź w zakładkę Tłumaczenia. Po kliknięciu w przycisk Dodaj należy wpisać Id tłumaczenia oraz Tekst, który będzie się wyświetlał w e-Sklepie. Zmiany należy zatwierdzić przyciskiem Dodaj.
Id: ShowProducts -- Tekst: Pokaż produkty
Id: ShowMore -- Tekst: Pokaż więcej
Ostatnim krokiem jest dodanie nowego elementu do nawigacji. W tym celu przejdź w zakładkę Szablon, a następnie Ustawienia paska nawigacji na stronie głównej, gdzie należy uzupełnić pola według własnych upodobań.
Etykieta PL - nazwa etykiety (na przykład: ti-import)
Id tłumaczenia - nazwa jaka będzie widoczna na elemencie
Link/Akcja - link do strony
Aktualizacja filtrów i wyszukiwarki w szablonach
Wskazówka
Od 1 czerwca 2025 roku zakończyliśmy aktualizację oraz wydawanie nowych wersji szablonów Bursztyn, Agat i Opal, a tym samym ich wsparcie, aby skupić się na nowoczesnych rozwiązaniach, które jeszcze lepiej odpowiadają na potrzeby dynamicznie rozwijającego się rynku e-commerce.
Zachęcamy Was do przejścia na nasze nowe, udoskonalone szablony. Dla sklepów B2C polecamy szablony Topaz, One Page Shop oraz Dla Gastronomii, natomiast dla platform B2B idealnym wyborem będą Rubin i Szafir.
Aktualizacja filtrów i wyszukiwarki w szablonach
W tym artykule dowiesz się jak zmodyfikować swój szablon, aby w lepszy sposób obsługiwał filtry i wyszukiwarkę.
Wskazówka
W tym artykule trzeba będzie wprowadzać zmiany w plikach js. Z tego artykułu dowiesz się jak je minifikować.
Szafir
W pliku common/pagination.html wyszukaj frazę {% if products.Search -%}. W tym warunku znajduje się tylko jedna linijka. Podmień ją na {% capture url -%}{{products.Search.Url}}{% endcapture -%}
Następnie w pliku js/init.js, wyszukaj funkcję filter, a w niej $.get. Zastąp go wraz z całą jego zawartością poniższym kodem:
$.get('', param, function (result) {
app.serverMessage(result, form, e);
if (result.action.Result) {
if(result.action.Redirect302 != null){
app.replace(result.action.Redirect302);
} else {
app.replace(window.location.pathname);
}
}
});
Agat
W pliku partials/blog/list-pagination.html wyszukaj frazę {% if products.Search -%}. W tym warunku znajduje się tylko jedna linijka. Podmień ją na {% capture url -%}{{products.Search.Url}}{% endcapture -%}
Następnie na początku pliku js/init2.js, wyszukaj funkcję oznaczoną komentarzem // filters, a w niej warunek if (d.length == 2 && !d[0].value && !d[1].value) {. Usuń ten warunek wraz z jego zawartością. Kilka linijek niżej jest $.get. Zastąp go wraz z całą jego zawartością poniższym kodem:
$.get('', p, function (d) {
if (d.action.Result) {
if (d.action.Redirect302 != null) {
LoadList(d.action.Redirect302);
}
}
});
Bursztyn lub Opal
W pliku product/listpagination.html wyszukaj frazę {% if products.Search -%}. W tym warunku znajduje się tylko jedna linijka. Podmień ją na {% capture url -%}{{products.Search.Url}}{% endcapture -%}
Następnie w pliku js/list.js, wyszukaj funkcję oznaczoną komentarzem // filters, a w niej warunek if (d.length == 2 && !d[0].value && !d[1].value) {. Usuń ten warunek wraz z jego zawartością. Kilka linijek niżej jest $.get. Zastąp go wraz z całą jego zawartością poniższym kodem:
$.get('', p, function (d) {
if (d.action.Result) {
if (d.action.Redirect302 != null) {
LoadList(d.action.Redirect302+'#products');
}
}
});
Topaz
W pliku partials/list-pagination.html wyszukaj frazę {% if products.Search -%}. W tym warunku znajduje się tylko jedna linijka. Podmień ją na {% capture url -%}{{products.Search.Url}}{% endcapture -%}
Następnie w pliku js/layout.js, wyszukaj funkcję getSearchFilters, a w niej warunek if (d.length == 2 && !d[0].value && !d[1].value) {. Usuń ten warunek wraz z jego zawartością. Kilka linijek niżej jest $.get. Zastąp go wraz z całą jego zawartością poniższym kodem:
$.get('', p, function (d) {
if (d.action.Result) {
if (d.action.Redirect302 != null) {
location.href = d.action.Redirect302;
}
}
});
Dodanie nowego widoku filtrów
Dodanie nowego widoku filtrów
Szablon Szafir umożliwia dodanie w nim nowego widoku filtrów oraz modyfikowację ustawienia szablonu, aby był bardziej czytelny. Zmiany wyglądu dotyczą opisu danej kategorii i graficznych odnośników do podkategorii.
Wskazówka
W tym artykule dowiesz się jak wprowadzać zmiany w plikach js i scss. Dodatkowe informacje o kompilacji i minifikacji znajdziesz w centrum pomocy.
Szafir
W pliku __settings.liquid dodaj poniżesze tłumaczenia:
{% assign productsList = "Lista towarów" -%}
{% assign filterPanel = "Panel filtra" -%}
{% assign filterPanelView = "Widok panelu filtra" -%}
{% assign filterPanelViewOption1 = "Po lewej pod menu kategorii" -%}
{% assign filterPanelViewOption2 = "U góry nad listą towarów" -%}
{% assign defaultSection = "Sekcja domyślnie" -%}
{% assign closed = "Zwinięta" -%}
{% assign opened = "Rozwinięta" -%}
{% assign graphMenu = "Graficzne menu" -%}
{% assign graphMenuInfo = "Dodatkowe, graficzne menu nawigacji do podgrup" -%}
{% assign category = "Kategoria" -%}
{% assign nameGraphDescCategory = "Nazwa, grafika i opis kategorii" -%}
{% assign overProductsList = "Nad listą towarów" -%}
{% assign underProductsList = "Pod listą towarów" -%}
{% assign graphFormOfNameDescImgCategory = "Forma graficzna prezentowania nazwy, opisu i zdjęcia kategorii" -%}
{% assign backgroundImage = "Zdjęcie w tle" -%}
{% assign leftImage = "Zdjęcie po lewej" -%}
W tym samym pliku wyszukaj frazę id="tab1" i linijkę niżej wklej:
{{productsList}}
Teraz wyszukaj frazę:
{% endif -%}
{% if settings.filterPanelView == "left" -%}
{% endif -%}
W pliku common/categories-navigation/categories-navigation-partial.html na samym dole znajdź warunek {% if areFilteringOptionsClass == 'with-filters-ui' -%} i zamień go na {% if areFilteringOptionsClass == 'with-filters-ui' and settings.filterPanelView == "left" -%}
Następnie w pliku js/init.js znajdź frazę events: function() i linijkę niżej wklej poniższy kod:
$('body').on('change', '.all-values-checkbox-lq', function(e) {
var isChecked = $(e.currentTarget).prop('checked');
$(e.currentTarget).parents('.filter-item-lq').find('[type=checkbox]').prop('checked', isChecked);
});
$('body').on('change', '.filters-up-lq .product-filters-lq input', function(e) {
app.filter(e);
});
Kontynuując zmiany w tym samym pliku, wyszukaj frazę form.find('[type="number"]').val(''); i zmień tam number na tel. Na końcu funkcji w której znajduje się ta fraza dopisz app.filter(e);.
Przejdź do pliku js/init-ui1.js i na samym końcu wklej poniższy kod:
$('body').on('click', '.toggle-filters-button-lq', function () {
$('.filters-label-lq').toggleClass('hidden-lq');
});
W tym momencie masz już dodany filtr, w następnych krokach będziesz edytował styl. W pliku scss/globals/_globals-m.scss znajdź frazę .products-page-lq{ i usuń z tej klasy margin-top: 114px;. Kilka linijek niżej znajdziesz:
.category-description-ui{
display: none;
}
Usuń ten fragment. Jeszcze niżej znajdziesz .category-img-ui{. Usuń w nim height: auto !important;. Znajdz i usuń poniższy fragment:
.view-options-mobile-ui{
width: 21px;
margin-right: 20px;
}
Linijkę niżej jest kod .sorting-options-ui{. Zmień w nim linijkę width: calc(100vw - 80px - 21px - 60px); na width: calc(100vw - 192px); i usuń oba wpisy związane z wysokością height: 26px;. Następnie w obrębie @media only screen and (max-width: 1279px) { (np w 2 linijce pliku) wklej poniższy kod:
.products-navigation-ui.filters-up-ui .sorting-views-container-ui .sorting-options-ui{
.dropdown-trigger-ui{
padding: 10px;
}
.toggle-filters-button-ui{
padding-bottom: 0;
& + .active-sorting-option-ui{
display: block;
}
}
}
.filters-up-main-container-ui{
margin: 0;
}
.filters-up-ui{
position: static;
margin: 0;
width: 100%;
background-color: $bgColor;
.sorting-views-container-ui{
padding: 20px 20px 0 20px;
}
.product-filters-ui{
position: static;
padding: 0;
background: $bgColor;
& > ul{
margin: 20px;
li{
width: calc(50% - 10px);
&:first-child{
width: 100%;
}
&:nth-child(5n){
margin-right: 20px;
}
&:nth-child(2n+1){
margin-right: 0;
}
}
}
}
}
.undercategory-links-ui{
padding: 0 20px;
a{
width: calc(50% - 10px);
&:nth-child(5n){
margin-right: 20px;
}
&:nth-child(2n){
margin-right: 0;
}
}
}
Przejdz do pliku scss/globals/_globals1.scss na samym dole wklej poniższy kod:
.undercategory-links-ui{
display: flex;
flex-wrap: wrap;
a{
width: calc(20% - 16px);
border: 1px solid $lightBorderColor;
margin: 0 20px 20px 0;
padding: 20px;
text-align: center;
&:nth-child(5n){
margin-right: 0;
}
}
.category-name-ui{
font-weight: 700;
margin-bottom: 20px;
color: $primaryColorFont;
}
img{
max-width: 100%;
max-height: 200px;
}
}
.graph-desc-category-down-ui{
display: flex;
flex-flow: column;
.category-section-ui{
order: 1;
}
}
.category-section-ui{
button{
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
border: 1px solid $lightBorderColor;
padding: 20px;
background: transparent;
color: $primaryColorFont;
}
h1{
font-size: 20px;
color: $primaryColorFont;
}
&.left-ui{
.category-img-ui .category-container-ui .category-container-bg-ui{
max-width: none;
}
.category-img-lq{
display: flex;
border: 1px solid $lightBorderColor;
height: auto !important;
}
.img-container-ui{
min-width: 150px;
max-width: 150px;
padding: 20px;
}
img{
max-height: 100%;
}
.category-container-ui{
position: static;
}
.category-description-ui{
height: auto !important;
}
}
}
.filters-up-ui{
flex-wrap: wrap;
.toggle-filters-button-ui + .active-sorting-option-ui{
transition: all ease 300ms;
}
.sorting-options-ui .toggle-filters-button-ui{
padding-bottom: 10px;
&.with-quantity-ui{
padding-bottom: 0;
}
&.expanded-lq{
background-color: $btnSolidBgColor;
color: $btnSolidTextColor;
& + .active-sorting-option-ui{
background-color: $btnSolidBgColor;
color: $btnSolidTextColor;
}
}
}
.product-filters-ui > ul{
display: flex;
flex-wrap: wrap;
li{
width: calc(20% - 16px);
border: 1px solid $lightBorderColor;
margin: 0 20px 20px 0;
&:nth-child(5n){
margin-right: 0;
}
}
.price-filter-ui{
padding: 20px;
}
.reset-filters-ui{
border: none;
}
.filter-drop-ui{
padding: 10px 20px;
border-bottom: 1px solid $lightBorderColor;
}
.filter-value-list-ui{
padding: 10px 20px;
overflow: auto;
&::-webkit-scrollbar {
width: 4px;
border-radius: 50%;
}
&::-webkit-scrollbar-track {
-webkit-box-shadow: inset 0 0 4px transparent;
}
&::-webkit-scrollbar-thumb {
background-color: rgba(#8E8E8E, 0.5);
outline: none;
border-radius: 2px;
&:hover{
background-color: #8E8E8E;
}
}
&.three-ui{
max-height: 140px;
}
&.five-ui{
max-height: 220px;
}
&.eight-ui{
max-height: 340px;
}
}
}
}
Ostatnim krokiem będzie znalezienie w scss/partials/_product-list.scss frazy .change-view-ui i podmień margin-right na margin-left
Jedyne zmiany w panelu administracyjnym wymagają dodania dwóch tłumaczeń. Wygląd sklepu -> Ustawienia -> Tłumaczenia:
- CloseFilters: Zwiń filtry
- ClearAllFilters: Wyczyść wszystkie filtry
Zmiana nagłówka sekcji polecanych towarów na przykładzie szablonu Topaz
Wstęp
W standardowym szablonie Topaz sekcja polecanych towarów domyślnie wyświetla się z nazwą "Towary polecane". W tym artykule dowiesz się w jaki sposób dostosować tą nazwę do swojego e-Sklepu.
Dodanie tłumaczenia
Tytuł sekcji Towary polecane można zmienić dodając odpowiednie tłumaczenie do szablonu oraz edytując kod HTML szablonu.
W pierwszej kolejności należy dodać tłumaczenie w sekcji Wygląd sklepu/ Ustawienia/ Tłumaczenia po kliknięciu w przycisk Dodaj należy wpisać Id tłumaczenia oraz Tekst, który będzie się wyświetlał w e-Sklepie. Zmiany należy zatwierdzić przyciskiem Dodaj.
Edycja kodu HTML
Następnie w panelu administracyjnym w sekcji: Wygląd sklepu/ Ustawienia/ Więcej (trzy kropki) / Edytuj ustawienia zaawansowane, a następnie Więcej/ Edytuj HTML należy przejść do katalogu elements/ recommendedgdzie znajdują się pliki HTML z sekcjami Towary polecane.
Tytuł sekcji znajduje się w linijce:
<span class="recommended-products-title">{{ translations.Recommended }}</span>
gdzie fragment Recommended jest Id tłumaczenia wprowadzanego w panelu administracyjnym. Aby zmienić nagłówek sekcji Towary polecane należy w miejsce Recommended wprowadzić Id wcześniej dodanego tłumaczenia. Po wprowadzonych zmianach w szablonie należy zapisać i opublikować zmiany.
Przyklad
Jeżeli w panelu administracyjnym dodałeś tłumaczenie o Id: PolecanaSekcja wówczas fragment kodu HTML powinien wyglądać następująco:
<span class="recommended-products-title">{{ translations.PolecanaSekcja }}</span>
Wskazówka
Nadmierna ilość sekcji polecanych i wyświetlanych w niej towarów może obciążyć wyświetlanie strony w wyniku czego strona może się gorzej ładować i indeksować.
Zmiana nagłówka w pozostałych szablonach
W pozostałych standardowych szablonach Comarch zmiana nagłówka sekcji polecanych towarów odbywa się podobnie natomiast należy dokonać edycji następujących plików HTML:
Zmiana szablonu i treści wiadomości e-mail to jedna z tych rzeczy, która może wyróżnić nas na tle konkurencji. Mail, który przyciąga uwagę potrafi sprawić, że w przyszłości Klient szybciej skojarzy naszą firmę. Dodatkowo zmiana kolorystyki wyrazów w mailu może pomóc odbiorcy zwrócić uwagę na istotne informacje.
W tym artykule dowiesz się, jak zarządzać powiadomieniami e-mail w Comarch e-Sklep, a także w jaki sposób możesz zarządzać szablonem domyślnym.
Uwaga
Dodatkowe modyfikacje stopki w szablonie wiadomości e-mail nie są wskazane dla osób, które nie posiadają wiedzy na temat kodowania w HTML.
Wskazówka
Po przeczytaniu całej instrukcji warto skorzystać z naszych przykładów, które utrwalą Twoją wiedzę i ułatwią kolejne modyfikacje szablonu wiadomości e-mail.
Gdzie zarządzać treściami powiadomień e-mail w Comarch e-Sklep?
Dostęp do treści związanych z komunikacją pomiędzy kontrahentem, a Comarch e-Sklep znajduje się w panelu administracyjnym w sekcji Ustawienia/Treści formalne.
W tym obszarze znajdują się następujące treści:
Zgody,
Wysyłka e-mail i SMS,
Wydruki,
Komunikaty,
Regulamin i inne.
Wszystkie treści wiadomości możemy edytować wchodząc w jej szczegóły. W środku możemy określić ich widoczność oraz zmienić lub modyfikować takie dane jak:
Zmiana nadawcy wiadomości,
Dodać lub usunąć odbiorcę,
Ustawić, żeby potwierdzenie wiadomości zostało wysłane również do opiekuna,
Temat,
Język,
Treść.
Pierwsze dwa pola związane są z odbiorcą i nadawcą, zmieniamy je klikając w zaznaczony obszar:
Po zakończeniu zmian klikamy w przycisk zapisz. Warto dla sprawdzenia poprawności treści wysłać wiadomość próbną. Opcja dostępna jest na szczegółach każdego powiadomienia - w prawym górnym rogu. Dla wszystkich treści wysyłanych testowo z obszaru Ustawienia/ Treści formalne/ Wysyłka e-mail i SMS obejmuje walidacja wprowadzonych danych.
Szablon wiadomości e-mail znajduje się w panelu administracyjnym Comarch e-Sklep.
Aby zmienić domyślny szablon wiadomości postępuj zgodnie z poniższymi krokami.
Krok 1. W panelu przejdź do sekcji Ustawienia/ Treści formalne/Wysyłka e-mail i SMS.
Krok 2. Z listy dostępnych treści wybierz okienko Szablon i przejdź do jego szczegółów.
Krok 3. W nowym oknie rozpocznij edycję szablonu wiadomości e-mail.
Każda linijka kodu, która jest z komentarzem odpowiada za wygląd naszego maila.
Przyklad
Wskazówka
Komentarze pomocnicze wyróżnione są kolorem brązowym i zawierają się w ramkach /**/. Nie usuwaj ich, ponieważ służą tylko do opisywania linijki kodu i mogą być przydatne podczas kolejnych modyfikacji.
Uwaga
Zmień tylko miejsca, które są opisane w instrukcji. Usunięcie nawet jednego symbolu może spowodować zniekształcenie całego szablonu. Jeżeli jednak usunąłeś za dużo elementów możesz przywrócić ustawienia domyślne. Pomocny artykuł: Jak przywrócić standardową treść wiadomości e-mail?
Edycja kolorów w szablonie wiadomości
Przed zabraniem się za zmianę kolorów warto sprawdzić szatę graficzną naszego e-Sklepu. Informację odnośnie kodów kolorów użytych w naszym szablonie możemy znaleźć w dwóch miejscach:
W panelu administracyjnym w zakładce Wygląd sklepu/ Ustawienia/ Ustawienia szablonu widzimy jaki kolor jest przyporządkowany do konkretnego miejsca w naszym szablonie. Kod używanego koloru znajduje się po prawej stronie. Można go skopiować oraz dowolnie modyfikować.
W konsoli przeglądarki (wciskając F12) możliwa jest weryfikacja poszczególnych kolorów użytych w wybranych elementach szablonu. Wybierając ikonę umożliwiamy sobie weryfikację obiektu oraz jego szczegółów po najechaniu na niego kursorem.
Po przygotowaniu kolorów możemy się zabrać za ich edycję w naszym szablonie wiadomości e-mail. W kodzie HTML szablonu szukamy w komentarzach miejsca, które chcemy podmienić. Po znalezieniu odpowiedniej linijki zmieniamy symbol koloru, który jest po symbolu „#” (UWAGA! Nie usuwamy tego symbolu).
Po wprowadzeniu modyfikacji zapisz zmiany.
Wskazówka
W dowolnym momencie dokonywania zmian po ich wcześniejszym zapisaniu możesz je zobaczyć wysyłając wiadomość próbną. Wybieramy dowolną wiadomość z miejsca Ustawienia/ Treści formalne/Wysyłka e-mail i SMS a następnie klikamy w prawym górnym roku w Więcej i Wyślij próbnie. Pojawi nam się okno:
Wpisujemy maila na, którego ma dojść wiadomość i klikamy w przycisk Wyślij próbnie.
Motywy kolorystyczne dla szablonów wiadomości e-mail
Szablon wiadomości e-mail możesz w każdej chwili dowolnie modyfikować. Niżej prezentujemy przykładowe motywy kolorystyczne stworzone na bazie dostępnych motywów w Kreatorze Wyglądu Comarch oraz tabelę z odpowiednimi wartościami kolorów dla poszczególnych elementów w szablonie wiadomości.
Szablon domyślnyTopaz - motyw bordowyTopaz - motyw granatowyTopaz - motyw błękitnyTopaz - motyw beżowy
Motyw kolorystyczny szablonu Topaz:
Domyślny
Granatowy
Bordowy
Błękitny
Beżowy
Nazwa:
a
CB6724
151B72
BE2745
FF9181
BCAA9C
bgcolor1
ffffff
ffffff
ffffff
ffffff
ffffff
bgcolor2
F0A88D
9597AD
CD6B7F
BAD4F0
E6CAA6
shopName
CB6724
151B72
BE2745
FF9181
BCAA9C
footerTitle
191616
000000
000000
17191A
3B3B3B
footerText
191616
000000
000000
17191A
3B3B3B
title1
4eb6f1
4eb6f1
4eb6f1
4eb6f1
4eb6f1
title2
ff7670
ff7670
ff7670
ff7670
ff7670
title3
53ccbd
53ccbd
53ccbd
53ccbd
53ccbd
text
191616
000000
000000
17191A
3B3B3B
orderColumnName
a8a9a9
9597ad
a8a9a9
9597ad
909090
orderDetails
3b3a3a
000000
000000
17191A
3B3B3B
orderPaymentName
a8a9a9
9597ad
a8a9a9
9597ad
909090
orderPaymentValue
191616
3B3B3B
000000
17191A
3B3B3B
orderPaymentTotal
CB6724
151B72
BE2745
FF9181
BCAA9C
tableName
CB6724
151B72
BE2745
FF9181
BCAA9C
rowName
191616
000000
000000
17191A
3B3B3B
rowContent
a8a9a9
9597ad
a8a9a9
9597ad
909090
feedbackButton (background-color)
CB6724
C85555
CD6B7F
FF9181
3B3B3B
feedbackButton (color)
ffffff
ffffff
ffffff
ffffff
ffffff
feedbackButton (border)
CB6724
C85555
CD6B7F
FF9181
3B3B3B
feedbackButton-2 (background-color)
191616
151B72
000000
17191A
BCAA9C
feedbackButton-2 (color)
ffffff
ffffff
ffffff
ffffff
ffffff
feedbackButton-2 (border)
191616
151B72
000000
17191A
BCAA9C
finishPaymentButton (background-color)
CB6724
C85555
CD6B7F
FF9181
3B3B3B
finishPaymentButton (color)
ffffff
ffffff
ffffff
ffffff
ffffff
finishPaymentButton (border)
CB6724
C85555
CD6B7F
FF9181
3B3B3B
Jak zmienić kształt przycisków w powiadomieniach e-mail?
Obecnie w szablonie wiadomości możemy mieć dwa rodzaje przycisków:
Kwadratowe,
Zaokrąglone.
Zmiany ich wyglądu dokonujemy w zakładce Ustawienia/ Treści/ E-mail i SMS. W kodzie HTML szukamy przycisku który chcemy podmienić.
Wskazówka
W komentarzach zawarte są szczegółowe informację odnośnie każdej linijki kodu. Dzięki temu możemy łatwo znaleźć odpowiedni przycisk i tym samy wiemy, która linijka służy np. do zmiany koloru przycisku lub koloru tekstu. Każdy przycisk jest opisany w następujący sposób:
W miejscu zaznaczonym na czerwono wpisujemy odpowiednią wartość, która wpływa na kształt przycisków w wiadomości:
0, gdy chcemy, aby przyciski były prostokątne,
50px, gdy chcemy, aby przyciski były zaokrąglone.
Warto, żebyśmy wybrali formę i kolorystykę zbliżoną do wyglądu naszego e-Sklepu.
Jak dodać logo w szablonie wiadomości e-mail?
W wiadomościach, które wysyłamy do naszego klienta za pośrednictwem panelu administracyjnego zamieszczone jest logo naszego e-Sklepu. Domyślnie logo pobierane jest z konfiguracji, czyli z sekcji Ustawienia/ Ustawienia sklepu/ Dane sprzedawcy/ Logotyp.
Więcej informacji odnośnie logotypu znajdziesz w artykule: Logotyp oraz favicon w Comarch e-Sklep (Logotyp oraz favicon w Comarch e-Sklep – Centrum Pomocy Comarch e-Sklep).
Jeżeli chcesz zamieścić w szablonie wiadomości e-mail inne logo, niż domyślnie ustawione w konfiguracji konieczna jest jego modyfikacja. Jak jej dokonać? Postępuj zgodnie z poniższymi krokami.
Krok 1. Wgraj plik z docelowym logiem na swój serwer.
Krok 2. W panelu administracyjnym przejdź do sekcji Ustawienia/ Treści/ E-mail i SMS i rozpocznij edycję szablonu.
Krok 3. Odszukaj w szablonie frazy src="{{config.Url}}logo.png".
Krok 4. W każdej odnalezionej frazie (będzie ich 4) wstaw ścieżkę z serwera, na którym został udostępniony plik z logiem.
Krok 5. Zapisz wprowadzone zmiany.
Jak edytować stopkę wiadomości e-mail?
Wszystkie dane kontaktowe, które są w stopce wiadomości e-mail pobierane są ustawień w panelu administracyjnym. Wszystkie frazy, które są zaznaczone na czerwono można w łatwy sposób zmienić w naszej stopce.
Krok 1. W panelu administracyjnym przejdź do sekcji Ustawienia/ Treści formalne/Wysyłka e-mail i SMS i edycję szablonu.
Krok 2. Odszukaj w szablonie frazy i je podmień.
Krok 3. Zapisz wprowadzone zmiany.
Wskazówka
Informacje odnośnie dodawania ikon social mediów w szablonie znajdziesz w artykule: Ustawienia Wyglądu Sklepu w zakładce Nagłówek / Stopka
Obsługa wtyczki Czatu Facebooka w szablonach
Wskazówka
Od 1 czerwca 2025 roku zakończyliśmy aktualizację oraz wydawanie nowych wersji szablonów Bursztyn, Agat i Opal, a tym samym ich wsparcie, aby skupić się na nowoczesnych rozwiązaniach, które jeszcze lepiej odpowiadają na potrzeby dynamicznie rozwijającego się rynku e-commerce.
Zachęcamy Was do przejścia na nasze nowe, udoskonalone szablony. Dla sklepów B2C polecamy szablony Topaz, One Page Shop oraz Dla Gastronomii, natomiast dla platform B2B idealnym wyborem będą Rubin i Szafir.
Uwaga
Z dniem 9 maja 2024 roku wtyczka została oficjalnie wycofana. Więcej informacji można znaleźć w Centrum Pomocy Meta.
W niniejszym artykule dowiesz się w jaki sposób Twój szablon może obsługiwać wtyczkę Czatu Facebooka.
Na początku omówiona zostanie ogólna instrukcja ustawienia wtyczki oraz opisane zostaną ustawienia w konfiguracji Facebooka, na które warto zwrócić uwagę. W dalszych punktach zostaną omówione wymagane zmiany w kodzie poszczególnych szablonów.
Uwaga
Instrukcja dotyczy dodania wtyczki dla standardowych szablonów Comarch od wersji 2021.2.
1. W przeglądarce internetowej otwieramy stronę https://business.facebook.com. Logujemy się swoimi danymi.
2. Wybieramy opcję Skrzynka odbiorcza. Z menu po prawej stronie wybieramy opcję Ustawienia.
3. Z listy po lewej wybieramy opcję Wtyczka czatu. Po załadowaniu się ustawień, znajduje się opcja Skonfiguruj wtyczkę czatu Klikamy przycisk Skonfiguruj.
4. Pokaże się małe okienko do konfiguracji.
5. Na początku mamy do wyboru metodę konfiguracji. Wybieramy opcję Standardowa.
6. W kroku pierwszym ustawiamy język, w jakim nasza wtyczka będzie pracować.
7. Krok drugi to dodanie naszej domeny. Zwróć uwagę na to, czy podana przez Ciebie domena posiada protokół http czy https. Podany w niniejszej konfiguracji musi się zgadzać z faktycznymi ustawieniami.
Jeśli korzystasz z szablonu Topaz, One Page Shop lub Szafir, możesz pominąć kroki 8 oraz 9. W wygenerowanym przez Meta kodzie do wklejenia, znajdź tylko page_id i znajdujący się tam numer (identyfikator) skopiuj - będzie potrzebny w ustawieniach szablonu.
8. (Dla szablonu Bursztyn, Opal, Agat) Krok trzeci to kod potrzebny do dodania wtyczki do szablonu. Należy go skopiować przy użyciu przycisku Skopiuj kod.
9. (Dla szablonu Bursztyn, Opal, Agat) Wklej skopiowany przed chwilą kod w odpowiednie miejsce w Twoim szablonie. Instrukcja gdzie należy wkleić ten kod, znajduje się poniżej, dla każdego ze standardowych szablonów z osobna.
Opcjonalnie:
10. Przejdź do sekcji Dostosuj wtyczkę Wtyczka czatu gdzie można ustawić m.in. wyrównanie wtyczki do lewej lub prawej strony, jej motyw kolorystyczny a także odległość od dołu strony dla komputerów i urządzeń mobilnych.
W tej sekcji możesz także dodatkowo ustawić automatyczne rozwijanie okna czatu oraz włączyć lub wyłączyć czat dla osób niezalogowanych do Facebooka bądź Messengera.
11. Przejdź do sekcji Rozpocznij konwersację gdzie można ustawić wiadomość powitalną a także włączyć/wyłączyć funkcję najczęściej zadawanych pytań. Pytania wraz z odpowiedziami na nie konfigurujemy w tej sekcji dowolnie.
Zwróć uwagę na te ustawienia:
Po procesie konfiguracji mogą wystąpić pewne problemy lub błędy. Część z nich może być spowodowana nieprawidłowymi ustawieniami Twojej strony na Facebooku. Na głównej stronie na rozwijanym menu po lewej stronie kliknij Wszystkie narzędzia, potem Ustawienia strony a następnie wybierz sekcję Ogólne. Ustawienia, które mogą powodować problemy to m.in. Widoczność strony, gdy mamy ustawioną opcję "Cofnięto publikację strony". Kolejnymi ustawieniami do sprawdzenia są Ograniczenia dotyczące kraju oraz Ograniczenia wiekowe. Ewentualne narzucenie ograniczeń może powodować błędy wyświetlane w konsoli w narzędziach developerskich, gdy otworzysz swój sklep.
Sprawdź też sekcję Wszystkie narzędzia -> Ustawienia strony -> Zaawansowane ustawienia wiadomości, a tam ustawienie Domeny dodane do białej listy. Upewnij się, że Twój sklep znajduje się na tej liście.
Z perspektywy Klienta, w przypadku ewentualnych błędów związanych z wyświetlaniem lub działaniem wtyczki, pomocne może okazać się wyczyszczenie pamięci podręcznej (cache).
Obsługa w szablonie Topaz, One Page Shop i Szafir
1. W przygotowanym przez Meta kodzie do wklejenia, odszukaj page_id i skopiuj podany tam numer (identyfikator).
2. Skopiowany identyfikator wklej w Panelu Administracyjnym Comarch e-Sklep, przechodząc do zakładki: Topaz/One Page Shop: Wygląd Sklepu/ Ustawienia/ Dodatkowe/ Wyświetlaj Facebook czat, Szafir: Wygląd sklepu/ Ustawienia/ Ogólne/ Wyświetlaj Facebook czat i zaznaczając parametr na Tak:
Obsługa w szablonie Bursztyn
W szablonie Bursztyn, skopiowany kod należy wkleić do pliku _layout.html znajdującego się w głównym katalogu z Twoim szablonem. Kod wklejamy pod koniec tego pliku. Poniżej niego mają zostać tylko linijki zawierające zamknięcie tagu html oraz zamknięcie tagu body.
Istnieje możliwość zmiany położenia wtyczki. Przy pomocy konfiguratora wtyczki czatu możemy ustalić, czy ma być ona wyrównana do lewej czy do prawej strony, zmienić motyw kolorystyczny dopasowując go do wyglądu sklepu, a także ustalić w jakiej odległości od dołu ekranu ma pojawiać się wtyczka (dla wyrównania do prawej, sugerowana odległość na komputery w szablonie Bursztyn to 120px). Można także własnoręcznie edytować style naszej wtyczki. W plikach .scss wystarczy dodać odpowiednio klasę .fb_customer_chat_bounce_in_v2 - okno czatu oraz .fb_customer_chat_icon - ikona wtyczki a następnie przy użyciu gulp'a przekonwertować pliki .scss na .css. Zmiany możemy dokonać na końcu pliku main.scss.
Obsługa w szablonie Opal
W szablonie Opal, skopiowany kod należy wkleić do pliku _layout.html znajdującego się w głównym katalogu z Twoim szablonem. Kod wklejamy pod koniec tego pliku. Poniżej niego mają zostać tylko linijki zawierające zamknięcie tagu html oraz zamknięcie tagu body.
Istnieje możliwość zmiany położenia wtyczki. Przy pomocy konfiguratora wtyczki czatu możemy ustalić, czy ma być ona wyrównana do lewej czy do prawej strony, zmienić motyw kolorystyczny dopasowując go do wyglądu sklepu, a także ustalić w jakiej odległości od dołu ekranu ma pojawiać się wtyczka (dla wyrównania do prawej, sugerowana odległość na komputery w szablonie Opal to 110px). Można także własnoręcznie edytować style naszej wtyczki. W plikach .scss wystarczy dodać odpowiednio klasę .fb_customer_chat_bounce_in_v2 - okno czatu oraz .fb_customer_chat_icon - ikona wtyczki a następnie przy użyciu gulp'a przekonwertować pliki .scss na .css. Zmiany możemy dokonać na końcu pliku main.scss.
Obsługa w szablonie Agat
W szablonie Agat, skopiowany kod należy wkleić do pliku _layout.html znajdującego się w głównym katalogu z Twoim szablonem. Kod wklejamy pod koniec tego pliku. Poniżej niego mają zostać tylko linijki zawierające zamknięcie tagu html oraz zamknięcie tagu body.
Istnieje możliwość zmiany położenia wtyczki. Przy pomocy konfiguratora wtyczki czatu możemy ustalić, czy ma być ona wyrównana do lewej czy do prawej strony, zmienić motyw kolorystyczny dopasowując go do wyglądu sklepu, a także ustalić w jakiej odległości od dołu ekranu ma pojawiać się wtyczka (dla wyrównania do prawej, sugerowana odległość na komputery w szablonie Agat to 120px). Można także własnoręcznie edytować style naszej wtyczki. W plikach .scss wystarczy dodać odpowiednio klasę .fb_customer_chat_bounce_in_v2 - okno czatu oraz .fb_customer_chat_icon - ikona wtyczki a następnie przy użyciu gulp'a przekonwertować pliki .scss na .css. Zmiany możemy dokonać na końcu pliku main.scss.
Przykładowy kod do modyfikacji wyglądu wtyczki - wersja na komputery
Poniżej znajduje się przykładowy kod służący modyfikacji położenia i wysokości zarówno okna czatu, jak i ikonki czatu.
Zakładamy, że w ustawieniach wtyczki opisanych wcześniej, mamy wyrównanie do prawej i 120px odległości od dołu w wersji na komputery.
Kod w wersji .scss (Po jego wklejeniu do odpowiedniego pliku w danym szablonie, należy przekonwertować pliki .scss na pliki .css i dokonać ich minifikacji. Jak tego dokonać dowiesz się z tego artykułu.
@media screen and (min-width: 769px) {
.fb_customer_chat_bounce_in_v2 {
bottom:185px !important;
right:3% !important;
height:600px !important
}
.fb_customer_chat_icon {
bottom:125px !important;
right:2.3% !important
}
}
Wskazówka
Przedstawiony kod jest tylko przykładem, jak możemy edytować wygląd naszej wtyczki. Należy pamiętać także o utworzeniu styli dla wersji mobilnej przy użyciu @media.
Wskazówka
W przykładzie została użyta instrukcja !important Jest to o tyle istotne, że bez jej użycia możemy nie nadpisać domyślnego wyglądu wtyczki przygotowanego przez Facebooka.
Trusted Shops – jak dodać logo do sklepu?
Wskazówka
Od 1 czerwca 2025 roku zakończyliśmy aktualizację oraz wydawanie nowych wersji szablonów Bursztyn, Agat i Opal, a tym samym ich wsparcie, aby skupić się na nowoczesnych rozwiązaniach, które jeszcze lepiej odpowiadają na potrzeby dynamicznie rozwijającego się rynku e-commerce.
Zachęcamy Was do przejścia na nasze nowe, udoskonalone szablony. Dla sklepów B2C polecamy szablony Topaz, One Page Shop oraz Dla Gastronomii, natomiast dla platform B2B idealnym wyborem będą Rubin i Szafir.
Trusted Shops to znak jakości z ochroną kupującego, przyznawany sklepom internetowym. Aby rozpocząć jego integrację z Comarch e-Sklep, najpierw musimy zarejestrować się na stronie TrustedShops. Po przejściu procesu rejestracji i otrzymaniu certyfikatu otrzymamy jego identyfikator, który jest potrzebny do połączenia go z naszym e-Sklepem.
Wprowadzenie identyfikatora Trusted Shops
W panelu administracyjnym należy wprowadzić identyfikator od Trusted Shops. Aby to zrobić, proszę przejść w Ustawienia/ Ustawiania sklepu/ Trusted Shops wpisać identyfikator i kliknąć przycisk Przyłącz.
Następnie proszę podążać za poniższymi wskazówkami dotyczącymi właściwego szablonu.
Dodawanie loga Trusted Shops do e-Sklepu
Kolejnym krokiem w integracji platformy Trusted Shops jest dodanie loga platformy. Dokonuje się tego poprzez edycję kodu HTML szablonu naszego sklepu i wgranie odpowiednich poprawek wymaganych przez platformę. Kod ten posiada kilka parametrów konfiguracyjnych, które zostaną opisane w rozdziale poniżej. Natomiast dalsza część instrukcji zostanie poświęcona implementacji loga zależnie od używanego szablonu w Comarch e-Sklep.
Parametry konfiguracyjne
Fragment kodu ’yOffset’: ’60’, /* offset from page bottom */ określa wysokość, na jakiej ma się znajdować logo Trusted Shops. Często domyślnie jest to wartość 60. Zmiana tej wartości pozwala na dopasowanie elementu do wyglądu posiadanego szablonu.
Parametr ’variant’ odpowiada za wariant wyświetlania Trustbadge. Pozwala określić, które logo Trusted Shops będzie widoczne w naszym sklepie. Domyślnie wybrany wariant to 'reviews’, natomiast pozostałe warianty to 'default’, 'custom_reviews’ oraz 'custom’. Aby je zmienić, wystarczy wpisać nazwę wybranego wariantu w linijce kodu ’variant’:’reviews’,zastępując domyślnie wybrany wariant reviews.
Uwaga
Jeśli chcesz użyć wariantu „custom” lub „custom_reviews”, konieczne będą dodatkowe modyfikacje kodu Trustbadge i używanego szablonu. Więcej na ten temat przeczytasz na stronie TrustedShops
Wybrane warianty prezentują się następująco:
Agat
Etap I - skrypt główny
Krok 1. W panelu administracyjnym przejdź do sekcji Wygląd sklepu/ Ustawienia/ Więcej / Edytuj ustawienia zaawansowane ponownie Więcej / Edytuj HTMLKrok 2. Przejdź do edycji pliku _layout.html, a następnie za pomocą narzędzia wyszukiwania odnajdź frazę </head>.
Krok 3. Powyżej znalezionego fragmentu wklej poniższy skrypt, w którym wartość XXXXXXXXXXXXX należy zastąpić identyfikatorem od Trusted Shops:
Etap II - wstawienie dodatkowego skryptu w szablonie
Krok 1. Pozostając w powyższym obszarze z plikami szablonu należy przejść do edycji partials/ cart/ lastpagesscripts.html i podmienić kod pliku na poniższy skrypt:
<div id="trustedShopsCheckout" style="display: none;">
<span id="tsCheckoutOrderNr">{{cart.PlacedOrder.Id}}</span>
<span id="tsCheckoutBuyerEmail">{{cart.Customer.Email}}</span>
<span id="tsCheckoutBuyerId">-</span>
<span id="tsCheckoutOrderAmount">{{cart.OrderTotalValue}}</span>
<span id="tsCheckoutOrderCurrency">{{currency}}</span>
<span id="tsCheckoutOrderPaymentType">OTHER</span>
</div>
<script>
(function(){try{trustbadge.reInitialize();}catch(err){}})();
</script>
Krok 2. Następnie należy zapisać i opublikować szablon ( Zapisz i opublikuj )
Opal i Bursztyn
Etap I - skrypt główny
Krok 1. W panelu administracyjnym przejdź do sekcji Wygląd sklepu/ Ustawienia/ Więcej / Edytuj ustawienia zaawansowane ponownie Więcej / Edytuj HTMLKrok 2. Przejdź do edycji pliku _layout.html, a następnie za pomocą narzędzia wyszukiwania odnajdź frazę </head>.
Krok 3. Powyżej znalezionego fragmentu wklej poniższy skrypt, w którym wartość XXXXXXXXXXXXX należy zastąpić identyfikatorem od Trusted Shops:
Etap II - wstawienie dodatkowego skryptu w szablonie
Krok 1. Pozostając w powyższym obszarze z plikami szablonu należy przejść do edycji partials/ cart/ lastpagesscripts.html i podmienić kod pliku na poniższy skrypt:
<div id="trustedShopsCheckout" style="display: none;">
<span id="tsCheckoutOrderNr">{{cart.PlacedOrder.Id}}</span>
<span id="tsCheckoutBuyerEmail">{{cart.Customer.Email}}</span>
<span id="tsCheckoutBuyerId">-</span>
<span id="tsCheckoutOrderAmount">{{cart.OrderTotalValue}}</span>
<span id="tsCheckoutOrderCurrency">{{currency}}</span>
<span id="tsCheckoutOrderPaymentType">OTHER</span>
</div>
<script>
(function(){try{trustbadge.reInitialize();}catch(err){}})();
</script>
Krok 2. Następnie należy zapisać i opublikować szablon ( Zapisz i opublikuj )
Wskazówka
Instrukcja dotycząca dodawania logo Trusted Shops w szablonach Topaz, Szafir, One Page Shop znajduje się w artykule Trusted Shops.
Implementacja Google Analytics 4 w szablonach
Comarch e-Sklep jest zintegrowany z Google Analytics 4 dzięki prostej konfiguracji polegającej na dodaniu skryptu śledzącego w panelu administracyjnym. Dzięki zaimplementowanej w e-Sklepie warstwie danych (Data Layer) oraz obsłużonych domyślnie w darmowych szablonach Comarch skryptom uzyskasz dostęp do wielu funkcji Google Analytics takich jak: podstawowe śledzenie ruchu na Twoim sklepie oraz śledzenie transakcji e-commerce.
Posiadając zmodyfikowany szablon również możesz korzystać z Google Analytics 4. Poniżej podpowiadamy jakie pliki HTML należy zmodyfikować, aby statystyki naliczały się w prawidłowy sposób. Zmodyfikuj następujące pliki.
Szafir:
base_layout.html
partials/customer-profile/discounts/discount-elements.html
partials/order/cart.html
partials/order/thx.html
partials/order/products-partials/set-aggregator.html
partials/product/cart-product.html
partials/product/product-presentation-forms.html
js/init.min.js
js/init-ui1.min.js
js/init-ui2.min.js
js/js.min.js
Topaz:
base_layout.html
elements/cart/cart-1.html (lub cart-2.html)
elements/product/product-details-1.html (lub 2,3,4)
partials/cart/cart-item.html (lub partials/cart/new-cart/cart-item.html)
partials/common/notify-about-availability-popup.html
partials/customer/discounts/discount-elements.html
js/layout0.min.js
js/layout1.min.js
js/layout2.min.js
Wskazówka
W celu wyodrębnienia zmian z owych plików, należy porównać dany plik z naszego szablonu z jego odpowiednikiem z najnowszej wersji szablonu
Jak wykonać kopię bezpieczeństwa mojego szablonu?
Jak wykonać kopię bezpieczeństwa mojego szablonu?
Oprawa wizualna sklepu jest bardzo ważnym elementem podczas prowadzenia sprzedaży w sieci. Narzędzie Kreator Wyglądu Comarch e-Sklep umożliwia stworzenie własnych, niepowtarzalnych szablonów wedle preferencji i potrzeb użytkowników. W intuicyjnym narzędziu jakim jest Kreator, będziesz w stanie zaprojektować wszelkie niezbędne funkcje, takie jak stronę główną, listę towarów, szczegóły towaru oraz koszyk.
Jeśli Twój projekt szablonu został zaimportowany do e-Sklepu oraz skonfigurowany wedle Twoich preferencji (dodanie grafik do bannerów, modyfikacje kolorystyczne) masz możliwość jego zapisania, co będzie stanowić kopię bezpieczeństwa.
Kopia bezpieczeństwa to dane, które w każdej chwili można odtworzyć w przypadku ich utracenia (np. poprzez przypadkowe usunięcie) lub częstego wprowadzania zmian. Dane, jakie może zawierać kopia bezpieczeństwa to szablon, który wcześniej został przez nas wygenerowany wraz z bannerami. Zaleca się wykonywanie kopii zapasowych oraz zabezpieczenie ich hasłem. Każda wykonana kopia zapasowa powinna zostać zapisana w bezpiecznym i dogodnym dla Użytkownika miejscu.
Jak wykonać kopię bezpieczeństwa?
W Panelu Administracyjnym przejdź do sekcji Wygląd sklepu/ Ustawienia/ Edytuj ustawienia zaawansowane, a następnie przejdź do zakładki Eksport szablonu.
W pustych polach znajdujących się w zakładce Eksport szablonu, opcjonalnie przed eksportem możesz uzupełnić powyższe dane, tj. Autora szablonu, e-mail, telefon i stronę WWW sklepu.
Aby wyeksportować szablon, kliknij Eksportuj szablon.
Wyeksportowany plik jest w formacie XML, a jego nazwa zawiera szablon oraz wersję, co znacznie ułatwia zarządzanie kopiami bezpieczeństwa w przypadku wykonywania ich regularnie.
Jak wyeksportować bannery?
Bannery, które znajdują się w Twoim sklepie możesz również wyeksportować tworząc kopię bezpieczeństwa. W tym celu także musisz przejść do Wygląd sklepu/ Ustawienia/ Edytuj ustawienia zaawansowane, a następnie do zakładki Eksport szablonu.
Obok przycisku Eksportuj szablon, znajduje się przycisk Eksportuj bannery, który musisz kliknąć aby bannery, które posiadasz w e-Sklepie zostały weksportowane.
Kopia bezpieczeństwa jest również zapisywana w formacie XML, a nazwa pliku wskazuje na szablon, wersję i zawartość bannerów.
Jak zabezpieczyć hasłem swój szablon?
Jeśli chcesz, aby Twój szablon został zabezpieczony hasłem, a znajomość hasła była niezbędna podczas zaimportowania tego szablonu do e-Sklepu, musisz w tym celu przejść w Panelu Administracyjnym do sekcji Wygląd sklepu/ Ustawienia/ Ustawienia zaawansowane, następnie do zakładki Szablon.
W tym miejscu nadasz hasło dla swojego szablonu.
Zgodnie z Polityką bezpieczeństwa haseł, hasło powinno:
Składać się z minimum 8 znaków,
Zawierać dużą literę,
Zawierać małą literę,
Zawierać cyfrę 0-9,
Zawierać znak specjalny – ‘!.+?;^]=-(&_)#=
Gotowe! Teraz Twój szablon został zabezpieczony hasłem.
Jeśli wyeksportujesz szablon, który zabezpieczyłeś hasłem – podczas importu tego szablonu, będziesz musiał podać nadane wcześniej hasło. Jego brak uniemożliwi import szablonu, a podanie błędnego hasła spowoduje nieprawidłowe działanie szablonu po imporcie.
Więcej informacji znajdziesz:
Przekreślenie na atrybutach towaru zgrupowanego - szablon Topaz
Wstęp
W szablonie Topaz, przy włączonej kontroli stanów magazynowych, w przypadku braku produktu towaru zgrupowanego wyświetlany jest przycisk "Powiadom mnie o dostępności". Z tego artykułu dowiesz się jak zmodyfikować swój szablon, aby dodatkowo wyświetlać przekreślenie na niedostępnych atrybutach.
Wskazówka
W tym artykule dowiesz się jak wprowadzać zmiany w plikach js i css. Z tego artykułu dowiesz się jak je minifikować.
Zmiany w plikach szablonu
Przedstawione w artykule modyfikacje są kompatybilne ze wszystkimi czterema widokami szczegółów towaru w szablonie Topaz. Kod odpowiedzialny za przekreślenie na atrybutach, będzie prawie identyczny dla każdego z widoków. Minimalne różnice zostały odpowiednio opisane.
Edycję szablonu rozpocznij od pliku js/layout2.js. Struktura części kodu, którą należy zmienić może się różnić, w zależności czy masz zaimplementowaną graficzną prezentację atrybutów. Dlatego przedstawione zostaną dwa przypadki edycji omawianego pliku.
W przypadku braku implementacji graficznej prezentacji atrybutów, odnajdź fragment:
function SetSuplFirst(drop, s, lvl, valId) {
var form = drop.parent().parent().parent();
var fDrop = form.find('.attributes-select');
drop.empty();
for (var el in s) {
drop.append($('' + s[el].Value + '').data('el', JSON.stringify(s[el])));
}
Kod znajdujący się w pętli for zamień na:
var isUnavailable = false;
var unavailableClassName = "";
if (s[el].Product) {
if (s[el].Product.StockLevel && s[el].Product.StockLevel.Value === 0) {
isUnavailable = true;
}
if (s[el].StockLevel && s[el].StockLevel.Value === 0) {
isUnavailable = true;
}
}
else {
var checkStockLevelLoopObj = s[el];
var checkSuppliesStockLevelLoopObj = s[el];
while (typeof checkStockLevelLoopObj.Product === 'undefined') {
checkSuppliesStockLevelLoopObj = checkStockLevelLoopObj.Supplies;
checkStockLevelLoopObj = checkStockLevelLoopObj.Supplies[0];
}
if (checkSuppliesStockLevelLoopObj.length > 1) {
for (var supply in checkSuppliesStockLevelLoopObj) {
if (checkSuppliesStockLevelLoopObj[supply].Product && checkSuppliesStockLevelLoopObj[supply].Product.StockLevel
&& checkSuppliesStockLevelLoopObj[supply].Product.StockLevel !== 0) {
break;
}
else {
if (checkSuppliesStockLevelLoopObj[supply].Product && !checkSuppliesStockLevelLoopObj[supply].Product.StockLevel) {
break;
} else {
isUnavailable = true;
}
}
if (checkSuppliesStockLevelLoopObj[supply].StockLevel && checkSuppliesStockLevelLoopObj[supply].StockLevel.Value !== 0) {
break;
}
else {
if (!checkSuppliesStockLevelLoopObj[supply].StockLevel) {
break;
} else {
isUnavailable = true;
}
}
}
}
else {
if (checkStockLevelLoopObj.Product && checkStockLevelLoopObj.Product.StockLevel && checkStockLevelLoopObj.Product.StockLevel === 0) {
isUnavailable = true;
}
if (checkStockLevelLoopObj.StockLevel && checkStockLevelLoopObj.StockLevel.Value === 0) {
isUnavailable = true;
}
}
}
if (isUnavailable) {
unavailableClassName = " button-option-unavailable";
}
drop.append($('' + s[el].Value + '').data('el', JSON.stringify(s[el])));
Następnie wyszukaj fragment:
function SetSupl(drop, s) {
var form = drop.closest('#AddToCartForm');
var fDrop = form.find('.attributes-select');
drop.empty();
for (var el in s) {
drop.append($('' + s[el].Value + '').data('el', JSON.stringify(s[el])));
}
I instrukcje w pętli for zastąp tym samym kodem co w przypadku przedstawionej wyżej modyfikacji funkcji SetSuplFirst.
Dla przypadku zaimplementowanej graficznej prezentacji atrybutów, zlokalizuj fragment:
function SetSuplFirst(drop, s, lvl, valId) {
var form = drop.parent().parent().parent();
var fDrop = form.find('.attributes-select'); //pobieram wszystkie kontenery dla poziomów
drop.empty();
var attributesColorsData = drop.data('variants-colors');
var pageLanguage = drop.data('page-language');
var attributesColors = [];
if (attributesColorsData) {
attributesColorsData = attributesColorsData.split('|||');
for (var i = 0; i < attributesColorsData.length; i++) {
var attributesColor = attributesColorsData[i].split('||');
var attributeColorName = attributesColor[0].split('|');
switch (pageLanguage) {
case 1:
attributeColorName = attributeColorName[0];
break;
case 2:
attributeColorName = attributeColorName[1];
break;
case 3:
attributeColorName = attributeColorName[2];
break;
case 5:
attributeColorName = attributeColorName[3];
break;
default:
break;
}
attributesColors.push([attributeColorName,attributesColor[1]]);
}
}
for (var el in s) {
if (drop.data('variants-colors')) {
if ((drop.data('colors-option') === 'Grouping_First' && drop.data('attribute-id') === drop.data('first-attribute-id'))
|| (drop.data('colors-option') === 'Grouping_Last' && drop.data('attribute-id') === drop.data('last-attribute-id'))
|| (drop.data('colors-option') === 'Grouping_All')) {
Teraz w pętli for (var el in s), przed pierwszą instrukcją sterującą if wklej:
var isUnavailable = false;
var unavailableClassName = "";
if (s[el].Product) {
if (s[el].Product.StockLevel && s[el].Product.StockLevel.Value === 0) {
isUnavailable = true;
}
if (s[el].StockLevel && s[el].StockLevel.Value === 0) {
isUnavailable = true;
}
}
else {
var checkStockLevelLoopObj = s[el];
var checkSuppliesStockLevelLoopObj = s[el];
while (typeof checkStockLevelLoopObj.Product === 'undefined') {
checkSuppliesStockLevelLoopObj = checkStockLevelLoopObj.Supplies;
checkStockLevelLoopObj = checkStockLevelLoopObj.Supplies[0];
}
if (checkSuppliesStockLevelLoopObj.length > 1) {
for (var supply in checkSuppliesStockLevelLoopObj) {
if (checkSuppliesStockLevelLoopObj[supply].Product && checkSuppliesStockLevelLoopObj[supply].Product.StockLevel
&& checkSuppliesStockLevelLoopObj[supply].Product.StockLevel !== 0) {
break;
}
else {
if (checkSuppliesStockLevelLoopObj[supply].Product && !checkSuppliesStockLevelLoopObj[supply].Product.StockLevel) {
break;
} else {
isUnavailable = true;
}
}
if (checkSuppliesStockLevelLoopObj[supply].StockLevel && checkSuppliesStockLevelLoopObj[supply].StockLevel.Value !== 0) {
break;
}
else {
if (!checkSuppliesStockLevelLoopObj[supply].StockLevel) {
break;
} else {
isUnavailable = true;
}
}
}
}
else {
if (checkStockLevelLoopObj.Product && checkStockLevelLoopObj.Product.StockLevel && checkStockLevelLoopObj.Product.StockLevel === 0) {
isUnavailable = true;
}
if (checkStockLevelLoopObj.StockLevel && checkStockLevelLoopObj.StockLevel.Value === 0) {
isUnavailable = true;
}
}
}
if (isUnavailable) {
unavailableClassName = " button-option-unavailable";
}
Następnie, w obrębie wspomnianej wyżej pętli for, wyszukaj wszystkie wystąpienia kodu zawierające fragment:
drop.append($('
I dla wszystkich znalezionych przypadków, na końcu fragmentów takich jak przedstawiony powyżej, dodaj kod:
' + unavailableClassName + '
Na koniec zmian w pliku, odnajdź poniższe instrukcje:
function SetSupl(drop, s) {
var form = drop.closest('#AddToCartForm');
var fDrop = form.find('.attributes-select'); //pobieram wszystkie kontenery dla poziomów
drop.empty();
var attributesColorsData = drop.data('variants-colors');
var pageLanguage = drop.data('page-language');
var attributesColors = [];
if (attributesColorsData) {
attributesColorsData = attributesColorsData.split('|||');
for (var i = 0; i < attributesColorsData.length; i++) {
var attributesColor = attributesColorsData[i].split('||');
var attributeColorName = attributesColor[0].split('|');
switch (pageLanguage) {
case 1:
attributeColorName = attributeColorName[0];
break;
case 2:
attributeColorName = attributeColorName[1];
break;
case 3:
attributeColorName = attributeColorName[2];
break;
case 5:
attributeColorName = attributeColorName[3];
break;
default:
attributeColorName = attributeColorName[0];
break;
}
attributesColors.push([attributeColorName,attributesColor[1]]);
}
}
for (var el in s) {
if (drop.data('variants-colors')) {
if ((drop.data('colors-option') === 'Grouping_First' && drop.data('attribute-id') === drop.data('first-attribute-id'))
|| (drop.data('colors-option') === 'Grouping_Last' && drop.data('attribute-id') === drop.data('last-attribute-id'))
|| (drop.data('colors-option') === 'Grouping_All')) {
Teraz dokonaj analogicznych modyfikacji jak w obrębie funkcji SetSuplFirst. Pamiętaj, że tym razem, zmiany we wszystkich wystąpieniach kodu:
drop.append($('
Musisz dokonać w obrębie funkcji SetSupl.
Do dokończenia zmian w szablonie pozostało zmodyfikowanie pliku ze stylami. W zależności od wygenerowanego w kreatorze szablonu widoku szczegółów towaru, nazwa edytowanego pliku będzie się różnić. Zmiany stylistyki w szablonie są identyczne dla wszystkich widoków, lecz umieszczane w innych fragmentach plików.
Najpierw przedstawiona zostanie modyfikacja przeznaczona dla pierwszego i drugiego widoku szczegółów towaru. Otwórz plik css/layout0.css i wyszukaj fragment:
.product-details .input-group input[type='button'].active,.product-details .input-group .attributes-select .button-option.active,.product-details .set .button-option.active,.product-details .set .button-option-sets.active{border:2px solid {{settings.paginationActiveBorderColor}};background-color:transparent}
Teraz tuż za ostatnim znakiem przedstawionego kodu wklej instrukcje:
.product-details .button-option-unavailable{position:relative;color:{{settings.secondaryFontColor}};transition:300ms}.product-details .button-option-unavailable::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;transition:300ms;background-color:rgba(226,226,226,0.2)}.product-details .button-option-unavailable::after{content:"";display:block;position:absolute;top:0;left:0;height:100%;width:100%;transition:300ms;cursor:pointer}@keyframes change-gradient-to-inactive{from{background:linear-gradient(to right top, transparent, transparent 48%, {{settings.secondaryFontColor}} 50%, {{settings.secondaryFontColor}} 50%, transparent 52%, transparent)}to{background:linear-gradient(to right top, transparent, transparent 49%, {{settings.secondaryFontColor}} 50%, {{settings.secondaryFontColor}} 50%, transparent 51%, transparent)}}@keyframes change-gradient-to-active{from{background:linear-gradient(to right top, transparent, transparent 49%, {{settings.secondaryFontColor}} 50%, {{settings.secondaryFontColor}} 50%, transparent 51%, transparent)}to{background:linear-gradient(to right top, transparent, transparent 48%, {{settings.secondaryFontColor}} 50%, {{settings.secondaryFontColor}} 50%, transparent 52%, transparent)}}.product-details .button-option-unavailable:not(.active){border:1px solid {{settings.secondaryFontColor}} !important}.product-details .button-option-unavailable:not(.active)::after{background:linear-gradient(to right top, transparent, transparent 49%, {{settings.secondaryFontColor}} 50%, {{settings.secondaryFontColor}} 50%, transparent 51%, transparent);-webkit-animation:change-gradient-to-inactive 300ms;animation:change-gradient-to-inactive 300ms}.product-details .button-option-unavailable.active{border:2px solid {{settings.secondaryFontColor}} !important}.product-details .button-option-unavailable.active::after{background:linear-gradient(to right top, transparent, transparent 48%, {{settings.secondaryFontColor}} 50%, {{settings.secondaryFontColor}} 50%, transparent 52%, transparent);-webkit-animation:change-gradient-to-active 900ms;animation:change-gradient-to-active 900ms}
Poniżej natomiast pokazane są zmiany przeznaczone dla trzeciego i czwartego widoku szczegółów towaru. Otwórz plik css/layout0.css i wyszukaj fragment:
.productDetails-attributes .button-option:not(.dropdown):not(.units-container){display:flex;flex-direction:row;justify-content:flex-start;align-items:center;margin-bottom:10px;flex-wrap:wrap}.productDetails-attributes .button-option:not(.dropdown):not(.units-container).active{border:2px solid {{settings.linkFontColor}};display:inline-flex}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) span{height:50px;padding-left:15px;padding-right:15px;font-size:14px;font-weight:normal;font-stretch:normal;font-style:normal;line-height:1.71;letter-spacing:1.2px;text-align:center;color:{{settings.primaryFontColor}};border:2px solid {{settings.primaryPageBgColor}};cursor:pointer;transition:300ms;margin-right:5px}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) span:not(.active):hover{border-color:{{settings.secondaryFontColor}}}
Następnie zaraz po ostatnim znaku powyższego fragmentu dodaj kod:
.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-unavailable{position:relative;color:{{settings.secondaryFontColor}};transition:300ms}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-unavailable::before{content:"";position:absolute;top:0;left:0;height:100%;width:100%;transition:300ms;background-color:rgba(226,226,226,0.2)}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-unavailable::after{content:"";display:block;position:absolute;top:0;left:0;height:100%;width:100%;transition:300ms;cursor:pointer}@keyframes change-gradient-to-inactive{from{background:linear-gradient(to right top, transparent, transparent 48%, {{settings.linkFontColor}} 50%, {{settings.linkFontColor}} 50%, transparent 52%, transparent)}to{background:linear-gradient(to right top, transparent, transparent 49%, {{settings.secondaryFontColor}} 50%, {{settings.secondaryFontColor}} 50%, transparent 51%, transparent)}}@keyframes change-gradient-to-active{from{background:linear-gradient(to right top, transparent, transparent 49%, {{settings.secondaryFontColor}} 50%, {{settings.secondaryFontColor}} 50%, transparent 51%, transparent)}to{background:linear-gradient(to right top, transparent, transparent 48%, {{settings.linkFontColor}} 50%, {{settings.linkFontColor}} 50%, transparent 52%, transparent)}}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-unavailable:not(.active){border:1px solid {{settings.secondaryFontColor}}}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-unavailable:not(.active)::after{background:linear-gradient(to right top, transparent, transparent 49%, {{settings.secondaryFontColor}} 50%, {{settings.secondaryFontColor}} 50%, transparent 51%, transparent);-webkit-animation:change-gradient-to-inactive 300ms;animation:change-gradient-to-inactive 300ms}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-unavailable.active{border:1px solid {{settings.linkFontColor}}}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-unavailable.active::after{background:linear-gradient(to right top, transparent, transparent 48%, {{settings.linkFontColor}} 50%, {{settings.linkFontColor}} 50%, transparent 52%, transparent);-webkit-animation:change-gradient-to-active 900ms;animation:change-gradient-to-active 900ms}
Migracja do nowszej biblioteki klienta Google
Wskazówka
Od 1 czerwca 2025 roku zakończyliśmy aktualizację oraz wydawanie nowych wersji szablonów Bursztyn, Agat i Opal, a tym samym ich wsparcie, aby skupić się na nowoczesnych rozwiązaniach, które jeszcze lepiej odpowiadają na potrzeby dynamicznie rozwijającego się rynku e-commerce.
Zachęcamy Was do przejścia na nasze nowe, udoskonalone szablony. Dla sklepów B2C polecamy szablony Topaz, One Page Shop oraz Dla Gastronomii, natomiast dla platform B2B idealnym wyborem będą Rubin i Szafir.
Wstęp
W wersji 2022.4. dostosowaliśmy logowanie do e-Sklepu z pomocą nowszej biblioteki usług tożsamości Google we wszystkich standardowych szablonach Comarch. Proces jest zoptymalizowany i przyjazny dla użytkownika. Ujednolicone zostały także przyciski logowania we wszystkich szablonach Comarch.
Poniżej znajdują się informację o tym w jaki sposób zaimplementować wspomnianą zmianę do wszystkich standardowych szablonów.
Wskazówka
W tym artykule dowiesz się jak wprowadzać zmiany w plikach js, html i scss. Dodatkowe informacje o kompilacji i minifikacji znajdziesz w centrum pomocy.
Na początek w pliku base_layout.html wyszukaj fragment crossorigin="anonymous". Powinien wystąpić raz w całym pliku. Dokładnie w linijkę pod tym elementem wklej ten fragment kodu:
Następnie w pliku static-elements/login/login.html wyszukaj fragment:
{% if config.External.Facebook or config.External.Google -%}
Zamień znajdujący się pomiędzy tym fragmentem a odpowiadającym mu elementem "{% endif -%}" fragment kodu na :
{{translations.Com_Or}}
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID %}
{{translations.Login_Fb}}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID -%}
{% endif -%}
Kolejną czynnością w plikach html dla szablonu Topaz będzie zamiana w pliku partials/customer/account-data.html całego tego fragmentu:
{% if config.External.Facebook or config.External.Google -%}
{{ translations.ExternalWebsites }} {% if customer-profile.LinkedAccounts[0] -%} {% assign fbConnect = 0 -%} {% assign googleConnect = 0 -%} {% for account in customer-profile.LinkedAccounts -%} {% if account.Service == 'Facebook' and config.External.Facebook and config.External.Facebook.AppID != '' %} {{translations.Disconnect_Fb}} {% assign fbConnect = 1 -%} {% elsif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %} {{translations.Disconnect_Google}} {% assign googleConnect = 1 -%} {% endif %} {% endfor %} {% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %} {{translations.ConnectAccount}} {% endif %} {% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %} {{translations.ConnectAccount}} {% endif %} {% else %} {% if config.External.Facebook and config.External.Facebook.AppID != '' %} {{translations.ConnectAccount}} {% endif %} {% if config.External.Google and config.External.Google.ClientID != '' %} {{translations.ConnectAccount}} {% endif %} {% endif %}
{% endif -%}
Na odpowiadający mu i poprawiony fragment:
{% if config.External.Facebook or config.External.Google -%}
{{translations.ExternalWebsites}} {% if customer-profile.LinkedAccounts[0] -%} {% assign fbConnect = 0 -%} {% assign googleConnect = 0 -%} {% for account in customer-profile.LinkedAccounts -%} {% if account.Service == 'Facebook' and config.External.Facebook and config.External.Facebook.AppID != '' %} {{translations.Disconnect_Fb}} {% assign fbConnect = 1 -%} {% elsif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %} {{translations.Disconnect_Google}} {% assign googleConnect = 1 -%} {% endif %} {% endfor %} {% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %} {{translations.ConnectFb}} {% endif %} {% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %} {{translations.ConnectGoogle}} {% endif %} {% else %} {% if config.External.Facebook and config.External.Facebook.AppID != '' %} {{translations.ConnectFb}} {% endif %} {% if config.External.Google and config.External.Google.ClientID != '' %} {{translations.ConnectGoogle}} {% endif %} {% endif %}
{% endif -%}
Następnie należy dokonać zmian w plikach koszyka. W zależności od wybranej wariancji w kreatorze pliki będą się róźnić numerkiem na końcu. Jednak zmiany w html są identyczne dla obydwóch wariancji. W pliku elements/cart/cart-1.html lub /cart-2.html wyszukaj fragment:
{% if config.External.Facebook or config.External.Google -%}
{{translations.LoginBy}}
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID %} {% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID -%} {% endif -%}
{% endif -%}
Następnie zamień ten fragment na wskazany poniżej:
{% if config.External.Facebook or config.External.Google -%}
{{translations.Com_Or}}
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID %}
{{translations.Login_Fb}}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID -%}
{% endif -%}
{% endif -%}
Pliki JavaScript
Zamień całą zawartość pliku js/google-login.js na ten kod:
W pliku js/layout3.js wyszukaj frazę clearInterval(intervalAddress);. Pod jej pierwszym wystąpieniem dodaj fragment location.reload();, w taki sposób jak jest to przedstawione w kodzie poniżej:
W pliku css/layout0.css wyszukaj frazę login-container. Następnie zamień kod znajdujący się za tą frazą na odpowiadający mu fragment znajdujący się poniżej:
Następnie w pliku css/layout2.css wyszukaj frazę login-form__socialButtons. Zamień kod znajdujący się za pierwszym wystąpieniem tej frazy (łącznie z tą frazą) na ten wskazany poniżej:
Ostatnim etapem implementacji będzie dodanie odpowiednich tekstów do swojego szablonu. Odbywa się to poprzez opcję Tłumaczenia , która znajduje się w Panelu administracyjnym sklepu. Dokładna jej lokalizacja ukazana jest poniżej.
W celu dodania tekstu klikamy przycisk dodaj. Dodajemy teksty według poniższej tabeli.
Id
Tekst
ConnectFb
Połącz konto z Facebookiem
ConnectGoogle
Połącz konto z Google
Bursztyn
Pliki html
Na początek w pliku _layout.html wyszukaj fragment crossorigin="anonymous". Powinien wystąpić raz w całym pliku. Dokładnie w linijkę pod tym elementem wklej ten fragment kodu:
W pliku customer/login/login-form.html wyszukaj fragment:
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
Następnie zamień go na ten wskazany poniżej:
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Login_Fb}}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
W pliku customer/registation.html wyszukaj fragment :
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' -%}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
Następnie zastąp go kodem ukazanym poniżej :
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' -%}
{{translations.Login_Fb}}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
Następnie w pliku customer/profile-account.html wyszukaj fragment :
{% if customerProfile.LinkedAccounts[0] -%}
{% assign fbConnect = 0 -%}
{% assign googleConnect = 0 -%}
{% for account in customerProfile.LinkedAccounts -%}
{% if account.Service == 'Facebook' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Disconnect_Fb}}
{% assign fbConnect = 1 -%}
{% elseif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Disconnect_Google}}
{% assign googleConnect = 1 -%}
{% endif %}
{% endfor %}
{% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Connect_Fb}}
{% endif %}
{% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Connect_Google}}
{% endif %}
{% else %}
{% if config.External.Facebook.AppID != '' and config.External.Facebook %}
{{translations.Connect_Fb}}
{% endif %}
{% if config.External.Google.ClientID != '' and config.External.Google %}
{{translations.Connect_Google}}
{% endif %}
{% endif %}
Następnie zastąp ten fragment tym wskazanym poniżej:
{% if customerProfile.LinkedAccounts[0] -%}
{% assign fbConnect = 0 -%}
{% assign googleConnect = 0 -%}
{% for account in customerProfile.LinkedAccounts -%}
{% if account.Service == 'Facebook' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Disconnect_Fb}}
{% assign fbConnect = 1 -%}
{% elseif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Disconnect_Google}}
{% assign googleConnect = 1 -%}
{% endif %}
{% endfor %}
{% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Connect_Fb}}
{% endif %}
{% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Connect_Google}}
{% endif %}
{% else %}
{% if config.External.Facebook.AppID != '' and config.External.Facebook %}
{{translations.Connect_Fb}}
{% endif %}
{% if config.External.Google.ClientID != '' and config.External.Google %}
{{translations.Connect_Google}}
{% endif %}
{% endif %}
Pliki JavaScript
W pliku js/order.js wyszukaj elemnt :
sessionStorage.removeItem('parcelSelected');
Powinien on wystąpić w tym pliku raz. Dokładnie w tym obszarze dokonaj zmian według fragmentu poniżej:
Pamiętaj, że pliki scss należy zminifikować. O tym jak skompilować i zminifikować pliki scss i js dowiesz się z artykułu o kompilacji i minifikacji.
Agat
Pliki html
Na początek w pliku _layout.html wyszukaj fragment crossorigin="anonymous". Powinien wystąpić raz w całym pliku. Dokładnie w linijkę pod tym elementem wklej ten fragment kodu:
W pliku partials/common/login-form.html wyszukaj fragment:
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{% endif -%}
{% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
Występuje on na końu kodu. Zamień wspomniany fragment na ten przedstawiony poniżej:
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{ translations.Login_Fb }}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
W pliku registration.html wyszukaj fragment:
{% if usr.Authenticated == 'false' and config.External.Facebook.AppID != '' and config.External.Facebook -%}
{% endif -%}
{% if usr.Authenticated == 'false' and config.External.Google.ClientID != '' and config.External.Google -%}
{% endif -%}
Następnie zastąp go fragmentem wsazanym poniżej:
{% if usr.Authenticated == 'false' and config.External.Facebook.AppID != '' and config.External.Facebook -%}
{{ translations.Login_Fb }}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
W pliku customer-profile.html wyszukaj fragment :
{% if customerProfile.LinkedAccounts[0] -%}
{% assign fbConnect = 0 -%}
{% assign googleConnect = 0 -%}
{% for account in customerProfile.LinkedAccounts -%}
{% if account.Service == 'Facebook' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Disconnect_Fb}}
{% assign fbConnect = 1 -%}
{% elsif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Disconnect_Google}}
{% assign googleConnect = 1 -%}
{% endif %}
{% endfor %}
{% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Connect_Fb}}
{% endif %}
{% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Connect_Google}}
{% endif %}
{% else %}
{% if config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Connect_Fb}}
{% endif %}
{% if config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Connect_Google}}
{% endif %}
{% endif %}
Następnie podmień ten kod na:
{% if customerProfile.LinkedAccounts[0] -%}
{% assign fbConnect = 0 -%}
{% assign googleConnect = 0 -%}
{% for account in customerProfile.LinkedAccounts -%}
{% if account.Service == 'Facebook' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Disconnect_Fb}}
{% assign fbConnect = 1 -%}
{% elsif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Disconnect_Google}}
{% assign googleConnect = 1 -%}
{% endif %}
{% endfor %}
{% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Connect_Fb}}
{% endif %}
{% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Connect_Google}}
{% endif %}
{% else %}
{% if config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Connect_Fb}}
{% endif %}
{% if config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Connect_Google}}
{% endif %}
{% endif %}
W pliku partials/cart-content.html wyszukaj fragment:
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{% endif -%}
{% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
Zamień ten fragment tym wskzazanym poniżej:
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{ translations.Login_Fb }}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
Pliki JavaScript
W pliku js/google-login.js zamień cały kod na ten wskazany poniżej:
W pliku scss/main.scss wyszukaj frazę span.social-button. Powinna występować raz w danym pliku. Następnie usuń z fragmentu pod tą linijką element width: 250px;, tak aby po edycji wyglądał w ten sposób:
Pamiętaj, że pliki scss należy zminifikować. O tym jak skompilować i zminifikować pliki scss i js dowiesz się z artykułu o kompilacji i minifikacji.
Opal
Pliki html
W pliku _layout.html wyszukaj frazę:
Dokładnie pod tym elementem wklej poniższy kod:
Następnie w plikach customer/login/login-form.html oraz customer/registration.html wyszukaj fragment:
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{% endif -%}
{% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
Zamień wspomniany fragment na ten ukazany poniżej:
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Login_Fb}}`
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID != '' -%}
{% endif -%}
W pliku customer/profile-account.html wyszukaj fragment kodu:
{% if customerProfile.LinkedAccounts[0] -%}
{% assign fbConnect = 0 -%}
{% assign googleConnect = 0 -%}
{% for account in customerProfile.LinkedAccounts -%}
{% if account.Service == 'Facebook' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Disconnect_Fb}}
{% assign fbConnect = 1 -%}
{% elseif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Disconnect_Google}}
{% assign googleConnect = 1 -%}
{% endif %}
{% endfor %}
{% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' -%}
{{translations.Connect_Fb}}
{% endif %}
{% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' -%}
{{translations.Connect_Google}}
{% endif %}
{% else %}
{% if config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Connect_Fb}}
{% endif %}
{% if config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Connect_Google}}
{% endif %}
{% endif %}
Zamień ten fragment na ten wskazany poniżej:
{% if customerProfile.LinkedAccounts[0] -%}
{% assign fbConnect = 0 -%}
{% assign googleConnect = 0 -%}
{% for account in customerProfile.LinkedAccounts -%}
{% if account.Service == 'Facebook' and config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Disconnect_Fb}}
{% assign fbConnect = 1 -%}
{% elseif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Disconnect_Google}}
{% assign googleConnect = 1 -%}
{% endif %}
{% endfor %}
{% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' -%}
{{translations.Connect_Fb}}
{% endif %}
{% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' -%}
{{translations.Connect_Google}}
{% endif %}
{% else %}
{% if config.External.Facebook and config.External.Facebook.AppID != '' %}
{{translations.Connect_Fb}}
{% endif %}
{% if config.External.Google and config.External.Google.ClientID != '' %}
{{translations.Connect_Google}}
{% endif %}
{% endif %}
Pliki JavaScript
W pliku js/google-login.js zamień cały kod na ten wskazany poniżej:
Pamiętaj, że pliki scss należy zminifikować. O tym jak skompilować i zminifikować pliki scss i js dowiesz się z artykułu o kompilacji i minifikacji.
Graficzna prezentacja atrybutów - szablon Topaz
Wstęp
W szablonie Topaz od wersji 2022.4 wprowadzono możliwość graficznej prezentacji atrybutów towaru. Funkcja umożliwia prezentację atrybutów, w formie kolorów dla towarów zgrupowanych (fantomów) i tych posiadających atrybuty oraz w formie miniatur dla towarów zgrupowanych. W tym artykule dowiesz się jak zmodyfikować swój szablon, aby obsługiwał graficzną prezentację atrybutów.
Wskazówka
W tym artykule dowiesz się jak wprowadzać zmiany w plikach js i css. Z tego artykułu dowiesz się jak je minifikować.
Zmiana ustawień w Panelu Administracyjnym
W Panelu Administracyjnym wybierz zakładkę Wygląd sklepu/Ustawienia szablonu, a następnie w prawym górnym rogu kliknij na ikonę z trzema kwadratami i wybierz opcję Edytuj ustawienia zaawansowane. Następnie w zakładce Ustawienia (JSON) w oknie JSON znajdź na końcu kodu znak "}" i wklej przed nim poniższą instrukcję, po czym zapisz zmiany.
'); var openPaletteBtns = document.querySelectorAll('.openPaletteBtn-js'); var colorInputs = document.querySelectorAll('.colorInput'); var oldColor; for (let i = 0; i < openPaletteBtns.length; i++) { openPaletteBtns[i].addEventListener('click', function() { var pickerColor = colorPicker.checkIfHex(this.dataset.value); oldColor = pickerColor; colorPicker.openPalette(this); colorPicker.setTransparencyGradient(pickerColor); colorPicker.setTransparencyPicker(this.dataset.value); }); } for (let i = 0; i < colorInputs.length;i++) { colorInputs[i].addEventListener('change', function() { var hex = $(this).val(); var alphaPickerPosition = (document.querySelector('.selectedAlpha-js').style.left).replace(/\D/g, ''); var alphaValue = (1 - (alphaPickerPosition / 300)).toFixed(2); var rgbaColor = "rgba(" + colorPicker.hexToRgb(hex).r + "," + colorPicker.hexToRgb(hex).g + "," + colorPicker.hexToRgb(hex).b + "," + alphaValue + ")"; colorPicker.clearCanvas(); colorPicker.drawElements(hex); colorPicker.setTransparencyGradient(hex); openPaletteBtns[i].style.backgroundColor = rgbaColor; openPaletteBtns[i].setAttribute("data-value",rgbaColor); this.setAttribute("data-value", hex); this.setAttribute("value", hex); }); } $('.colors-delete-js').on('click', function(e) { var colorToRemove = $(e.currentTarget).parent().parent(); colorToRemove.remove(); }); }); $('.colors-delete-js').on('click', function(e) { var colorToRemove = $(e.currentTarget).parent().parent(); colorToRemove.remove(); }); $('.grapicalVariantsPresentationColorSelectLng').on('change', function() { var colorsTables = $('.grapicalVariantsPresentationColorTable'); for(var i = 0; i < colorsTables.length; i++) { $(colorsTables[i]).hide(); } var languageToDisplay = $('.grapicalVariantsPresentationColorSelectLng').val(); var tableToDisplay = '.grapicalVariantsPresentationColorTable.' + languageToDisplay; if($(tableToDisplay).length > 0) { $(tableToDisplay).show(); } else { var colorsTablesSection = $('.grapicalVariantsPresentationColorSettings'); colorsTablesSection.append('
' + '
' + '
' + '
Kolor (' + languageToDisplay + ')
' + '
' + '
Wartość
' + '
' + '
Usuń
'); } }); function __SaveLiquidSettings(){ var o = {}; var colorsVariants = []; var tempColorsVariants = []; $('#lg-settings-content input[name], #lg-settings-content div[data-name]').each(function(i,el) { if($(el).attr('type') == 'radio' || $(el).attr('type') == 'checkbox') { if($(el).is(':checked')) { o[el.name] = el.value; } } else if ($(el).attr('type') == 'colorVariant') { var colorLanguage = $(el).closest('.grapicalVariantsPresentationColorTable')[0].classList[1]; var toAdd = true; var hexColorVariant = el.dataset.value; var colorRow = el.parentElement.parentElement; var colorName = colorRow.querySelector('.variantColorInputName').value.trim(); if(colorRow.querySelector('.variantColorInputName').value !== colorName) { colorRow.querySelector('.variantColorInputName').value = colorName; } var arrayIndex = 0; var hasLanguage = false; if(!tempColorsVariants) { tempColorsVariants[0][0] = colorLanguage; colorsVariants[0][0] = colorLanguage; } else { for(var i = 0; i < tempColorsVariants.length; i++) { if(tempColorsVariants[i][0] == colorLanguage) { arrayIndex = i; hasLanguage = true; break; } } if(!hasLanguage) { tempColorsVariants.push([colorLanguage]); colorsVariants.push([colorLanguage]); arrayIndex = tempColorsVariants.length - 1; } } for(var i=1; i < tempColorsVariants[arrayIndex].length; i++) { if (tempColorsVariants[arrayIndex][i].toLowerCase() === colorName.toLowerCase()) { toAdd = false; break; } } if (!colorName) { toAdd = false; } if (toAdd) { if (colorsVariants[arrayIndex][1] && hexColorVariant) { colorsVariants[arrayIndex][1] = colorsVariants[arrayIndex][1] + '|||'; } if (colorsVariants[arrayIndex].length < 2) { colorsVariants[arrayIndex].push(colorName + '||' + hexColorVariant); } else { colorsVariants[arrayIndex][1] = colorsVariants[arrayIndex][1] + colorName + '||' + hexColorVariant; } tempColorsVariants[arrayIndex].push(colorName); } else { var elementToRemove = colorRow.querySelector('.variantColorInputName').parentElement.parentElement; elementToRemove.remove(); } } else if ($(el).attr('type') == 'color') { o[el.dataset.name] = el.dataset.value; (el.dataset.value).length > 7 ? el.classList.add('transparent-js') : el.classList.remove('transparent-js'); } else { o[el.name] = el.value; } }); if (colorsVariants !== "") { for(var i = 0; i < colorsVariants.length; i++) { o['grapicalVariantsPresentationColors' + colorsVariants[i][0]] = colorsVariants[i][1]; } } $('.selectedTheme-js').attr('id') === "themecolorDark" ? o["defaultColor"] = "#ffffff" : o["defaultColor"] = "#000000"; return o; }
Kolejne zmiany w plikach szablonu Topaz dotyczą plików widoku szczegółów towaru. Kreator szablonów umożliwia wygenerowanie czterech różnych widoków szczegółów towarów, dlatego zmiany dla każdego z nich mogą się różnić.
Na początku wykonaj zmiany w pliku z kodem JavaScript. Są one identyczne dla wszystkich widoków i należy ich dokonać w pliku js/layout2.js. Wyszukaj w pliku fragment:
function SetSuplFirst(drop, s, lvl, valId) {
var form = drop.parent().parent().parent();
var fDrop = form.find('.attributes-select');
drop.empty();
for (var el in s) {
drop.append($('' + s[el].Value + '').data('el', JSON.stringify(s[el])));
}
Przedstawioną powyżej pętle for podmień na następujący kod:
var attributesColorsData = drop.data('variants-colors');
var attributesColors = [];
if (attributesColorsData) {
attributesColorsData = attributesColorsData.split('|||');
for (var i = 0; i < attributesColorsData.length; i++) {
var attributesColor = attributesColorsData[i].split('||');
attributesColors.push([attributesColor[0],attributesColor[1]]);
}
}
for (var el in s) {
if (drop.data('variants-colors')) {
if ((drop.data('colors-option') === 'Grouping_First' && drop.data('attribute-id') === drop.data('first-attribute-id'))
|| (drop.data('colors-option') === 'Grouping_Last' && drop.data('attribute-id') === drop.data('last-attribute-id'))
|| (drop.data('colors-option') === 'Grouping_All')) {
var bgVariantColor = null;
var borderVariantColor = null
for (var i = 0; i < attributesColors.length; i++) {
if (attributesColors[i][0].toLowerCase() === s[el].Value.toLowerCase()) {
bgVariantColor = attributesColors[i][1];
borderVariantColor = attributesColors[i][1];
}
}
if (!bgVariantColor) {
bgVariantColor = '#FFFFFF';
}
if (bgVariantColor === '#FFFFFF' || bgVariantColor === drop.data('page-bg')) {
borderVariantColor = null;
}
drop.append($('
function SetSupl(drop, s) {
var form = drop.closest('#AddToCartForm');
var fDrop = form.find('.attributes-select');
drop.empty();
for (var el in s) {
drop.append($('' + s[el].Value + '').data('el', JSON.stringify(s[el])));
}
Instrukcję pętli for podmień na ten sam kod, co dla fragmentu znajdującego się w funkcji SetSuplFirst.
Następne zmiany dotyczyć będą pliku html. Zmiany zostaną omówione na przykładzie pliku elements/product/product-details-3.html, lecz omawiany kod będzie identyczny dla innych widoków szczegółów towaru. Róźnić się będzie jedynie nazwa edytowanego pliku, a dokładniej cyfra znajdująca się w nazwie.
Na początku wyszukaj fragment:
{% if product.Archival == false -%}
{% if product.Clip or product.Batch -%}
{% if product.Clip or product.Batch -%}
{% endif -%}
{% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%}
Przedstawiony powyżej element div (linijka od 7 do 12) zamień na następujący kod:
{% if settings.grapicalVariantsPresentation == 'Variants_Colors' -%} {% assign firstAttribute = product.Supplies.AttributeNames|First -%} {% assign lastAttribute = product.Supplies.AttributeNames|Last -%} {% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%} {% elseif settings.grapicalVariantsPresentation == 'Variants_Thumbnails' -%} {% assign firstAttribute = product.Supplies.AttributeNames|First -%} {% assign lastAttribute = product.Supplies.AttributeNames|Last -%} {% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%} {% else -%} {% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%} {% endif -%}
Teraz znajdź:
{% elseif product.AttributesPolyvalent != empty -%}
{% for attribute in product.AttributesPolyvalent -%}
{{ attribute.Name }}
{% assign i = 0 -%} {% for value in attribute.Values -%} {{ value.Value | H }} {% assign i = i | Plus: 1 -%} {% endfor -%} {% if i >= 4 -%} {% assign diff = i | Minus: 4 -%}
{% assign i = i | Plus: 1 -%} {% endfor -%} {% if i >= 4 -%} {% assign diff = i | Minus: 4 -%}
{{translations.ReadMore}} +{{diff}}
{% endif -%} {% else -%} {% for value in attribute.Values -%} {{ value.Value | H }} {% assign i = i | Plus: 1 -%} {% endfor -%} {% if i >= 4 -%} {% assign diff = i | Minus: 4 -%}
{{translations.ReadMore}} +{{diff}}
{% endif -%} {% endif -%}
W przypadku kiedy szablon Topaz umożliwia zakup z listy towarów, konieczne są zmiany w pliku partials/products-list/add-to-cart-popup.html. Jeśli Twój szablon nie posiada tej opcji, możesz pominąć ten krok. Na początku wyszukaj fragment:
{% if product.Archival == false -%}
{% if product.Clip or product.Batch -%}
{% if product.Clip or product.Batch -%}
{% endif -%}
{% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%}
{% elseif product.AttributesPolyvalent != empty -%} {% for attribute in product.AttributesPolyvalent -%}
{{ attribute.Name }}
{% for value in attribute.Values -%} {{ value.Value | H }} {% endfor -%}
A następnie zamień go na:
{% if product.Archival == false -%}
{% assign pageLanguageShort = page.Language | Upcase -%}
{% assign settingsVariableName = 'grapicalVariantsPresentationColors' | Append: pageLanguageShort -%}
{% assign grapicalVariantsPresentationColorsData = settings[settingsVariableName] -%}
{% if settings.grapicalVariantsPresentation == 'Variants_Thumbnails' -%}
{% assign attributesThumbnails = true -%}
{% endif -%}
{% if product.Clip or product.Batch -%}
{% if product.Clip or product.Batch -%}
{% endif -%}
{% if settings.grapicalVariantsPresentation == 'Variants_Colors' -%} {% assign firstAttribute = product.Supplies.AttributeNames|First -%} {% assign lastAttribute = product.Supplies.AttributeNames|Last -%} {% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%} {% elseif settings.grapicalVariantsPresentation == 'Variants_Thumbnails' -%} {% assign firstAttribute = product.Supplies.AttributeNames|First -%} {% assign lastAttribute = product.Supplies.AttributeNames|Last -%} {% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%} {% else -%} {% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%} {% endif -%}
{% endfor -%} {% else -%} {% for value in attribute.Values -%} {{ value.Value | H }} {% endfor -%} {% endif -%}
Na koniec znajdź jeszcze fragment:
{% if product.Archival == false -%} {% if product.Clip or product.Batch -%} {% if product.Clip or product.Batch -%} {% endif -%}
{% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%}
{% elseif product.AttributesPolyvalent != empty -%} {% for attribute in product.AttributesPolyvalent -%}
{{ attribute.Name }}
{% assign i = 0 -%} {% for value in attribute.Values -%} {{ value.Value | H }} {% assign i = i | Plus: 1 -%} {% endfor -%} {% if i >= 4 -%} {% assign diff = i | Minus: 4 -%}
{{translations.ReadMore}} +{{diff}}
{% endif -%}
I zastąp go poniższym kodem:
{% if product.Archival == false -%} {% assign pageLanguageShort = page.Language | Upcase -%} {% assign settingsVariableName = 'grapicalVariantsPresentationColors' | Append: pageLanguageShort -%} {% assign grapicalVariantsPresentationColorsData = settings[settingsVariableName] -%} {% if settings.grapicalVariantsPresentation == 'Variants_Thumbnails' -%} {% assign attributesThumbnails = true -%} {% endif -%} {% if product.Clip or product.Batch -%} {% if product.Clip or product.Batch -%} {% endif -%}
{% if settings.grapicalVariantsPresentation == 'Variants_Colors' -%} {% assign firstAttribute = product.Supplies.AttributeNames|First -%} {% assign lastAttribute = product.Supplies.AttributeNames|Last -%} {% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%} {% elseif settings.grapicalVariantsPresentation == 'Variants_Thumbnails' -%} {% assign firstAttribute = product.Supplies.AttributeNames|First -%} {% assign lastAttribute = product.Supplies.AttributeNames|Last -%} {% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%} {% else -%} {% for attribute in product.Supplies.AttributeNames -%} {{ attribute.Name | H }}
{% endfor -%} {% endif -%}
{% assign i = i | Plus: 1 -%} {% endfor -%} {% if i >= 4 -%} {% assign diff = i | Minus: 4 -%}
{{translations.ReadMore}} +{{diff}}
{% endif -%} {% else -%} {% for value in attribute.Values -%} {{ value.Value | H }} {% assign i = i | Plus: 1 -%} {% endfor -%} {% if i >= 4 -%} {% assign diff = i | Minus: 4 -%}
{{translations.ReadMore}} +{{diff}}
{% endif -%} {% endif -%}
Ostatnim etapem zmian w szablonie Topaz w celu graficznej prezentacji atrybutów jest zmiana plików css w szablonie. Pliki ze stylami różnią się w zależności od wybranego szczegółu towaru. Poniższe zmiany dotyczą pierwszego i drugiego widoku szczegółów towaru. Zmiany dla pozostałych widoków przedstawione są w dalszej częsci artykułu.
W pliku css/layout1.css zlokalizuj podany fragment:
Następne zmiany stylistyki szablonu Topaz dotyczą wyłącznie trzeciego i czwartego widoku szczegółów towaru. W przypadku pozostałych widoków, wszystkie zmiany zostały już przedstawione.
W pliku css/layout2.css należy wyszukać w pliku fragment:
W przypadku trzeciego i czwartego widoku szczegółów towaru, konieczne są jeszcze dodatkowe zmiany w pliku css/layout-m0.css.
Na początku wyszukaj fragment:
Logowanie do sklepu za pomocą konta Google i Facebook - implementacja w szablonie Szafir
Wstęp
Z tego artykułu dowiesz się jak zaimplementować opcję logowania do Twojego sklepu w szablonie Szafir za pomocą kont Google oraz Facebook.
Od wersji 2022.4 w szablonie Szafir wprowadziliśmy możliwość logowania do sklepu za pomocą konta Google oraz Facebook. W celu zaimplementowania takiej możliwości w swoim sklepie należy wykonać trzy czynności dla każdej z tych platform :
Konfiguracja logowania w Panelu Administracyjnym
Zmiany w kodzie źródłowym sklepu
Przygotowanie tekstów
Wskazówka
W tym artykule dowiesz się jak wprowadzać zmiany w plikach js, html i scss. Dodatkowe informacje o kompilacji i minifikacji znajdziesz w centrum pomocy.
Poniżej znajdują się instrukcje rozwijające wspomniane wyżej wątki.
1. Konfiguracja logowania w Panelu Administracyjnym
';
document.body.innerHTML += popup;
setTimeout(function () {
$('.unsuccessfull-post-message-js').remove();
}, 3000);
}
});
});
$('body').on('click', '.logout', function () {
googleLogout();
});
}
function googleLogout() {
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut();
}
Plik fb-login.js :
var fbLoginStatus;
// This is called with the results from from FB.getLoginStatus().
function statusChangeCallback(response) {
fbLoginStatus = response;
}
function _login() {
FB.login(function (response) {
// handle the response
if (response.status === 'connected') {
connectToFb(response);
}
}, { scope: 'public_profile,email' });
}
window.fbAsyncInit = function () {
FB.init({
appId: __fbId, //Your APP ID
cookie: true, // enable cookies to allow the server to access the session
xfbml: true, // parse social plugins on this page
version: 'v2.1', // use version 2.1
status: true
});
// These three cases are handled in the callback function.
FB.getLoginStatus(function (response) {
statusChangeCallback(response);
});
FB.Event.subscribe('auth.authResponseChange', function (response) {
fbLoginStatus = response;
});
$('body').on('click', '.logout', function () {
fbLogout();
});
$('body').on('click', '#disconnect-fb', function () {
disconnectFb();
});
$('body').on('click', '#connect-fb', function (e) {
connectFb(e);
});
};
// Load the SDK asynchronously
(function (d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s); js.id = id;
js.src = "https://connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
} (document, 'script', 'facebook-jssdk'));
function connectToFb(response) {
FB.api('/me', {
fields: 'email,name'
}, function (u) {
response.user = u;
$.post(null, {
__CSRF: __CSRF,
__action: 'external/fblogin',
response: JSON.stringify(response)
}, function (result) {
if (result.action.Result) {
window.location.replace('');
} else if (result.action.Code != 100) {
const popup = '
' +
__translations.CantLoginWithFb + '
';
document.body.innerHTML += popup;
setTimeout(function () {
$('.unsuccessfull-post-message-js').remove();
}, 3000);
}
});
});
}
function fbLogout() {
FB.logout(function (response) { });
}
function disconnectFb() {
var data = {
__csrf: __CSRF,
__action: 'External/FbAccountUnlink'
};
$.post(null, data, function (result) {
if (result.action.Result) {
location.reload();
} else {
const popup = '
' +
__translations.FailedDisconnectFromFb + '
';
document.body.innerHTML += popup;
setTimeout(function () {
$('.unsuccessfull-post-message-js').remove();
}, 3000);
}
});
}
function connectFb(e) {
if (fbLoginStatus.status === 'connected') {
var userIdNum = fbLoginStatus.authResponse.userID;
var data = {
__csrf: __CSRF,
__action: 'External/FbAccountLink',
userID: userIdNum
};
$.post(null, data, function (result) {
if (result.action.Result) {
location.reload();
} else {
const popup = '
Pamiętaj, że pliki scss należy zminifikować. O tym jak skompilować i zminifikować pliki scss i js dowiesz się z artykułu o kompilacji i minifikacji.
3. Przygotowanie tekstów
Ostatnim etapem implementacji będzie dodanie odpowiednich tekstów do swojego szablonu. Odbywa się to poprzez opcję Tłumaczenia , która znajduje się w Panelu administracyjnym sklepu. Dokładna jej lokalizacja ukazana jest poniżej.
W celu dodania tekstu klikamy przycisk dodaj. Dodajemy teksty według poniższej tabeli.
Id
Tekst
ExternalWebsites
Serwisy zewnętrzne
NeedToConnectToFb
Musisz być zalogowany do Facebooka, aby połączyć konto.
CantLoginWithFb
Błąd podczas logowania do Facebooka.
FailedDisconnectFromFb
Błąd podczas odłączania konta Facebook.
FailedConnectToFb
Błąd podczas łączenia z kontem Facebook.
LoginWithFb
Zaloguj się przez Facebook
Disconnect_Fb
Odłącz konto od Facebooka
ConnectFb
Połącz konto z Facebookiem
CantLoginWithGoogle
Nie udało się zalogować, spróbuj jeszcze raz!
FailedDisconnectFromGoogle
Błąd podczas odłączania konta Google.
FailedConnectToGoogle
Błąd podczas łączenia z kontem Google.
LoginWithGoogle
Zaloguj się przez Google
Disconnect_Google
Odłącz konto od Google
ConnectGoogle
Połącz konto z Google
Obsługa i prezentacja najniższej ceny towaru w szablonach
Wstęp
W niniejszym artykule prezentujemy w jaki sposób możesz zmodyfikować swój szablon tak, aby była w nim widoczna najniższa cena towaru, jaka obowiązywała w okresie 30 dni przed wprowadzeniem obniżki. Poniższa instrukcja pozwoli Ci dostosować swój szablon do przepisów wynikających z Unijnej dyrektywy Omnibus.
Od wersji 2022.3 istnieje możliwość wyświetlania minimalnej ceny towaru z ostatnich 30 dni.
W obiekcie zawierającym wszystkie informacje na temat towaru zostały dodane nowe property: MinPrice, SubtotalMinPrice (cena netto dla sklepów Enterprise i B2B) oraz TotalMinPrice (cena brutto dla sklepów Enterprise i B2B).
Wskazówka
Pamiętaj, że wyżej wspomniany obiekt nosi różne nazwy, w zależności od szablonu czy od strony, na której się znajdujemy.
Kiedy widoczna jest cena minimalna?
Cena minimalna, czyli najniższa cena towaru, jaka obowiązywała w okresie 30 dni przed wprowadzeniem obniżki jest dostępna wówczas, gdy produkt posiada cenę aktualną oraz poprzednią. Cenę minimalną można prezentować w wielu miejscach w szablonie, m.in.: na szczegółach towaru, na liście towarów, na porównywarce towarów, na towarach ulubionych, w sekcjach z towarami polecanymi czy ostatnio oglądanymi. Wszystko zależy od tego, który szablon posiadasz - cena poprzednia w niektórych przypadkach nie jest widoczna w wymienionych miejscach, przez co cena minimalna również nie będzie możliwa do zobaczenia.
Wprowadzanie zmian w kodzie szablonu
Zmiany związane z ceną minimalną należy wprowadzić wszędzie tam, gdzie w szablonie pokazujemy cenę poprzednią (property PreviousPrice). Przykładowy kod z minimalną ceną:
{% if customer.HidePrices == false and product.Price != null and product.PreviousPrice != null -%}
W powyższym przykładzie najpierw sprawdzamy, czy ceny są widoczne, a także czy produkt posiada cenę aktualną i cenę poprzednią. Jeśli wszystkie warunki są spełnione, wyświetlamy minimalną cenę w odpowiednim formacie wraz z wybraną przez Klienta walutą. Dodatkowo, obok ceny wyświetla się ikonka z symbolem "i", czyli informacja. Po najechaniu kursorem na symbol wyświetli się tooltip z informacją, czym jest widoczna cena.
Cena minimalna na liście towarów - przykład w szablonie Szafir
Przykładowy kod związany z tooltipem informacyjnym do minimalnej ceny:
{% if customer.HidePrices != true -%}
Najniższa cena towaru, jaka obowiązywała w okresie 30 dni
przed wprowadzeniem obniżki
{% endif -%}
/* JS - wyświetlanie, ukrywanie tooltipa */
$('body').on('click', '.min-price__showTooltip', function(e) {
e.preventDefault();
e.stopPropagation();
});
$('body').on('mouseenter', '.min-price__showTooltip', function(e) {
e.preventDefault();
e.stopPropagation();
let tooltip = $('.minPriceTooltip-js');
let top = e.clientY - e.offsetY;
let right= "unset";
let left = (e.clientX - 30) - (e.offsetX/2);
if(left < 0) {
left = 10;
} else if (left > (($(window).width() - 200))) {
left = "unset";
right = 10;
}
tooltip.css('top', top);
tooltip.css('right', right);
tooltip.css('left', left);
tooltip.show();
});
$('body').on('mouseleave', '.min-price__showTooltip', function(e) {
$('.minPriceTooltip-js').hide();
});
$('body').on('pointerenter', '.min-price__showTooltip', function(e) {
e.preventDefault();
e.stopPropagation();
let tooltip = $('.minPriceTooltip-js');
let top = e.clientY - e.offsetY;
let right= "unset";
let left = (e.clientX - 30) - (e.offsetX/2);
if(left < 0) {
left = 10;
} else if (left > (($(window).width() - 200))) {
left = "unset";
right = 10;
}
tooltip.css('top', top);
tooltip.css('right', right);
tooltip.css('left', left);
tooltip.show();
});
$('body').on('pointerleave', '.min-price__showTooltip', function(e) {
$('.minPriceTooltip-js').hide();
});
$(window).on('scroll', function(e) {
$('.minPriceTooltip-js').hide();
});
Wskazówka
Pamiętaj, aby odpowiednio ostylować minimalną cenę, ikonkę oraz tooltipa.
W przypadku miejsc takich jak szczegóły towaru czy lista towarów, w zależności od szablonu, trzeba także dokonać pewnych zmian w funkcjach w plikach .js, a czasami również w .html. Dotyczy to jednak głównie towarów z atrybutami do wyboru lub w przypadku listy towarów, jeśli w Twoim szablonie towary są filtrowane bez odświeżania strony. W takich sytuacjach postępujemy analogicznie jak dla wszystkich miejsc związanych z ceną poprzednią (oldPrice, previousPrice itp.).
LiveChat - obsługa wtyczki w szablonach
Wskazówka
Od 1 czerwca 2025 roku zakończyliśmy aktualizację oraz wydawanie nowych wersji szablonów Bursztyn, Agat i Opal, a tym samym ich wsparcie, aby skupić się na nowoczesnych rozwiązaniach, które jeszcze lepiej odpowiadają na potrzeby dynamicznie rozwijającego się rynku e-commerce.
Zachęcamy Was do przejścia na nasze nowe, udoskonalone szablony. Dla sklepów B2C polecamy szablony Topaz, One Page Shop oraz Dla Gastronomii, natomiast dla platform B2B idealnym wyborem będą Rubin i Szafir.
LiveChat jest narzędziem służącym do komunikacji klientów z firmą poprzez aplikację. Widgety widoczne są przeważnie na stronach internetowych. Rozwiązanie jest coraz częściej wykorzystywane przede wszystkim przy sprzedaży online oraz customer service. Dzięki chatom komunikacja pomiędzy klientem, a firmą przebiega sprawniej. W niniejszym artykule dowiesz się, jak w prosty sposób zintegrować swój szablon z narzędziem LiveChat.
Instalacja wtyczki LiveChat w szablonach
Otwórz stronę LiveChat.com. Konieczne jest założenie konta. Oprócz adresu e-mail i hasła, należy podać m.in. link do Twojego sklepu. Po zatwierdzeniu wyświetli się okno, gdzie znajduje się instrukcja dodania wtyczki. Do wyboru są trzy opcje, wybierz Install LiveChat code manually. Po wybraniu tej opcji, wyświetli się fragment kodu z indywidualnym License ID. Kod można skopiować przyciskiem Copy code. Następnie możesz wkleić go do swojego szablonu.
Topaz – wklej kod do pliku base_layout.html. Kod możemy umieścić niemal na samym końcu pliku, najlepiej tuż nad zamknięciem tagu body.
Szafir, Agat, Bursztyn, Opal – wklej kod do pliku _layout.html. Kod możemy umieścić niemal na samym końcu pliku, najlepiej tuż nad zamknięciem tagu body.
Zmian możesz dokonać w Panelu Administracyjnym (Wygląd sklepu/ Ustawienia/ Edytuj ustawienia zaawansowane/Edytuj HTML) lub przy pomocy Comarch e-Sklep Liquid Sync.
Po wprowadzeniu zmian opublikuj je w Panelu Administracyjnym. Od teraz widget LiveChat będzie wyświetlał się na Twoim szablonie.
Dostosowanie wyglądu wtyczki do własnych preferencji
Wtyczkę LiveChat można dostosować m.in. pod kątem wyglądu. Aby tego dokonać, na stronie LiveChat w menu po lewej stronie ekranu wybierz opcję Settings. W wyświetlonym menu, zakładce Chat widget wybierz Customization. Możesz dostosować m.in. styl widgetu zminimalizowanego oraz zmaksymalizowanego, wybrać ciemny lub jasny motyw, podstawowy kolor widgetu, położenie widgetu na ekranie (odległość od krawędzi, wyrównanie do lewej/prawej), czy też widoczność widgetu.
W zakładce Language możesz dostosować język, powitanie, domyślną nazwę Klienta na czacie oraz inne wyświetlane w widgecie teksty i napisy.
Sprawdź także pozostałe zakładki i dostosuj widget LiveChat zgodnie ze swoimi preferencjami.
Zmiana czcionki w szablonie
Zmiana czcionki w szablonie
W tym artykule dowiesz się, jak w łatwy sposób zmienić czcionkę w szablonie.
Wybór czcionki
Wskazówka
Przy wyborze czcionki zwróć uwagę, aby miała licencję Apache 2.0
Wejdź tutaj i wybierz czcionkę, która Ci najbardziej odpowiada. Następnie kliknij w kafelek odpowiadający danej czcionce. Na potrzeby tego artykułu wybierzemy czcionkę Roboto. Następnie wybierz style, które Cię interesują. Po wybraniu przynajmniej jednego stylu pojawi się po prawej część kodu, którą należy skopiować do sekcji w szablonie. W naszym przypadku będzie to:
link rel="preconnect" href="https://fonts.googleapis.com">
link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet">
Kawałek niżej będzie podana linijka, którą trzeba wkleić w każdym miejscu, w którym występuje zapis z inną czcionką. W naszym wypadku będzie to:
font-family: 'Roboto', sans-serif;
Szafir
W pliku __layout.html znajdź znacznik head (3 linijka) i wklej w jego obrębie kod:
link rel="preconnect" href="https://fonts.googleapis.com">
link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
link href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap" rel="stylesheet">
Znajdź plik scss/globals/_fonts.scss i usuń go. Następnie w pliku scss/desktop1.scss usuń linijkę:
@import 'globals/_fonts';
W pliku scss/components/_collection-points.scss wyszukaj frazę 'SegoeUI' i zamień wszystkie jej wystąpienia na 'Roboto', sans-serif.
Następnie w plikach scss/globals/_globals1.scss, scss/globals/_globals2.scss i scss/globals/_header.scss wyszukaj frazę "SegoeUI" i zamień wszystkie jej wystąpienia w każdym z tych plików na 'Roboto', sans-serif.
Na sam koniec w plikach scss/globals/_globals-m.scss, scss/globals/_globals2.scss, scss/globals/_header.scss i scss/partials/_order.scss wyszukaj frazę SegoeUI i zamień wszystkie jej wystąpienia w każdym z tych plików na 'Roboto', sans-serif.
Wskazówka
Pamiętaj, że pliki należy zminifikować. O tym jak skompilować i zminifikować pliki dowiesz się z artykułu o kompilacji i minifikacji plików.
Podtrzymanie sesji użytkownika
Wskazówka
Od 1 czerwca 2025 roku zakończyliśmy aktualizację oraz wydawanie nowych wersji szablonów Bursztyn, Agat i Opal, a tym samym ich wsparcie, aby skupić się na nowoczesnych rozwiązaniach, które jeszcze lepiej odpowiadają na potrzeby dynamicznie rozwijającego się rynku e-commerce.
Zachęcamy Was do przejścia na nasze nowe, udoskonalone szablony. Dla sklepów B2C polecamy szablony Topaz, One Page Shop oraz Dla Gastronomii, natomiast dla platform B2B idealnym wyborem będą Rubin i Szafir.
Podtrzymanie sesji użytkownika w szablonach
W szablonach Comarch sesja użytkownika jest podtrzymywana w otwartej karcie przeglądarki, dzięki czemu brak aktywności użytkownika w sklepie nie powoduje usunięcia wykonywanych czynności - np. nie jest usuwany utworzony koszyk. Domyślnie czas bezczynności sesji użytkownika wynosi 15 minut, po upływie których zostaje usunięta. Dotyczy to głównie użytkowników niezalogowanych.
W tym artykule dowiesz się, jak zaimplementować podtrzymywanie sesji użytkownika w swoim modyfikowanym szablonie.
1. Szablony Szafir, Opal, Bursztyn i Agat
Krok 1. W panelu administracyjnym przejdź do sekcji Wygląd sklepu/Ustawienia/ Edytuj ustawienia zaawansowane, a następnie przejdź do opcji Edytuj HTML.Krok 2. W dostępnych plikach przejdź do folderu js, w którym znajduje się plik init.js.Krok 3. Przejdź do edycji pliku init.js wprowadzając poniższy skrypt na jego końcu:
setInterval(() => fetch(document.baseURI + 'xhr?__action=svc/ping'), 600000);Krok 4. Dokonaj minifikacji oraz odpowiedniej kompilacji edytowanego pliku zgodnie z instrukcją.Krok 5. Zapisz i opublikuj zmiany.
Gotowe! Sesja użytkowników Twojego e-Sklepu będzie aktywna przez cały czas, gdy witryna będzie wyświetlona w otwartej przeglądarce.
2. Szablon Topaz
Krok 1. W panelu administracyjnym przejdź do sekcji Wygląd sklepu/Ustawienia/ Edytuj ustawienia zaawansowane, a następnie przejdź do opcji Edytuj HTML.Krok 2. W dostępnych plikach przejdź do folderu js, w którym znajduje się plik layout0.js.Krok 3. Przejdź do edycji pliku layout0.js wprowadzając poniższy skrypt na jego końcu:
setInterval(() => fetch(document.baseURI + 'xhr?__action=svc/ping'), 600000);Krok 4. Dokonaj minifikacji oraz odpowiedniej kompilacji edytowanego pliku zgodnie z instrukcją.Krok 5. Zapisz i opublikuj zmiany.
Gotowe! Sesja użytkowników Twojego e-Sklepu będzie aktywna przez cały czas, gdy witryna będzie wyświetlona w otwartej przeglądarce.
Lista plików w Strefie klienta w szablonie Szafir
Lista plików w strefie klienta w szablonie Szafir
W tym artykule dowiesz się jak dodać listę plików w strefie klienta w swoim szablonie.
Wskazówka
W tym artykule trzeba będzie wprowadzać zmiany w plikach js i css. Z tego artykułu dowiesz się jak je minifikować
Uwaga
Zapis nazwa_folderu/nazwa_pliku.rozszerzenie oznacza, że aby znaleźć dany plik należy udać się do folderu o nazwie podanej przed ukośnikiem. Przykładowo: order/thx.html oznacza plik thx.html w folderze order
Pierwszym krokiem będzie dodanie kodu w pliku customer-profile/pagination.html. W tym celu za pomocą narzędzia wyszukiwania znajdź frazę {% endif -%}, a linijkę wyżej wklej następujący kod:
{% elseif page.QueryString contains 'to-download-erp' -%}
{% assign buttonClass = 'to-download-button-lq' -%}
{% assign inputClass = 'to-download-input-lq' -%}
{% assign urlType = 'to-download-erp=true' -%}
Następnie proszę otworzyć plik customer-profile/menu.html, następnie wyszukać w nim za pomocą narzędzia wyszukiwania frazę <li class="load-erp-data-lq i zastąpić znalezioną linijkę następującą:
<li class="load-erp-data-lq {% unless page.QueryString contains 'tab=invoices' or page.QueryString contains 'tab=executed-complaints' or page.QueryString contains 'tab=active-complaints' or page.QueryString contains 'tab=sor' or page.QueryString contains 'tab=wm' or page.QueryString contains 'tab=to-download' or page.QueryString == '?tab=discounts' -%} active-lq {% endunless -%}" data-template="customer-profile/orders/orders.html">
Również w tym samym pliku proszę wyszukać frazę {% if settings.discountsPresentationInCustomerProfileInPromotionsTab == 'yes' %} a bezpośrednio nad nią wkleić następujący kod:
{% if config.B2B -%}
<li class="load-erp-data-lq {% if page.QueryString contains 'tab=to-download' -%} active-lq {% endif -%}" data-template="customer-profile/to-download/to-download.html">
<i class="ti-download"></i> {{ translations.Downloads }}
</li>
{% endif -%}
Następnym krokiem będzie dodanie odpowiednich styli. W tym celu przejdź do pliku scss/globals/_globals2.scss, a na samym końcu tego pliku wklej:
.to-download-table-ui{
a{
color: $primaryColorFont;
}
.column-ui{
width: 50%;
vertical-align: middle;
}
}
Teraz należy przejść do folderu customer-profile, w nim utworzyć folder o nazwie to-download. W nowo utworzonym folderze proszę utworzyć plik to-download.html, a w nim umieścić następujący kod:
<nav class="customer-profile-header-menu-ui">
<ul>
<li><a href="{{ page.BaseHref }}{{ config.DefinedPages.Home }}"><i class="ti-angle-left"></i> <span class="no-on-mobile-ui">{{ translations.BackToShopping }}</span></a></li>
<li class="active-ui only-text-ui">{{ translations.Downloads }}</li>
</ul>
</nav>
{% include 'customer-profile/menu.html' -%}
<div class="with-column-ui">
<div class="container-ui">
{% if customer.CompanyErpId <= 0 -%}
{{ translations.AccessDenied }}
{% else %}
<div class="erp-data-ui erp-data-lq">
<div class="to-download-table-ui to-download-table-lq table-lq" data-sp="CDN.eshop_GetCustomerFiles">
<div class="column-name-ui">
<div class="column-ui">{{ translations.FileName }}</div>
<div class="column-ui">{{ translations.Downloads }}</div>
</div>
<div class="row-ui" rv-each-o="List">
<a rv-href="o.UrlValue" rv-if="o.IsUrl" target="_blank">
<div class="column-ui">
<i class="file-to-download-icon-lq icon-ui" rv-data-extension="o.Extension"></i> { o.Name }
</div>
<div class="column-ui"><i class="ti-download"></i> {{ translations.DownloadFile }}</div>
</a>
<div class="download-file-from-to-download-lq" rv-data-id="o.ID" rv-data-extension="o.Extension" rv-unless="o.IsUrl">
<div class="column-ui">
<i class="file-to-download-icon-lq icon-ui" rv-data-extension="o.Extension"></i> { o.Name }
</div>
<div class="column-ui"><i class="ti-download"></i> {{ translations.DownloadFile }}</div>
</div>
</div>
</div>
{% include 'customer-profile/pagination.html' -%}
</div>
{% endif -%}
</div>
</div>
Kolejnym krokiem jest dodanie kodu JavaScript. W tym celu przejdź do pliku js/init-ui2.js, przy pomocy narzędzia wyszukiwania znajdź frazę function getData(). Należy usunąć cały kod począwszy od znalezionej linii, aż do klamerki (włącznie) znajdującej się dwie linijki pod frazą div.find('.pager-lq').css('display', 'inline-flex');.
W miejsce usuniętego kodu proszę wkleić:
$.fn.erpData = function () {
return this.each(function () {
var div = $(this);
var table = div.children('.table-lq');
if(!table.hasClass('to-download-table-lq')){
var dateTo = $('.get-erp-data-lq[name=dateTo]');
}
var spin = $('.ng-spinner-lq');
var sp = table.data('sp');
var ds = { List: null, Pager: null, PageNo: 1 };
rivets.bind(div, ds);
function getDateStr(d) {
return new Date((d - d.getTimezoneOffset() * 60000)).toISOString().slice(0, -14);
}
function getDateEl(el) {
try {
var val = el.val();
if (val == '') return null;
var d = new Date(val);
el.val(getDateStr(d));
return getDateStr(d).replace(/-/g, '');
} catch (ex) {
el.val('');
return null;
}
}
function getData() {
spin.css('visibility', 'visible');
if($('[type=date]').val() == ''){
var date = new Date().toISOString().slice(0, -14);
$('[type=date]').val(date);
}
if(!table.hasClass('to-download-table-lq')){
var dt = getDateEl(dateTo);
var parameters = { DateTo: dt, LanguageId: __lngId, PageNo: ds.PageNo }
} else {
var parameters = { LanguageId: __lngId, PageNo: ds.PageNo }
}
$.post(null, { __action: 'sync/exec', __csrf: __CSRF, worker: 'erpData', message: JSON.stringify({ command: sp, parameters: parameters }) }, function (d) {
spin.css('visibility', 'hidden');
if (!d.action.Result) {
return;
}
var r = d.action.Object[0];
ds[r.Name] = r.Result;
ds.Pager = Array.apply(null, Array(r.PageCount)).map(function (_, i) { return { No: i + 1, Selected: ds.PageNo == i + 1 }; });
if(r.PageCount > 1){
ds.FewPages = true;
}
var elements = r.Result;
var elementsQuantity = elements.length;
for(var i=0; i<elementsQuantity; i++){
if(elements[i].DaysAfterDueDate > 0 && (elements[i].ToPay > 0 || elements[i].ToReturn < 0)){
elements[i].DaysAfterExists = true;
}
if(elements[i].ToPay > 0){
elements[i].ToPayExists = true;
$('.no-to-pay-lq').remove();
$('.to-pay-column-lq').removeClass('hidden-lq');
}
if(elements[i].ToReturn > 0){
elements[i].ToReturnExists = true;
$('.no-to-pay-lq').remove();
$('.to-pay-column-lq').removeClass('hidden-lq');
}
if(elements[i].DeliveryStatus == 0){
elements[i].DeliveryStatus0 = true;
}
if(elements[i].DeliveryStatus == 1){
elements[i].DeliveryStatus1 = true;
}
if(elements[i].DeliveryStatus == 2){
elements[i].DeliveryStatus2 = true;
}
if(elements[i].DeliveryStatus == 3){
elements[i].DeliveryStatus3 = true;
}
if(elements[i].DeliveryStatus == 4){
elements[i].DeliveryStatus4 = true;
}
if(elements[i].PaymentStatus == 0){
elements[i].PaymentStatus0 = true;
}
if(elements[i].PaymentStatus == 1){
elements[i].PaymentStatus1 = true;
}
if(elements[i].PaymentStatus == 2){
elements[i].PaymentStatus2 = true;
}
if(elements[i].DeliveryStatus == 0 || elements[i].DeliveryStatus == 1 || elements[i].DeliveryStatus == 2 || elements[i].DeliveryStatus == 3 || elements[i].DeliveryStatus == 4 || elements[i].PaymentStatus == 0 || elements[i].PaymentStatus == 1 || elements[i].PaymentStatus == 2){
elements[i].StatusExists = true;
}
if(elements[i].DeliveryStatus == 0 || elements[i].DeliveryStatus == 1 || elements[i].DeliveryStatus == 2 || elements[i].DeliveryStatus == 3 || elements[i].DeliveryStatus == 4){
elements[i].DeliveryStatusExists = true;
}
if(elements[i].PaymentStatus == 0 || elements[i].PaymentStatus == 1 || elements[i].PaymentStatus == 2){
elements[i].PaymentStatusExists = true;
}
if(elements[i].DeliveryStatusExists && elements[i].PaymentStatusExists){
elements[i].DeliveryAndPaymentStatusExists = true;
}
}
div.find('.page-count-lq').text(r.PageCount);
if(ds.PageNo == r.PageCount){
$('.pager-lq .next-lq').attr('disabled', true).removeClass('btn-gray-ui');
} else {
$('.pager-lq .next-lq').attr('disabled', false).addClass('btn-gray-ui');
}
if(ds.PageNo == 1){
$('.pager-lq .prev-lq').attr('disabled', true).removeClass('btn-gray-ui');
} else {
$('.pager-lq .prev-lq').attr('disabled', false).addClass('btn-gray-ui');
}
$('.pager-lq [type=number]').val(ds.PageNo);
if(table.hasClass('to-download-table-lq')){
$('.file-to-download-icon-lq').each(function(){
var extension = $(this).data('extension');
if(extension == 'jfif' || extension == 'jpe' || extension == 'jpeg' || extension == 'jpg'){
var icon = 'ti-image';
} else if(extension == 'csv' || extension == 'txt'){
var icon = 'ti-receipt';
} else if(extension == 'doc' || extension == 'docx' || extension == 'odt'){
var icon = 'ti-write';
} else if(extension == 'xls' || extension == 'xlsx' || extension == 'ods'){
var icon = 'ti-bar-chart';
} else if(extension == 'zip' || extension == 'rar' || extension == '7zip'){
var icon = 'ti-archive';
} else if(extension == 'pdf'){
var icon = 'ti-agenda';
} else {
var icon = 'ti-file';
}
$(this).addClass(icon);
});
}
table.show();
div.find('.pager-lq').css('display', 'inline-flex');
});
}
W tym samym pliku proszę wyszukać frazę function rivetsPropertyCheck(bindedObj, property), a bezpośrednio nad nią dodać kod:
function downloadFileFromToDownload(e) {
var id = $(e.currentTarget).data('id');
var extension = $(e.currentTarget).data('extension');
var fileDownloaded = false;
if(window.downloadedFiles){
for(i=0; i<window.downloadedFiles.length; i++){
if(window.downloadedFiles[i].id == id){
fileDownloaded = true;
var blob = window.downloadedFiles[i].blob;
}
}
}
if(fileDownloaded){
var a = document.getElementById('file-'+id);
var url = window.URL.createObjectURL(blob);
a.href = url;
a.click();
window.URL.revokeObjectURL(url);
} else {
var fileData = {
__csrf:__CSRF,
__action:'sync/exec',
worker:'erpData',
message:JSON.stringify({command:'CDN.eShop_GetCustomerBinaryFile', parameters:{'Id':id}})
};
$.post(null,fileData, function(d){
var file = d.action.Object[0][0];
var name = file.FileName+'.'+extension;
var binaryString = file.FileData;
var fileBytes = base64ToArrayBuffer(binaryString);
var blob = new Blob([fileBytes], {type: "octet/stream"});
var url = window.URL.createObjectURL(blob);
var a = document.createElement("a");
document.body.appendChild(a);
a.setAttribute("id", "file-"+id);
a.style = "display: none";
a.href = url;
a.download = name;
a.click();
window.URL.revokeObjectURL(url);
if(window.downloadedFiles){
window.downloadedFiles.push({id:id, blob:blob});
} else {
window.downloadedFiles = [{id:id, blob:blob}];
}
});
}
}
$('body').on('click', '.download-file-from-to-download-lq', function(e) {
downloadFileFromToDownload(e);
});
Następnie proszę dodać tłumaczenia. W sekcji Wygląd sklepu/ Ustawienia/ Tłumaczenia po kliknięciu w przycisk Dodaj należy wpisać Id tłumaczenia oraz Tekst, który będzie się wyświetlał w e-Sklepie. Zmiany należy zatwierdzić przyciskiem Dodaj.
Id: FileName -- Tekst: Nazwa pliku
Id: DownloadFile -- Tekst: Pobierz plik
Umieszczenie przycisków iLease - wygodne finansowanie dla firm oraz iRaty - swobodne raty online na szczegółach towaru
Wskazówka
Od 1 czerwca 2025 roku zakończyliśmy aktualizację oraz wydawanie nowych wersji szablonów Bursztyn, Agat i Opal, a tym samym ich wsparcie, aby skupić się na nowoczesnych rozwiązaniach, które jeszcze lepiej odpowiadają na potrzeby dynamicznie rozwijającego się rynku e-commerce.
Zachęcamy Was do przejścia na nasze nowe, udoskonalone szablony. Dla sklepów B2C polecamy szablony Topaz, One Page Shop oraz Dla Gastronomii, natomiast dla platform B2B idealnym wyborem będą Rubin i Szafir.
Umieszczenie przycisków iLease - wygodne finansowanie dla firm oraz iRaty - swobodne raty online na szczegółach towaru
W tym artykule dowiesz się, jak w łatwy sposób dodać przyciski iLeasing oraz iRaty na szczegółach towaru w e-Sklepie.
Wskazówka
Poradnik dotyczy standardowych, niemodyfikowanych szablonów w wersji 2019.3 lub nowszej.
Wskazówka
W przykładach użyta jest grafika 09.png. Jeśli preferujesz inną, to wystarczy w poniższych przykładach zamienić cyfrę 9 na wybraną z przedziału 1-8. W panelu partnera płatności ratalnych (tu możesz się zalogować), w sekcji Integracje możesz zobaczyć wszystkie opcje i wybrać tą, która odpowiada Ci najbardziej.
1. Szafir
W pliku product/product-presentation-data.html wyszukaj frazę {% if canBuy -%}, gdzie znajduje się przycisk dodawania do koszyka. Bezpośrednio pod tą linijką wklej kod:
{% if customer.Authenticated and customer.Company -%}
{% assign tempVat = 100 | Plus: product.VAT | DividedBy: 100 -%}
{% assign totalPrice = product.Price | Times: tempVat -%}
{% assign subtotalPrice = product.Price -%}
{% else -%}
{% assign totalPrice = product.Price -%}
{% assign tempVat = 100 | Plus: product.VAT | DividedBy: 100 -%}
{% assign subtotalPrice = product.Price | DividedBy: tempVat -%}
{% endif -%}
Wskazówka
W miejsce XXXX należy wpisać ID partnera.
Wskazówka
Kod zawiera oba przyciski (iLeasing i iRaty). Jeśli potrzebujesz tylko jednego z nich, to skopiuj tylko ten fragment, który Cię interesuje.
2. Agat
W pliku partials/product/product-popup.html wyszukaj frazę Pro_addToCart. To etykieta przycisku dodawania do koszyka w szablonie Agat. Linijkę niżej znajduje się domknięcie przycisku czyli (/span). Wklej pod tym zamknięciem fragment kodu z przyciskami (pierwszy przycisk to iRaty, drugi to iLeasing):
Sklep w wersji Light lub Standard:{% if customer.Authenticated and customer.Company -%}
{% assign tempVat = 100 | Plus: product.VAT | DividedBy: 100 -%}
{% assign totalPrice = product.Price | Times: tempVat -%}
{% assign subtotalPrice = product.Price -%}
{% else -%}
{% assign totalPrice = product.Price -%}
{% assign tempVat = 100 | Plus: product.VAT | DividedBy: 100 -%}
{% assign subtotalPrice = product.Price | DividedBy: tempVat -%}
{% endif -%}
Wskazówka
W miejsce XXXX należy wpisać ID partnera.
Wskazówka
Kod zawiera oba przyciski (iLeasing i iRaty). Jeśli potrzebujesz tylko jednego z nich, to skopiuj tylko ten fragment, który Cię interesuje. Nie zapomnij o warunku, który jest na początku kodu.
Sklep w wersji Enterprise lub B2B:
Wskazówka
W miejsce XXXX należy wpisać ID partnera.
Wskazówka
Kod zawiera oba przyciski (iLeasing i iRaty). Jeśli potrzebujesz tylko jednego z nich, to skopiuj tylko ten fragment, który Cię interesuje.
3. Bursztyn lub Opal
W pliku productdetails.html wyszukaj frazę Com_AskForPrice. To etykieta przycisku zapytania o cenę. Linijkę niżej znajduje się domknięcie przycisku: (/div). Wklej pod tym zamknięciem fragment kodu z przyciskami (pierwszy przycisk to iRaty, drugi to iLeasing):
Sklep w wersji Light lub Standard:{% if customer.Authenticated and customer.Company -%}
{% assign tempVat = 100 | Plus: _pd.VAT | DividedBy: 100 -%}
{% assign totalPrice = _pd.Price | Times: tempVat -%}
{% assign subtotalPrice = _pd.Price -%}
{% else -%}
{% assign totalPrice = _pd.Price -%}
{% assign tempVat = 100 | Plus: _pd.VAT | DividedBy: 100 -%}
{% assign subtotalPrice = _pd.Price | DividedBy: tempVat -%}
{% endif -%}
Wskazówka
W miejsce XXXX należy wpisać ID partnera.
Wskazówka
Kod zawiera oba przyciski (iLeasing i iRaty). Jeśli potrzebujesz tylko jednego z nich, to skopiuj tylko ten fragment, który Cię interesuje. Nie zapomnij o warunku, który jest na początku kodu.
Sklep w wersji Enterprise lub B2B:
Wskazówka
W miejsce XXXX należy wpisać ID partnera.
Wskazówka
Kod zawiera oba przyciski (iLeasing i iRaty).Jeśli potrzebujesz tylko jednego z nich, to skopiuj tylko ten fragment, który Cię interesuje.
4. Topaz
Wskazówka
W celu sprawdzenia jaka wersja wyglądu elementu ze szczegółami towaru jest przez nas posiadana, należy przejść do katalogu elements a następnie product. Nazwa pliku znajdujacego się w katalogu odpowiada wersji. Proszę wykonać instrukcje znajdujące się poniżej w zależności od wersji.
Wersja product-details-1
W pliku elements/product/product-details-1.html wyszukaj frazę {% include 'partials/common/after-adding-to-cart-popup.html' %}. Bezpośrednio nad nią wklej fragment kodu z przyciskami (pierwszy przycisk to iRaty, drugi to iLeasing):
{% if customer.Authenticated and customer.Company -%}
{% assign tempVat = 100 | Plus: _pd.VAT | DividedBy: 100 -%}
{% assign totalPrice = _pd.Price | Times: tempVat -%}
{% assign subtotalPrice = _pd.Price -%}
{% else -%}
{% assign totalPrice = _pd.Price -%}
{% assign tempVat = 100 | Plus: _pd.VAT | DividedBy: 100 -%}
{% assign subtotalPrice = _pd.Price | DividedBy: tempVat -%}
{% endif -%}
Wskazówka
W miejsce XXXX należy wpisać ID partnera.
Wskazówka
Kod zawiera oba przyciski (iLeasing i iRaty). Jeśli potrzebujesz tylko jednego z nich, to skopiuj tylko ten fragment, który Cię interesuje.
Sklep w wersji Enterprise lub B2B:
Wskazówka
W miejsce XXXX należy wpisać ID partnera.
Wskazówka
Kod zawiera oba przyciski (iLeasing i iRaty).Jeśli potrzebujesz tylko jednego z nich, to skopiuj tylko ten fragment, który Cię interesuje.
Wersja product-details-2
W pliku elements/product/product-details-2.html wyszukaj frazę {% include 'partials/common/after-adding-to-cart-popup.html' %}. Bezpośrednio nad nią wklej fragment kodu z przyciskami (pierwszy przycisk to iRaty, drugi to iLeasing):
{% if customer.Authenticated and customer.Company -%}
{% assign tempVat = 100 | Plus: _pd.VAT | DividedBy: 100 -%}
{% assign totalPrice = _pd.Price | Times: tempVat -%}
{% assign subtotalPrice = _pd.Price -%}
{% else -%}
{% assign totalPrice = _pd.Price -%}
{% assign tempVat = 100 | Plus: _pd.VAT | DividedBy: 100 -%}
{% assign subtotalPrice = _pd.Price | DividedBy: tempVat -%}
{% endif -%}
Wskazówka
W miejsce XXXX należy wpisać ID partnera.
Wskazówka
Kod zawiera oba przyciski (iLeasing i iRaty). Jeśli potrzebujesz tylko jednego z nich, to skopiuj tylko ten fragment, który Cię interesuje.
Sklep w wersji Enterprise lub B2B:
Wskazówka
W miejsce XXXX należy wpisać ID partnera.
Wskazówka
Kod zawiera oba przyciski (iLeasing i iRaty).Jeśli potrzebujesz tylko jednego z nich, to skopiuj tylko ten fragment, który Cię interesuje.
Umieszczenie przycisku Leasing Grenke na szczegółach towaru
Wskazówka
Od 1 czerwca 2025 roku zakończyliśmy aktualizację oraz wydawanie nowych wersji szablonów Bursztyn, Agat i Opal, a tym samym ich wsparcie, aby skupić się na nowoczesnych rozwiązaniach, które jeszcze lepiej odpowiadają na potrzeby dynamicznie rozwijającego się rynku e-commerce.
Zachęcamy Was do przejścia na nasze nowe, udoskonalone szablony. Dla sklepów B2C polecamy szablony Topaz, One Page Shop oraz Dla Gastronomii, natomiast dla platform B2B idealnym wyborem będą Rubin i Szafir.
Umieszczenie przycisku Leasing Grenke na szczegółach towaru
W tym artykule dowiesz się, jak w łatwy sposób dodać przycisk Leasing Grenke na szczegółach towaru w e-Sklepie.
Wskazówka
W przykładach użyta jest grafika w5.jpg. Jeśli preferujesz inną, to wystarczy w poniższym przykładzie zmienić ją na jedną z dostępnych tutaj.
1. Szafir
Wchodzimy w zakładkę Wygląd sklepu/ Ustawienia/ Edytuj ustawienia zaawansowane/ Edytuj HTML /product/ product-presentation-data.html wyszukaj frazę w kodzie(CTRL+F) {% if canBuy -%}, gdzie znajduje się przycisk dodawania do koszyka. Bezpośrednio pod tą linijką wklej kod:
{% if currencyExt.Code == 'PLN' and activeProduct.Price > 0 -%}{% unless config.ENTERPRISE == false and customer.SubtotalPrices == false -%}
{% endunless -%}{% endif -%}
2. Agat
Wchodzimy w zakładkę Wygląd sklepu/ Ustawienia/ Edytuj ustawienia zaawansowane/ Edytuj HTML / partials/ product/ product-popup.html wyszukaj frazę w kodzie(CTRL+F) Pro_addToCart. To etykieta przycisku dodawania do koszyka w szablonie Agat. Linijkę niżej znajduje się domknięcie przycisku czyli (/span). Wklej pod tym zamknięciem kod:
{% if currencyExt.Code == 'PLN' and product-details.Product.Price > 0 -%}{% unless config.ENTERPRISE == false and customer.SubtotalPrices == false -%}
{% endunless -%}{% endif -%}
3. Bursztyn lub Opal
Wchodzimy w zakładkę Wygląd sklepu/ Ustawienia/ Edytuj ustawienia zaawansowane/ Edytuj HTML plik productdetails.html wyszukaj frazę w kodzie(CTRL+F) Com_AskForPrice. To etykieta przycisku zapytania o cenę. Linijkę niżej znajduje się domknięcie przycisku: (/div). Wklej pod tym zamknięciem kod:
{% if currencyExt.Code == 'PLN' and productdetails.Product.Price > 0 -%}{% unless config.ENTERPRISE == false and customer.SubtotalPrices == false -%}
{% endunless -%}{% endif -%}
4. Topaz
Wchodzimy w zakładkę Wygląd sklepu/ Ustawienia/ Edytuj ustawienia zaawansowane/ Edytuj HTML / elements/ product/ product-details-1.html (lub elements/ product/ product-details-2.html - w zależności od Twojej wersji szablonu) wyszukaj w kodzie(CTRL+F) {% include 'partials/common/after-adding-to-cart-popup.html' %}. Bezpośrednio nad nią wklej kod:
{% if currencyExt.Code == 'PLN' and product-details.Product.Price > 0 -%}{% unless config.ENTERPRISE == false and customer.SubtotalPrices == false -%}
{% endunless -%}{% endif -%}
Obsługa nowych zestawów
Obsługa nowych zestawów
Z tego artykułu dowiesz się jak dodać w szablonie obsługę nowych zestawów.
Wskazówka
W tym artykule dowiesz się jak wprowadzać zmiany w plikach js i scss. Dodatkowe informacje o kompilacji i minifikacji znajdziesz w centrum pomocy.
Szafir
W pliku product/product-presentation-data.html znajdź frazę {% if product.Sets != null and product.Sets != empty -%}. Powinna występować 3 razy. W każdym z nich zmień Sets na SetsExt. Następnie będąc przy ostatnim wystąpieniu tej frazy (która jest warunkiem) podmień calą zawartość tego warunku poniższym kodem:
{{ translations.BuyInSet }}
{% for set in product.SetsExt -%}
{% assign setPrice = '' -%}
{% assign setPreviousPrice = '' -%}
{{ set.SetName }}
{% for setElement in set.Elements -%}
{% for setProduct in setElement.Products -%}
{% assign index = forloop.index -%}
{% if index == 1 -%}
{% if setProduct.Value -%}
{% if setPrice == '' -%}
{% assign setPrice = setProduct.Value -%}
{% else -%}
{% assign setPrice = setPrice | Plus: setProduct.Value -%}
{% endif -%}
{% endif -%}
{% if setProduct.PreviousValue -%}
{% if setPreviousPrice == '' -%}
{% assign setPreviousPrice = setProduct.PreviousValue -%}
{% else -%}
{% assign setPreviousPrice = setPreviousPrice | Plus: setProduct.PreviousValue -%}
{% endif -%}
{% endif -%}
{% endif -%}
Pozostając w tym samym pliku (scss/globals/_globals-m.scss) zaraz pod pierwszą linijką wklej poniższy kod:
.set-product-hidden-lq{
display: none;
}
Obsługa załączników na formularzu kontaktowym
Obsługa załączników na formularzu kontaktowym
Z tego artykułu dowiesz się jak dodać w szablonie obsługę załączników na formularzu kontaktowym.
Uwaga
Instrukcja przeznaczona dla sklepów od wersji 2022.0 ze starszymi szablonami.
Wskazówka
Artykuł przeprowadzi Cię przez proces modyfikacji plików js. Dodatkowe informacje o kompilacji i minifikacji znajdziesz w centrum pomocy.
Szafir
W pliku common/navigation-bars/navigation-contact.html znajdź frazę contact-form-required-fields-ui i linijkę niżej wklej poniższy kod:
{% if config.Contact.AttachmentsEnabled -%}
{% capture maxSize -%}{{config.Contact.AttachmentMaxSize}}B{% endcapture -%} {% for i in (1..config.Contact.AttachmentsMaxCount) -%}
{% endfor -%}
{% endif -%}
Następnie w pliku js/init-ui2.js znajdź frazę function sendContactForm(e) i usuń całą tą funkcję wraz z jej wywołaniem które jest zaraz pod nią.
Przejdź do pliku js/init.js i znajdź frazę List of events. Linijkę wyżej wklej poniższy kod:
sendContactForm: function(e) {
if(app.validationBeforePost(e) != 'error'){
$('.during-ajax-modal-lq').removeClass('hidden-lq');
var form = $(e.currentTarget).parents('.form-lq');
var dataFromHTML = form.find('input:not([disabled]), select:not([disabled]), textarea:not([disabled])').serializeArray();
var fileList = window.attachementsInComplaint;
if(fileList != undefined){
var filesSize = fileList.length;
}
var fd = new FormData();
fd.append('__csrf', __CSRF);
for(var i=0; i<dataFromHTML.length; i++){ fd.append(dataFromHTML[i].name,dataFromHTML[i].value); } if (filesSize > 0) {
window.AttachementsErrors = 0;
function addAttachementError(file, message) {
if(window.AttachementsNotAdded == undefined){
window.AttachementsNotAdded = [];
}
var attachement = '
'+file.name+': '+message+'
'; window.AttachementsNotAdded.push(attachement); window.AttachementsErrors += 1; }; var input = form.find('[name=file]').eq(0); var extensions = input.attr('accept').split(', '); var fileSize = input.data('file-size'); for (var i=0; i<filesSize; i++) { var file = fileList.pop(); if(file.size < fileSize){ var extensionArr = file.name.split('.'); var extension = '.' + extensionArr[extensionArr.length - 1].toLowerCase(); var wrongExtension = true; for(var j=0; j<extensions.length; j++){ if(extension == extensions[j]){ fd.append('file'+i, file); var wrongExtension = false; } } if(wrongExtension){ var message = input.data('invalid-file'); addAttachementError(file, message); } } else { var message = input.data('size-exceeded'); addAttachementError(file, message); } } if(window.AttachementsNotAdded){ var popup = '
'+ '
'+ '
'+ __translations.AttachementsNotAdded+ ''+ '
'+ window.AttachementsNotAdded.join('')+ '
'+ '
'; $('body').append(popup); $('body').addClass('modal-opened-ui'); window.AttachementsNotAdded = undefined; window.AttachementsErrors = undefined; } } $.ajax({ data: fd, processData: false, contentType: false, type: 'POST', success: function (data) { $('.during-ajax-modal-lq').addClass('hidden-lq'); $('.add-attachement-in-complaint-lq').val(''); if (data.action.Result) { var message = form.data('success'); app.temporaryMessage(form, message); $.each(inputs, function (index, value) { if ($(value).attr('name') !== 'contactId' && $(value).attr('name') !== '__action') { $(value).val(''); } }); form.find('.message-lq').remove(); } else { var message = '
' + result.action.Message + '
'; if(result.action.Code != 100){ app.message(form, message); } } } }); $(e.currentTarget).removeClass('error-lq'); } else { $(e.currentTarget).addClass('error-lq'); } },
Pozostając w tym samym pliku (js/init.js) po wklejeniu powyższego kodu zejdź trochę niżej do funkcji events i analogicznie do pozostałych wywołań dodaj poniższy kod:
Aby załączniki pokazały się w szablonie należy aktywować parametr "Załączniku do formularza kontaktowego" z poziomu Panelu Administracyjnego/Ustawienia/Ustawienia sklepu/Ogólne.
Dodanie obsługi filtrów na stronie głównej
Dodanie obsługi filtrów na stronie głównej
W tym artykule dowiesz się jak zmodyfikować swój szablon, aby dodać w nim obsługę filtrów na stronie głównej.
Poniższy przykład jest jednym z wielu możliwych scenariuszy, Należy modyfikować kod we we własnym zakresie i dostosować go do własnych potrzeb.
Uwaga
W tym artykule trzeba będzie wprowadzać zmiany w plikach js i scss. Z tego artykułu dowiesz się jak je kompilować i minifikować.
Przykład modyfikacji szablonu Szafir
Wskazówka
Instrukcja dotyczy modyfikacji szablonu Szafir. W przypadku innych szablonów Comarch lub innego własnego, modyfikowanego - nie należy tej instrukcji traktować w stosunku 1:1, a jedynie jako źródło analogicznego postępowania.
Krok 1. W panelu administracyjnym e-Sklepu przejdź do sekcji Wygląd sklepu/Ustawienia/(prawy górny róg) Edytuj ustawienia zaawansowane/(prawy górny róg) Edytuj HTML.Krok 2. Przejdź do pliku home.html i na samym początku zastąp linijkę:
poniższym kodem:
Pamiętaj, aby odpowiednio skompilować oraz zminifikować modyfikowane pliki. Więcej na ten temat przeczytasz tutaj.
Wskazówka
Pamiętaj także, aby wszelkie zmiany zapisać, a następnie opublikować.
Panel Administracyjny
Krok 1. W Panelu Administracyjnym przejdź do zakładki Wygląd sklepu/Ustawienia/(prawy górny róg) Edytuj ustawienia zaawansowane/Zakładka Obiekty.Krok 2. Dodaj nowy obiekt klikając przycisk Dodaj. Wybierz typ Tekst i nazwij go homepage-filters. Gdy się pojawi na liście obiektów kliknij na niego, aby edytować jego ustawienia.
Krok 3. W polu treść sprecyzuj, jakiej kategorii towarów ma dotyczyć filtrowanie (możesz utworzyć kilka osobnych zakładek), oraz jakich atrybutów filtrujących będzie można użyć.
Poniżej przykładowa treść:
Nazwa Kategorii1|ID kategorii1
|||||
Nazwa Filtra1|FILTR1
||||
Nazwa Filtra2|FILTR2
||||
Nazwa Filtra3|FILTR3
||||
Nazwa Filtra4|FILTR4
||||
Nazwa Filtra5|FILTR5
||||||
Nazwa Kategorii2|ID kategorii2
|||||
Nazwa Filtra6|FILTR6
||||
Nazwa Filtra7|FILTR7
||||
Nazwa Filtra8|FILTR8
||||
Nazwa Filtra9|FILTR9
Wskazówka
Nazwa Kategorii1,2,3,... - Nazwa Kategorii w e-Sklepie, na podstawie której zostanie utworzony filtr na stronie głównej.
ID Kategorii1,2,3,... - jest to ID wybranej kategorii w e-Sklepie, na podstawie której zostanie utworzony filtr.
Nazwa Filtra1,2,3,... - w tym miejscu podaj nazwę filtra, jaki chcesz aby został wyświetlony na stronie głównej.
FILTR1,2,3,... - wartość Field w obiekcie, w którym znajdują się filtry dla danej kategorii.
Wskazówka
Zwróć uwagę na ilość "|" belek między nazwami kategorii oraz filtrami. Jest ona istotna, aby prawidłowo utworzyć filtry.