Задача тривиальная и решений у нее много. В основном все "по старинке" дергают событие поступления почтового события и в нем что-то делают с массивом письма шаблона (дописывают недостающие и/или модифицируют имеющиеся).
Я набросал решение с класса\Bitrix\Sale\Notify , который не особо документирован, но с него накопировал кода под заполнение плейсхолдеров, как в шаблоне SALE_NEW_ORDER.
Ниже код, как пример использования, собрал на "быструю руку":
hipot studio — разработка, поддержка и сопровождение интернет-проектов
Я набросал решение с класса
Ниже код, как пример использования, собрал на "быструю руку":
// init.php use Bitrix\Main\Loader; use Bitrix\Main; use Bitrix\Main\EventManager; use Bitrix\Main\Application; use Bitrix\Sale\Basket; use Bitrix\Sale\Order; use Bitrix\Sale\OrderBase; use Bitrix\Sale\Helpers; use Bitrix\Sale\PropertyValueCollection; $eventManager = EventManager::getInstance(); $request = Application::getInstance()->getContext()->getRequest(); $eventManager->addEventHandler('sale', /*\Bitrix\Sale\Notify::EVENT_ORDER_STATUS_SEND_EMAIL= */ 'OnOrderStatusSendEmail', static function ($orderId, &$eventName, &$fields, $statusId) use ($request) { $entity = Bitrix\Sale\Order::load($orderId); $separator = "<br/>"; $eventName = Bitrix\Sale\Notify::EVENT_DEFAULT_STATUS_CHANGED_ID . $statusId; $filter = array( "EVENT_NAME" => $eventName, 'ACTIVE' => 'Y', ); if ($entity instanceof OrderBase) { $filter['SITE_ID'] = $entity->getSiteId(); } elseif (defined('SITE_ID') && SITE_ID != '') { $filter['SITE_ID'] = SITE_ID; } $res = \CEventMessage::GetList('', '', $filter); if ($eventMessage = $res->Fetch()) { if ($eventMessage['BODY_TYPE'] == 'text') { $separator = "\n"; } } $basketList = ''; /** @var Basket $basket */ $basket = $entity->getBasket(); if ($basket) { $basketTextList = $basket->getListOfFormatText(); if (!empty($basketTextList)) { foreach ($basketTextList as $basketItemCode => $basketItemData) { $basketList .= $basketItemData . $separator; } } } $getUserEmail = static function (Order $order) { $userEmail = ""; if (empty($userEmail)) { /** @var PropertyValueCollection $propertyCollection */ if ($propertyCollection = $order->getPropertyCollection()) { if ($propUserEmail = $propertyCollection->getUserEmail()) { $userEmail = $propUserEmail->getValue(); } } } if (empty($userEmail)) { $userRes = Main\UserTable::getList(array( 'select' => array('ID', 'LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'EMAIL'), 'filter' => array('=ID' => $order->getUserId()), )); if ($userData = $userRes->fetch()) { $userEmail = $userData['EMAIL']; } } return $userEmail; }; $getUserName = static function (Order $order) { $userName = ""; if (empty($userName)) { /** @var PropertyValueCollection $propertyCollection */ if ($propertyCollection = $order->getPropertyCollection()) { if ($propPayerName = $propertyCollection->getPayerName()) { $userName = $propPayerName->getValue(); } } } if (empty($userName)) { $userRes = Main\UserTable::getList(array( 'select' => array('ID', 'LOGIN', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'EMAIL'), 'filter' => array('=ID' => $order->getUserId()), )); if ($userData = $userRes->fetch()) { $userData['PAYER_NAME'] = \CUser::FormatName( \CSite::GetNameFormat(null, $order->getSiteId()), $userData, true ); $userName = $userData['PAYER_NAME']; } } return $userName; }; $fields = array_merge($fields, array( "ORDER_ID" => $entity->getField("ACCOUNT_NUMBER"), "ORDER_REAL_ID" => $entity->getField("ID"), "ORDER_ACCOUNT_NUMBER_ENCODE" => urlencode(urlencode($entity->getField("ACCOUNT_NUMBER"))), "ORDER_DATE" => $entity->getDateInsert()->toString(), "ORDER_USER" => $getUserName($entity), "PRICE" => SaleFormatCurrency($entity->getPrice(), $entity->getCurrency()), "BCC" => Main\Config\Option::get("sale", "order_email", "order@" . $request->getServer()->getServerName()), "EMAIL" => $getUserEmail($entity), "ORDER_LIST" => $basketList, "SALE_EMAIL" => Main\Config\Option::get("sale", "order_email", "order@" . $request->getServer()->getServerName()), "DELIVERY_PRICE" => $entity->getDeliveryPrice(), "ORDER_PUBLIC_URL" => Helpers\Order::isAllowGuestView($entity) ? Helpers\Order::getPublicLink($entity) : "" )); return true; } ); |