PodporaZnalostní báze

Práce s daty

Možnost přístupu k externím zdrojům dat a používání těchto dat v rámci šablon je jednou z nejvýkonnějších funkcí Mailkitu. Z externích zdrojů dat je možné jak načítat data do seznamů příjemců, tak do šablon a vytvářet tak personalizovaný obsah zpráv. Právě v šablonách je to místo, kde můžete naplno využít svá BI data a kde se naplno může projevit síla šablonovacího jazyka.

Firmy mají přebytek dat - takový, že vznikl zcela nový obor věnující se analýze dat. Není divu, že marketéři dychtivě touží po možnosti využít data, která mají k dispozici. Ať už se jedná o jednoduchá data, která pomohou marketérům zrychlit vytváření obsahu, nebo data o zákaznících, která pomohou řídit personalizaci. Superschopnosti Mailkitu se prokáží vždy, kdy se bude jednat o práci s daty.

Začněme naši datovou cestu tím, že vytvoříme základní integrace pomocí datových zdrojů. V tomto dokumentu se zaměříme na využití zdrojů dat XML a SQL, protože ty jsou nejčastěji využívanými typy datových zdrojů ve většině společností. XML zdroji mohou být jak jednoduché RSS kanály, tak i komplexní zdroje generované z Google Sheets. SQL zdroji jsou obvykle velké datové sady - ať už to jsou data z produktových feedů nebo z jakékoli jiné datové sady, kde použití SQL zdrojů pro přístup k datům poskytuje výhodu.

Tento dokument bude používat ukázkové zdroje dat, které vám pomohou pochopit základy práce s daty.

1) Začněte vytvořením datového zdroje s Názvem WIKINEWS, s Typem XML, s Cílem nastaveným na Šablonu a URL zdrojem: https://en.wikipedia.org/w/api.php?action=featuredfeed&feed=onthisday

069datovyzdroj.PNG

2) Dále vytvořte datový zdroj nazvaný PRODUCTS, s typem SQL, zdrojovým formátem Google Merchant Feed a URL zdrojem: https://static.mailkit.eu/templates/google-feed.xml

070datovyzdroj.PNG

3) Následně otevřete nově vytvořený zdroj dat PRODUCTS a klikněte na tlačítko Import. Po dokončení importu již budou produkty z feedu dostupné v databázi SQL. Zdroj můžete také nastavit tak, aby se automaticky aktualizoval podle časového plánu, aby se proces zautomatizoval a data byla neustále aktuální.

Jakmile nastavíte zdroje dat v menu Profil / Datové zdroje, bude potřeba dané zdroje přiřadit k šabloně. Datové zdroje lze k šabloně přiřadit jak při zakládání šablony, tak i po založení v jejích detailech. Stačí kliknout na tlačítko Upravit v bloku Informace o šabloně.

071infoosablone.PNG

Díky přiřazení datových zdrojů k šablone bude možné přistupovat k datům z těchto zdrojů přímo ze šablony

Dalším krokem je jít do šablony a začít pracovat s daty. Protože každý zdroj má jinou strukturu, jazyk šablon umožňuje vypsat data, která jsou k dispozici pro šablonu. Příprava šablony by tedy měla začít získáním výpisu struktury dat, tzv. dumpem:

<pre>[% USE Dumper; Dumper.dump(data) -%]</pre>

Ve výše uvedeném případě funkce Dumper vypíše obsah datové struktury, ale může být také použita k výpisu jakékoli jiné struktury. Nejběžnější struktury jsou shared (pro nestrukturované proměnné z API volání / deliveru feedů), data (strukturovaná data ze zdrojů dat / API volání), Event & EventItems (data události eventAPI), recipient (data příjemce) a email (obsahové proměnné).
V případě našich zdrojů dat bude výstup šablony něco jako:

