Get email templates defined in admin panel in custom module
-
23-03-2021 - |
Pregunta
I'm writing a module that sends some emails to customers. Right now it works just fine with the email template defined in my code. Thing is I want other non-developer users to be able to access that template in the admin-panel.
Is there a way I could define a template in the back-office and call it in my code ?
Solución
You have to create email template configuration at stores > configuration like below in app/code/VendorName/ModuleName/etc/adminhtml/system.xml:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
<system>
<section id="paytrade" translate="label" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
<group id="general" translate="label" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">
<field id="paytrade_commission_template" translate="label" type="select" sortOrder="3" showInDefault="1" showInStore="1" showInWebsite="1">
<label>Test Tab Email Template</label>
<comment>Test tab email sent to xyz.</comment>
<source_model>Magento\Config\Model\Config\Source\Email\Template</source_model>
</field>
</group>
</section>
</system>
</config>
your email_templates.xml file as below at app/code/VendorName/ModuleName/etc/:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../Email/etc/email_templates.xsd">
<template id="paytrade_general_paytrade_commission_template" label="Test Tab Email Template" file="test_tab_template_email.html" type="html" module="Ewall_Paytrade" area="frontend"/>
</config>
Now your email template php code like below:
<?php
namespace NameSpace\ModuleName\Helper;
/**
* Custom Module Email helper
*/
class Email extends \Magento\Framework\App\Helper\AbstractHelper
{
const XML_PATH_EMAIL_TEMPLATE_FIELD = 'paytrade/general/paytrade_commission_template';
/* Here section and group refer to name of section and group where you create this field in configuration*/
/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
protected $_scopeConfig;
/**
* Store manager
*
* @var \Magento\Store\Model\StoreManagerInterface
*/
protected $_storeManager;
/**
* @var \Magento\Framework\Translate\Inline\StateInterface
*/
protected $inlineTranslation;
/**
* @var \Magento\Framework\Mail\Template\TransportBuilder
*/
protected $_transportBuilder;
/**
* @var string
*/
protected $temp_id;
/**
* @param Magento\Framework\App\Helper\Context $context
* @param Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
* @param Magento\Store\Model\StoreManagerInterface $storeManager
* @param Magento\Framework\Translate\Inline\StateInterface $inlineTranslation
* @param Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
*/
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Magento\Framework\Translate\Inline\StateInterface $inlineTranslation,
\Magento\Framework\Mail\Template\TransportBuilder $transportBuilder
) {
$this->_scopeConfig = $context;
parent::__construct($context);
$this->_storeManager = $storeManager;
$this->inlineTranslation = $inlineTranslation;
$this->_transportBuilder = $transportBuilder;
}
/**
* Return store configuration value of your template field that which id you set for template
*
* @param string $path
* @param int $storeId
* @return mixed
*/
protected function getConfigValue($path, $storeId)
{
return $this->scopeConfig->getValue(
$path,
\Magento\Store\Model\ScopeInterface::SCOPE_STORE,
$storeId
);
}
/**
* Return store
*
* @return Store
*/
public function getStore()
{
return $this->_storeManager->getStore();
}
/**
* Return template id according to store
*
* @return mixed
*/
public function getTemplateId($xmlPath)
{
return $this->getConfigValue($xmlPath, $this->getStore()->getStoreId());
}
/**
* [generateTemplate description] with template file and tempaltes variables values
* @param Mixed $emailTemplateVariables
* @param Mixed $senderInfo
* @param Mixed $receiverInfo
* @return void
*/
public function generateTemplate($emailTemplateVariables,$senderInfo,$receiverInfo)
{
$template = $this->_transportBuilder->setTemplateIdentifier($this->temp_id)
->setTemplateOptions(
[
'area' => \Magento\Framework\App\Area::AREA_FRONTEND, /* here you can defile area and
store of template for which you prepare it */
'store' => $this->_storeManager->getStore()->getId(),
]
)
->setTemplateVars($emailTemplateVariables)
->setFrom($senderInfo)
->addTo($receiverInfo['email'],$receiverInfo['name']);
return $this;
}
/**
* [sendInvoicedOrderEmail description]
* @param Mixed $emailTemplateVariables
* @param Mixed $senderInfo
* @param Mixed $receiverInfo
* @return void
*/
/* your send mail method*/
public function yourCustomMailSendMethod($emailTemplateVariables,$senderInfo,$receiverInfo)
{
$this->temp_id = $this->getTemplateId(self::XML_PATH_EMAIL_TEMPLATE_FIELD);
$this->inlineTranslation->suspend();
$this->generateTemplate($emailTemplateVariables,$senderInfo,$receiverInfo);
$transport = $this->_transportBuilder->getTransport();
$transport->sendMessage();
$this->inlineTranslation->resume();
}
}
After completing above steps, you can create new email template from Marketing > Communications > Email Templates
Click on new email template > Select above created email template from dropdown > click on load template > save email template
Go to store > configuration and Test Tab Email Template field value set new created email template from above step