Задача тривиальная и решений у нее много. В основном все "по старинке" дергают событие поступления почтового события и в нем что-то делают с массивом письма шаблона (дописывают недостающие и/или модифицируют имеющиеся).
Я набросал решение с класса , который не особо документирован, но с него накопировал кода под заполнение плейсхолдеров, как в шаблоне SALE_NEW_ORDER.
Ниже код, как пример использования, собрал на "быструю руку":
— разработка, поддержка и сопровождение интернет-проектов
Я набросал решение с класса , который не особо документирован, но с него накопировал кода под заполнение плейсхолдеров, как в шаблоне SALE_NEW_ORDER.
Ниже код, как пример использования, собрал на "быструю руку":
// 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;
}
);
|
— разработка, поддержка и сопровождение интернет-проектов