Search
Write a publication
Pull to refresh

Bitrix: Расширенное оповещение о новом оформленном заказе

Многие из тех, кто когда либо работал с Bitrix знают, на сколько не полноценнен функционал уведомления о новом заказе на почту пользователя. С чем это связано, мне даже не хотелось думать. Под те условия которые хотел заказчик это совершенно не подходило.
День первый
Долгие и усердные поиски по тому-же форуму нашей cms, никакой конкретики не давали, пока не наткнулся на одну статью в каком-то блоге сейчас даже и не вспомню, может быть ближе к концу статьи.

Там был код примерно следующего вида:
<?
AddEventHandler("sale", "OnOrderAdd", Array("new_order", "OnOrderAdd_mail")); 
class new_order
{ 
function OnOrderAdd_mail($ID, $val)
{
 // Выборка e-mail и username пользователя
 $rsUser = CUser::GetByID($val["USER_ID"]);
 $arUser = $rsUser->Fetch();
 $arUser_name = $arUser["LAST_NAME"]." ".$arUser["NAME"];
 $arUser = $arUser["EMAIL"];
 // Содержимое заказа
$dbBasketItems = CSaleBasket::GetList(
array(
"NAME" => "ASC",
"ID" => "ASC"
),
array(
"FUSER_ID" => CSaleBasket::GetBasketUserID(),
"LID" => SITE_ID,
"DELAY" => "N",
"CAN_BUY" => "Y",
"ORDER_ID" => "NULL"
),
false,
false,
array()
);
$ordelist = "<table style='font-family:Verdana;'>";
$ordelist = $ordelist."<tr><td align='left'><b>Наименование</b></p></td><td align='left'>Цена    </td><td align='left'>Количество    </td><td align='right'>Сумма    </td></tr>";
while ($arItem = $dbBasketItems->Fetch())
{
$st = (int)$arItem["QUANTITY"]*$arItem["PRICE"];
$quantity = (int)$arItem["QUANTITY"];
$ordelist = $ordelist."<tr><td align='left'>"."<b>".$arItem["NAME"]."</b>      </td><td align='left'>".$arItem["PRICE"]." руб.</td><td align='center'>".$quantity." шт.</td><td align='right'>".$st." руб.</td></tr>";
}
$arDeliv = CSaleDelivery::GetByID($val["DELIVERY_ID"]);
$ordelist = $ordelist."</table>";
 $arEventFields = array(
"ORDER_ID" => $ID,
"ORDER_LIST" => $ordelist,
"ORDER_USER" => $arUser_name,
"EMAIL" => $arUser,
"BCC" => $arUser,
"PRICE" => (int)$val["PRICE"]." руб",
"SALE_EMAIL" => "mail@mail.ru",
"ORDER_DATE" => date('m.d.Y'),
);
CEvent::SendImmediate("SALE_NEW_ORDER", s1, $arEventFields, "N", 22);
}
}
?>

Думаю пояснять его не нужно, в нем всё ясно и понятно.

Ну и как обычно это происходит, я не нашел удовлетворения в этих строчках, они всего-лишь выводят список того-что заказал человек.
Стул 2000 руб. 1шт. 2000 руб.
День второй
Продолжаем деятельность
Заказчик бился и кричал что ему этого мало, что он хочет отображения определенного свойства товара, в нашем случае это цвет слула, допустим он в разных цветах:
  • Зеленый
  • Красный
  • Синий


Т.к CSaleBasket::GetList свойства не выдает (поправте если ошибаюсь) пришлось использовать CIBlockElement::GetById.
Выглядело это следующим образом:
$rsElem = CIBlockElement::GetById($arItem["PRODUCT_ID"]); 
$arElem = $rsElem->GetNextElement();
$arProps = $arElem->GetProperties();

Вуаля, print_t($arProps) нам показывает все характеристики товаров которые имеются в заказе.
Осталось лишь подправить 1 строчку:
$ordelist = $ordelist."<tr><td align='left'>"."<b>".$arItem["NAME"]."</b>      </td><td align='left'>".$arItem["PRICE"]." руб.</td><td align='center'>".$quantity." шт.</td><td align='right'>".$st." руб.</td></tr>";

превращаем в:
$ordelist = $ordelist."<tr><td align='left'>"."<b>".$arItem["NAME"]." - ".$arProps["COLORSET"]["VALUE"]."</b>      </td><td align='left'>".$arItem["PRICE"]." руб.</td><td align='center'>".$quantity." шт.</td><td align='right'>".$st." руб.</td></tr>";

где .$arProps[«COLORSET»][«VALUE»]. и есть код нашего свойства.

Осталось во всю эту красоту добавить контактную информацию пользователя и небольшое дополнение из оформления заказа.
Необходимая строчка всегда была у меня под носом
$_SESSION['CURRENT_ORDER'];
Пробуем вывести массив. О радость, $_SESSION возвращает нам всё что необходимо было достать.
Выдернув из него нужные свойства, я добавил в $arEventFields несколько строк/
"ZNAME" => $homes["PROPS"]["ORDER_PROP_21"]["VALUE"], //Имя заказчика
"PHONE" => $homes["PROPS"]["ORDER_PROP_22"]["VALUE"], //Контактный телефон
"LCITY" => "г.".$homes["PROPS"]["ORDER_PROP_25"]["VALUE"], //Страна - Город
"LSTREET" => "ул.".$homes["PROPS"]["ORDER_PROP_26"]["VALUE"], //Улица
"LHOME" => "д.".$homes["PROPS"]["ORDER_PROP_30"]["VALUE"], //Номер дома
"LKORP" => "к.".$homes["PROPS"]["ORDER_PROP_31"]["VALUE"], //Корпус
"LKV" => "кв.".$homes["PROPS"]["ORDER_PROP_32"]["VALUE"], //Квартира
"LFL" => "эт.".$homes["PROPS"]["ORDER_PROP_33"]["VALUE"], //Этаж


