XML Feeds
Feature XML feedů v EdeeShop slouží k poskytování informací o entitách ve formátu XML. Tyto feedy mají několik účelů a využití. V aktuální implementaci podporujeme feedy pro:
- Produkty
- Skladovost
- Hodnocenní produktů
Ke zpracování feedů dochází asynchroně pomocí job modulu. Každý typ feedu pro každý konfigurovaný katalog, kromě katalogu produktových předloh, obsahuje dva joby jeden job pro generování snippetů a druhý job pro finalní generaci feedu.
Konfigurace feedů je popsána zde.
Generování Snippetů
K generování snippetů dochází inkrementálně ve výchozí implementaci jednou denně pro produkty a jednou za deset minut pro skladovost.
Pro všechny produkty, které v Evitě mají větší čas publikace než poslední běh jobu generování feedů, dochází k vygenerování nové verze snippetu. Snippet je uložen v additional datech produktu, kde každé dato představuje jeden feed.
Zkrácený příklad snippetu pro Google může vypadat takto:
<entry> <g:id>123</g:id> <g:title>Červená šála</g:title> <g:image_link>http://localhost/img/eshop/placeholder/eshop-product-detail.jpg</g:image_link> <g:condition>new</g:condition> <g:availability>out of stock</g:availability> <g:sale_price>399 CZK</g:sale_price></entry>Připravený snippet je následně použit k vygenerování kompletního feedu produktů, kde výhodou snippetu je, že nezměněné produkty nejsou stále dokola generovány, což významně šetří čas.
Implementace jobu je k naleznutí zde.
Generování Feedů
Asynchronní úloha pro každý konfigurovaný feed zpracuje všechny publikované produkty v Evitě, které obsahují data pro konkrétní feed, a dochází k vytvoření nové verze feedu. Vytvořený feed je následně uložen do úložiště aplikace a je možné ho z úložiště kdykoliv načíst.
Implementace jobu je k naleznutí zde
Šablony
V základní implementaci modulu existují výchozí implementace pro:
- heureka
- zbozi
- glami
Každý feeed obsahuje dvě šablony:
- šablonu pro snippet konkrétního feedu
- šablonu pro feed
Šablony jsou k naleznutí zde
Tyto šablony je možné na projektu přetížit, či vytvořit další pro feedy, které nejsou podporované v základu.
Tvorba vlastní šablony
Šablony jsou vytvořeny pomocí šablonovacího jazyka freemarker stejně jako například šablony mailu.
Dostupné proměnné v šabloně jsou:
- item => ProductSnippetContext
- product => PublishedProductContract
- catalog => Catalog
- catalogRegion => CatalogRegion
- productFeedConfig => EdeeShopProductFeedConfig
- feedConfig => FeedConfiguration
- cartContext => CartContext
Pokud by byly potřeba nějaká další proměnné na projektu je možné přetižít metodu: ProductFeedSnippetBuilder.createInputs
Přeskočení položky
Položky lze přeskočit dvěma způsoby. Prvním způsobem je, pokud šablona feedů nevrátí žádná data. Celou šablonu je možné obalit klauzulí if.
Druhým způsobem je přeskočení vyhodnocení položky pomocí metody: AbstractFeedSnippetBuilder.shouldSkipItem, kde ve výchozí implementaci je vyhodnocen SpEL. Výraz lze načíst pomocí konfigurace: FeedConfiguration.getShouldSkipItem
Výpočetní metody
Některá logika jako výpočet externích kategorií pro konkrétní feed, konverze hodnot, formátování výstupu a jiné by se opakovali napříč šablonami
nebo by logika byla komplikovaná vytvořit ve FreeMarkeru. Z tohoto důvodu vznikla sada připravených metod pro podporu generování snippetů, které jsou možné projektově upravit či vytvořit další.
Vytvořené metody ze základu implementují interface FeedMethod. Existujicí metody jsou:
- feed.getConvertedValue(originalValue, converterKey, feedConfiguration)
- Metoda konvertuje původní hodnotu do požadované pomocí konvertéru definovaného klíčem
converterKey, který je registrován vefeedProfiluaktualního feedu
- Metoda konvertuje původní hodnotu do požadované pomocí konvertéru definovaného klíčem
- feed.getCashOnDeliveryPrice(context, shippingMethod)
- Metoda vypočítá cenu dobírky pro konkrétní dopravu
- feed.getProductNameWithVariantParameters(product)
- Metoda vytvoří název produktu s variantními parametry.
- feed.formatPrice(price, scale?, roundingMode?)
- Metoda formátuje cenu do požadovaného formátu, default: scale 2, roundinhType: HALF_UP
- feed.getImgUrl(context, feedConfiguration)
- Metoda načítá hlavní obrázek produktu v konkrétní galerii pro konkrétní variantu obrázku. (Galerie a varianta je načitána z feedConfiguration)
- feed.getImgAlternativeUrl(context, feedConfiguration)
- Metoda vytvoří seznam url alternativních obrázku pro produkt dle konfigurace feedu
- feed.getProductCategoryNames(context, feedConfiguration, allowEshopCategoryNames?, separator?)
- Metoda vytvoří řetězec externích kategorií pro produkt spojený separátorem.
- Pokud nenajdeme externí kategorie a allowEshopCategoryNames parametr je true, jsou vráceny původní EdeeShop kategorie
- feed.getProductEshopCategoryNames(context, feedConfiguration, firstOnly?, seprator?)
- Metoda vytvoří řetězec EdeeShop kategorií spojený separátorem.
- Pokud parametr firstOnly je true, vracíme pouze první kategorii
- feed.getProductUrl(context)
- Metoda vytvoří absolutní URL detailu produktu, pokud relativní url je k produktu přiřazena
- feed.getWithoutHTML(product.description)
- Metoda pro vstupní řetězec data, parsuje HTML tagy z řetězce a escapuje Xml111 znaky.
- feed.getFeedSnippet(feedConfiguration, product)
- Metoda načte připravený snippet z additional dat produktu pro zpracování v šabloně
- feed.getProductRatings(context)
- Metoda načte všechny detaily hodnocenní pro produkty
- feed.getRatingDetailPros(rating)
- Metoda rozparsuje všechny pozitivní komentáře pomocí \r\n
- feed.getRatingDetailCons(rating)
- Metoda rozparsuje všechny negativní komentáře pomocí \r\n
- feed.getUserByExternalId(externalId)
- Metoda načte objekt uživatele pomocí externalId (ve většině případů externalId = login)
Tvorba vlastní metody
Pro vytvoření vlastní metody, stačí vytvořit třídu, která
import com.fg.form.web.render.freemarker.func.AbstractTemplateMethodModel;import com.fg.cps.eshop.edee.export.feed.methods.FeedMethod;
public class CustomProjectMethod extends AbstractTemplateMethodModel implements FeedMethod { @Override public Object exec(List arguments) throws TemplateModelException { //Implementation final Object objectExample = getArgument(arguments, 0, Object.class); return objectExample.toString(); }}Pokud by metoda obsahovala cache, kterou je potřeba po zpracování snippetů ručně smazat. Je možné implementovat rozhraní com.fg.cps.eshop.edee.export.feed.methods.FeedMethodWithCache
Feed profily
FeedProfil slouží k možností načtení společných částí konfigurace mezi instancemi feedů. Příkladem může být, například to že jeden zákazník má víc implementací heureka feedů. Typově:
- standardní heuréka
- heuréka s upraveným datem dodání
- heuréka s parametry
- heuréka s parametry s custom jmény
Externí kategorie
Google používá vlastní strom kategorií, který je periodicky automaticky aktualizován. Každé kategorii lze nastavit v administraci právě jedna google kategorie.
Strom kategorií je automaticky aktualizován na základě property googleCategoriesImportInterval.
V konfiguraci google. Specifikace formátu je k dispozici zde.
Heureka
Heuréka používá vlastní strom kategorií, který je periodicky automaticky aktualizován. Každé kategorii lze nastavit v administraci právě jednu heureka kategorii.
Strom kategorií je automaticky aktualizován na základě parametru importInterval konfigurační hodnoty externalCategory daného zdroje. Specifikace formátu je k dispozici zde.
V konfiguraci <externalCategorySource>heureka</externalCategorySource>.
Zboží.cz
Zboží.cz používá vlastní strom kategorií, který je periodicky automaticky aktualizován. Každé kategorii lze nastavit v administraci právě jednu kategorii zboží.cz.
Strom kategorií je automaticky aktualizován na základě property zboziCategoriesImportInterval.
V konfiguraci exportFormat="zbozi". Specifikace formátu je k dispozici zde.
V konfiguraci <externalCategorySource>zbozi</externalCategorySource>.
Pro export produktů na Facebook se používá strom kategorií googlu.
V konfiguraci <externalCategorySource>google</externalCategorySource>.
Skrz.cz
Pro export produktů na Skrz.cz se používá strom kategorií heureky.
V konfiguraci <externalCategorySource>heureka</externalCategorySource>.
