EdeeShop · Implementace

Přidání produktů do newsletteru

Upraveno

Následující dokument popisuje, jak přidat produkty do newsletterů.

Mail module modifikace

Nejprve je nutné upravit konfiguraci mail modulu.

  1. Přidat poskytovatele dat a freemarker-makra do šablony v mail modulu.
xml
<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>
  1. 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.
xml
<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.

xml
<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>
  1. Nakonec přidání titulků do module-mail/i18n (toto se odvíjí od id, která nastavíte widgetům). Např:
properties
eshopProductContainer.eshopProducts.title=E-shop produktyeshopProductContainer.eshopProducts.allAvailableItems=Aktivní produkty v katalogueshopProductContainer.eshopProducts.allAvailableTags=Vybrat produkty

Freemarker

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.

html
<#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.

html
<@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) - region je CatalogRegion.Key nebo 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.

html
<#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 &gt; 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>