Template.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405
  1. <?php
  2. namespace Dotdigitalgroup\Email\Model\Email;
  3. class Template extends \Magento\Framework\DataObject
  4. {
  5. /**
  6. * HTML template type.
  7. */
  8. const TEMPLATE_TYPE = 1;
  9. const XML_PATH_WISHLIST_EMAIL_EMAIL_TEMPLATE = 'wishlist/email/email_template';
  10. const XML_PATH_DDG_TEMPLATE_NEW_ACCCOUNT =
  11. 'dotmailer_email_templates/email_templates/customer_create_account_email_template';
  12. const XML_PATH_DDG_TEMPLATE_NEW_ACCCOUNT_CONFIRMATION_KEY =
  13. 'dotmailer_email_templates/email_templates/customer_create_account_email_confirmation_template';
  14. const XML_PATH_DDG_TEMPLATE_NEW_ACCOUNT_CONFIRMATION =
  15. 'dotmailer_email_templates/email_templates/customer_create_account_email_confirmed_template';
  16. const XML_PATH_DDG_TEMPLATE_FORGOT_PASSWORD =
  17. 'dotmailer_email_templates/email_templates/customer_password_forgot_email_template';
  18. const XML_PATH_DDG_TEMPLATE_REMIND_PASSWORD =
  19. 'dotmailer_email_templates/email_templates/customer_password_remind_email_template';
  20. const XML_PATH_DDG_TEMPLATE_WISHLIST_PRODUCT_SHARE =
  21. 'dotmailer_email_templates/email_templates/wishlist_email_email_template';
  22. const XML_PATH_DDG_TEMPLATE_FORGOT_ADMIN_PASSWORD =
  23. 'dotmailer_email_templates/email_templates/admin_emails_forgot_email_template';
  24. const XML_PATH_DDG_TEMPLATE_SUBSCRIPTION_SUCCESS =
  25. 'dotmailer_email_templates/email_templates/newsletter_subscription_success_email_template';
  26. const XML_PATH_DDG_TEMPLATE_SUBSCRIPTION_CONFIRMATION =
  27. 'dotmailer_email_templates/email_templates/newsletter_subscription_confirm_email_template';
  28. const XML_PATH_DGG_TEMPLATE_NEW_ORDER_CONFIRMATION =
  29. 'dotmailer_email_templates/email_templates/sales_email_order_template';
  30. const XML_PATH_DDG_TEMPLATE_NEW_ORDER_CONFIRMATION_GUEST =
  31. 'dotmailer_email_templates/email_templates/sales_email_order_guest_template';
  32. const XML_PATH_DDG_TEMPLATE_ORDER_UPDATE =
  33. 'dotmailer_email_templates/email_templates/sales_email_order_comment_template';
  34. const XML_PATH_DDG_TEMPLATE_ORDER_UPDATE_GUEST =
  35. 'dotmailer_email_templates/email_templates/sales_email_order_comment_guest_template';
  36. const XML_PATH_DDG_TEMPLATE_NEW_SHIPMENT =
  37. 'dotmailer_email_templates/email_templates/sales_email_shipment_template';
  38. const XML_PATH_DDG_TEMPLATE_NEW_SHIPMENT_GUEST =
  39. 'dotmailer_email_templates/email_templates/sales_email_shipment_guest_template';
  40. const XML_PATH_DDG_TEMPLATE_INVOICE_UPDATE =
  41. 'dotmailer_email_templates/email_templates/sales_email_invoice_comment_template';
  42. const XML_PATH_DDG_TEMPLATE_UNSUBSCRIBE_SUCCESS =
  43. 'dotmailer_email_templates/email_templates/newsletter_subscription_un_email_template';
  44. const XML_PATH_DDG_TEMPLATE_INVOICE_UPDATE_GUEST =
  45. 'dotmailer_email_templates/email_templates/sales_email_invoice_comment_guest_template';
  46. const XML_PATH_DDG_TEMPLATE_NEW_INVOICE =
  47. 'dotmailer_email_templates/email_templates/sales_email_invoice_template';
  48. const XML_PATH_DDG_TEMPLATE_NEW_INVOICE_GUEST =
  49. 'dotmailer_email_templates/email_templates/sales_email_invoice_guest_template';
  50. const XML_PATH_DDG_TEMPLATE_NEW_CREDIT_MEMO =
  51. 'dotmailer_email_templates/email_templates/sales_email_creditmemo_template';
  52. const XML_PATH_DDG_TEMPLATE_NEW_CREDIT_MEMO_GUEST =
  53. 'dotmailer_email_templates/email_templates/sales_email_creditmemo_guest_template';
  54. const XML_PATH_DDG_TEMPLATE_CREDIT_MEMO_UPDATE =
  55. 'dotmailer_email_templates/email_templates/sales_email_creditmemo_comment_template';
  56. const XML_PATH_DDG_TEMPLATE_SHIPMENT_UPDATE =
  57. 'dotmailer_email_templates/email_templates/sales_email_shipment_comment_template';
  58. const XML_PATH_DDG_TEMPLATE_SHIPMENT_UPDATE_GUEST =
  59. 'dotmailer_email_templates/email_templates/sales_email_shipment_comment_guest_template';
  60. const XML_PATH_DDG_TEMPLATE_CONTACT_FORM =
  61. 'dotmailer_email_templates/email_templates/contact_email_email_template';
  62. const XML_PATH_DDG_TEMPLATE_CREDIT_MEMO_UPDATE_GUEST =
  63. 'dotmailer_email_templates/email_templates/sales_email_creditmemo_comment_guest_template';
  64. const XML_PATH_DDG_TEMPLATE_SEND_PRODUCT_TO_FRIEND =
  65. 'dotmailer_email_templates/email_templates/sendfriend_email_template';
  66. const XML_PATH_DDG_TEMPLATE_PRODUCT_STOCK_ALERT =
  67. 'dotmailer_email_templates/email_templates/product_stock_alert_template';
  68. const XML_PATH_DDG_TEMPLATE_PRODUCT_PRICE_ALERT =
  69. 'dotmailer_email_templates/email_templates/product_price_alert_template';
  70. /**
  71. * Mapping from template code = config path for templates.
  72. * @var array
  73. */
  74. public $templateConfigMapping = [
  75. 'customer_create_account_email_template' =>
  76. \Magento\Customer\Model\EmailNotification::XML_PATH_REGISTER_EMAIL_TEMPLATE,
  77. 'customer_create_account_email_confirmed_template' =>
  78. \Magento\Customer\Model\EmailNotification::XML_PATH_CONFIRMED_EMAIL_TEMPLATE,
  79. 'customer_create_account_email_confirmation_template' =>
  80. \Magento\Customer\Model\EmailNotification::XML_PATH_CONFIRM_EMAIL_TEMPLATE,
  81. 'customer_password_forgot_email_template' =>
  82. \Magento\Customer\Model\EmailNotification::XML_PATH_FORGOT_EMAIL_TEMPLATE,
  83. 'customer_password_remind_email_template' =>
  84. \Magento\Customer\Model\EmailNotification::XML_PATH_REMIND_EMAIL_TEMPLATE,
  85. 'wishlist_email_email_template' => self::XML_PATH_WISHLIST_EMAIL_EMAIL_TEMPLATE,
  86. 'admin_emails_forgot_email_template' => \Magento\User\Model\User::XML_PATH_FORGOT_EMAIL_TEMPLATE,
  87. 'newsletter_subscription_success_email_template' =>
  88. \Magento\Newsletter\Model\Subscriber::XML_PATH_SUCCESS_EMAIL_TEMPLATE,
  89. 'newsletter_subscription_confirm_email_template' =>
  90. \Magento\Newsletter\Model\Subscriber::XML_PATH_CONFIRM_EMAIL_TEMPLATE,
  91. 'newsletter_subscription_un_email_template' =>
  92. \Magento\Newsletter\Model\Subscriber::XML_PATH_UNSUBSCRIBE_EMAIL_TEMPLATE,
  93. 'sales_email_order_template' =>
  94. \Magento\Sales\Model\Order\Email\Container\OrderIdentity::XML_PATH_EMAIL_TEMPLATE,
  95. 'sales_email_order_guest_template' =>
  96. \Magento\Sales\Model\Order\Email\Container\OrderIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE,
  97. 'sales_email_order_comment_template' =>
  98. \Magento\Sales\Model\Order\Email\Container\OrderCommentIdentity::XML_PATH_EMAIL_TEMPLATE,
  99. 'sales_email_order_comment_guest_template' =>
  100. \Magento\Sales\Model\Order\Email\Container\OrderCommentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE,
  101. 'sales_email_shipment_template' =>
  102. \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity::XML_PATH_EMAIL_TEMPLATE,
  103. 'sales_email_shipment_guest_template' =>
  104. \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE,
  105. 'sales_email_invoice_comment_template' =>
  106. \Magento\Sales\Model\Order\Email\Container\InvoiceCommentIdentity::XML_PATH_EMAIL_TEMPLATE,
  107. 'sales_email_invoice_comment_guest_template' =>
  108. \Magento\Sales\Model\Order\Email\Container\InvoiceCommentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE,
  109. 'sales_email_invoice_template' =>
  110. \Magento\Sales\Model\Order\Email\Container\InvoiceIdentity::XML_PATH_EMAIL_TEMPLATE,
  111. 'sales_email_invoice_guest_template' =>
  112. \Magento\Sales\Model\Order\Email\Container\InvoiceIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE,
  113. 'sales_email_creditmemo_template' =>
  114. \Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity::XML_PATH_EMAIL_TEMPLATE,
  115. 'sales_email_creditmemo_guest_template' =>
  116. \Magento\Sales\Model\Order\Email\Container\CreditmemoIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE,
  117. 'sales_email_creditmemo_comment_template' =>
  118. \Magento\Sales\Model\Order\Email\Container\CreditmemoCommentIdentity::XML_PATH_EMAIL_TEMPLATE,
  119. 'sales_email_creditmemo_comment_guest_template' =>
  120. \Magento\Sales\Model\Order\Email\Container\CreditmemoCommentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE,
  121. 'sales_email_shipment_comment_template' =>
  122. \Magento\Sales\Model\Order\Email\Container\ShipmentCommentIdentity::XML_PATH_EMAIL_TEMPLATE,
  123. 'sales_email_shipment_comment_guest_template' =>
  124. \Magento\Sales\Model\Order\Email\Container\ShipmentCommentIdentity::XML_PATH_EMAIL_GUEST_TEMPLATE,
  125. 'contact_email_email_template' => 'contact/email/email_template',//interface don't exist on lower versions 2.2.2
  126. 'sendfriend_email_template' => \Magento\SendFriend\Helper\Data::XML_PATH_EMAIL_TEMPLATE,
  127. 'product_stock_alert_template' => \Magento\ProductAlert\Model\Email::XML_PATH_EMAIL_STOCK_TEMPLATE,
  128. 'product_price_alert_template' => \Magento\ProductAlert\Model\Email::XML_PATH_EMAIL_PRICE_TEMPLATE,
  129. ];
  130. /**
  131. * Config path id to dotmialer config.
  132. *
  133. * @var array
  134. */
  135. public $templateConfigIdToDotmailerConfigPath = [
  136. 'customer_create_account_email_template' => self::XML_PATH_DDG_TEMPLATE_NEW_ACCCOUNT,
  137. 'customer_create_account_email_confirmation_template' =>
  138. self::XML_PATH_DDG_TEMPLATE_NEW_ACCCOUNT_CONFIRMATION_KEY,
  139. 'customer_create_account_email_confirmed_template' => self::XML_PATH_DDG_TEMPLATE_NEW_ACCOUNT_CONFIRMATION,
  140. 'customer_password_forgot_email_template' => self::XML_PATH_DDG_TEMPLATE_FORGOT_PASSWORD,
  141. 'customer_password_remind_email_template' => self::XML_PATH_DDG_TEMPLATE_REMIND_PASSWORD,
  142. 'admin_emails_forgot_email_template' => self::XML_PATH_DDG_TEMPLATE_FORGOT_ADMIN_PASSWORD,
  143. 'newsletter_subscription_success_email_template' => self::XML_PATH_DDG_TEMPLATE_SUBSCRIPTION_SUCCESS,
  144. 'newsletter_subscription_confirm_email_template' => self::XML_PATH_DDG_TEMPLATE_SUBSCRIPTION_CONFIRMATION,
  145. 'newsletter_subscription_un_email_template' => self::XML_PATH_DDG_TEMPLATE_UNSUBSCRIBE_SUCCESS,
  146. 'sales_email_order_template' => self::XML_PATH_DGG_TEMPLATE_NEW_ORDER_CONFIRMATION,
  147. 'sales_email_order_guest_template' => self::XML_PATH_DDG_TEMPLATE_NEW_ORDER_CONFIRMATION_GUEST,
  148. 'sales_email_order_comment_template' => self::XML_PATH_DDG_TEMPLATE_ORDER_UPDATE,
  149. 'sales_email_order_comment_guest_template' => self::XML_PATH_DDG_TEMPLATE_ORDER_UPDATE_GUEST,
  150. 'sales_email_shipment_template' => self::XML_PATH_DDG_TEMPLATE_NEW_SHIPMENT,
  151. 'sales_email_shipment_guest_template' => self::XML_PATH_DDG_TEMPLATE_NEW_SHIPMENT_GUEST,
  152. 'sales_email_invoice_comment_template' => self::XML_PATH_DDG_TEMPLATE_INVOICE_UPDATE,
  153. 'sales_email_invoice_comment_guest_template' => self::XML_PATH_DDG_TEMPLATE_INVOICE_UPDATE_GUEST,
  154. 'sales_email_invoice_template' => self::XML_PATH_DDG_TEMPLATE_NEW_INVOICE,
  155. 'sales_email_invoice_guest_template' => self::XML_PATH_DDG_TEMPLATE_NEW_INVOICE_GUEST,
  156. 'sales_email_creditmemo_template' => self::XML_PATH_DDG_TEMPLATE_NEW_CREDIT_MEMO,
  157. 'sales_email_creditmemo_guest_template' => self::XML_PATH_DDG_TEMPLATE_NEW_CREDIT_MEMO_GUEST,
  158. 'sales_email_creditmemo_comment_template' => self::XML_PATH_DDG_TEMPLATE_CREDIT_MEMO_UPDATE,
  159. 'sales_email_creditmemo_comment_guest_template' => self::XML_PATH_DDG_TEMPLATE_CREDIT_MEMO_UPDATE_GUEST,
  160. 'sales_email_shipment_comment_template' => self::XML_PATH_DDG_TEMPLATE_SHIPMENT_UPDATE,
  161. 'sales_email_shipment_comment_guest_template' => self::XML_PATH_DDG_TEMPLATE_SHIPMENT_UPDATE_GUEST,
  162. 'contact_email_email_template' => self::XML_PATH_DDG_TEMPLATE_CONTACT_FORM,
  163. 'sendfriend_email_template' => self::XML_PATH_DDG_TEMPLATE_SEND_PRODUCT_TO_FRIEND,
  164. 'wishlist_email_email_template' => self::XML_PATH_DDG_TEMPLATE_WISHLIST_PRODUCT_SHARE,
  165. 'product_stock_alert_template' => self::XML_PATH_DDG_TEMPLATE_PRODUCT_STOCK_ALERT,
  166. 'product_price_alert_template' => self::XML_PATH_DDG_TEMPLATE_PRODUCT_PRICE_ALERT
  167. ];
  168. /**
  169. * @var \Magento\Email\Model\ResourceModel\Template\CollectionFactory
  170. */
  171. public $templateCollectionFactory;
  172. /**
  173. * @var \Dotdigitalgroup\Email\Helper\Data
  174. */
  175. public $helper;
  176. /**
  177. * @var \Magento\Store\Model\StoreManagerInterface
  178. */
  179. public $storeManager;
  180. /**
  181. * @var \Magento\Framework\App\Config\ScopeConfigInterface
  182. */
  183. public $scopeConfig;
  184. /**
  185. * @var \Magento\Email\Model\ResourceModel\TemplateFactory
  186. */
  187. public $templateResource;
  188. /**
  189. * @var \Magento\Email\Model\TempalteFactory
  190. */
  191. public $templateFactory;
  192. /**
  193. * @var array
  194. */
  195. public $proccessedCampaings = [];
  196. /**
  197. * Template constructor.
  198. * @param \Dotdigitalgroup\Email\Helper\Data $helper
  199. * @param \Magento\Store\Model\StoreManagerInterface $store
  200. * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
  201. * @param \Magento\Email\Model\TemplateFactory $templateFactory
  202. * @param \Magento\Email\Model\ResourceModel\Template $templateResource
  203. * @param \Magento\Email\Model\ResourceModel\Template\CollectionFactory $templateCollectionFactory
  204. */
  205. public function __construct(
  206. \Dotdigitalgroup\Email\Helper\Data $helper,
  207. \Magento\Store\Model\StoreManagerInterface $store,
  208. \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
  209. \Magento\Email\Model\TemplateFactory $templateFactory,
  210. \Magento\Email\Model\ResourceModel\Template $templateResource,
  211. \Magento\Email\Model\ResourceModel\Template\CollectionFactory $templateCollectionFactory
  212. ) {
  213. $data = [];
  214. $this->helper = $helper;
  215. $this->scopeConfig = $scopeConfig;
  216. $this->storeManager = $store;
  217. $this->templateFactory = $templateFactory;
  218. $this->templateResource = $templateResource;
  219. $this->templateCollectionFactory = $templateCollectionFactory;
  220. parent::__construct($data);
  221. }
  222. /**
  223. * Load email_template by code/name.
  224. *
  225. * @param string $templateCode
  226. * @return \Magento\Framework\DataObject
  227. */
  228. public function loadByTemplateByCode($templateCode)
  229. {
  230. $template = $this->templateCollectionFactory->create()
  231. ->addFieldToFilter('template_code', $templateCode)
  232. ->setPageSize(1);
  233. return $template->getFirstItem();
  234. }
  235. /**
  236. * Delete email_template.
  237. *
  238. * @param string $templatecode
  239. */
  240. public function deleteTemplateByCode($templatecode)
  241. {
  242. $template = $this->loadByTemplateByCode($templatecode);
  243. if ($template->getId()) {
  244. $template->delete();
  245. }
  246. }
  247. /**
  248. * Template sync.
  249. *
  250. * @return array
  251. */
  252. public function sync()
  253. {
  254. $result = ['store' => 'Stores : ', 'message' => 'Done.'];
  255. $lastWebsiteId = '0';
  256. foreach ($this->storeManager->getStores(true) as $store) {
  257. $storeId = $store->getId();
  258. //store not enabled to sync
  259. if (! $this->helper->isStoreEnabled($storeId)) {
  260. continue;
  261. }
  262. //reset the campaign ids for each website
  263. $websiteId = $store->getWebsiteId();
  264. if ($websiteId != $lastWebsiteId) {
  265. $this->proccessedCampaings = [];
  266. $lastWebsiteId = $websiteId;
  267. }
  268. foreach ($this->templateConfigIdToDotmailerConfigPath as $configTemplateId => $dotConfigPath) {
  269. $campaignId = $this->getConfigValue($dotConfigPath, $storeId);
  270. $configPath = $this->templateConfigMapping[$configTemplateId];
  271. $emailTemplateId = $this->getConfigValue($configPath, $storeId);
  272. if ($campaignId && $emailTemplateId && ! in_array($campaignId, $this->proccessedCampaings)) {
  273. //sync template for store
  274. $this->syncEmailTemplate($campaignId, $emailTemplateId, $store);
  275. $result['store'] .= ', ' . $store->getCode();
  276. $this->proccessedCampaings[$campaignId] = $campaignId;
  277. }
  278. }
  279. }
  280. return $result;
  281. }
  282. /**
  283. * @param string $config
  284. * @param int $storeId
  285. * @return string|boolean
  286. */
  287. public function getConfigValue($config, $storeId)
  288. {
  289. return $this->scopeConfig->getValue(
  290. $config,
  291. \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
  292. $storeId
  293. );
  294. }
  295. /**
  296. * @param int $campaignId
  297. * @param int $emailTemplateId
  298. * @param \Magento\Store\Api\Data\StoreInterface $store
  299. * @return \Magento\Email\Model\Template|string
  300. */
  301. private function syncEmailTemplate($campaignId, $emailTemplateId, $store)
  302. {
  303. $websiteId = $store->getWebsiteId();
  304. $client = $this->helper->getWebsiteApiClient($websiteId);
  305. $dmCampaign = $client->getCampaignByIdWithPreparedContent($campaignId);
  306. if (isset($dmCampaign->message)) {
  307. $message = $dmCampaign->message;
  308. $this->helper->log($message);
  309. return $message;
  310. }
  311. $template = $this->templateFactory->create();
  312. $this->templateResource->load($template, $emailTemplateId);
  313. //check if is a dotmailer template
  314. if ($template->getId() || $template->getTemplateCode()) {
  315. return $this->saveTemplate($template, $dmCampaign, $campaignId);
  316. }
  317. }
  318. /**
  319. * @param string $templateConfigPath
  320. * @param int $campaignId
  321. * @param string $scope
  322. * @param int $scopeId
  323. * @return bool|mixed
  324. * @throws \Magento\Framework\Exception\LocalizedException
  325. */
  326. public function saveTemplateWithConfigPath($templateConfigPath, $campaignId, $scope, $scopeId)
  327. {
  328. if ($scope == \Magento\Store\Model\ScopeInterface::SCOPE_WEBSITES) {
  329. $websiteId = $scopeId;
  330. } elseif ($scope == \Magento\Store\Model\ScopeInterface::SCOPE_STORES) {
  331. $websiteId = $this->storeManager->getStore($scopeId)->getWebsiteId();
  332. } else {
  333. $websiteId = '0';
  334. }
  335. //get the campaign from api
  336. $client = $this->helper->getWebsiteApiClient($websiteId);
  337. $dmCampaign = $client->getCampaignByIdWithPreparedContent($campaignId);
  338. if (isset($dmCampaign->message)) {
  339. $this->helper->log('Failed to get api template : ' . $dmCampaign->message);
  340. return false;
  341. }
  342. $templateName = $dmCampaign->name . '_' . $campaignId;
  343. $template = $this->loadByTemplateByCode($templateName);
  344. return $this->saveTemplate($template, $dmCampaign, $campaignId, $templateConfigPath);
  345. }
  346. /**
  347. * @param \Magento\Email\Model\Template $template
  348. * @param Object $dmCampaign
  349. * @param int $campaignId
  350. * @param string $origTemplateCode
  351. * @return \Magento\Email\Model\Template
  352. */
  353. public function saveTemplate($template, $dmCampaign, $campaignId, $origTemplateCode = '')
  354. {
  355. $templateName = $dmCampaign->name . '_' . $campaignId;
  356. try {
  357. $template->setTemplateCode($templateName)
  358. ->setOrigTemplateCode($origTemplateCode)
  359. ->setTemplateSubject($dmCampaign->subject)
  360. ->setTemplateText($dmCampaign->processedHtmlContent)
  361. ->setTemplateType(\Magento\Email\Model\Template::TYPE_HTML)
  362. ->setTemplateSenderName($dmCampaign->fromName)
  363. ->setTemplateSenderEmail($dmCampaign->fromAddress->email);
  364. $this->templateResource->save($template);
  365. } catch (\Exception $e) {
  366. $this->helper->log($e->getMessage());
  367. }
  368. return $template;
  369. }
  370. }