Многие из тех, кто когда либо работал с Bitrix знают, на сколько не полноценнен функционал уведомления о новом заказе на почту пользователя. С чем это связано, мне даже не хотелось думать. Под те условия которые хотел заказчик это совершенно не подходило.
День первый
Долгие и усердные поиски по тому-же форуму нашей cms, никакой конкретики не давали, пока не наткнулся на одну статью в каком-то блоге сейчас даже и не вспомню,может быть ближе к концу статьи.
Там был код примерно следующего вида:
Думаю пояснять его не нужно, в нем всё ясно и понятно.
Ну и как обычно это происходит, я не нашел удовлетворения в этих строчках, они всего-лишь выводят список того-что заказал человек.
Стул 2000 руб. 1шт. 2000 руб.
День второй
Продолжаем деятельность
Заказчик бился и кричал что ему этого мало, что он хочет отображения определенного свойства товара, в нашем случае это цвет слула, допустим он в разных цветах:
Т.к CSaleBasket::GetList свойства не выдает (поправте если ошибаюсь) пришлось использовать CIBlockElement::GetById.
Выглядело это следующим образом:
Вуаля, print_t($arProps) нам показывает все характеристики товаров которые имеются в заказе.
Осталось лишь подправить 1 строчку:
превращаем в:
где .$arProps[«COLORSET»][«VALUE»]. и есть код нашего свойства.
Осталось во всю эту красоту добавить контактную информацию пользователя и небольшое дополнение из оформления заказа.
Необходимая строчка всегда была у меня под носом
$_SESSION['CURRENT_ORDER'];
Пробуем вывести массив. О радость, $_SESSION возвращает нам всё что необходимо было достать.
Выдернув из него нужные свойства, я добавил в $arEventFields несколько строк/
В шаблон сообщения, подставив всё в нужном порядке
Имя: #ZNAME#
Телефон: #PHONE#
Адрес: #LCITY# #LSTREET# #LHOME# #LKORP# #LKV# #LFL#
Наконец-то получил почти готовый вариант. Вместо человечески понятного названия города Санкт-Петербург, мы получали непонятное число 615.
Через CSaleLocation::GetByID приводим всё в порядок
Заменяем одну строчку в $arEventFields
с
«LCITY» => «г.».$homes[«PROPS»][«ORDER_PROP_25»][«VALUE»],
на
«LCITY» => $locationName, и радуемся результату.
Вспомним про плюшки о которых я говорил в начале.
При оформлении заказа, пользователю дается возможность выбора, имеется ли в подъезде лифт, домофон или собака. Всё это производится посредством чекбоксов.
Зная что они хранятся в $_SESSION мы их идентифицируем уже знакомым нам способом, а именно в $arEventFields подставляем:
Не забываем что чекбоксы нам возвращают либо Y, либо N.
Соответственно в код мы добавляем простейшие условия.
Ну вот на этом кажется и проделана вся работа. Оформляем шаблон письма:
День первый
Долгие и усердные поиски по тому-же форуму нашей 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>