private:koding:hostcms:modules:shop:order:otpravka_pisma_administratoru_i_pokupatelju_pri_smene_statusa_zakaza:observer.php
<?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;
	}
}
private/koding/hostcms/modules/shop/order/otpravka_pisma_administratoru_i_pokupatelju_pri_smene_statusa_zakaza/observer.php.txt · Last modified: 10.07.17 в 11:07 by maximzasorin_gmail.com