Добрый день, дамы и господа.
Текущий функционал генерации номера заказа штука прикольная, но для тех кому лень разбираться и еще затратная на время.
Я вам собрал события и как с ними можно поступать, чтоб получить то, что вы хотите.
Задача: Генерация номера заказа по шаблону:
#Какой то префикс#-#USER_ID#-#Номер заказа пользователя#
Для чего шаблон?
а)красиво
б)Хрен докопаешься,т.е. не собрать инфу по магазину(сколько заказов в сутки к ним приходит, примерную выручку и тд и тп)
в)Проще искать
г)Проще запоминать
Почему именно Такой шаблон?
а)Генерация из случайного набора штука сложная и не интересная в том плане, что пользователь вам будет говорить Latinskie Simvoli, что не всегда есть хорошо...вспоминается сайт "С как доллар".
б)Мы с легкостью видим сколько заказов было оформлено юзером
в)Генерация по дню выдает количество заказов в сутки, даже без элементарных арифметических действий(фу какая гадость)
И тут у людей, которые смотрели все эти шаблоны появится мысль: "Ты дурак? это же есть в коробке!"
Да, в коробке это есть, но оно вот в таком виде
Что попадает по "антипункт" (а), оно не красиво
Перейдем к практике
Ну во первых нужно посмотреть, а как нам добавить наш выбор в список? Для этого Господами из 1С-Битрикс было добавлено событие на страницу настроек модуля sale под названием OnBuildAccountNumberTemplateList
На вход которого приходит ровным счетом ничего, а на выходе массив вида array('CODE'=>'#ваш код#','NAME'=>'Название') Причем в событие можно добавить только 1 тип...мда.
При выборе данные сохраняются в строку настрек модуля, причем для кастомных типов используется только строка с кодом, а для встроенных битриксом, еще сохраняется набор данных(типа параметры генерации шаблона)
COption::SetOptionString("sale", "account_number_template", "#CODE шаблона генерации#";
COption::SetOptionString("sale", "account_number_data", #некое значение#);
Итак, добавляем наш тип генерации шаблона следующим кодом:
После выбора в настройках модуля нам нужно всетаки как то выставлять именно наш шаблон.
Так вот, при вызове метода
CSaleOrder::Add();
вызывается функция генерации нового номера
CSaleOrder::SetAccountNumber($ID);
В котором было найдено уже событие,по обработке генерации
на которое входит ID нового заказа и тип шаблона генерации.
На выходе он просит вернуть значение номера заказа или false,если не нужно генерировать
Все отлично, теперь наш заказ создается в таком виде
Теперь мы столкнулись с тремя трудностями, а имеено с поиском по этим номерам, внешний вид значения в списке заказов и почтовые шаблоны(там идет ORDER_ID).
Поиск заказов:
Так как поиск по этому полю осуществляется по точному совпадению, то всегда менеджеру придется писать туда и префикс и суфикс(2 на скрине выше) и разделители.
Это решается кастомизацией фильтра поиска по заказам.
событие OnOrderListFilter на вход получает текущий массив и на выход должен получить тоже полный массив, потому что он заменяется а не добавляется
Список заказов:
Для этого у нас есть событие OnAdminListDisplay модуля main
Так как у меня в обработке много всего, покажу лишь часть, которая отвечает за номер заказа
В заключении хотелось бы сказать что в этом ничего сложного нет. Для любителей писать модули в маркет есть небольшое поле для игр.
P.S. Не советую в разделители помещать символы \ / ? & = ато малоли как себя поведет строка браузера
P.S.S. Для тех кто догадается для чего следующие скрины, пирожок лежит на полке.
Текущий функционал генерации номера заказа штука прикольная, но для тех кому лень разбираться и еще затратная на время.
Я вам собрал события и как с ними можно поступать, чтоб получить то, что вы хотите.
Задача: Генерация номера заказа по шаблону:
#Какой то префикс#-#USER_ID#-#Номер заказа пользователя#
Для чего шаблон?
а)красиво
б)Хрен докопаешься,т.е. не собрать инфу по магазину(сколько заказов в сутки к ним приходит, примерную выручку и тд и тп)
в)Проще искать
г)Проще запоминать
Почему именно Такой шаблон?
а)Генерация из случайного набора штука сложная и не интересная в том плане, что пользователь вам будет говорить Latinskie Simvoli, что не всегда есть хорошо...вспоминается сайт "С как доллар".
б)Мы с легкостью видим сколько заказов было оформлено юзером
в)Генерация по дню выдает количество заказов в сутки, даже без элементарных арифметических действий(фу какая гадость)
И тут у людей, которые смотрели все эти шаблоны появится мысль: "Ты дурак? это же есть в коробке!"
Да, в коробке это есть, но оно вот в таком виде
Что попадает по "антипункт" (а), оно не красиво
Перейдем к практике
Ну во первых нужно посмотреть, а как нам добавить наш выбор в список? Для этого Господами из 1С-Битрикс было добавлено событие на страницу настроек модуля sale под названием OnBuildAccountNumberTemplateList
На вход которого приходит ровным счетом ничего, а на выходе массив вида array('CODE'=>'#ваш код#','NAME'=>'Название') Причем в событие можно добавить только 1 тип...мда.
При выборе данные сохраняются в строку настрек модуля, причем для кастомных типов используется только строка с кодом, а для встроенных битриксом, еще сохраняется набор данных(типа параметры генерации шаблона)
COption::SetOptionString("sale", "account_number_template", "#CODE шаблона генерации#";
COption::SetOptionString("sale", "account_number_data", #некое значение#);
Итак, добавляем наш тип генерации шаблона следующим кодом:
AddEventHandler('sale', 'OnBuildAccountNumberTemplateList', 'OnBuildAccountNumberTemplateListHandler'); |
function OnBuildAccountNumberTemplateListHandler(){ return array('CODE'=>'sl_user_id','NAME'=>'ИД Пользователя - Номер заказа'); } |
После выбора в настройках модуля нам нужно всетаки как то выставлять именно наш шаблон.
Так вот, при вызове метода
CSaleOrder::Add();
вызывается функция генерации нового номера
CSaleOrder::SetAccountNumber($ID);
В котором было найдено уже событие,по обработке генерации
на которое входит ID нового заказа и тип шаблона генерации.
На выходе он просит вернуть значение номера заказа или false,если не нужно генерировать
function OnBeforeOrderAccountNumberSetHandler($ID,$type){ global $USER; if($type=='sl_user_id'){ if(CModule::IncludeModule('sale') && $ID>0){ $arOrder = CSaleOrder::GetByID($ID); if(!empty($arOrder)){ $cntOrders = CSaleOrder::GetList(array(),array('USER_ID'=>$arOrder['USER_ID']),array(),false); if($cntOrders>0){ $newOrder = 'SL-'.$arOrder['USER_ID'].'-'.$cntOrders; return $newOrder; } } } } } |
Все отлично, теперь наш заказ создается в таком виде
Теперь мы столкнулись с тремя трудностями, а имеено с поиском по этим номерам, внешний вид значения в списке заказов и почтовые шаблоны(там идет ORDER_ID).
Поиск заказов:
Так как поиск по этому полю осуществляется по точному совпадению, то всегда менеджеру придется писать туда и префикс и суфикс(2 на скрине выше) и разделители.
Это решается кастомизацией фильтра поиска по заказам.
событие OnOrderListFilter на вход получает текущий массив и на выход должен получить тоже полный массив, потому что он заменяется а не добавляется
AddEventHandler("sale", "OnOrderListFilter", "OnOrderListFilterHandler"); function OnOrderListFilterHandler($arFilterTmp){ if(isset($arFilterTmp['%NAME_SEARCH']) && intval($arFilterTmp['%NAME_SEARCH'])>0){ $arFilterTmp['USER_ID'] = intval($arFilterTmp['%NAME_SEARCH']); unset($arFilterTmp['%NAME_SEARCH']); } if(isset($arFilterTmp['ACCOUNT_NUMBER'])){ $arFilterTmp['%ACCOUNT_NUMBER'] = $arFilterTmp['ACCOUNT_NUMBER']; unset($arFilterTmp['ACCOUNT_NUMBER']); } return $arFilterTmp; } |
Список заказов:
Для этого у нас есть событие OnAdminListDisplay модуля main
Так как у меня в обработке много всего, покажу лишь часть, которая отвечает за номер заказа
if($list->table_id=='tbl_sale_order'){ foreach($list->aRows as &$arRow){ if(!isset($arRow->aFields['ACCOUNT_NUMBER'])){ $link = $arRow->link; $number = $arRow->arRes['ACCOUNT_NUMBER']; $arRow->aFields['ACCOUNT_NUMBER'] = array( 'view'=>array( 'type'=>'html', 'value'=>'<table><tr><td><img hspace="4" src="/bitrix/images/sale/'.$arRow->arRes['LOCK_STATUS'].'.gif"></td><td><a title="Посмотреть подробную информацию о заказе" href="'.$link.'"><b>'.$number.'</b></a></td></tr></table>', ), ); } } } |
В заключении хотелось бы сказать что в этом ничего сложного нет. Для любителей писать модули в маркет есть небольшое поле для игр.
P.S. Не советую в разделители помещать символы \ / ? & = ато малоли как себя поведет строка браузера
P.S.S. Для тех кто догадается для чего следующие скрины, пирожок лежит на полке.