<?php defined('HOSTCMS') || exit('HostCMS: access denied.'); /** * Наблюдатель для отправки писем администратору и пользователю при смене статуса заказа * // KAD: Отправка писем администратору и пользователю при смене статуса Core_Event::attach('shop_order.onBeforeSave', array('Shop_Order_Observer', 'onBeforeSave')); */ class Shop_Order_Observer { /** * Настройки статусов * * Задавать в след. формате: * {ИдентификаторСтатуса} => array( * 'adminEmailXsl' => {Название XSL-шаблона для отправки администратору}, * 'adminSubject' => {Тема письма для отправки администратору}, * * 'userEmailXsl' => {Название XSL-шаблона для отправки пользователю}, * 'userSubject' => {Тема письма для отправки пользователю}, * * 'active' => {Активность отправки письма true|false}}, * ), * ) */ static protected $_config = array( // В обработке 1 => array( 'adminEmailXsl' => 'ПисьмоАдминистратору', 'adminSubject' => 'Статус заказа изменен на «В обработке» (администратору)', 'userEmailXsl' => 'ПисьмоПользователю', 'userSubject' => 'Статус заказа изменен на «В обработке» (пользователю)', 'active' => true, ), // Отправлено 2 => array( 'adminEmailXsl' => 'ПисьмоАдминистратору', 'adminSubject' => 'Статус заказа изменен на «Отправлено» (администратору)', 'userEmailXsl' => 'ПисьмоПользователю', 'userSubject' => 'Статус заказа изменен на «Отправлено» (пользователю)', 'active' => true, ), // Доставлено 3 => array( 'adminEmailXsl' => 'ПисьмоАдминистратору', 'adminSubject' => 'Статус заказа изменен на Доставлено (администратору)', 'userEmailXsl' => 'ПисьмоПользователю', 'userSubject' => 'Статус заказа изменен на Доставлено (пользователю)', 'active' => true, ), ); /** * Событие сохранения заказа * * @param Shop_Order_Model $object Заказ * @param array $args Аргументы */ static public function onBeforeSave(Shop_Order_Model $object, $args) { $oShop_Order = Core_Entity::factory('shop_order', $object->id); $oShop = $oShop_Order->Shop; // Смена статуса произошла if ($oShop_Order->shop_order_status_id != $object->shop_order_status_id) { // print 'Статус изменен на: ' . $object->Shop_Order_Status->name . '<br />'; $statusId = $object->shop_order_status_id; // Если для текущего статуса назначена отправка писем if (isset(self::$_config[$statusId]) && self::$_config[$statusId]['active']) { $oAdminEmailXsl = Core_Entity::factory('Xsl')->getByName(self::$_config[$statusId]['adminEmailXsl']); $adminEmail = $oShop->getFirstEmail(); $adminSubject = self::$_config[$statusId]['adminSubject']; $oUserEmailXsl = Core_Entity::factory('Xsl')->getByName(self::$_config[$statusId]['userEmailXsl']); $userEmail = $oShop_Order->email; $userSubject = self::$_config[$statusId]['userSubject']; $fromEmail = $adminEmail; if ($oShop->shop_company_id) { $oShop ->addEntity($oShop->Shop_Company); } $oShop ->addEntity( $oShop->Site->clearEntities()->showXmlAlias() ) ->addEntity( $oShop_Order->clearEntities() ->showXmlCurrency(TRUE) ->showXmlCountry(TRUE) ->showXmlItems(TRUE) ->showXmlDelivery(TRUE) ->showXmlPaymentSystem(TRUE) ->showXmlOrderStatus(TRUE) ->showXmlProperties(TRUE) ->showXmlSiteuser(TRUE) ); $sXml = $oShop->getXml(); // Письмо администратору if (Core_Valid::email($adminEmail) && $oAdminEmailXsl) { self::_sendEmail($adminEmail, $fromEmail, $adminSubject, $oAdminEmailXsl, $sXml); } // Письмо пользователю if (Core_Valid::email($userEmail) && $oUserEmailXsl) { self::_sendEmail($userEmail, $fromEmail, $userSubject, $oUserEmailXsl, $sXml); } } } } /** * Отправляет рендерит письмо и отправляет по заданному адресу * * @param string $to * @param string $from * @param string $subject * @param Xsl_Model $oXsl * @param string $sXml */ static protected function _sendEmail($to, $from, $subject, Xsl_Model $oXsl, $sXml) { // Генерируем тело письма $sMessage = Xsl_Processor::instance() ->xml($sXml) ->xsl($oXsl) ->process(); // Отправляем $ret = Core_Mail::instance() ->from($from) ->to($to) ->subject($subject) ->message($sMessage) ->contentType('text/html') ->header('X-HostCMS-Reason', 'OrderChangeStatus') ->header('Precedence', 'bulk') ->send(); if ($ret) { // print 'Письмо по адресу ' . $to . ' отправлено<br />'; } else { // print 'Письмо по адресу ' . $to . ' не отправлено<br />'; } return $ret; } }