Przykładowe modyfikacje

Wyszukiwarka zaawansowana w szablonie Topaz

Wyszukiwarka zaawansowana w szablonie Topaz

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 %}
 
 
 
 
   
 
{{translations.SearchIn}}
 

{{translations.Pro_ProductDescription}}

{{translations.Pro_ProductSymbol}}

{{translations.EanCode}}

{{translations.Man_ManufacturerCode}}

{{translations.Pro_productAttributes}}

{{translations.Pro_ProductCode}}
 
 
 
{{translations.Pro_productAttributes}}
 
{% if customer.HidePrices != true -%}
{{translations.PriceFrom}}
{{translations.PriceTo}}
 

{{translations.PricesDifference}}

 
{% endif -%}

{{translations.WithPhoto}}

{{translations.NewProduct}}

{{translations.Prize}}

{{translations.ExtraQuality}}

{{translations.ExtraPrice}}

{{translations.ProductFromNewsletter}}

{{translations.Promotion}}

{{translations.RecommendedProduct}}

{{translations.SellerRecomendation}}

{{translations.Sale}}

{{translations.BestReviewed}}
 
 
{% if manufacturer-brand.Manufacturer != 0 -%}
 
{{translations.Manufacturer}}
 
{% 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

Pierwszym krokiem będzie zamiana treści w pliku common/navigation-bars/main-navigation-bar-partial.html. Ze względu na znaczną rozbudowę nie można wskazać konkretnych zmian, zatem udostępniamy cały kod, którym należy zastąpić kod obecny: {% if config.DefinedPages.WithdrawalRight.Id != page.PageId and config.DefinedPages.Payment.Id != page.PageId and config.DefinedPages.Shipping.Id != page.PageId and config.DefinedPages.Complaints.Id != page.PageId and config.DefinedPages.Loyalty.Id != page.PageId and config.DefinedPages.Registration.Id != page.PageId and config.DefinedPages.Login.Id != page.PageId and config.DefinedPages.Terms.Id != page.PageId and config.DefinedPages.Contact.Id != page.PageId and config.DefinedPages.Privacy.Id != page.PageId and config.DefinedPages.Blog.Id != page.PageId and config.DefinedPages.BlogDetails.Id != page.PageId and config.DefinedPages.PasswordReminder.Id != page.PageId and config.DefinedPages.CustomerProfile.Id != page.PageId and config.DefinedPages.About.Id != page.PageId and config.DefinedPages.SocialMedia.Id != page.PageId -%} {% assign togglingClass = '' -%} {% if page.PageId == config.DefinedPages.ProductDetails.Id -%} {% assign togglingClass = 'toggle-categories-lq' -%} {% endif -%} <nav class="header-categories-ui main-navigation-bar-ui"> <ul class="manufacturer-container-ui"> <li class="{% if config.DefinedPages.ProductList.Id == page.PageId or config.DefinedPages.Home.Id == page.PageId or config.DefinedPages.Manufacturers.Id == page.PageId -%} categories-opened-ui {% endif -%} {% if config.DefinedPages.AdvancedSearch.Id == page.PageId -%} login-back-ui {% endif -%} categories-option-ui categories-option-lq" > <a class="categories-label-ui category-links-ui categories-link-lq {{togglingClass}}" aria-label="categories-label" href="{{ config.DefinedPages.ProductList.Url }}" title="{{ translations.Contact }}"> <i class="va-mid-ui header-categories-icon-ui ti-menu"></i> <span class="va-mid-ui line-height-1-ui">{{translations.Categories}}</span> </a> </li> <li class="main-navigation-bar-links-ui"> <ul> {% assign manufacturersSize = manufacturer-brand.Manufacturers | Size -%} {% if usr.Authenticated == true -%} {% if settings.discountsPresentationInCustomerProfileInPromotionsTab == 'yes' and settings.promotions -%} <li class="no-on-mobile-ui" style="order: {{settings.promotionsNo}};"> <a href="{{settings.promotionsLink}}"> {% if settings.promotionsIcon != '' -%} <i class="va-mid-ui {{settings.promotionsIcon}} header-manufacturers-icon-ui header-categories-icon-ui"></i> {% endif -%} <span class="va-mid-ui line-height-1-ui documents-ui"> {% if settings.promotionsTranslation != '' -%} {{ translations[settings.promotionsTranslation] }} {% else -%} {{ settings.promotionsLabel }} {% endif -%} </span> </a> </li> {% endif -%} {% if settings.documents -%} <li class="no-on-mobile-ui" style="order: {{settings.documentsNo}};"> <a href="{{settings.documentsLink}}"> {% if settings.documentsIcon != '' -%} <i class="va-mid-ui {{settings.documentsIcon}} header-manufacturers-icon-ui header-categories-icon-ui"></i> {% endif -%} <span class="va-mid-ui line-height-1-ui documents-ui"> {% if settings.documentsTranslation != '' -%} {{ translations[settings.documentsTranslation] }} {% else -%} {{ settings.documentsLabel }} {% endif -%} </span> </a> </li> {% endif -%} {% assign manufacturers = settings.authenticatedManufacturers -%} {% assign manufacturersNo = settings.authenticatedManufacturersNo -%} {% assign manufacturersIcon = settings.authenticatedManufacturersIcon -%} {% assign manufacturersLabel = settings.authenticatedManufacturersLabel -%} {% assign manufacturersTranslation = settings.authenticatedManufacturersTranslation -%} {% assign manufacturersLink = settings.authenticatedManufacturersLink -%} {% assign searchAdvanced = settings.authenticatedSearchAdvanced -%} {% assign searchAdvancedNo = settings.authenticatedSearchAdvancedNo -%} {% assign searchAdvancedIcon = settings.authenticatedSearchAdvancedIcon -%} {% assign searchAdvancedLabel = settings.authenticatedSearchAdvancedLabel -%} {% assign searchAdvancedTranslation = settings.authenticatedSearchAdvancedTranslation -%} {% assign searchAdvancedLink = settings.authenticatedSearchAdvancedLink -%} {% assign cartImport = settings.authenticatedCartImport -%} {% assign cartImportNo = settings.authenticatedCartImportNo -%} {% assign cartImportIcon = settings.authenticatedCartImportIcon -%} {% assign cartImportLabel = settings.authenticatedCartImportLabel -%} {% assign cartImportTranslation = settings.authenticatedCartImportTranslation -%} {% assign cartImportLink = settings.authenticatedCartImportLink -%} {% assign downloadCSV = settings.authenticatedDownloadCSV -%} {% assign downloadCSVNo = settings.authenticatedDownloadCSVNo -%} {% assign downloadCSVIcon = settings.authenticatedDownloadCSVIcon -%} {% assign downloadCSVLabel = settings.authenticatedDownloadCSVLabel -%} {% assign downloadCSVTranslation = settings.authenticatedDownloadCSVTranslation -%} {% assign downloadCSVLink = settings.authenticatedDownloadCSVLink -%} {% assign customerLinks = settings.authenticatedCustomerLinks -%} {% else -%} {% assign manufacturers = settings.notAuthenticatedManufacturers -%} {% assign manufacturersNo = settings.notAuthenticatedManufacturersNo -%} {% assign manufacturersIcon = settings.notAuthenticatedManufacturersIcon -%} {% assign manufacturersLabel = settings.notAuthenticatedManufacturersLabel -%} {% assign manufacturersTranslation = settings.notAuthenticatedManufacturersTranslation -%} {% assign manufacturersLink = settings.notAuthenticatedManufacturersLink -%} {% assign searchAdvanced = settings.notAuthenticatedSearchAdvanced -%} {% assign searchAdvancedNo = settings.notAuthenticatedSearchAdvancedNo -%} {% assign searchAdvancedIcon = settings.notAuthenticatedSearchAdvancedIcon -%} {% assign searchAdvancedLabel = settings.notAuthenticatedSearchAdvancedLabel -%} {% assign searchAdvancedTranslation = settings.notAuthenticatedSearchAdvancedTranslation -%} {% assign searchAdvancedLink = settings.notAuthenticatedSearchAdvancedLink -%} {% assign cartImport = settings.notAuthenticatedCartImport -%} {% assign cartImportNo = settings.notAuthenticatedCartImportNo -%} {% assign cartImportIcon = settings.notAuthenticatedCartImportIcon -%} {% assign cartImportLabel = settings.notAuthenticatedCartImportLabel -%} {% assign cartImportTranslation = settings.notAuthenticatedCartImportTranslation -%} {% assign downloadCSV = settings.notAuthenticatedDownloadCSV -%} {% assign downloadCSVNo = settings.notAuthenticatedDownloadCSVNo -%} {% assign downloadCSVIcon = settings.notAuthenticatedDownloadCSVIcon -%} {% assign downloadCSVLabel = settings.notAuthenticatedDownloadCSVLabel -%} {% assign downloadCSVTranslation = settings.notAuthenticatedDownloadCSVTranslation -%} {% assign customerLinks = settings.notAuthenticatedCustomerLinks -%} {% endif -%} {% assign manufacturersSize = manufacturer-brand.Manufacturers | Size -%} {% if manufacturers and manufacturersSize > 0 -%} <li class="{% if page.PageId == config.DefinedPages.Manufacturers.Id -%} active-bar-ui {% else -%} no-on-mobile-ui {% endif -%}" style="order: {{manufacturersNo}};"> {% if page.PageId == config.DefinedPages.Manufacturers.Id -%} <span class="block-ui page-label-ui"> {% else -%} <a href="{{manufacturersLink}}"> {% endif -%} {% if manufacturersIcon != '' -%} <i class="va-mid-ui {{manufacturersIcon}} header-manufacturers-icon-ui"></i> {% endif -%} <span class="va-mid-ui line-height-1-ui"> {% if manufacturersTranslation != '' -%} {{ translations[manufacturersTranslation] }} {% else -%} {{ manufacturersLabel }} {% endif -%} </span> {% if page.PageId != 20 -%} </a> {% else -%} </span> {% endif -%} </li> {% endif -%} {% if searchAdvanced -%} <li class="{% if config.DefinedPages.AdvancedSearch.Id == page.PageId -%} active-bar-ui {% else -%} no-on-mobile-ui {% endif -%}" style="order: {{searchAdvancedNo}};"> {% if config.DefinedPages.AdvancedSearch.Id == page.PageId -%} <span class="block-ui page-label-ui"> {% else -%} <a href="{{searchAdvancedLink}}"> {% endif -%} {% if searchAdvancedIcon != '' -%} <i class="va-mid-ui {{searchAdvancedIcon}} header-manufacturers-icon-ui"></i> {% endif -%} <span class="va-mid-ui line-height-1-ui"> {% if searchAdvancedTranslation != '' -%} {{ translations[searchAdvancedTranslation] }} {% else -%} {{ searchAdvancedLabel }} {% endif -%} </span> {% if config.DefinedPages.AdvancedSearch.Id != page.PageId -%} </a> {% else -%} </span> {% endif -%} </li> {% endif -%} {% if cartImport -%} <li class="no-on-mobile-ui" style="order: {{cartImportNo}};"> <label for="file" class="import-cart-lq import-cart-ui block-ui page-label-ui"> {% if cartImportIcon != '' -%} <i class="{{cartImportIcon}} header-manufacturers-icon-ui"></i> {% endif -%} {% if cartImportTranslation != '' -%} {{ translations[cartImportTranslation] }} {% else -%} {{ cartImportLabel }} {% endif -%} </label> <input class="import-cart-input-lq" id="file" type="file" name="file" accept=".csv" {% if settings.afterAddingToCart == 1 -%} data-redirect-url="{{ page.BaseHref }}{{ config.DefinedPages.Order.Url }}" {% endif -%} /> {% if settings.afterAddingToCart == 3 -%} <div class="message-popup-background-ui after-importing-cart-popup-lq container-to-hide-lq hide-container-lq hidden-lq"> {% include 'product/after-adding-to-cart.html' -%} </div> {% endif -%} <div class="importing-cart-succeed-lq message-popup-background-ui hidden-lq hide-lq container-to-hide-lq" data-url="{{ page.BaseHref }}{{ config.DefinedPages.Order.Url }}"> <div class="message-popup-ui box-ui after-adding-to-cart-popup-ui after-importing-popup-container-lq"> <div class="box-ui product-added-to-cart-ui"> <i class="va-mid-ui ti-check"></i> <span class="va-mid-ui line-height-1-ui"> {% if customer.Cart.EditedOrderId -%} {{ translations.AddedToOrder }} {% else -%} {{ translations.AddedToCart }} {% endif -%} </span> </div> </div> </div> <div class="during-ajax-modal-lq during-ajax-modal-ui hidden-lq"> <div class="loader-ui big-ui"></div> </div> </li> {% endif -%} {% if downloadCSV -%} <li class="no-on-mobile-ui" style="order: {{downloadCSVNo}};"> <a href="usr/cart_importcsv_file.csv"> {% if downloadCSVIcon != '' -%} <i class="{{downloadCSVIcon}} header-manufacturers-icon-ui"></i> {% endif -%} {% if downloadCSVTranslation != '' -%} {{ translations[downloadCSVTranslation] }} {% else -%} {{ downloadCSVLabel }} {% endif -%} </a> </li> {% endif -%} {% for customerLink in customerLinks -%} {% if customerLink.available -%} <li class="no-on-mobile-ui" style="order: {{customerLink.no}};"> <a href="{{customerLink.link}}"> {% if customerLink.icon != '' -%} <i class="{{customerLink.icon}} header-manufacturers-icon-ui"></i> {% endif -%} {% if customerLink.translation != '' -%} {{ translations[customerLink.translation] }} {% else -%} {{ customerLink.label }} {% endif -%} </a> </li> {% endif -%} {% endfor -%} </ul> </li> </ul> </nav> {% endif -%} Następnie dodamy ustawienia do szablonu. W tym celu należy użyć narzędzia wyszukiwania w pliku _settings.liquid i wyszukać pierwsze wystąpienie frazy {% else %}, a następnie wkleić następujący kod linijkę wyżej: {% assign general = "Ogólne" -%} {% assign navigationBarSettings = "Ustawienia paska nawigacji na stronie głównej" -%} {% assign notAuthenticatedInfo = "Lista elementów zawartych w pasku nawigacji dla klientów niezalogowanych" -%} {% assign authenticatedInfo = "Lista elementów zawartych w pasku nawigacji dla klientów zalogowanych" -%} {% assign available = "Dostępne" -%} {% assign number = "Lp" -%} {% assign icon = "Ikona" -%} {% assign polishLabel = "Etykieta PL" -%} {% assign translationId = "Id tłumaczenia" -%} {% assign linkAction = "link/akcja" -%} {% assign cartImport = "Import koszyka" -%} {% assign cartImportInfo = "Opcja importu koszyka z pliku CSV" -%} {% assign downloadCSV = "Pobierz przykładowy plik CSV" -%} {% assign downloadCSVInfo = "Przykładowy plik CSV do importu koszyka" -%} {% assign searchAdvanced = "Wyszukiwarka zaawansowana" -%} {% assign promotions = "Promocje" -%} {% assign documents = "Dokumenty" -%} {% assign addLink = "Dodaj link" -%} {% assign delete = "Usuń" -%} W tym sam pliku szukamy pierwszego wystąpienia frazy {% endcase %} i wklejamy następujący kod linijkę wyżej: {% assign general = "General" -%} {% assign navigationBarSettings = "Homepage navigation bar settings" -%} {% assign notAuthenticatedInfo = "List of elements in navigation bar for not authenticated customers" -%} {% assign authenticatedInfo = "List of elements in navigation bar for authenticated customers" -%} {% assign available = "Available" -%} {% assign number = "No" -%} {% assign icon = "Icon" -%} {% assign polishLabel = "Label PL" -%} {% assign translationId = "Translation Id" -%} {% assign linkAction = "link/action" -%} {% assign cartImport = "Cart import" -%} {% assign cartImportInfo = "Cart import option from CSV file" -%} {% assign downloadCSV = "Download sample CSV file" -%} {% assign downloadCSVInfo = "Sample CSV file for cart import" -%} {% assign searchAdvanced = "Search advanced" -%} {% assign promotions = "Promotions" -%} {% assign documents = "Documents" -%} {% assign addLink = "Add link" -%} {% assign delete = "Delete" -%}

Kolejnym krokiem jest wyszukanie frazy <script> oraz wklejenie bezpośrednio nad nią następującego kodu:

<div id="tab1Content"> <fieldset> <legend>{{notAuthenticatedInfo}}</legend> <div> <div class="row"> <div class="cell available">{{available}}</div> <div class="cell no">{{number}}</div> <div class="cell">{{icon}}</div> <div class="cell">{{polishLabel}}</div> <div class="cell">{{translationId}}</div> <div class="cell">{{linkAction}}</div> <div class="cell delete">{{delete}}</div> </div> <div class="row"> <div class="cell available"><input type="checkbox" name="notAuthenticatedCartImport" {% if settings.notAuthenticatedCartImport -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="notAuthenticatedCartImportNo" value="{{ settings.notAuthenticatedCartImportNo }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedCartImportIcon" value="{{ settings.notAuthenticatedCartImportIcon }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedCartImportLabel" value="{{ settings.notAuthenticatedCartImportLabel }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedCartImportTranslation" value="{{ settings.notAuthenticatedCartImportTranslation }}" /></div> <div class="cell">{{cartImportInfo}}</div> <div class="cell delete"></div> </div> <div class="row"> <div class="cell available"><input type="checkbox" name="notAuthenticatedDownloadCSV" {% if settings.notAuthenticatedDownloadCSV -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="notAuthenticatedDownloadCSVNo" value="{{ settings.notAuthenticatedDownloadCSVNo }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedDownloadCSVIcon" value="{{ settings.notAuthenticatedDownloadCSVIcon }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedDownloadCSVLabel" value="{{ settings.notAuthenticatedDownloadCSVLabel }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedDownloadCSVTranslation" value="{{ settings.notAuthenticatedDownloadCSVTranslation }}" /></div> <div class="cell">{{downloadCSVInfo}}</div> <div class="cell delete"></div> </div> <div class="row"> <div class="cell available"><input type="checkbox" name="notAuthenticatedSearchAdvanced" {% if settings.notAuthenticatedSearchAdvanced -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="notAuthenticatedSearchAdvancedNo" value="{{ settings.notAuthenticatedSearchAdvancedNo }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedSearchAdvancedIcon" value="{{ settings.notAuthenticatedSearchAdvancedIcon }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedSearchAdvancedLabel" value="{{ settings.notAuthenticatedSearchAdvancedLabel }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedSearchAdvancedTranslation" value="{{ settings.notAuthenticatedSearchAdvancedTranslation }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedSearchAdvancedLink" value="{{ settings.notAuthenticatedSearchAdvancedLink }}" /></div> <div class="cell delete"></div> </div> {% for customerLink in settings.notAuthenticatedCustomerLinks -%} <div class="row notAuthenticatedCustomerLink" data-index="{{forloop.index0}}"> <div class="cell available"><input type="checkbox" name="notAuthenticatedCustomerLink{{forloop.index0}}" {% if customerLink.available -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="notAuthenticatedCustomerLinkNo{{forloop.index0}}" value="{{ customerLink.no }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedCustomerLinkIcon{{forloop.index0}}" value="{{ customerLink.icon }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedCustomerLinkLabel{{forloop.index0}}" value="{{ customerLink.label }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedCustomerLinkTranslation{{forloop.index0}}" value="{{ customerLink.translation }}" /></div> <div class="cell"><input type="text" name="notAuthenticatedCustomerLinkLink{{forloop.index0}}" value="{{ customerLink.link }}" /></div> <div class="cell delete"><div class="fa fa-trash"></div></div> </div> {% endfor -%} </div> <button class="add-link">{{addLink}}</button> <input name="customer-links" type="hidden" value="{{settings.notAuthenticatedCustomerLinks | Size }}" /> </fieldset> <fieldset> <legend>{{authenticatedInfo}}</legend> <div> <div class="row"> <div class="cell available">{{available}}</div> <div class="cell no">{{number}}</div> <div class="cell">{{icon}}</div> <div class="cell">{{polishLabel}}</div> <div class="cell">{{translationId}}</div> <div class="cell">{{linkAction}}</div> <div class="cell delete">{{delete}}</div> </div> <div class="row"> <div class="cell available"><input type="checkbox" name="authenticatedCartImport" {% if settings.authenticatedCartImport -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="authenticatedCartImportNo" value="{{ settings.authenticatedCartImportNo }}" /></div> <div class="cell"><input type="text" name="authenticatedCartImportIcon" value="{{ settings.authenticatedCartImportIcon }}" /></div> <div class="cell"><input type="text" name="authenticatedCartImportLabel" value="{{ settings.authenticatedCartImportLabel }}" /></div> <div class="cell"><input type="text" name="authenticatedCartImportTranslation" value="{{ settings.authenticatedCartImportTranslation }}" /></div> <div class="cell">{{cartImportInfo}}</div> <div class="cell delete"></div> </div> <div class="row"> <div class="cell available"><input type="checkbox" name="authenticatedDownloadCSV" {% if settings.authenticatedDownloadCSV -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="authenticatedDownloadCSVNo" value="{{ settings.authenticatedDownloadCSVNo }}" /></div> <div class="cell"><input type="text" name="authenticatedDownloadCSVIcon" value="{{ settings.authenticatedDownloadCSVIcon }}" /></div> <div class="cell"><input type="text" name="authenticatedDownloadCSVLabel" value="{{ settings.authenticatedDownloadCSVLabel }}" /></div> <div class="cell"><input type="text" name="authenticatedDownloadCSVTranslation" value="{{ settings.authenticatedDownloadCSVTranslation }}" /></div> <div class="cell">{{downloadCSVInfo}}</div> <div class="cell delete"></div> </div> <div class="row"> <div class="cell available"><input type="checkbox" name="promotions" {% if settings.promotions -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="promotionsNo" value="{{ settings.promotionsNo }}" /></div> <div class="cell"><input type="text" name="promotionsIcon" value="{{ settings.promotionsIcon }}" /></div> <div class="cell"><input type="text" name="promotionsLabel" value="{{ settings.promotionsLabel }}" /></div> <div class="cell"><input type="text" name="promotionsTranslation" value="{{ settings.promotionsTranslation }}" /></div> <div class="cell"><input type="text" name="promotionsLink" value="{{ settings.promotionsLink }}" /></div> <div class="cell delete"></div> </div> <div class="row"> <div class="cell available"><input type="checkbox" name="documents" {% if settings.documents -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="documentsNo" value="{{ settings.documentsNo }}" /></div> <div class="cell"><input type="text" name="documentsIcon" value="{{ settings.documentsIcon }}" /></div> <div class="cell"><input type="text" name="documentsLabel" value="{{ settings.documentsLabel }}" /></div> <div class="cell"><input type="text" name="documentsTranslation" value="{{ settings.documentsTranslation }}" /></div> <div class="cell"><input type="text" name="documentsLink" value="{{ settings.documentsLink }}" /></div> <div class="cell delete"></div> </div> <div class="row"> <div class="cell available"><input type="checkbox" name="authenticatedSearchAdvanced" {% if settings.authenticatedSearchAdvanced -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="authenticatedSearchAdvancedNo" value="{{ settings.authenticatedSearchAdvancedNo }}" /></div> <div class="cell"><input type="text" name="authenticatedSearchAdvancedIcon" value="{{ settings.authenticatedSearchAdvancedIcon }}" /></div> <div class="cell"><input type="text" name="authenticatedSearchAdvancedLabel" value="{{ settings.authenticatedSearchAdvancedLabel }}" /></div> <div class="cell"><input type="text" name="authenticatedSearchAdvancedTranslation" value="{{ settings.authenticatedSearchAdvancedTranslation }}" /></div> <div class="cell"><input type="text" name="authenticatedSearchAdvancedLink" value="{{ settings.authenticatedSearchAdvancedLink }}" /></div> <div class="cell delete"></div> </div> {% for customerLink in settings.authenticatedCustomerLinks -%} <div class="row authenticatedCustomerLink" data-index="{{forloop.index0}}"> <div class="cell available"><input type="checkbox" name="authenticatedCustomerLink{{forloop.index0}}" {% if customerLink.available -%} checked {% endif -%} /></div> <div class="cell no"><input type="number" name="authenticatedCustomerLinkNo{{forloop.index0}}" value="{{ customerLink.no }}" /></div> <div class="cell"><input type="text" name="authenticatedCustomerLinkIcon{{forloop.index0}}" value="{{ customerLink.icon }}" /></div> <div class="cell"><input type="text" name="authenticatedCustomerLinkLabel{{forloop.index0}}" value="{{ customerLink.label }}" /></div> <div class="cell"><input type="text" name="authenticatedCustomerLinkTranslation{{forloop.index0}}" value="{{ customerLink.translation }}" /></div> <div class="cell"><input type="text" name="authenticatedCustomerLinkLink{{forloop.index0}}" value="{{ customerLink.link }}" /></div> <div class="cell delete"><div class="fa fa-trash"></div></div> </div> {% endfor -%} </div> <button class="add-link authenticated">{{addLink}}</button> <input name="customer-links" type="hidden" value="{{settings.authenticatedCustomerLinks | Size }}" /> </fieldset> </div> </div>

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 -%}
{% endblock -%}
products/product-filters.html
{% if settings.filterPanelView == "left" -%}

{{translations.Filters}}

{% endif -%}
    {% assign fo = products.FilteringOptions -%} {% unless customer.HidePrices -%}
  • {{ translations.Price }}
    {{translations.RangeFrom | Downcase }} {{translations.RangeTo | Downcase }} {{ currencyExt }}
  • {% endunless -%} {% if settings.graphicColorFilter == 'yes' and color-filter.Content and color-filter.Content != '' %} {% assign colorFilterArr = color-filter.Content | StripNewlines | Split: '|||' -%} {% assign colorFilterName = colorFilterArr[0] -%} {% assign colorFilterValues = colorFilterArr[1] | Split: '||' -%} {% endif -%} {% for filter in fo.Filters -%} {% unless filter.Field == 'MARK' and config.Reviews.Enabled == false -%} {% assign isSthSelected = false -%} {% assign allSelected = false -%} {% assign selectedQuantity = 0 -%} {% for value in filter.Values -%} {% if value.Selected -%} {% if isSthSelected == false and settings.toggleFilters == 2 -%} {% assign isSthSelected = true -%} {% endif -%} {% capture stringToAdd -%}{{value.Field}}|{{filter.Heading}}|{{value.Value}}|{{value.Text}}||{% endcapture -%} {% assign activeFiltersKeysString = activeFiltersKeysString | Append: stringToAdd -%} {% assign activeFiltersQuantity = activeFiltersKeysString | Split:'||' | Size -%} {% assign selectedQuantity = selectedQuantity | Plus: 1 -%} {% assign filtersQuantity = filter.Values | Size -%} {% if selectedQuantity == filtersQuantity -%} {% assign allSelected = true -%} {% endif -%} {% endif -%} {% endfor -%}
  • {% if settings.filterPanelView == "left" -%} {% else -%} {% endif -%}
    {% assign filterValuesLength = filter.Values | Size -%} {% if filter.Field == colorFilterName or isSthSelected or settings.filterPanelView == "up" -%} {% assign limit = filterValuesLength | ToInt -%} {% else -%} {% assign limit = settings.maxfilter | ToInt -%} {% endif -%}
    {% for value in filter.Values limit: limit -%} {% endfor -%}
    {% if filterValuesLength > limit and filter.Field != colorFilterName and settings.filterPanelView == "left" -%} {% endif -%}
  • {% endunless -%} {% endfor -%} {% if settings.filterPanelView == "up" -%}
  • {% 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/ recommended gdzie 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:
  • szablon Agat – home-page.html
  • szablon Bursztyn – homepage.html
  • szablon Szafir – home.html

Szablon i treści wiadomości e-mail

Wstęp

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.
Wskazówka
Zachęcamy do przeczytania naszego artykułu odnośnie Dezaktywacji wybranych powiadomień e-mail

Gdzie edytować szablon wiadomości e-mail?

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ślny
Szablon domyślny
Topaz - motyw bordowy
Topaz - motyw bordowy
Topaz - motyw granatowy
Topaz - motyw granatowy
Topaz - motyw błękitny
Topaz - motyw błękitny
Topaz - motyw beżowy
Topaz - 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.

Instrukcja ogólna

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.
Spis treści

Wstęp

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 HTML Krok 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 HTML Krok 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.
Instrukcje do szablonów:

Szafir

Implementacja dla szablonu Szafir ukazana jest w artykule Logowanie do sklepu za pomocą konta Google i Facebook - implementacja w szablonie Szafir, ponieważ w tym szablonie funkcja ta jest również dostępna od wersji 2022.4.

Topaz

Pliki html

  • 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 :  
  • 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 != '' %} {% assign fbConnect = 1 -%} {% elsif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %} {% assign googleConnect = 1 -%} {% endif %} {% endfor %} {% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %} {% endif %} {% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %} {% endif %} {% else %} {% if config.External.Facebook and config.External.Facebook.AppID != '' %} {% endif %} {% if config.External.Google and config.External.Google.ClientID != '' %} {% 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 != '' %} {% assign fbConnect = 1 -%} {% elsif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %} {% assign googleConnect = 1 -%} {% endif %} {% endfor %} {% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %} {% endif %} {% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %} {% endif %} {% else %} {% if config.External.Facebook and config.External.Facebook.AppID != '' %} {% endif %} {% if config.External.Google and config.External.Google.ClientID != '' %} {% 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  -%}
{% endif -%} Następnie zamień ten fragment na wskazany poniżej:
{% if config.External.Facebook or config.External.Google  -%}
{% endif -%}

Pliki JavaScript

  • Zamień całą zawartość pliku js/google-login.js na ten kod:
function handleCredentialResponse(response) {
  setTimeout(function() {
    $.post(null,{ __action: 'External/GoogleLogin', __CSRF: __CSRF, id_token: response.credential },function(result){
        if (result.action.Result) {
            window.location.replace('');
        } else if (result.action.Code === 108) {
            var errMsg = document.querySelector('#google-signin').dataset.errorMsg;
            createMessage(errMsg);
        } else {
            createMessage(result);
        }
    });
  }, 1000);
}

window.onload = function () {
    google.accounts.id.initialize({client_id: __googleID, callback: handleCredentialResponse})
    google.accounts.id.renderButton(
      document.getElementById("google-signin"),
      { theme: "outline", size: "large", width: "250", logo_alignment: "center", text: "signin_with"}
    );

    $('body').on('click', '#linkGoogleAccount', function(){
      setTimeout(function() {
          $.post(null,{ __action: 'External/GoogleAccountLink', __CSRF: __CSRF, userID: __googleID },function(result){
              if (result.action.Result) {
                  location.reload();
              } else {
                  createMessage(result);
              }
          });
      }, 1000);
    });

    $('body').on('click', '#unlinkGoogleAccount', function(){
      $.post(null,{ __action: 'External/GoogleAccountUnlink', __CSRF: __CSRF },function(result){
          if (result.action.Result) {
              location.reload();
          } else {
              createMessage(result);
          }
      });
    });

    $('body').on('click', '.logout', function () {
        googleLogout();
    });
}

function googleLogout() {
  var auth2 = gapi.auth2.getAuthInstance();
  auth2.signOut();
}

function createMessage(obj) {
    if (obj.action.Code != 100) {
        app.showTemporaryPopup(obj.action.Message);
    }
}

  • 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:
        clearInterval(intervalAddress);
    }
}, 1000);
location.reload();

Pliki css

  • 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:
.login-container{`max-width:100%;width:30rem;padding:7rem 3rem;box-sizing:border-box;margin:0 auto}.login-container .form__input-wrapper{display:inline-block;position:relative;width:calc(100% - 30px);margin-left:30px;background-color:inherit;margin-bottom:23px}.login-container .form__icons:not(.form__preview){color:{{settings.primaryFontColor}};position:absolute;transform:translateY(-50%);top:20px;left:-30px}.login-container .form__icons.form__preview svg{fill:{{settings.linkFontColor}}}.login-container .form .form__icon_left,.login-container .form__icon_left{left:0}.login-container .form select{border-bottom:1px solid {{settings.primaryFontColor}}}.login-form__signIn{color:{{settings.primaryFontColor}};text-align:center;margin:0;font-weight:300;font-size:32px;display:block}.login-form__welcomeMsg{margin:0.6rem 0 4rem 0;color:{{settings.primaryFontColor}};opacity:0.65;text-align:center}.login-form__more-options{margin:0 0 18px;display:block;text-align:right}.login-form__registerLink{display:block;margin:20px auto 70px;text-align:center}.login-form__forget-password{font-size:12px;font-weight:300;color:{{settings.primaryFontColor}};text-decoration:none}.login-form__register{color:{{settings.linkFontColor}};font-weight:400;font-size:16px}.login-form__submit{margin:0 auto 2.5rem;width:100%;box-sizing:border-box;padding:.8rem 0;display:block;height:auto}.login-container .login-form__socialButtons{display:block;width:100%;font-size:14px;color:{{settings.primaryFontColor}};text-align:center}.login-container .login-form__socialButtons .login-form__socialButtons__buttons{display:flex;flex-direction:column}.login-container .login-form__socialButtons .login-form__socialButtons__buttons .Facebook_Login_Container{display:flex;justify-content:center;align-items:center}.login-container .login-form__socialButtons .login-form__socialButtons__buttons .Facebook_Login_Container .button__Social__facebook{display:flex;justify-content:center;align-items:center;border:1px solid #dadce0;width:248px;min-width:248px;height:38px;margin-top:35px;cursor:pointer;background-color:#FFF;color:#3c4043;margin-left:1px;border-radius:4px;font-weight:500;letter-spacing:0.3px}.login-container .login-form__socialButtons .login-form__socialButtons__buttons .Facebook_Login_Container .button__Social__facebook:hover{background-color:#f9faff;border:1px solid #dbe1ee}.login-container .login-form__socialButtons .login-form__socialButtons__buttons .button__Social__google{display:flex;justify-content:center;align-items:center;margin-top:35px;cursor:pointer;background-color:#FFF}.login-container .login-form__socialButtons .login-form__socialButtons__title{display:block;width:100%;text-align:center;margin:50px 0 15px}.login-container .login-form__socialButtons .GFbLoginIcon{width:30px;height:30px;margin-right:7px}.login-container .login-form__socialButtons .FBIcon{width:21px;height:21px}
  • 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:
.login-form__socialButtons{display:block;width:100%;font-size:14px;color:{{settings.primaryFontColor}};text-align:center}.login-form__socialButtons .login-form__socialButtons__buttons{display:flex;flex-direction:column}.login-form__socialButtons .login-form__socialButtons__buttons .Facebook_Login_Container{display:flex;justify-content:center;align-items:center}.login-form__socialButtons .login-form__socialButtons__buttons .Facebook_Login_Container .button__Social__facebook{display:flex;justify-content:center;align-items:center;border:1px solid #dadce0;width:248px;min-width:248px;height:38px;margin-top:20px;cursor:pointer;background-color:#FFF;color:#3c4043;margin-left:1px;border-radius:4px;font-weight:500;letter-spacing:0.3px}.login-form__socialButtons .login-form__socialButtons__buttons .Facebook_Login_Container .button__Social__facebook:hover{background-color:#f9faff;border:1px solid #dbe1ee}.login-form__socialButtons .login-form__socialButtons__buttons .button__Social__google{display:flex;justify-content:center;align-items:center;margin-top:20px;cursor:pointer;background-color:#FFF}.login-form__socialButtons .login-form__socialButtons__title{display:block;width:100%;text-align:center;margin:20px 0 0 0;font-size:20px;letter-spacing:1.2px}.login-form__socialButtons .GFbLoginIcon{width:30px;height:30px;margin-right:7px}.login-form__socialButtons .FBIcon{width:21px;height:21px}.primary-action-button .angleRight{fill:{{settings.primaryBtnFontColor}};margin-bottom:-3px;width:16px !important;height:16px !important}.primary-action-button:hover .angleRight{fill:{{settings.primaryBtnHoverFontColor}}}.primary-action-button--disabled .angleRight{fill:{{settings.primaryBtnFontColor}};margin-bottom:-3px;width:16px !important;height:16px !important}.primary-action-button--disabled:hover .angleRight{fill:{{settings.primaryBtnHoverFontColor}}}.cartContainer .validation-info__container{margin-top:6px}
  • 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
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 != '' %}
{% 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 != '' -%}
{% 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 != '' %}
                
                {% assign fbConnect = 1 -%}
            {% elseif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
                
                {% assign googleConnect = 1 -%}
            {% endif %}
        {% endfor %}
        {% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %}
            
        {% endif %}
        {% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %}
            
        {% endif %}
    {% else %}
        {% if config.External.Facebook.AppID != '' and config.External.Facebook %}
            
        {% endif %}
        {% if config.External.Google.ClientID != '' and config.External.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 != '' %}
                
                {% assign fbConnect = 1 -%}
            {% elseif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
                
                {% assign googleConnect = 1 -%}
            {% endif %}
        {% endfor %}
        {% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %}
            
        {% endif %}
        {% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %}
            
        {% endif %}
    {% else %}
        {% if config.External.Facebook.AppID != '' and config.External.Facebook %}
            
        {% endif %}
        {% if config.External.Google.ClientID != '' and config.External.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:
CreateTooltip(d.action);
lazyCheck();
location.reload();
$('html, body').animate({ scrollTop: $('#order-form').offset().top });
$(document).trigger('stepChanged', [step]);
sessionStorage.removeItem('parcelSelected');
 
  • Następnie w plikujs/google-login.js zastąp cały kod tym wskazanym poniżej :
function handleCredentialResponse(response) {
    setTimeout(function() {
      $.post(null,{ __action: 'External/GoogleLogin', __CSRF: __CSRF, id_token: response.credential },function(result){
        if (result.action.Result) {
            window.location.replace('');
        } else if (result.action.Code === 108) {
            var errMsg = document.querySelector('#google-signin').dataset.errorMsg;
            CreateTooltip({Type: 'err', Message: errMsg});
        } else {
            CreateTooltip(result.action);
        }
      });
    }, 1000);
  }
  
  window.onload = function () {
      google.accounts.id.initialize({client_id: __googleID, callback: handleCredentialResponse})
      google.accounts.id.renderButton(
        document.getElementById("google-signin"),
        { theme: "outline", size: "large", width: "325", logo_alignment: "center", text: "signin_with"}
      );
  
      $('body').on('click', '#linkGoogleAccount', function(){
        setTimeout(function() {
            $.post(null,{ __action: 'External/GoogleAccountLink',_csrf: __CSRF, userID: __googleID},function(result){
                if (result.action.Result) {
                    location.reload();
                } else {
                    CreateTooltip(result.action);
                }
            });
        }, 6000);
      });
  
      $('body').on('click', '#unlinkGoogleAccount', function(){
        $.post(null,{ __action: 'External/GoogleAccountUnlink',  __csrf: __CSRF},function(result){
            if (result.action.Result) {
                location.reload();
            } else {
                CreateTooltip(result.action);
            }
        });
      });
}

Pliki scss

  • W pliku scss/main.scss wyszukaj fragment:
.social-button {
  cursor: pointer;
  background-color: #4267b2;
  color: #fff;
  margin: 15px auto;
  padding: 15px 15px 10px;
  text-align: center;
  position: relative;
  transition: 200ms;
  display: block;
  .fa {
    font-size: 26px;
    position: relative;
    top: 5px;
    line-height: 0;
    margin-right: 5px;
  }
}

.client-panel {
  .social-button {
    &.google-button {
      background-color: #ea4335;
    }
  }
}

.register.container {
  .google-social-btn {
    margin-top: -15px;
  }
}

.google-social-btn {
  background-color: #ea4335;
  font-size: inherit;
  border: none;
  border-radius: 0;
  margin-top: 5px;
  &:hover {
    background-color: #da4639;
  }
}

.login-social-button {
  display: block;
  padding: 12px 0 13px;
  float: left;
  width: 100%;
  .fa-facebook-official {
    margin-right: 10px;
  }
}
Następnie zamień ten fragment według tego wskazanego poniżej :
.social-button {
  cursor: pointer;
  background-color: #FFF;
  color: #606060;
  margin: 15px auto;
  padding: 15px 15px 10px;
  text-align: center;
  position: relative;
  transition: 200ms;
  display: block;
  box-shadow: 0px 1px 1px 1px lightgray;
  font-weight: 700;
  .GLoginIcon{
    width: 30px;
    margin-right: 5px;
  }
  .FbLoginIcon{
    width:33px;
    margin-right: 5px;
  }
}
.social-button:hover{
  background-color: #E9E9E5;
  transition: 0,5s;
}

.register.container {
  .google-social-btn {
    margin-top: -15px;
  }
}

.login-social-button {
  font-family: system-ui;
  border: 1px solid #dadce0;
  border-radius: 4px;
  display: flex;
  justify-content: center;
  align-items: center;
  float: left;
  width: 325px;
  height: 44px;
  font-weight: 500;
  margin: 15px auto;
  color: #3c4043;
  cursor: pointer;

  .FbLoginIcon{
    width:21px;
    margin-right: 5px;
  }
}
.login-social-button:hover{
  background-color: #f9faff;
  border: 1px solid #dbe1ee;
}
 
  • W pliku scss/main2.scss zamień podany fragment:
.fb-login-section {
  background-color: #fff;
  padding: 0 25px 25px;
  display: inline-block;
  margin-top: -30px;
}
Na fragment wskazany poniżej:
.fb-login-section {
  background-color: #fff;
  display: inline-block;
  margin-top: -30px;
  padding: 0 25px 25px;
}
.fb-register-section{
  background-color: #fff;
  display: inline-block;
  margin-top: -30px;
  padding: 0 25px 0px;
}
Wskazówka
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 != '' %}
{% 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 -%}
{% 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 != '' %}
            
            {% assign fbConnect = 1 -%}
        {% elsif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
            
            {% assign googleConnect = 1 -%}
        {% endif %}
    {% endfor %}
    {% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %}
        
    {% endif %}
    {% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %}
        
    {% endif %}
{% else %}
    {% if config.External.Facebook and config.External.Facebook.AppID != '' %}
        
    {% endif %}
    {% if config.External.Google and config.External.Google.ClientID != '' %}
        
    {% 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 != '' %}
			
			{% assign fbConnect = 1 -%}
		{% elsif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
			
			{% assign googleConnect = 1 -%}
		{% endif %}
	{% endfor %}
	{% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' %}
		
	{% endif %}
	{% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' %}
		
	{% endif %}
{% else %}
	{% if config.External.Facebook and config.External.Facebook.AppID != '' %}
		
	{% endif %}
	{% if config.External.Google and config.External.Google.ClientID != '' %}
		
	{% 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 != '' %}
{% 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:
function handleCredentialResponse(response) {
    setTimeout(function() {
      $.post(null,{ __action: 'External/GoogleLogin', __CSRF: __CSRF, id_token: response.credential },function(result){
          if (result.action.Result) {
              window.location.replace('');
          } else if (result.action.Code === 108) {
              var errMsg = document.querySelector('#google-signin').dataset.errorMsg;
              createMessage(errMsg);
          } else {
              createMessage(result);
          }
      });
    }, 1000);
  }
  
  window.onload = function () {
      google.accounts.id.initialize({client_id: __googleID, callback: handleCredentialResponse})
      google.accounts.id.renderButton(
        document.getElementById("google-signin"),
        { theme: "outline", size: "large", width: "355", logo_alignment: "center", text: "signin_with"}
      );
  
      $('body').on('click', '#linkGoogleAccount', function(){
        setTimeout(function() {
            $.post(null,{ __action: 'External/GoogleAccountLink', __CSRF: __CSRF, userID: __googleID },function(result){
                if (result.action.Result) {
                    location.reload();
                } else {
                    createMessage(result);
                }
            });
        }, 1000);
      });
  
      $('body').on('click', '#unlinkGoogleAccount', function(){
        $.post(null,{ __action: 'External/GoogleAccountUnlink', __CSRF: __CSRF },function(result){
            if (result.action.Result) {
                location.reload();
            } else {
                createMessage(result);
            }
        });
      });
  
      $('body').on('click', '.logout', function () {
          googleLogout();
      });
  }
  
  function googleLogout() {
    var auth2 = gapi.auth2.getAuthInstance();
    auth2.signOut();
  }
  
  function createMessage(obj) {
      if (obj.action.Code != 100) {
          application.createMessage(obj.action);
      }
  }

Pliki scss

  • 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:
span.social-button {
	margin: 5px;
}
 
  • W pliku scss/main2.scss wyszukaj fragment:
.login-social-button,
.client-profile .social-button {
  cursor: pointer;
  background-color: #4267b2;
  color: #fff;
  padding: 15px 15px 15px 50px;
  margin: 15px auto;
  position: relative;
  transition: 200ms;
  display: block;
  max-width: 400px;
  width: 100%;
}
.client-profile .social-button {
  display: inline-block;
}
.login-social-button i,
.client-profile .social-button i {
  font-size: 32px;
  position: absolute;
  left: 13px;
  top: 9px;
}
.login-social-button:hover,
.client-profile .social-button:hover {
  background-color: #365899;
  transition: 200ms;
}

.client-profile {
  .social-button {
    margin: 15px;
    &.google-button {
      background-color: #ea4335;
    }
  }
}

.google-social-btn {
  background-color: #ea4335;
  position: relative;
  display: block;
  margin: 0 auto;
  &:hover {
    background-color: #da4639;
  }
}
Następnie zamień go na ten przedstawiony poniżej:
.login-social-button,
.client-profile .social-button {
  cursor: pointer;
  background-color: #FFF;
  color: #7f7f7f;
  padding: 15px 0px 15px 0px;
  margin: 15px auto;
  position: relative;
  transition: 200ms;
  display: flex;
  max-width: 400px;
  width: 100%;
  justify-content: center;
  align-items: center;

}
.client-profile .social-button {
  display: inline-block;
}
.login-social-button,
.client-profile .social-button{
  font-size: 14px;
  display: flex;
  justify-content: center;
  align-items: center;
  top: 9px;
  border: 1px solid #dadce0;
  .GLoginIcon{
    width: 30px;
    margin-right: 10px;
  }
  .FbLoginIcon{
    width:33px;
    margin-right: 10px;
  }
}
.fblogin-button{
  font-family: system-ui;
  width: 351px;
  height: 38px;
  padding: 0px;
  border-radius: 4px;
  font-weight: 500;
  color: #3c4043;
  top: 0;
    .FbLoginIcon{
    width:21px;
    height: 21px;
    margin-right: 10px;
  }
}
.Googlelogin-button{
  display: flex;
  justify-content: center;
  align-items: center;
}
.login-social-button:hover,
.client-profile .social-button:hover {
  background-color: #f9faff;
  border: 1px solid #dbe1ee;
}
Wskazówka
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 != '' %}
{% 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 != '' %}
            
            {% assign fbConnect = 1 -%}
        {% elseif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
            
            {% assign googleConnect = 1 -%}
        {% endif %}
    {% endfor %}
    {% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' -%}
        
    {% endif %}
    {% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' -%}
        
    {% endif %}
{% else %}
    {% if config.External.Facebook and config.External.Facebook.AppID != '' %}
        
    {% endif %}
    {% if config.External.Google and config.External.Google.ClientID != '' %}
        
    {% 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 != '' %}
            
            {% assign fbConnect = 1 -%}
        {% elseif account.Service == 'Google' and config.External.Google and config.External.Google.ClientID != '' %}
            
            {% assign googleConnect = 1 -%}
        {% endif %}
    {% endfor %}
    {% if fbConnect == 0 and config.External.Facebook and config.External.Facebook.AppID != '' -%}
        
    {% endif %}
    {% if googleConnect == 0 and config.External.Google and config.External.Google.ClientID != '' -%}
        
    {% endif %}
{% else %}
    {% if config.External.Facebook and config.External.Facebook.AppID != '' %}
        
    {% endif %}
    {% if config.External.Google and config.External.Google.ClientID != '' %}
        
    {% endif %}
{% endif %}

Pliki JavaScript

  • W pliku js/google-login.js zamień cały kod na ten wskazany poniżej:
function handleCredentialResponse(response) {
    setTimeout(function() {
      $.post(null,{ __action: 'External/GoogleLogin', __csrf: __CSRF, id_token: response.credential },function(result){
          if (result.action.Result) {
              window.location.replace('');
          } else if (result.action.Code === 108) {
              var errMsg = document.querySelector('#google-signin').dataset.errorMsg;
              CreateTooltip({Type: 'err', Message: errMsg});
          } else {
              CreateTooltip(result.action);
          }
      });
    }, 1000);
  }
  
  window.onload = function () {
      google.accounts.id.initialize({client_id: __googleID, callback: handleCredentialResponse})
      google.accounts.id.renderButton(
        document.getElementById("google-signin"),
        { theme: "outline", size: "large", width: "350", logo_alignment: "center", text: "signin_with"}
      );
  
      $('body').on('click', '#linkGoogleAccount', function(){
        setTimeout(function() {
            $.post(null,{ __action: 'External/GoogleAccountLink', __csrf: __CSRF, userID: __googleID },function(result){
                if (result.action.Result) {
                    location.reload();
                } else {
                    CreateTooltip(result.action);
                }
            });
        }, 1000);
      });
      
      $('body').on('click', '#unlinkGoogleAccount', function(){
        $.post(null,{ __action: 'External/GoogleAccountUnlink', __csrf: __CSRF },function(result){
            if (result.action.Result) {
                location.reload();
            } else {
                CreateTooltip(result.action);
            }
        });
    });
}
  • W pliku js/order.js wyszukaj fragment:
$('.order:not(.order-content)').replaceWith(d.template);
lazyCheck();
$('html, body').animate({scrollTop: $('#order-form').offset().top});
$(document).trigger('stepChanged', [step]);
Następnie zamień ten fragment na ten wskazany poniżej:
location.reload();
lazyCheck();
$('html, body').animate({ scrollTop: $('#order-form').offset().top });
$(document).trigger('stepChanged', [step]);

Pliki scss

  • W pliku scss/main2.scss wyszukaj fragment kodu:
.social-button {
  cursor: pointer;
  background-color: #4267b2;
  color: #fff;
  padding: 15px 15px 10px;
  text-align: center;
  margin: 15px auto;
  position: relative;
  transition: 200ms;
  max-width: 350px;
  display: block;
  .fa {
    font-size: 26px;
    position: relative;
    top: 4px;
    line-height: 0;
    margin-right: 5px;
  }
}

.client-panel {
  .social-button {
    &.google-button {
      background-color: #ea4335;
    }
  }
}

.google-social-btn {
  background-color: #ea4335;
  font-size: inherit;
  border: none;
  border-radius: 0;
  margin-top: 5px;
  &:hover {
    background-color: #da4639;
  }
}

.login-social-button {
  display: block;
  padding: 14px 10px 11px;
  width: 100%;
  .fa-facebook-official {
    margin-right: 10px;
  }
}
Następnie zamień ten fragment na kod wskazany poniżej:
.social-button {
  cursor: pointer;
  background-color: #FFF;
  color: #3c4043;
  padding: 15px 15px 10px;
  text-align: center;
  margin: 15px auto;
  position: relative;
  transition: 200ms;
  max-width: 350px;
  display: block;
  border: 1px solid #dadce0;
  border-radius: 4px;
  .GLoginIcon{
    width: 30px;
    margin-right: 5px;
  }
  .FbLoginIcon{
    width:33px;
    margin-right: 5px;
  }
}
.social-button:hover{
  background-color: #f9faff;
  border: 1px solid #dbe1ee;
}
.facebookLogin-button{
  font-family: system-ui;
  font-weight: 500;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 38px;
  padding: 0;
  .FbLoginIcon{
    width:21px;
    margin-right: 5px;
  }
}

.google-social-btn {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 38px;
}
Wskazówka
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.
,"grapicalVariantsPresentation":"Variants_No","variantsGroupingAttribute":"Grouping_First","grapicalVariantsPresentationColorsPL":"Błękitny||#99CCFF|||Czerwony||#FF3300|||Niebieski||#3366FF|||Brązowy||#964b00|||Czarny||#000000|||Biały||#FFFFFF|||Złoty||#ffd700|||Różowy||#ffc0cb|||Turkusowy||#76D7C4|||Pomarańczowy||#fc9303|||Zielony||#008000|||Beżowy||#c2b280|||Bordowy||#800000|||Ciemny szary||#909090|||Fioletowy||#87599d|||Granatowy||#000080|||Szary||#b4b4b4|||Zgniło zielony||#a5a542|||Żółty||#ffef00","grapicalVariantsPresentationColorsEN":"Azure||#99CCFF|||Red||#FF3300|||Blue||#3366FF|||Brown||#964b00|||Black||#000000|||White||#FFFFFF|||Gold||#ffd700|||Pink||#ffc0cb|||Turquoise||#76D7C4|||Orange||#fc9303|||Green||#008000|||Beige||#c2b280|||Burgundy||#800000|||Dark grey||#909090|||Purple||#87599d|||Navy blue||#000080|||Gray||#b4b4b4|||Rotten green||#a5a542|||Yellow||#ffef00","grapicalVariantsPresentationColorsDE":"Azurblau||#99CCFF|||Rot||#FF3300|||Blau||#3366FF|||Braun||#964b00|||Schwarz||#000000|||Weiß||#FFFFFF|||Gold||#ffd700|||Rosa||#ffc0cb|||Türkis||#76D7C4|||Orange||#fc9303|||Grün||#008000|||Beige||#c2b280|||Kastanienbraun||#800000|||Dunkelgraué||#909090|||Violett||#87599d|||Marineblau||#000080|||Grau||#b4b4b4|||Fauliges Grün||#a5a542|||Gelb||#ffef00","grapicalVariantsPresentationColorsFR":"Azur||#99CCFF|||Rouge||#FF3300|||Bleu||#3366FF|||Marron||#964b00|||Noir||#000000|||Blanc||#FFFFFF|||Or||#ffd700|||Rose||#ffc0cb|||Turquoise||#76D7C4|||Orange||#fc9303|||Vert||#008000|||Beige||#c2b280|||Bordeaux||#800000|||Gris foncé||#909090|||Violet||#87599d|||Bleu marine||#000080|||Gris||#b4b4b4|||Vert pourri||#a5a542|||Jaune||#ffef00"

Zmiany w plikach szablonu

W pliku __settings.liquid znajdź frazę:
{% when '1' -%}
Pod podaną treścią należy wkleić poniższy kod:
{% assign additionalSettings = "Dodatkowe" -%}
{% assign grapicalVariantsPresentation_Title = "Graficzna prezentacja wariantów towarów" -%}
{% assign grapicalVariantsPresentation_No = "Nie" -%}
{% assign grapicalVariantsPresentation_Colors = "Kolory" -%}
{% assign grapicalVariantsPresentation_Thumbnails = "Miniatury (tylko dla towarów zgrupowanych)" -%}
{% assign grapicalVariantsPresentationColorSettings_Title = "Dodaj własne wartości atrybutów i przypisane dla nich wartości do poniższej listy" -%}
{% assign multiVariantProducts = "Towary wielowariantowe" -%}
{% assign variantsGroupingAttributeColors_Title = "W formie graficznej prezentowany będzie atrybut" -%}
{% assign variantsGroupingAttribute_Title = "W formie graficznej prezentowany będzie atrybut grupujący" -%}
{% assign variantsGroupingAttribute_First = "Pierwszy" -%}
{% assign variantsGroupingAttribute_Last = "Ostatni" -%}
{% assign variantsGroupingAttribute_All = "Wszystkie" -%}
{% assign addColor = "Dodaj kolor" -%}
{% assign grapicalVariantsPresentationColorSettings_Color = "Kolor" -%}
{% assign grapicalVariantsPresentationColorSettings_Value = "Wartość" -%}
{% assign delete = "Usuń" -%}
Następnie wyszukaj najbliższą frazę:
{% else %}
I wklej pod nią następujący kod:
{% assign additionalSettings = "Additional" -%}
{% assign grapicalVariantsPresentation_Title = "Graphical presentation of product variants" -%}
{% assign grapicalVariantsPresentation_No = "No" -%}
{% assign grapicalVariantsPresentation_Colors = "Colors" -%}
{% assign grapicalVariantsPresentation_Thumbnails = "Miniatures (only for grouped goods)" -%}
{% assign grapicalVariantsPresentationColorSettings_Title = "Add customized attribute values and assign them to the list below" -%}
{% assign multiVariantProducts = "Multivariant products" -%}
{% assign variantsGroupingAttributeColors_Title = "The attribute will be presented graphically" -%}
{% assign variantsGroupingAttribute_Title = "Grouping attribute will be presented in graphical form" -%}
{% assign variantsGroupingAttribute_First = "First" -%}
{% assign variantsGroupingAttribute_Last = "Last" -%}
{% assign variantsGroupingAttribute_All = "All" -%}
{% assign addColor = "Add color" -%}
{% assign grapicalVariantsPresentationColorSettings_Color = "Color" -%}
{% assign grapicalVariantsPresentationColorSettings_Value = "Value" -%}
{% assign delete = "Delete" -%}
Teraz znajdź fragment kodu:
#lg-settings-content .mainHeader {
	font-size: 22px;
	margin: 45px auto 10px;
}
A następnie zmień wartości marginesów na:
margin: 10px auto;
Kolejno wyszukaj:
#lg-settings-content .themeSettings__inputs > section
Podany fragment zastąp:
#lg-settings-content .themeSettings__inputs > section, #lg-settings-content .additionalSettingsTab section
Teraz wyszukaj:
#lg-settings-content .themeSettings__inputs .section-title
I zmień kod na poniższy:
#lg-settings-content .themeSettings__inputs .section-title, #lg-settings-content .additionalSettingsTab .section-title
Kolejno odnajdź instrukcję:
#lg-settings-content .colorInput {
	position: relative;
	box-shadow: 2px 8px 10px 0 rgba(0, 0, 0, .25);
	cursor: pointer;
	width: 80px !important;
	min-width: 80px !important;
	height: 22px;
	border-radius: 5px;
	margin: 5px 0 -5px 5px;
}
A następnie zastąp ją podanym fragmentem:
#lg-settings-content .colorInput, #lg-settings-content .variantColorInput {
	position: relative;
	box-shadow: 2px 8px 10px 0 rgba(0, 0, 0, .25);
	cursor: pointer;
	width: 80px !important;
	min-width: 80px !important;
	height: 22px;
	border-radius: 5px;
	margin: 5px 0 -5px 5px;
} 

#lg-settings-content .variantColorInput {
	width: 110px !important;
	min-width: 110px !important;
}

#lg-settings-content .colors-row {
	display: flex;
	width: 290px;
	border-bottom: 1px solid #ddd;
	border-right: 1px solid #ddd;
}

#lg-settings-content .colors-row:first-child {
	border-top: 1px solid #ddd;
	border-bottom: 1px solid #ddd;
	font-weight: bold;
}

#lg-settings-content .colors-cell-title {
	display: flex;
	align-items: center;
}

#lg-settings-content .colors-cell-title p {
	padding: 0 5px;
}

#lg-settings-content .colors-cell {
	border-left: 1px solid #ddd;
	padding: 5px 0 10px;
}

#lg-settings-content .colors-cell-name {
	width: 120px;
}

#lg-settings-content .colors-cell-color {
	display: flex;
	width: 130px !important;
}

#lg-settings-content .colors-cell-delete {
	width: 40px;
	display: flex;
	justify-content: center;
	align-items: center;
}

#lg-settings-content .colors-cell-delete div {
	cursor: pointer;
	padding: 5px;
}

#lg-settings-content .add-variant-color {
	margin: 10px 0;
}
Kolejnym etapem jest zmiana wyświetlanej treści w ustawieniach Panelu Administracyjnego. Wyszukaj fragment:
{{saveChangesTranslation}}

I poniżej powyższego kodu wklej poniższe instrukcje:

 
 
Teraz odszukaj instrukcję:

A linijkę przed nią wklej:

 
 
  {{multiVariantProducts}} 

{{grapicalVariantsPresentation_Title}}

 
 
 
 
 
 
 
 
 

{{variantsGroupingAttribute_Title}}

 

{{variantsGroupingAttributeColors_Title}}

 
 
 
 
 
 
 
 
 

{{grapicalVariantsPresentationColorSettings_Title}}

{% assign colorVariantsPresentationLanguageTableText = 'PL,EN,DE,FR,UK,RU,CS,SK,BG,DA,EL,ES,FI,IT,NO,NL,PT,RO,HR,ET,BE,IS,SV,LT,LV,HU,SR,SL,MK,TR,JA,SQ,KA' -%} {% assign colorVariantsPresentationLanguageTable = colorVariantsPresentationLanguageTableText | Split: ',' -%} {{chooseColorVariantsPresentationLanguage}}: {% for language in colorVariantsPresentationLanguageTable -%} {% assign variableName = 'grapicalVariantsPresentationColors' | Append: language -%} {% if settings[variableName] -%} {% endif -%} {% endfor -%}
 
 
  {{SizeChartTitle}} 

{{SizeChartSectionOne}}

 
 
 
 
 
 
 
 
 

{{SizeChartSectionTwo}}

 
 
 
 
 
 
 
 
 
 
 

Ostatnim etapem zmian w pliku jest edycja kodu JavaScript. Znajdź fragment:
function __SaveLiquidSettings(){
        var o = {};
        $('#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') == '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;
			}
        });
        return o;
    }
A nastepnie podmień go na:
if($('#grapicalVariantsPresentation-Colors').prop('checked')){
	    $('.grapicalVariantsPresentationColorSettings').show();
		$('.grouping-attribute-thumbnails').hide();
		$('.grouping-attribute-colors').show();
    } else {
	    $('.grapicalVariantsPresentationColorSettings').hide();
    }

	if($('#grapicalVariantsPresentation-Thumbnails').prop('checked')){
		$('.grouping-attribute-thumbnails').show();
		$('.grouping-attribute-colors').hide();
    }

	if($('#grapicalVariantsPresentation-No').prop('checked')){
		$('.variantsGroupingAttributeSettings').hide();
		$('.grouping-attribute-thumbnails').hide();
		$('.grouping-attribute-colors').hide();
    } else {
	    $('.variantsGroupingAttributeSettings').show();
    }

	$('[name=grapicalVariantsPresentation]').on('change', function(){
	    if($('#grapicalVariantsPresentation-Colors').prop('checked')){
			$('.grapicalVariantsPresentationColorSettings').show();
			$('.variantsGroupingAttributeSettings').show();
			$('.grouping-attribute-thumbnails').hide();
			$('.grouping-attribute-colors').show();
		} else if($('#grapicalVariantsPresentation-Thumbnails').prop('checked')) {
			$('.variantsGroupingAttributeSettings').show();
			$('.grapicalVariantsPresentationColorSettings').hide();
			$('.grouping-attribute-thumbnails').show();
			$('.grouping-attribute-colors').hide();
		} else {
			$('.grapicalVariantsPresentationColorSettings').hide();
			$('.variantsGroupingAttributeSettings').hide();
			$('.grouping-attribute-thumbnails').hide();
			$('.grouping-attribute-colors').hide();
		}
    });

	$('#lg-settings-content .add-variant-color').on('click', function(e){
		var colorsTableClass = $(e.currentTarget).prev().prev().val();
		var colorsTable = $(e.currentTarget).parent().find('.' + colorsTableClass);
		var newColorNumber = colorsTable.find('.colors-row').length - 1;
		var colorsTableTitle = colorsTable.find('.colors-row-title');
		colorsTableTitle.after('
'+ '
'+ '
'+ '
'+ '
'+ '
'); 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($('
' + s[el].Value + '
 
').data('el', JSON.stringify(s[el])));
            }
            else {
                drop.append($('' + s[el].Value + '').data('el', JSON.stringify(s[el])));
            }  
        }
        else if (drop.data('thumbnails')) {
            var bgVariantImage
            if (s[el].Product) {
                if (s[el].Product.ImagesExt[0].ExternalUrl) {
                    bgVariantImage = "url(" + s[el].Product.ImagesExt[0].ExternalUrl + ")";
                }
                else {
                    bgVariantImage = "url(img/" + s[el].Product.ImagesExt[0].Id + "/" + s[el].Product.ImagesExt[0].Link + ")";
                }
            } else {
                var chcekImagesLoopObj = s[el].Supplies[0]
                while (!chcekImagesLoopObj.Product) {
                    chcekImagesLoopObj = chcekImagesLoopObj.Supplies[0];
                }
                if (chcekImagesLoopObj.Product.ImagesExt[0].ExternalUrl) {
                    bgVariantImage = "url(" + chcekImagesLoopObj.Product.ImagesExt[0].ExternalUrl + ")";
                } else {
                    bgVariantImage = "url(img/" + chcekImagesLoopObj.Product.ImagesExt[0].Id + "/" +  chcekImagesLoopObj.Product.ImagesExt[0].Link + ")";
                }
            }
            if ((drop.data('thumbnails-option') === 'Grouping_First' && drop.data('attribute-id') === drop.data('first-attribute-id'))
                || (drop.data('thumbnails-option') === 'Grouping_Last' && drop.data('attribute-id') === drop.data('last-attribute-id'))
                || (drop.data('thumbnails-option') === 'Grouping_All')) {
                drop.append($('
' + s[el].Value + '
 
').data('el', JSON.stringify(s[el])));
            } else {
                drop.append($('' + s[el].Value + '').data('el', JSON.stringify(s[el])));
            }
        } else {
            drop.append($('' + s[el].Value + '').data('el', JSON.stringify(s[el])));
        }
    }
Analogiczną zmianę wykonaj w sekcji:
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:
{% assign pageLanguageShort = page.Language | Upcase -%}
{% assign settingsVariableName = 'grapicalVariantsPresentationColors' | Append: pageLanguageShort -%}
{% assign grapicalVariantsPresentationColorsData = settings[settingsVariableName] -%}
{% if settings.grapicalVariantsPresentation == 'Variants_Thumbnails' -%}
    {% assign attributesThumbnails = true -%}
{% 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 -%}
  Teraz znajdź:
{% elseif product.AttributesPolyvalent != empty -%}
{% for attribute in product.AttributesPolyvalent -%}
{{ attribute.Name }}
{% assign i = 0 -%} {% for value in attribute.Values -%} {% assign i = i | Plus: 1 -%} {% endfor -%} {% if i >= 4 -%} {% assign diff = i | Minus: 4 -%}

{{translations.ReadMore}} +{{diff}}

{% endif -%}
I powyższy kod zamień na:
{% elseif product.AttributesPolyvalent != empty -%}
	{% assign loopAttributeFlag = false -%}
        {% assign attributeQuantity = product.AttributesPolyvalent | Size -%}
        {% assign loopIterationVariable = 0 -%}
        {% for attribute in product.AttributesPolyvalent -%}
{{ attribute.Name }}
{% assign i = 0 -%} {% assign loopIterationVariable = loopIterationVariable | Plus: 1 -%} {% if settings.variantsGroupingAttribute == 'Grouping_First' and loopIterationVariable == 1 -%} {% assign loopAttributeFlag = true -%} {% elseif settings.variantsGroupingAttribute == 'Grouping_Last' and loopIterationVariable == attributeQuantity -%} {% assign loopAttributeFlag = true -%} {% elseif settings.variantsGroupingAttribute == 'Grouping_All' -%} {% assign loopAttributeFlag = true -%} {% else -%} {% assign loopAttributeFlag = false -%} {% endif -%} {% if settings.grapicalVariantsPresentation == 'Variants_Colors' and grapicalVariantsPresentationColorsData and loopAttributeFlag -%} {% assign variantsColorArr = grapicalVariantsPresentationColorsData | Split: '|||' -%} {% for value in attribute.Values -%} {% assign bgColorValue = '' -%} {% assign borderColorValue = '' -%} {% for colorValue in variantsColorArr -%} {% assign colorValueArr = colorValue | Split: '||' -%} {% assign colorValueName = colorValueArr[0] | Downcase -%} {% assign colorValueHash = colorValueArr[1] -%} {% assign colorValueToCheck = value.Value | H | Downcase -%} {% if colorValueName == colorValueToCheck -%} {% assign bgColorValue = colorValueHash -%} {% endif -%} {% endfor -%} {% if bgColorValue == '' -%} {% assign bgColorValue = '#FFFFFF' -%} {% endif -%} {% if bgColorValue != '#FFFFFF' or bgColorValue != settings.primaryPageBgColor -%} {% assign borderColorValue = bgColorValue -%} {% endif -%}
 
 
{{ value.Value | H }}
 
{% assign i = i | Plus: 1 -%} {% endfor -%} {% if i >= 4 -%} {% assign diff = i | Minus: 4 -%}

{{translations.ReadMore}} +{{diff}}

{% endif -%} {% else -%} {% for value in attribute.Values -%} {% 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 -%}
{% elseif product.AttributesPolyvalent != empty -%} {% assign loopAttributeFlag = false -%} {% assign attributeQuantity = product.AttributesPolyvalent | Size -%} {% assign loopIterationVariable = 0 -%} {% for attribute in product.AttributesPolyvalent -%}
{{ attribute.Name }}
{% assign loopIterationVariable = loopIterationVariable | Plus: 1 -%} {% if settings.variantsGroupingAttribute == 'Grouping_First' and loopIterationVariable == 1 -%} {% assign loopAttributeFlag = true -%} {% elseif settings.variantsGroupingAttribute == 'Grouping_Last' and loopIterationVariable == attributeQuantity -%} {% assign loopAttributeFlag = true -%} {% elseif settings.variantsGroupingAttribute == 'Grouping_All' -%} {% assign loopAttributeFlag = true -%} {% else -%} {% assign loopAttributeFlag = false -%} {% endif -%} {% if settings.grapicalVariantsPresentation == 'Variants_Colors' and grapicalVariantsPresentationColorsData and loopAttributeFlag -%} {% assign variantsColorArr = grapicalVariantsPresentationColorsData | Split: '|||' -%} {% for value in attribute.Values -%} {% assign bgColorValue = '' -%} {% assign borderColorValue = '' -%} {% for colorValue in variantsColorArr -%} {% assign colorValueArr = colorValue | Split: '||' -%} {% assign colorValueName = colorValueArr[0] | Downcase -%} {% assign colorValueHash = colorValueArr[1] -%} {% assign colorValueToCheck = value.Value | H | Downcase -%} {% if colorValueName == colorValueToCheck -%} {% assign bgColorValue = colorValueHash -%} {% endif -%} {% endfor -%} {% if bgColorValue == '' -%} {% assign bgColorValue = '#FFFFFF' -%} {% endif -%} {% if bgColorValue != '#FFFFFF' or bgColorValue != settings.primaryPageBgColor -%} {% assign borderColorValue = bgColorValue -%} {% endif -%}
 
 
{{ value.Value | H }}
 
{% 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 -%} {% 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 -%}
{% elseif product.AttributesPolyvalent != empty -%} {% assign loopAttributeFlag = false -%} {% assign attributeQuantity = product.AttributesPolyvalent | Size -%} {% assign loopIterationVariable = 0 -%} {% for attribute in product.AttributesPolyvalent -%}
{{ attribute.Name }}
{% assign i = 0 -%} {% assign loopIterationVariable = loopIterationVariable | Plus: 1 -%} {% if settings.variantsGroupingAttribute == 'Grouping_First' and loopIterationVariable == 1 -%} {% assign loopAttributeFlag = true -%} {% elseif settings.variantsGroupingAttribute == 'Grouping_Last' and loopIterationVariable == attributeQuantity -%} {% assign loopAttributeFlag = true -%} {% elseif settings.variantsGroupingAttribute == 'Grouping_All' -%} {% assign loopAttributeFlag = true -%} {% else -%} {% assign loopAttributeFlag = false -%} {% endif -%} {% if settings.grapicalVariantsPresentation == 'Variants_Colors' and grapicalVariantsPresentationColorsData and loopAttributeFlag -%} {% assign variantsColorArr = grapicalVariantsPresentationColorsData | Split: '|||' -%} {% for value in attribute.Values -%} {% assign bgColorValue = '' -%} {% assign borderColorValue = '' -%} {% for colorValue in variantsColorArr -%} {% assign colorValueArr = colorValue | Split: '||' -%} {% assign colorValueName = colorValueArr[0] | Downcase -%} {% assign colorValueHash = colorValueArr[1] -%} {% assign colorValueToCheck = value.Value | H | Downcase -%} {% if colorValueName == colorValueToCheck -%} {% assign bgColorValue = colorValueHash -%} {% endif -%} {% endfor -%} {% if bgColorValue == '' -%} {% assign bgColorValue = '#FFFFFF' -%} {% endif -%} {% if bgColorValue != '#FFFFFF' or bgColorValue != settings.primaryPageBgColor -%} {% assign borderColorValue = bgColorValue -%} {% endif -%}
 
 
{{ value.Value | H }}
 
{% assign i = i | Plus: 1 -%} {% endfor -%} {% if i >= 4 -%} {% assign diff = i | Minus: 4 -%}

{{translations.ReadMore}} +{{diff}}

{% endif -%} {% else -%} {% for value in attribute.Values -%} {% 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:
.product-details .input-group .wrongInput{border-bottom:1px solid #ce283e !important}.product-details .input-group .wrongInput--info{font-size:11px;text-align:left;color:#ce283e;position:absolute;left:0%;margin-top:-10px}.product-details .input-group input[name="attributeEditable"]{margin:30px 0 15px;padding-bottom:10px}.product-details .input-group .attributes-select{display:inline-block}
A następnie zaraz po ostatnim znaku powyższego kodu wklej:
.product-details .input-group .button-option-variants{height:auto;font-size:13px;padding:0 8px}.product-details .input-group .button-option-variants .button-option-variants-content{display:flex;flex-direction:column;align-items:center;padding:5px 0;margin:0 auto}.product-details .input-group .button-option-variants .button-option-variants-content__color{width:50px;height:50px;border:1px solid {{settings.secondaryFontColor}};border-radius:50%;margin-bottom:5px;background-size:cover !important}.product-details .input-group .button-option-variants .button-option-variants-content__text{line-height:1em;width:70px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
Na koniec odnajdź fragment:
.product-details .dropdown .dropdown-content{display:none;position:absolute;background-color:{{settings.primaryPageBgColor}};box-shadow:0 8px 16px 0 rgba(0,0,0,0.2);z-index:1;overflow-y:auto;max-height:190px;min-width:220px;padding:10px 15px}
I zmień wartość maksymalnej wysokości:
max-height:180px;
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:
.productDetails-attributes .breakLine{display:block;width:100%;height:0;margin:0}
A następnie przed powyższym kodem dodaj:
.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-variants{height:auto;font-size:13px;padding:0 6px}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-variants .button-option-variants-content{display:flex;flex-direction:column;align-items:center;padding:10px 0}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-variants .button-option-variants-content__color{width:50px;height:50px;border:1px solid {{settings.secondaryFontColor}};border-radius:50%;margin-bottom:5px;background-size:cover !important}.productDetails-attributes .button-option:not(.dropdown):not(.units-container) .button-option-variants .button-option-variants-content__text{line-height:1em;width:65px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
Teraz odnajdź w pliku instrukcje:
.choose-attribute-popup .attribute-name,.choose-attribute-popup .attr-ed-name{color:{{settings.primaryFontColor}};width:30%;font-size:14px;font-weight:bold;line-height:1.43;letter-spacing:normal;margin-bottom:10px}.choose-attribute-popup .attribute-name::first-letter,.choose-attribute-popup .attr-ed-name::first-letter{text-transform:capitalize}
I wklej przed podanym fragmentem takie instrukcje:
.choose-attribute-popup .attributes-select .button-option-variants{height:auto;font-size:13px;padding:0 6px;width:fit-content;margin:0 auto}.choose-attribute-popup .attributes-select .button-option-variants .button-option-variants-content{display:flex;flex-direction:column;align-items:center;padding:10px 0}.choose-attribute-popup .attributes-select .button-option-variants .button-option-variants-content__color{width:50px;height:50px;border:1px solid {{settings.secondaryFontColor}};border-radius:50%;margin-bottom:5px;background-size:cover !important}.choose-attribute-popup .attributes-select .button-option-variants .button-option-variants-content__text{line-height:1em;width:65px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
Następnie wyszukaj fragment:
@media screen and (min-width: 769px){.productDetails .popup-dialog .form-container{width:35rem !important;max-width:unset !important;padding:3rem 4rem 2rem}}
Aby podmienić go na poniższe wartości:
@media screen and (min-width: 769px){.productDetails .popup-dialog .form-container{width:55rem !important;max-width:unset !important;padding:3rem 4rem 2rem}}
Kolejno zlokalizuj instrukcje:
.choose-attribute-popup .form-container{padding:20px}.choose-attribute-popup .input-group{width:100%;display:flex;flex-direction:row;align-items:center;flex-wrap:wrap}.choose-attribute-popup .attributes-select{display:grid;width:100%;grid-template-columns:33% 33% 33%;grid-row-gap:10px;max-width:unset}
I zastąp je następującymi:
.choose-attribute-popup .form-container{padding:20px}.choose-attribute-popup .close-button{right:40px}.choose-attribute-popup .input-group{width:100%;display:flex;flex-direction:row;align-items:center;flex-wrap:wrap}.choose-attribute-popup .attributes-select{display:grid;width:100%;grid-template-columns:16% 16% 16% 16% 16% 16%;column-gap:6px;grid-row-gap:10px;max-width:unset}
Ostatnim etapem zmian w pliku jest aktualizacja podanego kodu:
.choose-attribute-popup .attr-popup-button{width:calc(100%-34px);height:16px;font-size:14px;font-weight:normal;font-stretch:normal;font-style:normal;line-height:16px;letter-spacing:1.2px;text-align:center}.choose-attribute-popup .button-option[data-selected="true"]{border:2px solid {{settings.linkFontColor}} !important}.choose-attribute-popup .attr-values{display:grid;grid-template-columns:33% 33% 33%;grid-row-gap:10px;width:100%;background-color:{{settings.primaryPageBgColor}} !important}
Na poniższy fragment:
.choose-attribute-popup .attr-popup-button{width:50%;margin:0 auto;height:16px;font-size:14px;font-weight:normal;font-stretch:normal;font-style:normal;line-height:16px;letter-spacing:1.2px;text-align:center}.choose-attribute-popup .button-option[data-selected="true"]{border:2px solid {{settings.linkFontColor}} !important}.choose-attribute-popup .attr-values{display:grid;grid-template-columns:16% 16% 16% 16% 16% 16%;column-gap:6px;grid-row-gap:10px;width:100%;background-color:{{settings.primaryPageBgColor}} !important}
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:
.productDetails .popup-dialog .main-title{max-width:85%}.productDetails .popup-dialog .primary-action-button{line-height:11px}.productDetails .popup-dialog .form-container{width:95%;padding:2rem 1.5rem;overflow-y:scroll;max-height:90vh}
Teraz podmień go na poniższy kod:
.productDetails .popup-dialog .main-title{max-width:85%}.productDetails .popup-dialog .primary-action-button{line-height:11px}.productDetails .popup-dialog .form-container{width:95%;padding:2rem 1.2rem;overflow-y:scroll;overflow-x:hidden;max-height:90vh}
Na koniec odnajdź w pliku instrukcje:
@media screen and (max-width: 400px){.choose-attribute-popup .attributes-select,.choose-attribute-popup .attr-values{grid-template-columns:49% 49%}
I zastąp je następującym fragmentem:
@media screen and (max-width: 768px){.choose-attribute-popup .attributes-select,.choose-attribute-popup .attr-values{grid-template-columns:33% 33% 33%;column-gap:0}.choose-attribute-popup .button-option-variants{padding:0 4px;word-break:break-word}.close-button{right:8px !important}.attr-popup-button{width:calc(100% - 34px) !important}.button-option-variants-content{padding:8px 0}}

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 :
  1. Konfiguracja logowania w Panelu Administracyjnym
  2. Zmiany w kodzie źródłowym sklepu
  3. 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

Informacje odnośnie tego etapu implementacji znajdują się w artykule o logowaniu do sklepu za pomocą konta Google i Facebook.

2. Zmiany w kodzie źródłowym sklepu

Poniżej znajdują się fragmenty kodu, które należy dodać w celu utworzenia nowych opcji logowania.

Pliki html

  • W pliku _layout.html wyszukaj frazę crossorigin="anonymous" dokładnie pod linijką z tym elementem wklej ten kod:

  • W pliku sign-in.html wyszukaj frazę loader-js. Fraza powinna wystąpić raz. Pod tą linijką w miejscu pomiędzy tymi dwoma elementami:
    
{% endif -%} Wstaw poniższy fragment kodu:
{% if config.External.Facebook or config.External.Google  -%}
    
{% if usr.Authenticated == 'false' and config.External.Facebook and config.External.Facebook.AppID %}
{{translations.LoginWithFb}}
{% endif -%} {% if usr.Authenticated == 'false' and config.External.Google and config.External.Google.ClientID -%}
{% endif -%}
{% endif -%}
  • W pliku customer-profile/your-account/your-account.html na samym końcu w przedostatniej linijce dodaj fragment :

{{ translations.ExternalWebsites }}

{% if config.External.Facebook or config.External.Google -%}
{% 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 -%}

Pliki JavaScript

W katalogu js stwórz dwa pliki JavaScript nazwij je kolejno google-login.js oraz fb-login.js. Następnie wklej do nich poniższe kody:
  • Plik google-login.js :
function handleCredentialResponse(response) {
  setTimeout(function() {
    $.post(null,{ __action: 'External/GoogleLogin', __csrf: __CSRF, id_token: response.credential },function(result){
      if (result.action.Result) {
          window.location.replace('');
      } else if (result.action.Code === 108) {
          const popup = '
' + __translations.CantLoginWithGoogle + '
'; document.body.innerHTML += popup; setTimeout(function () { $('.unsuccessfull-post-message-js').remove(); }, 3000); } else { const popup = '
' + __translations.CantLoginWithGoogle + '
'; document.body.innerHTML += popup; setTimeout(function () { $('.unsuccessfull-post-message-js').remove(); }, 3000); } }); }, 1000); } window.onload = function () { google.accounts.id.initialize({client_id: __googleID, callback: handleCredentialResponse}) google.accounts.id.renderButton( document.getElementById("google-signin"), { theme: "outline", size: "large", width: "250", logo_alignment: "center", text: "signin_with", wight: "100"} ); $('body').on('click', '#linkGoogleAccount', function(){ setTimeout(function() { $.post(null,{ __action: 'External/GoogleAccountLink', __csrf: __CSRF, userID: __googleID },function(result){ if (result.action.Result) { location.reload(); } else { const popup = '
' + __translations.FailedConnectToGoogle + '
'; document.body.innerHTML += popup; setTimeout(function () { $('.unsuccessfull-post-message-js').remove(); }, 3000); } }); }, 1000); }); $('body').on('click', '#unlinkGoogleAccount', function(){ $.post(null,{ __action: 'External/GoogleAccountUnlink', __csrf: __CSRF },function(result){ if (result.action.Result) { location.reload(); } else { const popup = '
' + __translations.FailedDisconnectFromGoogle + '
'; 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 = '
' + __translations.FailedConnectToFb + '
'; document.body.innerHTML += popup; setTimeout(function () { $('.unsuccessfull-post-message-js').remove(); }, 3000); } }); } else { const popup = '
' + __translations.NeedToConnectToFb + '
'; document.body.innerHTML += popup; setTimeout(function () { $('.unsuccessfull-post-message-js').remove(); }, 3000); } }

Pliki scss

  • W pliku scss/globals/_globals-m.scss na samym końcu dodaj poniższy fragment kodu:
@media only screen and (max-width: 1279px){
  .connectSocialsAccount-ui{
    width: 100%; 
    .CustomerContentSection-ui{
      .CustomerSocialButton-ui{
        width: 100%;
        min-width: auto;
      }
    }
  }
}
  • W pliku scss/globals/_globals1.scss znajdź fragment :
  }
  &-button-drop-ui span{
    margin-left: 13px;
  }
Dokładnie nad tym fragmentem wstaw poniższy kod:
    .loginForm-ui{
      width:100%; 
      font-size: 16px; 
      margin-bottom: 20px;
      .login-form__socialButtons__title-ui{
        display:inline-block;
        width: 100%;
        text-align: center;
      }
      .socialLoginButtons-ui{
        display: flex;
        width: 100%;
        align-content: center;
        flex-wrap: wrap;
        flex-direction: column;
        .FbLoginForm-ui {
          display: flex;
          background: #FFFFFF;
          color: #3c4043;
          width: 250px;
          height: 40px;
          border: 1px solid #dadce0;
          border-radius: 4px;
          justify-content: center;
          align-items: center;
          margin-top: 18px;
          cursor: pointer;
          .FbLoginIcon-ui {
            background: #FFFFFF;
            display: inline-block;
            vertical-align: middle;
            width: 21px;
            height: 21px;
          }
          .FbButtonText-ui {
            display: inline-block;
            vertical-align: middle;
            padding-left: 10px;
            font-size: 14px;
            font-family: 'Roboto', sans-serif;
            font-weight: 500;
          }
        }
        .FbLoginForm-ui:hover{
          background-color: #f9faff;
          border: 1px solid #dbe1ee;
          transition: 0,5s;
        }

        .GLoginForm-ui {
          display: flex;
          justify-content: center;
          align-items: center;
          margin-top: 18px;
        }
      }
    }
  • Następnie dalej w tym samym pliku (scss/globals/_globals1.scss) na samym końcu dodaj poniższy fragment kodu:
.connectSocialsAccount-ui{
  width: 93%; 
  margin: auto;
  margin-bottom:50px;
  .CustomerContentSection-ui{
    margin-top: 50px;
    display: flex;
    flex-direction: column;
    .CustomerSocialButton-ui{
      display: inline-flex !important;
      box-shadow: 0px 1px 1px 1px lightgray;
      justify-content: center;
      align-items: center;
      width: calc(33% - 11px);
      min-width: 420px;
      height: auto;
      color: #232323;
      font-size: 14px;
      text-transform: uppercase;
      font-weight: 400;
      display: block;
      margin-bottom: 20px;
      padding: 17px;
      text-align: center;
      cursor: pointer;
      letter-spacing: 1px;
    }
    .CustomerSocialButtonGoogle-ui {
      background-color: #FFFFFF;
    }
    .CustomerSocialButtonFacebook-ui {
      background-color: #FFFFFF;
    }
    .CustomerSocialButton-ui:hover{
      box-shadow:0 0 4px #4285F4;
      transition: 1s;
    }
    .GFbLinkIcon-ui{
      margin-right: 10px;
      width: 32px;
      height: 32px;
    }
  }
}
Wskazówka
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