$VAR1 = {
    'DS_XML_WIKINEWS' => {
        'xmlns:dc' => 'http://purl.org/dc/elements/1.1/',
        'version' => '2.0',
        'channel' => {
            'lastBuildDate' => 'Fri, 14 Jun 2019 07:38:20 GMT',
            'title' => 'Wikipedia "On this day..." feed',
            'link' => 'https://en.wikipedia.org/wiki/Main_Page',
            'language' => 'en',
            'item' => [
                {
                'guid' => {
                    'content' => 'http://en.wikipedia.org/wiki/Special:FeedItem/onthisday/20190605000000/en',
                    'isPermaLink' => 'false'
                },
                'link' => 'http://en.wikipedia.org/wiki/Special:FeedItem/onthisday/20190605000000/en',
                'dc:creator' => {},
                'title' => 'On this day: June 5',
                'pubDate' => 'Wed, 05 Jun 2019 00:00:00 GMT',
                'description' => "
    ...
    ...
}

Jak vidíte v našem příkladu, struktura nese název datového zdroje (DS_XML_WIKINEWS) a odpovídá původnímu XML souboru. Data jsou ve struktuře data.DS_XML_WIKINEWS. Pro přístup k elementu title dodržíme strukturu a pro vypsání názvu použijeme:

[% data.DS_XML_WIKINEWS.channel.title -%]

Stejným způsobem můžeme vypsat datum zveřejnění pubDate pomocí:

[% data.DS_XML_WIKINEWS.channel.pubDate -%]

Nebo ještě lépe použijeme funkce data a času pro formátování výstupu dle potřeby:

[% date.format(data.DS_XML_WIKINEWS.channel.pubDate) -%]

Zajímavější část XML spočívá v seznamu článků ve struktuře data.DS_XML_WIKINEWS.channel.item. Pokud bychom použili jednoduchý přístup k datům pro výpis dat (jak jsme to udělali pro title či pubDate):

[% data.DS_XML_WIKINEWS.channel.item -%]

Výstup by vypadal podobně jako "ARRAY (0x56032b920168)", protože se jedná o strukturované pole, které musí být zpracováváno po jednotlivých položkách. To se provádí iterací přes pole položek:

[% FOREACH data.DS_XML_WIKINEWS.channel.item -%]
[% END -%]

Tímto způsobem iterujeme obsah pole a můžeme vypsat data ve struktuře podle jejich názvu:

[% FOREACH data.DS_XML_WIKINEWS.channel.item -%]
    <div><a href="[% link -%]">[% title -%]</a></div>
[% END -%]

Nyní, když mámě jednoduchý výstup je čas se podívat, jak jej můžeme optimalizovat. Můžeme například chtít vidět pouze 5 záznamů z pole, zvýraznit sudé a liché záznamy atd. Toho lze jednoduše dosáhnout smyčkami pomocí loop.count a loop.parity směrnic.

Použití SQL zdrojů dat

Stejná iterace platí pro všechna data polí a jejich zpracování v rámci šablon bez ohledu na zdroj. Další zdroj, který jsme přidali, je zdroj dat typu SQL, který je třeba nejprve inicializovat. To se provádí vytvořením SQL připojení ke zdroji dat podle jeho názvu:

[% USE dbh_sql = DBI (dbh = shared.DBI_DS_SQL_PRODUCTS) -%]

Nyní, když je navázáno spojení, lze příkazy SQL použít k načítání dat z SQL tabulek zdrojů dat. Protože všechny tabulky zákazníka sídlí ve stejné databázi, není nutné vytvářet samostatné připojení pro každý SQL zdroj dat. Aby bylo možné spouštět SQL příkazy, musíme být schopni identifikovat základní název tabulky. Schéma pojmenování je ds_ID_název, kde ds_ je předpona, ID je ID číslo zdroje dat a název představuje uzavřenou větev s položkami. V případě produktových feedů např. Google, Heureka, atd., je vždy název „products“. V našem případě je zdrojem dat zdroj Google Merchant a má ID 1234, což má za následek název databázové tabulky ds_1234_products. Můžeme se tedy snadno dotazovat databázi pomocí SQL příkazu:

[% query_items = dbh_sql.prepare('SELECT * FROM ds_3223_products ORDER BY RAND() LIMIT 5') %]

and provést dotaz načítání dat do pole items:

[ % items = query_items.execute () -%]

Nyní si můžeme snadno nechat zobrazit záznamy pomocí dumperu:

[% FOREACH items -%]
<pre>[% USE Dumper; Dumper.dump(items) -%]</pre>
[% END -%]

Výpis nám poskytne informace o názvech sloupců:

'ITEM' => {
	'custom_label_2' => 'pneu',
	'price' => '10982 CZK',
	'custom_label_1' => '38',
	'brand' => 'Pirelli',
	'custom_label_0' => 'osobni-zimni',
	'image_link' => 'https://www.mojepneu.cz/pics/pneu/pirelli_sottozero270.jpg',
	'link' => 'https://www.mojepneu.cz/pirelli-winter-270-sottozero-serie-ii-245-35-r20-95w-xl',
	'gtin' => undef,
	'condition' => 'new',
	'shipping' => undef,
	'id' => '283136',
	'availability' => 'in stock',
	'description' => "Pirelli WINTER 270 SOTTOZERO SERIE II - Pneumatika Sottozero Serie II, kter\x{e1} vych\x{e1}z\x{ed} p\x{159}\x{ed}mo z pneumatiky Sottozero W270 (uvedena v roce 2007) a ze \x{161}pi\x{10d}kov\x{fd}ch znalost\x{ed} segmentu U.H.P., byla vyvinuta jako \x{201e}modern\x{ed} zimn\x{ed} pneumatika\x{201c}, kter\x{e1} by splnila po\x{17e}adavky koncov\x{fd}ch u\x{17e}ivatel\x{16f} na v\x{fd}konnost a bezpe\x{10d}nost, p\x{159}i\x{10d}em\x{17e} do\x{161}lo k p\x{159}ijet\x{ed} ur\x{10d}it\x{fd}ch technick\x{fd}ch diferenciac\x{ed} mezi velikostmi W a H/V, a pneumatika tak v\x{17e}dy nab\x{ed}z\x{ed} to, co \x{159}idi\x{10d}i \x{17e}\x{e1}daj\x{ed}. Pirelli WINTER 270 SOTTOZERO SERIE II",
	'title' => "Pirelli WINTER 270 SOTTOZERO SERIE II 245/35 R20 95W  XL - zimn\x{ed} pneumatiky",
	'identifier_exists' => 'FALSE'
},

a stejně tak některé doplňující podrobnosti o iteraci, jako je další položka, velikost datové sady, atd. Tento příklad vybere 5 náhodných položek, ale příkaz select může být podle potřeby výrazně komplexnější:

[% query_items = dbh_sql.prepare('SELECT * FROM ds_3223_products WHERE `availability`="in stock" AND `condition`="new" ORDER BY RAND(id) LIMIT 5') %]

Dalším krokem by bylo zkombinovat tento dotaz s daty příjemců pro vytvoření vlastního výstupu. Nejprve musíme zajistit, že údaje o příjemci jsou vždy dostupné, nebo je zde alternativní obsah. V této ukázce přiřazujeme proměnné brand hodnotu z vlastního pole příjemce č. 2 (CUSTOM2), nebo v případě, že příjemce tuto hodnotu má prázdnou, vrátíme všechny záznamy.

[% IF recipient.CUSTOM2 ! = '' -%]
	[% brand = recipient.CUSTOM2 -%]
[% ELSE -%]
	[% brand = '%' -%]
[% END -%]

Dále aktualizujeme náš SQL dotaz:

[% query_items = dbh_sql.prepare('SELECT * FROM ds_3223_products WHERE `availability`="in stock" AND `brand` LIKE ? ORDER BY RAND(id) LIMIT 5') %]

a příkaz doplníme o proměnnou brand:

[% items = query_items.execute(brand) -%]

Výsledkem bude nyní pouze 5 náhodných produktů konkrétní značky uvedené v seznamu pole příjemce CUSTOM2 nebo 5 náhodných produktů, pokud příjemce žádnou hodnotu v CUSTOM2 nastavenou nemá.
Mějte na paměti, že se jedná pouze o jednoduchý příklad a správná šablona by měla obsahovat další alternativní zpracování. Je třeba zvážit, nejen aby neselhal výběr dat z databáze v důsledku chybějících hodnot, ale také jak nechávat zpracovat prázdné sady výsledků a jak zajistit, že pro takové případy bude vždy existovat záložní obsah.
Ošetření prázdných výsledků může být velmi snadné:

[% items=query_items.execute(brand) -%]
[% IF items.size == 0 -%]
	[% items=query_items.execute('%') -%]
[% END -%]

Nejprve dojde ke spuštění SQL dotazu s parametrem brand odpovídajícím hodnotě uživatele. Následně dojde k vyhodnocení velikosti výsledku dotazu. Pokud má výsledek dotazu nulovou velikost dojde k opakovanému spuštění dotazu, tentokráte na všechny záznamy bez omezení značky. Mohl by zde však být i zcela odlišný dotaz pro získání zcela jiné sady dat.

Vždy mějte na paměti, že dotazy MUSÍ být efektivní. Dotazy se budou vykonávat opakovaně pro každého příjemce vaší zprávy, a tak v případě špatně koncipovaných dotazů může dojít k výraznému zpomalení rozesílání zpráv. Vždy používejte pro vaše podmínky WHERE a GROUP v dotazech pouze indexovaná pole. Rozsah indexovaných polí se liší podle typu použitého zdroje. U předdefinovaných produktových feedů jsou indexována pole ID a název produktu, kategorie, dostupnost a značka v závislosti na dostupnosti těchto polí ve feedu. U vlastního formátu je možné vybrat primární klíč a indexovaná pole při nastavování datového zdroje.

V případě dotazů či nejasností týkajících se použití dat v šablonách se neváhejte obrátit na naši zákaznickou podporu.