Inne ==== Instalacja - search ^^^^^^^^^^^^^^^^^^^ Uwaga: do instalacji tego mechanizmu wymagana jest znajomość podstaw języka *JavaScript* i zapytań *HTTP*. #. Jeżeli nie posiadasz konta ``_ to utwórz je, klikając *Sign Up* i następnie podając nazwę użytkownika, swój adres email oraz hasło #. Zaloguj się na swoje konto w ``_ #. Odnajdź *Link your shop* w *Integration status* z rozwijanej listy wybierz *Other (generic)* #. Podaj url, z którego można pobrać plik XML opisujący produkty w twoim sklepie, obecnie żaden mechanizm autoryzacji nie jest wspieranie to jest plik musi być ogólnie dostępny #. Wciśnij *Save*. Zostanie przydzielony identyfikator (ShopNavigator's identifier), zapisz go #. Jeżeli podany plik jest w jednym ze wspieranych standartów informacje o produktach zostaną pobrane. Czas na to potrzebny zależy od liczby produktów i może to być kilka minut #. Odczekaj kilka minut, wyślij zapytanie ``JSON`` ``POST`` na adres ``https://app.shopnavigator.net/v1/search/IDENTYFIKATOR`` o treści ``{}`` gdzie ``IDENTYFIKATOR`` to identyfikator, który został wcześniej przydzielony #. Sprawdź ``results`` w treści odpowiedzi, jeżeli jest to ``[]`` to plik XML nie jest w jednym ze wspieranych standardów lub dane nie zostały jeszcze przetworzone, jeżeli pojawiły się tam dane o produktach z twojego sklepu możesz kontynuować #. Zapytania wysyłane do ``https://app.shopnavigator.net/v1/search/IDENTYFIKATOR`` powinny być ``JSON`` ``POST`` i zawierać szukaną frazę pod ``q`` przykładowo ``{"q":"bluza"}`` #. W odpowiedzi na zapytanie ShopNavigator przysyła ``JSON`` z danymi pasujących kategorii (``categories``) i produktów (``results``), ich przetwarzanie i dalsze wykorzystanie odbywa się po stronie sklepu Przykładowa odpowiedź na ``{"q":"Shirt"}`` dla sklepu który korzysta z identyfikatora ``0B3A02D7`` .. code-block:: JSON {"categories":[{"category_name":" Clothing > Dresses ","category_url":null}],"metadata":"metadata","results":[{"category_id":"Apparel & Accessories > Clothing > Dresses","category_name":" Clothing > Dresses ","category_path":null,"description":"Solid red, queen-sized bed sheets made from 100% woven polyester 300 thread count fabric. Set includes one fitted sheet, one flat sheet, and two standard pillowcases. Machine washable; extra deep fitted pockets.","description_short":null,"group":" Clothing > Dresses ","id":9244,"imgurl":"http://www.example.com/image1.jpg","name":"Mens Pique Polo Shirt","pid":"tddy123uk","price":1900,"price_sale":1500,"shop_hash":"0B3A02D7","shop_id":8,"url":"http://www.example.com/asp/sp.asp?cat=12&id=1030","url_category":null,"url_img":"http://www.example.com/image1.jpg"}]} Dostępność danych zależy od wykorzystywanego standartu w pliku XML, brak informacji oznaczany jest poprzez ``null``. Przykładowa implementacja wykorzystująca ``_ oraz ``_, ``test`` to specjalny identyfikator, którego użycie powoduje szukanie wśród trzech stałych produktów: ``Mysz``, ``Komputer``, ``Monitor`` Zależności .. code-block:: HTML Panel search .. code-block:: HTML
Skrypt .. code-block:: JavaScript $(document).ready(function () { var search_mode = document.getElementById("shopnavigator_search_widget").dataset.searchMode; var search_url = document.getElementById("shopnavigator_search_widget").dataset.searchUrl; const settings = {"searchurl": search_url, "cooldown": 300}; function getSuggestionsSimple(text, update){ let xhr = new XMLHttpRequest(); xhr.open("POST", settings["searchurl"], true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { var searchanswer = JSON.parse(xhr.responseText); update(searchanswer["results"]); }; }; var data = JSON.stringify({"q":text}); xhr.send(data); } function getSuggestionsExtended(text){ if(!text){ removeSearchPanel(); return; } let xhr = new XMLHttpRequest(); xhr.open("POST", settings["searchurl"], true); xhr.setRequestHeader("Content-Type", "application/json"); xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { var searchanswer = JSON.parse(xhr.responseText); showSuggestions(searchanswer, text); }; }; var data = JSON.stringify({"q":text}); xhr.send(data); } function charsAllowed(value){ return /^[a-zA-Z\s]+$/.test(value); } function removeSearchPanel(){ if(!(document.getElementById("shopnavigator_search_widget_panel")===null)){ document.getElementById("shopnavigator_search_widget_panel").remove(); } } function showSuggestions(items, value){ var prods_header = document.createElement("div"); prods_header.innerText = "Products"; var prods_div = document.createElement("div"); prods_div.appendChild(prods_header); for(item of items["results"]){ var itemElement = document.createElement("a"); itemElement.innerHTML = "\"""; if (charsAllowed(value)) { var regex = new RegExp(value, 'gi'); var inner = item.name.replace(regex, function(match) { return "" + match + "" }); itemElement.innerHTML += inner; } else { itemElement.textContent += item.name; } itemElement.href = item.url; itemElement.className = "shopnavprod"; prods_div.appendChild(itemElement); } prods_div.className = "shopnavprod"; var cats_div = document.createElement("div"); for(cat of items["categories"]){ var catElement = document.createElement("a"); catElement.innerHTML = "" + cat.category_name + ""; catElement.href = cat.category_url; catElement.className = "shopnavcat"; cats_div.appendChild(catElement); } removeSearchPanel(); var holder = document.createElement("div"); holder.appendChild(cats_div); holder.appendChild(prods_div); holder.id = "shopnavigator_search_widget_panel"; holder.className = "shopnavpanel"; document.getElementById("shopnavigator_search_widget_suggestions").appendChild(holder); } var searchInput = document.getElementById("shopnavigator_search_widget_textinput"); if(search_mode == "simple"){ autocomplete({ input: searchInput, onSelect: function(item){ /*searchInput.value = item.name;*/ window.location.href = item.url; }, fetch: getSuggestionsSimple, render: function(item, value) { var itemElement = document.createElement("div"); itemElement.innerHTML = "\"""; if (charsAllowed(value)) { var regex = new RegExp(value, 'gi'); var inner = item.name.replace(regex, function(match) { return "" + match + "" }); itemElement.innerHTML += inner; } else { itemElement.textContent += item.name; } return itemElement; }, renderGroup: function(groupName, currentValue) { var div = document.createElement("div"); div.textContent = groupName; return div; }, emptyMsg: "nothing found", debounceWaitMs: settings["cooldown"] }) }else if(search_mode == "extended"){ document.addEventListener("click", function(evt) { var shopnavigatorSearchPanel = document.getElementById("shopnavigator_search_widget_panel"); if(!shopnavigatorSearchPanel){ return; } var targetElement = evt.target; do { if (targetElement == shopnavigatorSearchPanel) { return; } targetElement = targetElement.parentNode; } while (targetElement); shopnavigatorSearchPanel.remove(); }); const debounce = (func, delay) => { /* used for preventing spamming API with calls for each change */ let inDebounce return function() { const context = this const args = arguments clearTimeout(inDebounce) inDebounce = setTimeout(() => func.apply(context, args), delay) } } searchInput.oninput = debounce(function(){getSuggestionsExtended(this.value)}, settings["cooldown"]); }else{ console.log(search_mode+" is not supported search_mode"); } }); Instalacja - recommendations ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Przykład: umieszczanie widżetu z 3 kolumnami i 2 wierszami dla produktu z id 3505 #. Jeżeli nie posiadasz konta ``_ to utwórz je, klikając *Sign Up* i następnie podając nazwę użytkownika, swój adres email oraz hasło #. Zaloguj się na swoje konto w ``_ #. W swojej stronie umieść ``
`` #. Bezpośrednio po zamknięciu tagu ``body`` umieść ``