Отправка письма заказа повешено на обработчик OnOrderNewSendEmail .
В шаблоне письма было поле ORDER_LIST. Его и перезапишем. Весь этот код вставляется в init.php
Функция getStrOrderById($ORDER_ID) собирает все данные о заказе в строку и заменяет стандартный ORDER_LIST в письме.
Собранные данные
-товары с количество и суммами
— данные о доставке
-данные о оплате
— поля заполенные пользователем
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
AddEventHandler("sale", "OnOrderNewSendEmail", "bxModifySaleMails"); function bxModifySaleMails($orderID, &$eventName, &$arFields) { if(CModule::IncludeModule("sale") && CModule::IncludeModule("iblock")) { $strOrderList = ""; $arFields["ORDER_LIST"] = getStrOrderById($orderID); } return true; } function getStrOrderById($ORDER_ID){ if(CModule::IncludeModule("sale") && CModule::IncludeModule("iblock")){ $res = CSaleBasket::GetList(array(), array("ORDER_ID" => $ORDER_ID)); // ID заказа $mass=array(); while ($arItem = $res->Fetch()) {// var_dump($arItem); $IBLOCK_ID=19; $PRODUCT_ID=$arItem['PRODUCT_ID']; if (CModule::IncludeModule("iblock")) { $db_props = CIBlockElement::GetProperty($IBLOCK_ID, $PRODUCT_ID, Array("sort"=>"asc"), Array("CODE"=>"CML2_ARTICLE","CODE"=>"CML2_ARTICLE")); if($ar_props = $db_props->Fetch()) $CML2_ARTICLE= $ar_props["VALUE"]; $db_props = CIBlockElement::GetProperty($IBLOCK_ID, $PRODUCT_ID, Array("sort"=>"asc"), Array("CODE"=>"CML2_ARTICLE","CODE"=>"CML2_VENDOR")); if($ar_props = $db_props->Fetch()) $CML2_VENDOR= $ar_props["VALUE"]; } if ($CML2_VENDOR == ""){ $CML2_VENDOR = "Викинг"; } $mass[] = array( 'name' => $arItem['NAME'], 'id' => $arItem['PRODUCT_ID'], 'price' => round($arItem['PRICE'],2), 'price_show' => SaleFormatCurrency($arItem["PRICE"], $arItem["CURRENCY"]),//эта цена для отображения 'price_full' => $arItem['PRICE']*$arItem['QUANTITY'], 'price_full_show' =>SaleFormatCurrency($arItem['PRICE']*$arItem['QUANTITY'], $arItem["CURRENCY"]) ,//эта цена для отображения 'quantity' => round($arItem['QUANTITY'],2), 'CURRENCY' => $arItem["CURRENCY"], 'vendor' => $CML2_VENDOR, 'art' => $CML2_ARTICLE, ); // debug( $arItem["CURRENCY"]); } //строка $css_td=' style="padding-right:6px; border:1px solid #ccc;" '; $str_show="<table><tr><td $css_td>Артикул </td><td $css_td>Имя </td><td $css_td>Количество </td><td $css_td>Цена </td><td $css_td>Сумма </td><td $css_td>Производитель </td></tr>"; $summ=0; foreach ($mass as $v){ $str_show.='<tr>'; $str_show.="<td $css_td>".$v["art"]."</td><td $css_td>".$v["name"]."</td><td $css_td>".$v["quantity"]." шт. </td><td $css_td>".$v["price_show"]." </td><td $css_td>".$v["price_full_show"]."</td><td $css_td>".$v["vendor"]."</td>"; $summ+=$v['price_full']; $str_show.='</tr>'; } $str_show.='</table>'; $str_show.='Сумма без учета доставки: '.SaleFormatCurrency($summ, 'RUB').' <br/><br/>'; //Общаяя сумма заказа (можно получить и дополнительные данные) if ($arOrder = CSaleOrder::GetByID($ORDER_ID)){ // $PRICE= $arOrder['PRICE']; $USER_DESCRIPTION=$arOrder['USER_DESCRIPTION']; $DELIVERY_ID=$arOrder['DELIVERY_ID']; $PAY_SYSTEM_ID=$arOrder['PAY_SYSTEM_ID']; } //выбираем свойства заказа $dbOrderProps = CSaleOrderPropsValue::GetList( array("SORT" => "ASC"), array("ORDER_ID" => $ORDER_ID, "CODE"=>array("FIO", "PHONE","PHONE2","EMAIL","ADDRESS")) ); while ($arOrderProps = $dbOrderProps->GetNext()): $str_show.=$arOrderProps['NAME'].': '.$arOrderProps['VALUE'].'<br>'; endwhile; $str_show.='<br/>Комментарий:<br/>'.$USER_DESCRIPTION.'<br/>'; $PAY=CSalePaySystem::GetByID($PAY_SYSTEM_ID); $str_show.='<br/>Тип оплаты: '.$PAY['NAME'].' ('.$PAY['DESCRIPTION'].')<br/>'; // получаем данные о доставке по id способоа доставки $DELIVERY=CSaleDelivery::GetByID($DELIVERY_ID); $str_show.='<br/>Тип доставки: '.$DELIVERY['NAME'].'<br/>'; $str_show.='<br/>Цена доставки: '.$DELIVERY['PRICE'].' руб.<br/>'; $DELIVERY['DESCRIPTION']=str_replace("<br>", "",$DELIVERY['DESCRIPTION'] ); $DELIVERY['DESCRIPTION']=str_replace("<br />", "",$DELIVERY['DESCRIPTION'] ); $DELIVERY['DESCRIPTION']=str_replace("<br/>", "",$DELIVERY['DESCRIPTION'] ); $str_show.='<br/>Описание доставки:<br/>'.$DELIVERY['DESCRIPTION'].'<br/>'; $str_show.='<br/>Срок доставки: от '.$DELIVERY['PERIOD_FROM'].' до '.$DELIVERY['PERIOD_TO'].' дней<br/>'; return $str_show; } |
если нам нужны различные поля, мы их делаем таким образом
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 |
AddEventHandler("sale", "OnOrderNewSendEmail", "bxModifySaleMails"); function bxModifySaleMails($orderID, &$eventName, &$arFields) { if(CModule::IncludeModule("sale") && CModule::IncludeModule("iblock")) { $mass=getStrOrderById2($orderID); foreach ($mass as $key=>$val){ $arFields[$key]=$val; } } return true; } function getStrOrderById2($ORDER_ID){ $ret=array(); if(CModule::IncludeModule("sale") && CModule::IncludeModule("iblock")){ $res = CSaleBasket::GetList(array(), array("ORDER_ID" => $ORDER_ID)); // ID заказа $mass=array(); while ($arItem = $res->Fetch()) {// var_dump($arItem); $IBLOCK_ID=19; $PRODUCT_ID=$arItem['PRODUCT_ID']; if (CModule::IncludeModule("iblock")) { $db_props = CIBlockElement::GetProperty($IBLOCK_ID, $PRODUCT_ID, Array("sort"=>"asc"), Array("CODE"=>"CML2_ARTICLE","CODE"=>"CML2_ARTICLE")); if($ar_props = $db_props->Fetch()) $CML2_ARTICLE= $ar_props["VALUE"]; $db_props = CIBlockElement::GetProperty($IBLOCK_ID, $PRODUCT_ID, Array("sort"=>"asc"), Array("CODE"=>"CML2_ARTICLE","CODE"=>"CML2_VENDOR")); if($ar_props = $db_props->Fetch()) $CML2_VENDOR= $ar_props["VALUE"]; } if ($CML2_VENDOR == ""){ $CML2_VENDOR = "Викинг"; } $mass[] = array( 'name' => $arItem['NAME'], 'id' => $arItem['PRODUCT_ID'], 'price' => round($arItem['PRICE'],2), 'price_show' => SaleFormatCurrency($arItem["PRICE"], $arItem["CURRENCY"]),//эта цена для отображения 'price_full' => $arItem['PRICE']*$arItem['QUANTITY'], 'price_full_show' =>SaleFormatCurrency($arItem['PRICE']*$arItem['QUANTITY'], $arItem["CURRENCY"]) ,//эта цена для отображения 'quantity' => round($arItem['QUANTITY'],2), 'CURRENCY' => $arItem["CURRENCY"], 'vendor' => $CML2_VENDOR, 'art' => $CML2_ARTICLE, ); // debug( $arItem["CURRENCY"]); } //строка $css_td=' style="padding-right:6px; border:1px solid #ccc;" '; $str_show="<table><tr><td $css_td>Артикул </td><td $css_td>Имя </td><td $css_td>Количество </td><td $css_td>Цена </td><td $css_td>Сумма </td><td $css_td>Производитель </td></tr>"; $summ=0; foreach ($mass as $v){ $str_show.='<tr>'; $str_show.="<td $css_td>".$v["art"]."</td><td $css_td>".$v["name"]."</td><td $css_td>".$v["quantity"]." шт. </td><td $css_td>".$v["price_show"]." </td><td $css_td>".$v["price_full_show"]."</td><td $css_td>".$v["vendor"]."</td>"; $summ+=$v['price_full']; $str_show.='</tr>'; } $str_show.='</table>'; $ret['ORDER_LIST']=$str_show; unset($str_show); //сумма без учета доставки $ret['PRICE_WITHOUT_DELIVERY']=SaleFormatCurrency($summ, 'RUB'); // $str_show='Сумма без учета доставки: '.SaleFormatCurrency($summ, 'RUB').' <br/><br/>'; //Общаяя сумма заказа (можно получить и дополнительные данные) if ($arOrder = CSaleOrder::GetByID($ORDER_ID)){ // $PRICE= $arOrder['PRICE']; $USER_DESCRIPTION=$arOrder['USER_DESCRIPTION']; $DELIVERY_ID=$arOrder['DELIVERY_ID']; $PAY_SYSTEM_ID=$arOrder['PAY_SYSTEM_ID']; } //выбираем свойства заказа $dbOrderProps = CSaleOrderPropsValue::GetList( array("SORT" => "ASC"), array("ORDER_ID" => $ORDER_ID, "CODE"=>array("FIO", "PHONE","PHONE2","EMAIL","ADDRESS")) ); while ($arOrderProps = $dbOrderProps->GetNext()): $str_show.=$arOrderProps['NAME'].': '.$arOrderProps['VALUE'].'<br>'; $ret[ $arOrderProps['CODE'].'_FIELD']=$arOrderProps['VALUE']; endwhile; $ret['USER_DESCRIPTION']=$USER_DESCRIPTION; $PAY=CSalePaySystem::GetByID($PAY_SYSTEM_ID); $ret['TYPE_PAY']=$PAY['NAME'].' ('.$PAY['DESCRIPTION'].')'; // получаем данные о доставке по id способоа доставки $DELIVERY=CSaleDelivery::GetByID($DELIVERY_ID); $ret['TYPE_DELIVERY']=$DELIVERY['NAME']; $ret['PRICE_DELIVERY']=SaleFormatCurrency($DELIVERY['PRICE'], 'RUB'); $DELIVERY['DESCRIPTION']=str_replace("<br>", "",$DELIVERY['DESCRIPTION'] ); $DELIVERY['DESCRIPTION']=str_replace("<br />", "",$DELIVERY['DESCRIPTION'] ); $DELIVERY['DESCRIPTION']=str_replace("<br/>", "",$DELIVERY['DESCRIPTION'] ); $ret['DESCRIPTION_DELIVERY']=$DELIVERY['DESCRIPTION']; $ret['TIME_DELIVERY']='от '.$DELIVERY['PERIOD_FROM'].' до '.$DELIVERY['PERIOD_TO'].' дней';; return $ret; } } |
Ключевым моментом является , у нас заполенине изменение по ключу новыми данными.
1 2 3 4 |
$mass=getStrOrderById2($orderID); foreach ($mass as $key=>$val){ $arFields[$key]=$val; } |
не забудьте вставить вот такое описание в почтовое событие, иначе массив не будет наполнен значениями. и в почтовых шаблонах эти значения не отобразятся
это в описание (и в ru и в en)
1 2 3 4 5 6 7 8 9 10 11 12 |
#PRICE_WITHOUT_DELIVERY# - Сумма без учета доставки #FIO_FIELD# - Ф.И.О #EMAIL_FIELD# - E-Mail #PHONE_FIELD# - Телефон #ADDRESS_FIELD# - Адрес доставки #PHONE2_FIELD# - Телефон 2 #USER_DESCRIPTION# - Комментарий #TYPE_PAY# - Тип оплаты #TYPE_DELIVERY# - Тип доставки #PRICE_DELIVERY# - Цена доставки #DESCRIPTION_DELIVERY# - Описание доставки #TIME_DELIVERY# - Срок доставки |
это в почтовый шаблон ( в html код)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Cостав заказа - #ORDER_LIST# <br/> Сумма без учета доставки: #PRICE_WITHOUT_DELIVERY# <br/><br/> Ф.И.О : #FIO_FIELD#<br/> E-Mail #EMAIL_FIELD#<br/> Телефон #PHONE_FIELD#<br/> Адрес доставки #ADDRESS_FIELD#<br/> Телефон 2 #PHONE2_FIELD#<br/> Комментарий:<br/>#USER_DESCRIPTION#<br/> Тип оплаты: #TYPE_PAY# <br/> Тип доставки: #TYPE_DELIVERY#<br/> Цена доставки: #PRICE_DELIVERY#<br/> Описание доставки: #DESCRIPTION_DELIVERY#<br/> Срок доставки: #TIME_DELIVERY# <br/> |