Доброго времени суток,
Сотрудники тех. поддержки часто испытывают проблему с долгим поиском по большому числу старых обращений, поступивших в ТП (например хочется найти свой ответ на какую-либо типовую проблему или что-то в этом духе). Модуль support формирует довольно тяжелые запросы, из-за большого количества записей в БД, фильтров и сортировок, выполнение этих запросов сказывается на общей производительности сайта.[spoiler]
Считаю, что оптимальным решением проблемы будет переложить задачу поиска с модуля "Тех. поддержка" на модуль "Поиск". Обусловлено это тем, что поиск будет идти всегда по индексам, доступен морфологический разбор, логика при поиске и другие вкусности.
Решать задачу будет следующий код (вставляем в init.php):
Задача решается обработкой события OnReindex модуля "Поиск" и относительно новых событий OnAfterTicketAdd, OnAfterTicketUpdate, OnTicketDelete модуля "Тех. поддержка".
Теперь немного подробнее о тонкостях...
Думаю каждый для себя определит, куда должна вести ссылка на обращение с компонента поиска.
Узнал, что в событие OnAfterTicketUpdate не передаётся ни ID добавленного сообщения, ни ID текущего обращения, поэтому пришлось вставить небольшой хак, который имеет право на жизнь на стандартных компонентах и в админке.
Вроде всё:
Всем пока.
UPD. Событие OnReindex вызывается также и при переиндексации сайта, т.е. можно всегда держать базу обращений в актуальном состоянии.
Сотрудники тех. поддержки часто испытывают проблему с долгим поиском по большому числу старых обращений, поступивших в ТП (например хочется найти свой ответ на какую-либо типовую проблему или что-то в этом духе). Модуль support формирует довольно тяжелые запросы, из-за большого количества записей в БД, фильтров и сортировок, выполнение этих запросов сказывается на общей производительности сайта.[spoiler]
Считаю, что оптимальным решением проблемы будет переложить задачу поиска с модуля "Тех. поддержка" на модуль "Поиск". Обусловлено это тем, что поиск будет идти всегда по индексам, доступен морфологический разбор, логика при поиске и другие вкусности.
Решать задачу будет следующий код (вставляем в init.php):
<? AddEventHandler("support", "OnAfterTicketAdd", Array("CSupportSearch", "OnAfterTicketAddHandler")); AddEventHandler("support", "OnAfterTicketUpdate", Array("CSupportSearch", "OnAfterTicketAddHandler")); AddEventHandler("support", "OnTicketDelete", Array("CSupportSearch", "OnTicketDelete")); RegisterModuleDependences("search", "OnReindex", "support", "CSupportSearch", "OnReindex"); class CSupportSearch { function OnTicketDelete (&$fields) { if (CModule::IncludeModule("search")) { $db_res = CTicket::GetMessageList (($by = 's_id'), ($order = 'desc'), array("TICKET_ID"=>$fields), ($is_filtered = false) , "N"); while($ar_res = $db_res->Fetch()) if ($ar_res["IS_LOG"] == 'N') { CSearch::DeleteIndex("support", $ar_res["ID"]); } } } function OnAfterTicketAddHandler (&$fields) { if ($fields["ID"] == "") $fields["ID"] = $_POST["ID"]; if (CModule::IncludeModule("search")) { $db_res = CTicket::GetMessageList (($by = 's_id'), ($order = 'desc'), array("TICKET_ID"=>$fields["ID"]), ($is_filtered = false) , "N"); while($ar_res = $db_res->Fetch()) { if ($ar_res["IS_LOG"] == 'N') { $cur_site = CSite::GetDefSite(); //$url = COption::GetOptionString("support", "SUPPORT_DIR").COption::GetOptionString("support", "SUPPORT_EDIT")."?ID=".$fields["ID"]; $url = "/bitrix/admin/ticket_edit.php?ID=".$fields["ID"]; $title = $fields["TITLE"]; if ($title == "") { $db_ticket = CTicket::GetByID($ar_res["TICKET_ID"]); if($ar_ticket = $db_ticket->Fetch()) $title = $ar_ticket["TITLE"]; } $Result = array( "ID" => $ar_res["ID"], "SITE_ID" => $cur_site, "DATE_CHANGE" => $ar_res["TIMESTAMP_X"], "URL" => $url, "PERMISSIONS" => array_merge(CTicket::GetAdminGroups(), CTicket::GetSupportTeamGroups()), "TITLE" => $title, "BODY" => $ar_res["MESSAGE"], "PARAM1" => $fields["ID"], "PARAM2" => $ar_res["ID"], ); CSearch::Index("support", $ar_res["ID"], $Result); } } } } function OnReindex ($NS, $oCallback, $callback_method) { if (CModule::IncludeModule("support")) { $db_res = CTicket::GetMessageList (($by = 's_id'), ($order = 'desc'), array(), ($is_filtered = false) , "N"); while($ar_res = $db_res->Fetch()) { if ($ar_res["IS_LOG"] == 'N') { $db_ticket = CTicket::GetByID($ar_res["TICKET_ID"]); if($ar_ticket = $db_ticket->Fetch()) $title = $ar_ticket["TITLE"]; $cur_site = CSite::GetDefSite(); //$url = COption::GetOptionString("support", "SUPPORT_DIR").COption::GetOptionString("support", "SUPPORT_EDIT")."?ID=".$ar_ticket["ID"]; $url = "/bitrix/admin/ticket_edit.php?ID=".$ar_ticket["ID"]; $Result = array( "ID" => $ar_res["ID"], "SITE_ID" => $cur_site, "DATE_CHANGE" => $ar_res["TIMESTAMP_X"], "URL" => $url, "PERMISSIONS" => array_merge(CTicket::GetAdminGroups(), CTicket::GetSupportTeamGroups()), "TITLE" => $title, "BODY" => $ar_res["MESSAGE"], "PARAM1" => $ar_res["TICKET_ID"], "PARAM2" => $ar_res["ID"], ); $index_res = call_user_func(array($oCallback, $callback_method), $Result); if(!$index_res) return $Result["ID"]; } } } return false; } } ?> |
Задача решается обработкой события OnReindex модуля "Поиск" и относительно новых событий OnAfterTicketAdd, OnAfterTicketUpdate, OnTicketDelete модуля "Тех. поддержка".
Теперь немного подробнее о тонкостях...
//$url = COption::GetOptionString("support", "SUPPORT_DIR").COption::GetOptionString("support", "SUPPORT_EDIT")."?ID=".$fields["ID"]; $url = "/bitrix/admin/ticket_edit.php?ID=".$fields["ID"]; |
Думаю каждый для себя определит, куда должна вести ссылка на обращение с компонента поиска.
function OnAfterTicketAddHandler (&$fields) { if ($fields["ID"] == "") $fields["ID"] = $_POST["ID"]; |
Узнал, что в событие OnAfterTicketUpdate не передаётся ни ID добавленного сообщения, ни ID текущего обращения, поэтому пришлось вставить небольшой хак, который имеет право на жизнь на стандартных компонентах и в админке.
Вроде всё:
Всем пока.
UPD. Событие OnReindex вызывается также и при переиндексации сайта, т.е. можно всегда держать базу обращений в актуальном состоянии.