Доброго времени суток,
Сотрудники тех. поддержки часто испытывают проблему с долгим поиском по большому числу старых обращений, поступивших в ТП (например хочется найти свой ответ на какую-либо типовую проблему или что-то в этом духе). Модуль 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 вызывается также и при переиндексации сайта, т.е. можно всегда держать базу обращений в актуальном состоянии.