
Renderer Template
The email subject, email body, and content of the components are generated using Velocity scripts. The RendererTemplate page contains a Velocity script, along with the Content Class name. The Velocity script contains tags which are replaced with the values from the context object provided during the rendering process.
<itemtype code="DiscountEmail"
extends="StoreFrontCustomerProcess"
autocreate="true"
generate="true">
<attributes>
<attribute qualifier="cart" type="AbstractOrder">
<persistence type="property"/>
</attribute>
</attributes>
</itemtype>
Sending email is a business process containing a sequence of actions and is defined in a process definition XML file. The business process object contains the information required for the actions within the process. With email processes, the following actions are configured:
<process xmlns="http://www.hybris.de/xsd/processdefinition" start="generateDiscountEmail" name="DiscountEmailProcess" processClass="org.training.core.model.DiscountEmailProcessModel." onError="error">
<action id="generateDiscountEmail" bean="generateDiscountEmailAction">
<transition name="OK" to="sendEmail"/>
<transition name="NOK" to="error"/>
</action>
<action id="sendEmail" bean="sendEmail">
<transition name="OK" to="removeSentEmail"/>
<transition name="NOK" to="failed"/>
</action>
<action id="removeSentEmail" bean="removeSentEmail">
<transition name="OK" to="success"/>
<transition name="NOK" to="error"/>
</action>
<end id="error" state="ERROR">Something went wrong.</end>
<end id="failed" state="FAILED">Could not send email for Discount.</end>
<end id="success" state="SUCCEEDED">Sent Discount email .</end>
</process>
<bean id="discountEmailProcessDefinitionResource"
class="de.hybris.platform.processengine.definition.ProcessDefinitionResource" >
<property name="resource" value="classpath:/trainingcore/processes/DiscountEmailProcess.xml"/>
</bean>
<bean id="generateDiscountEmailAction" parent="abstractGenerateEmailAction">
<property name="frontendTemplateName" value="DiscountEmailTemplate"/>
</bean>
public class DiscountEmailEvent extends AbstractCommerceUserEvent
{
// provide getter and setter
private AbstractOrder cart;
//Constructor
public DiscountEmailEvent(final AbstractOrderModel cart, final BaseStoreModel baseStore, final BaseSiteModel site, final CurrencyModel ,currency)
{
this.cart=cart;
// this methods are from "AbstractCommerceUserEvent" class
setBaseStore(baseStore);
setBaseSite(site);
setCurrency(currency);
setLanguage(cart.getUser().getSessionLanguage());
}
}
public class DiscountEmailEventListener extends AbstractAcceleratorSiteEventListener<DiscountEmailEvent>
{
private ModelService modelService;//provide getter and setter
private BusinessProcessService businessProcessService;//provide getter and setter
protected void onSiteEvent(final DiscountEmailEvent event)
{
final DiscountEmailProcessModel discountEmailProcessModel =(DiscountEmailProcessModel) getBusinessProcessService().createProcess("DiscountEmailProcess-" +event.getCart().getCode() + "-" + System.currentTimeMillis(),"DiscountEmailProcess");
discountEmailProcessModel.setCart(event.getCart());
// these methods are from "StoreFrontCustomerProcess" itemtype which we define parent in "DiscountEmailProcess" itemtype
discountEmailProcessModel.setCurrency(event.getCurrency());
discountEmailProcessModel.setLanguage(event.getLanguage());
discountEmailProcessModel.setStore(event.getBaseStore());
discountEmailProcessModel.setSite(event.getSite());
getModelService().save(discountEmailProcessModel);
getBusinessProcessService().startProcess(discountEmailProcessModel);
}
}
<bean id="discountEmailEventListener" class="org.training.core.event.DiscountEmailEventListener"
parent="abstractAcceleratorSiteEventListener">
<property name="modelService" ref="modelService"/>
<property name="businessProcessService" ref="businessProcessService"/>
</bean>
public String showCart(final Model model) throws CMSItemNotFoundException
{
if(!userFacade.isAnonymousUser())
{
final CartModel cartModel = cartService.getSessionCart();
if(cartModel.getTotalPrice()>=Double.valueOf(100))
{
eventService.publishEvent(initializeEvent(new DiscountEmailEvent(cartModel,cartModel.getStore(),cartModel.getSite(),cartModel.getCurrency()),cartModel));
}
}
return prepareCartUrl(model);
}
private AbstractEvent initializeEvent(final DiscountEmailEvent discountEmailEvent,final CartModel cartModel)
{
discountEmailEvent.setCart(cartModel);
return discountEmailEvent;
}
public class DiscountEmailContext extends AbstractEmailContext<DiscountEmailProcessModel>
{
public void init(final DiscountEmailProcessModel discountEmailProcessModel, final EmailPageModel emailPageModel)
{
super.init(discountEmailProcessModel, emailPageModel);
put(Email, getCustomerEmailResolutionService().getEmailForCustomer(getCustomer(discountEmailProcessModel)));
put(Display_NAME, getCustomer(discountEmailProcessModel).getDislayName())
}
}
<bean id="discountEmailContext" class="org.training.facades.process.email.context.DiscountEmailContext" parent="abstractEmailContext" scope="prototype" >
$contentCatalog=apparel-ukContentCatalog
$contentCV=catalogVersion(CatalogVersion.catalog(Catalog.id[default=$contentCatalog]),CatalogVersion.version[default=Online])[default=$contentCatalog:Online]
$wideContent=CMSImageComponent,BannerComponent
# Import modulegen config properties into impex macros
UPDATE GenericItem[processor=de.hybris.platform.commerceservices.impex.impl.ConfigPropertyImportProcessor];pk[unique=true]
$jarResourceCms=$config-jarResourceCmsValue
$emailPackageName=$config-emailContextPackageName
$emailResource=$config-emailResourceValue
$lang=en
INSERT_UPDATE RendererTemplate;code[unique=true];contextClass;rendererType(code)[default='velocity']
;discountEmailBody;$emailPackageName.DiscountEmailContext
;discountEmailSubject;$emailPackageName.DiscountEmailContext
UPDATE RendererTemplate;code[unique=true];description[lang=$lang];templateScript[lang=$lang,translator=de.hybris.platform.commerceservices.impex.impl.FileLoaderValueTranslator]
;discountEmailBody;"Discount Email Body";$emailResource/email-discountEmailBody.vm
;discountEmailSubject;"Discount Email Subject";$emailResource/email-discountEmailSubject.vm
INSERT_UPDATE EmailPageTemplate;$contentCV[unique=true];uid[unique=true];name;active;frontendTemplateName;subject(code);htmlTemplate(code);restrictedPageTypes(code)
;;DiscountEmailTemplate;discount Email Template;true;discountEmail;discountEmailSubject;discountEmailBody;EmailPage
INSERT_UPDATE EmailPage;$contentCV[unique=true];uid[unique=true];name;masterTemplate(uid,$contentCV);defaultPage;approvalStatus(code)[default='approved'];fromEmail[lang=en];fromName[lang=en]
;;discountEmail;Discount Email;DiscountEmailTemplate;true;;aadil.kaleem@signiwis.com;Hybris Training
INSERT_UPDATE ContentSlotName;name[unique=true];template(uid,$contentCV)[unique=true][default='DiscountEmailTemplate'];validComponentTypes(code)
;SiteLogo;;;logo
;TopContent;;$wideContent;
;BottomContent;;$wideContent;
INSERT_UPDATE ContentSlotForTemplate;$contentCV[unique=true];uid[unique=true];position[unique=true];pageTemplate(uid,$contentCV)[unique=true][default='DiscountEmailTemplate'];contentSlot(uid,$contentCV)[unique=true];allowOverwrite
;;SiteLogo-DiscountEmail;SiteLogo;;EmailSiteLogoSlot;true
;;TopContent-DiscountEmail;TopContent;;EmailTopSlot;true
;;BottomContent-DiscountEmail;BottomContent;;EmailBottomSlot;true
mail.smtp.server=smtp.gmail.com
mail.smtp.port=587
mail.smtp.user=INSERT_YOUR_GOOGLE_MAIL_ADDRESS
mail.smtp.password=INSERT_YOUR_GOOGLE_MAIL_PASSWORD_HERE
mail.use.tls=true
<relation code="BusinessProcess2Attachments" localized="false" generate="true" autocreate="true">
<sourceElement type="BusinessProcess" qualifier="process" cardinality="one">
</sourceElement>
<targetElement type="EmailAttachment" qualifier="attachments" cardinality="many" collectiontype="list">
<modifiers partof="true"/>
</targetElement>
</relation>
public class AttachmentEmailGenerationService extends DefaultEmailGenerationService
{
private ModelService modelService; // provide getter and setter
private static final Logger LOG = Logger.getLogger(AttachmentEmailGenerationService.class);
@Override
public EmailMessageModel generate(final BusinessProcessModel businessProcessModel, final EmailPageModel emailPageModel) throws RuntimeException
{
EmailMessageModel emailMessage = super.generate(businessProcessModel, emailPageModel);
List<EmailAttachmentModel> attachments = businessProcessModel.getAttachments();
emailMessage.setAttachments(attachments);
getModelService().saveAll(emailMessage);
return emailMessage;
}
}
<alias alias="emailGenerationService" name="attachmentEmailGenerationService"/>
<bean id="attachmentEmailGenerationService"
class="com.stackextend.training.core.email.AttachmentEmailGenerationService"
parent="defaultEmailGenerationService">
</bean>
InputStream input;
try {
input= new FileInputStream("");\\Attachment File Location
DataInputStream dataInputStream = new DataInputStream(input);
final String fileName = "Discount_Attachment"+System.currentTimeMillis()+".txt";
final String mimeType="text";
EmailAttachmentModel emailAttachment = getEmailService().createEmailAttachment(dataInputStream, fileName, mimeType);
List<EmailAttachmentModel> attachments = new ArrayList<>();
attachments.add(emailAttachment);
discountEmailModel.setAttachments(attachments);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
getModelService().save(discountEmailModel);
getBusinessProcessService().startProcess(discountEmailModel);
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.