В шаблон сообщения, подставив всё в нужном порядке
Имя: #ZNAME#
Телефон: #PHONE#
Адрес: #LCITY# #LSTREET# #LHOME# #LKORP# #LKV# #LFL#
Наконец-то получил почти готовый вариант. Вместо человечески понятного названия города Санкт-Петербург, мы получали непонятное число 615.
Через CSaleLocation::GetByID приводим всё в порядок
$arVal = CSaleLocation::GetByID($homes['PROPS']['ORDER_PROP_25']['VALUE']); 
$locationName = "";
$locationName .= ((strlen($arVal["COUNTRY_NAME"])<=0) ? "" : $arVal["COUNTRY_NAME"]);
if (strlen($arVal["COUNTRY_NAME"])>0 && strlen($arVal["REGION_NAME"])>0)
$locationName .= " - ".$arVal["REGION_NAME"];
elseif (strlen($arVal["REGION_NAME"])>0)
$locationName .= $arVal["REGION_NAME"];
if (strlen($arVal["COUNTRY_NAME"])>0 || strlen($arVal["REGION_NAME"])>0) 
$locationName .= " - ".$arVal["CITY_NAME"];
elseif (strlen($arVal["CITY_NAME"])>0)
$locationName .= $arVal["CITY_NAME"];
$userlocation = $locationName;


Заменяем одну строчку в $arEventFields
с
«LCITY» => «г.».$homes[«PROPS»][«ORDER_PROP_25»][«VALUE»],
на
«LCITY» => $locationName, и радуемся результату.

Вспомним про плюшки о которых я говорил в начале.
При оформлении заказа, пользователю дается возможность выбора, имеется ли в подъезде лифт, домофон или собака. Всё это производится посредством чекбоксов.
Зная что они хранятся в $_SESSION мы их идентифицируем уже знакомым нам способом, а именно в $arEventFields подставляем:
"LLIFT" => $homes["PROPS"]["ORDER_PROP_34"]["VALUE"],
"DOMOF" => $homes["PROPS"]["ORDER_PROP_35"]["VALUE"],
"LDOG" => $homes["PROPS"]["ORDER_PROP_36"]["VALUE"],


Не забываем что чекбоксы нам возвращают либо Y, либо N.
Соответственно в код мы добавляем простейшие условия.
if ($homes["PROPS"]["ORDER_PROP_34"]["VALUE"] == "Y") {
 $homes["PROPS"]["ORDER_PROP_34"]["VALUE"] = "Да";
} else {
 $homes["PROPS"]["ORDER_PROP_34"]["VALUE"] = "Нет";
}
if ($homes["PROPS"]["ORDER_PROP_35"]["VALUE"] == "Y") {
 $homes["PROPS"]["ORDER_PROP_35"]["VALUE"] = "Да";
} else {
 $homes["PROPS"]["ORDER_PROP_35"]["VALUE"] = "Нет";
}
if ($homes["PROPS"]["ORDER_PROP_36"]["VALUE"] == "Y") {
 $homes["PROPS"]["ORDER_PROP_36"]["VALUE"] = "Да";
} else {
 $homes["PROPS"]["ORDER_PROP_36"]["VALUE"] = "Нет";
}


Ну вот на этом кажется и проделана вся работа. Оформляем шаблон письма:
<p style="font-size:20px;font-weight:100;font-family:Verdana;">Уважаемый клиент</p>

<p style="font-weight:100;font-size:14px;font-family:Verdana;"">Благодарим за заказ в Магазине Мебели Он-лайн.
В настоящий момент Ваш заказ обрабатывается. 
Наш оператор свяжется с Вами в течении часа, если Вы успели заказать с 9-00 до 22-00. Если позже, не тревожьтесь, наш менеджер свяжется с Вами с 9-00 до 11-00.</p>
<br/><br/>
<p style="color:#000;font-size:16px;font-weight:100;font-family:Verdana;"">Ваш заказ №#ORDER_ID# от #ORDER_DATE#</p>
#ORDER_LIST#
________________________<br/>
<p style="font-size:14px;font-weight:100;font-family:Verdana;"">Общая сумма заказа: <b>#PRICE#</b></p>

<br/>
<br/>
<span style="font-size:14px;font-weight:100;font-family:Verdana">Контактная информация:<br/>
Имя: #ZNAME#<br/>
Телефон: #PHONE#<br/>
Адрес: #LCITY# #LSTREET# #LHOME# #LKORP# #LKV# #LFL#<br/><br/>
Дополнительно:<br/>
Лифт: #LLIFT#<br/>
Домофон: #DOMOF#<br/>
Собака: #LDOG#</span><br/>
________________________
<br/>
<p style="font-size:14px;font-family:Verdana;"">С уважением, Магазин Мебели Он-лайн <b>+7(812)888-88-88</b></p>
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.