- Модуль: forum
- Путь к файлу: ~/bitrix/modules/forum/lib/integration/search/topic.php
- Класс: BitrixForumIntegrationSearchTopic
- Вызов: Topic::execute
function execute(array &$option)
{
$storedInformation = MainConfigOption::get('forum', 'search.reindex.topic', '');
$topicsToReindex = [];
if (
!empty($storedInformation)
&& ($topics = unserialize($storedInformation, ['allowed_classes' => false]))
&& is_array($topics)
)
{
$topicsToReindex = $topics;
}
if (empty($topicsToReindex) || !MainLoader::includeModule('search'))
{
return self::FINISH_EXECUTION;
}
$state = reset($topicsToReindex);
$topicId = $state['id'] ?? key($topicsToReindex);
$result = self::FINISH_EXECUTION;
if (is_array($state) && $topicId > 0)
{
$state['reindexFirst'] = ($state['reindexFirst'] ?? false) === true;
if ($state['reindexFirst'] === true)
{
if (
($dbRes = CForumMessage::GetList(
['ID' => 'ASC'],
[
'TOPIC_ID' => $topicId,
'NEW_TOPIC' => 'Y',
'GET_TOPIC_INFO' => 'Y',
'GET_FORUM_INFO' => 'Y',
'FILTER' => 'Y'
]
))
&& ($message = $dbRes->fetch())
)
{
CForumMessage::Reindex($message['ID'], $message);
}
}
else
{
$state['LAST_ID'] = (int) ($state['LAST_ID'] ?? 0);
if ($state['LAST_ID'] <= 0)
{
CSearch::DeleteIndex('forum', false, false, $topicId);
}
$limit = MainConfigOption::get('forum', 'search_message_count', 20);
$limit = ($limit > 0 ? $limit : 20);
$messages = ForumMessageTable::query()
->setSelect(['*'])
->addFilter('=TOPIC_ID', $topicId)
->addFilter('>ID', $state['LAST_ID'])
->setLimit($limit)
->setOrder(['ID' => 'ASC'])
->exec()
;
if ($message = $messages->fetch())
{
$forum = ForumForum::getById($message['FORUM_ID']);
if ($forum['INDEXATION'] === 'Y')
{
$topic = ForumTopic::getById($message['TOPIC_ID']);
$count = 0;
do
{
$count++;
$message['FORUM_INFO'] = $forum->getData();
$message['TOPIC_INFO'] = $topic->getData();
CForumMessage::Reindex($message['ID'], $message);
$state['LAST_ID'] = $message['ID'];
} while ($message = $messages->fetch());
if ($count >= $limit)
{
$result = self::CONTINUE_EXECUTION;
}
}
}
}
}
if ($result === self::FINISH_EXECUTION)
{
array_shift($topicsToReindex);
}
else
{
$topicsToReindex[$topicId] = $state;
}
$option['steps'] = 1;
$option['count'] = count($topicsToReindex);
if (empty($topicsToReindex))
{
MainConfigOption::delete('forum', ['name' => 'search.reindex.topic']);
return self::FINISH_EXECUTION;
}
MainConfigOption::set('forum', 'search.reindex.topic', serialize($topicsToReindex));
return self::CONTINUE_EXECUTION;
}