Декабрь 19, 2019
Теги: Магазин
Отправка уведомлений магазина: сообщений о новом заказе, оплате и других.
Хотя сообщение о новом заказе отправляется пользователю автоматически, иногда необходимо отправить его вручную, например, при оплате заказа, если при создании заказа мы это сообщение отменили с помощью событий. Сделать это короткими методами, к сожалению, нельзя система разрешает отправлять его только для новых заказов.
Класс для отправки сообщения о новом заказе:
<?
namespace Partner;
class SaleNotifyCustom
{
function sendOrderNew(\Bitrix\Sale\Order $order)
{
$basketList = '';
/** @var Basket $basket */
$basket = $order->getBasket();
if ($basket)
{
$basketTextList = $basket->getListOfFormatText();
if (!empty($basketTextList))
{
foreach ($basketTextList as $basketItemCode => $basketItemData)
{
$basketList .= $basketItemData.$separator;
}
}
}
$fields = Array(
"ORDER_ID" => $order->getField("ACCOUNT_NUMBER"),
"ORDER_REAL_ID" => $order->getField("ID"),
"ORDER_ACCOUNT_NUMBER_ENCODE" => urlencode(urlencode($order->getField("ACCOUNT_NUMBER"))),
"ORDER_DATE" => $order->getDateInsert()->toString(),
"ORDER_USER" => self::getUserName($order),
"PRICE" => \SaleFormatCurrency($order->getPrice(), $order->getCurrency()),
"BCC" => \Bitrix\Main\Config\Option::get("sale", "order_email", "order@".$_SERVER["SERVER_NAME"]),
"EMAIL" => self::getUserEmail($order),
"ORDER_LIST" => $basketList,
"SALE_EMAIL" => \Bitrix\Main\Config\Option::get("sale", "order_email", "order@".$_SERVER["SERVER_NAME"]),
"DELIVERY_PRICE" => $order->getDeliveryPrice(),
"ORDER_PUBLIC_URL" => \Bitrix\Sale\Helpers\Order::isAllowGuestView($order) ? \Bitrix\Sale\Helpers\Order::getPublicLink($order) : ""
);
$send = true;
foreach(\GetModuleEvents("sale", \Bitrix\Sale\Notify::EVENT_ON_ORDER_NEW_SEND_EMAIL, true) as $oldEvent)
{
if (ExecuteModuleEventEx($oldEvent, array($order->getId(), &$eventName, &$fields)) === false)
{
$send = false;
}
}
$siteData = \Bitrix\Main\SiteTable::GetById($order->getSiteId())->fetch();
if($send)
{
$event = new \CEvent;
$event->Send('SALE_NEW_ORDER', $order->getField('LID'), $fields, "Y", "", array(),$siteData['LANGUAGE_ID']);
}
}
function getUserEmail(\Bitrix\Sale\Order $order)
{
/** @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;
}
function getUserName(\Bitrix\Sale\Order $order)
{
/** @var PropertyValueCollection $propertyCollection */
if ($propertyCollection = $order->getPropertyCollection())
{
if ($propPayerName = $propertyCollection->getPayerName())
{
$userName = $propPayerName->getValue();
}
}
if (empty($userName))
{
$userRes = \Bitrix\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;
}
}
Использование (в переменной $order должен быть объект заказа):
Отправка сообщения об отмене заказа (отправить можно, только если заказ действительно отменен и только один раз, поэтому использовать в таком виде его вряд ли получится, но можно взять исходный код):
Отправка сообщения о том, что заказ оплачен (аналогично предыдущему методу):