Přidání produktů do newsletteru
Následující dokument popisuje, jak přidat produkty do newsletterů.
Mail module modifikace
Nejprve je nutné upravit konfiguraci mail modulu.
- Přidat poskytovatele dat a freemarker-makra do šablony v mail modulu.
<mailmodule> ... <superTemplate> <messageTemplate extends="default"> ... <features> <freemarkerProcessing> <dataProviders> <dataProvider name="publishedProductMailProvider" bean="publishedProductMailProvider"/> </dataProviders> </freemarkerProcessing> </features> </messageTemplate> <dataProviders> <dataProvider name="publishedProductMailProvider" bean="publishedProductMailProvider"/> </dataProviders> <imports> <import>classpath:/META-INF/lib_eshop_edee/mail/mail-edeeshop-product-macros.ftl</import> </imports> </superTemplate> ...</mailmodule>- Přidat edee volbu na produkt, změňte TARGET_CATALOG na catalog na projektu, productKey je název proměnné, která poté bude přístupná ve ftl.
<gui admin="true"> <modifications> <modify target="defaultCampaignEditor"> <appendWidget widget="emailDetails"> <eshopProductTagsContainer id="eshopProductContainer"> <metadata> <catalog>TARGET_CATALOG</catalog> <productKey>someKey</productKey> </metadata> </eshopProductTagsContainer> </appendWidget> </modify> </modifications></gui>Přidání více selectů s různými katalogy se dá jednoduše změněním produktKey - pro odlišení proměnných ve ftl.
<appendWidget widget="emailDetails"> <eshopProductTagsContainer id="eshopProductContainer"> <metadata> <catalog>TARGET_CATALOG</catalog> <productKey>someKey1</productKey> </metadata> </eshopProductTagsContainer> <eshopProductTagsContainer id="eshopProductCatalog2Container"> <metadata> <catalog>TARGET_CATALOG2</catalog> <productKey>someKey2</productKey> </metadata> </eshopProductTagsContainer></appendWidget>- Nakonec přidání titulků do module-mail/i18n (toto se odvíjí od id, která nastavíte widgetům). Např:
eshopProductContainer.eshopProducts.title=E-shop produktyeshopProductContainer.eshopProducts.allAvailableItems=Aktivní produkty v katalogueshopProductContainer.eshopProducts.allAvailableTags=Vybrat produktyFreemarker
V newsletter.ftl budou dostupné dvě proměnné (nastavené dle 2.) tedy př. someKey a someKey_catalog, který se předá do připraveného makra.
<#if someKey?has_content> <#assign productIds=someKey/> <@printProducts productCodes=productIds?split(",") catalogCode=someKey_catalog title="Novinky z eshopu"/></#if>Ceny podle regionu
Makro printProducts má volitelný parametr region - region katalogu jako CatalogRegion.Key nebo jeho identifikátor
(např. czcsCZK, stejný formát jako REST parametr catalogRegion). Produkty se pak načtou v měně, jazyce a se základním
a referenčním ceníkem daného regionu (viz konfigurace basicPriceList / referencePriceList regionu). Bez parametru
se použije výchozí region katalogu (měna a jazyk katalogu) - chování je stejné jako dříve.
<@printProducts productCodes=productIds?split(",") catalogCode=someKey_catalog title="Novinky z eshopu" region="skenEUR"/>Odpovídající metody poskytovatele dat publishedProductMailProvider:
getProductsIndexedByCode(catalogCode, productCodes)- výchozí region katalogu,getProductsIndexedByCode(catalogCode, productCodes, region)-regionjeCatalogRegion.Keynebo jeho identifikátor.
Rozhraní PublishedCatalogEntityMailProvider (projektové implementace) má nové default metody
getProductsIndexedByCode(catalog, productCodes, region) a getProductsIndexedByCode(catalog, productCodes, atTheMoment, region).
Výchozí implementace region ignorují a volají původní metody bez regionu - ceny podle regionu vrátí jen implementace,
které tyto metody přetíží.
Výběr publikovaných produktů v administraci
Datasource PublishedProductDataProvider (stránka publishedProductSelectionPage) přijímá kromě catalogCode,
currency a priceLists i parametr catalogRegion (identifikátor regionu, např. czcsCZK). Podle něj určí měnu
a základní ceníky, pokud nejsou zadány explicitně. Bez parametru se použije výchozí region katalogu.
Extra
V mail-edeeshop-product-macros.ftl je výčet nejčastěji používaných atributů.
Toto makro je možné na projektech přetížit a ostylovat dle svého, proměnné jsou již předané z newsletter.ftl a ostatní dle příkladu.
<#macro printProducts productCodes catalogCode title="" region=""> <#if region?has_content> <#assign publishedProducts=publishedProductMailProvider.getProductsIndexedByCode(catalogCode, productCodes, region)/> <#else> <#assign publishedProducts=publishedProductMailProvider.getProductsIndexedByCode(catalogCode, productCodes)/> </#if>
<#if publishedProducts?size > 0> <table cellpadding="0" cellspacing="0" border="0" bgcolor="${texts.get('mail.config.emailBackgroundColor')}" style="margin-bottom: ${texts.get('mail.config.emailPaddingLarge')};" width="100%" align="center"> <#if title!=""> <tr> <td style="padding-bottom: ${texts.get('mail.config.emailPaddingMedium')};"> <h2 style="font-size: ${texts.get('mail.config.emailTextLineHeight')};font-weight: ${texts.get('mail.config.emailBoldWeight')}; margin: 0!important;">${title}</h2> </td> </tr> </#if> <#list publishedProducts?values as product> <@printOneProduct product=product productIndex=product_index productHasNext=product?has_next/> </#list> </table> </#if></#macro>
<#macro printOneProduct product productIndex productHasNext> <#if (productIndex % 2) == 0> <tr> </#if> <td valign="top" width="50%"> <table cellpadding="0" cellspacing="0" border="0" align="center"> <tr> <td style="padding-bottom: ${texts.get('mail.config.emailPaddingMedium')}" align="center"> <#assign mainMotive=product.mainMotive!/> <#assign mainMotiveUrl="/img/eshop/placeholder/eshop-mail-product-tiles.jpg"/> <#if mainMotive??><#assign mainMotiveUrl=(mainMotive.getUrl("eshop-mail-product-tiles"))!"/img/eshop/placeholder/eshop-mail-product-tiles.jpg"/></#if> <img src="${product.getAbsoluteUrlFromRelative(mainMotiveUrl)}" alt="${product.name!}" width="250" height="250" style="display: block;" border="0" /> </td> <tr> <td style="padding-bottom: ${texts.get('mail.config.emailPaddingMedium')}" align="center"> <h3 style="font-size: ${texts.get('mail.config.emailTextFontSizeLarge')}; font-weight: ${texts.get('mail.config.emailBoldWeight')}; margin: 0!important;">${product.name!}</h3> </td> </tr> <#if product.descriptionShort??> <tr> <td style="padding-bottom: ${texts.get('mail.config.emailPaddingMedium')}" align="center"> ${product.descriptionShort!} </td> </tr> </#if> <#if product.sellingPrice?has_content> <tr> <td style="padding-bottom: ${texts.get('mail.config.emailPaddingMedium')}" align="center"> <h3 style="font-size: ${texts.get('mail.config.emailTextFontSize')}; margin: 0!important; font-weight: ${texts.get('mail.config.emailBoldWeight')};">${texts.convertToText(eshop.formatPrice(product.sellingPrice.priceWithTax(), product.sellingPrice.currency(), "price.zeroPriceString"))}</h3> </td> </tr> </#if> <tr> <td align="center" style="padding-bottom: ${texts.get('mail.config.emailPaddingLarge')}"> <table border="0" cellspacing="0" cellpadding="0"> <tr> <td align="center" style="border-radius: ${texts.get('mail.config.emailBtnBorderRadius')};" bgcolor="${texts.get('mail.config.emailBtnBackgroundColor')}"> <a href="${product.absoluteUrl}" class="btn" target="_blank" style="font-size: ${texts.get('mail.config.emailTextFontSizeSmaller')}; color: ${texts.get('mail.config.emailBtnTextColor')}!important; text-decoration: none; padding: ${texts.get('mail.config.emailBtnPadding')}; display: inline-block;">${texts.get("edeeShop.mail.tile.detail")}</a> </td> </tr> </table> </td> </tr> </table> </td> <#if ((productIndex % 2) == 1) || (!productHasNext)> </tr> </#if></#macro>