с позволения Алг выкладываю все правки (
доработка Алг) для штатного мода поиска.
исправлено:
- поиск выполняется по всему списку тем без ограничений
- отображается максимум N строк (20 - задается опционально) из списка найденных тем
- задается ширина списка поисковой выборки (600px - опционально)
- к названию темы добавлено название форума, где хранится тема
- исправлена ссылка открываемой из поиска темы с ID-темы до общефорумного ID-форума,ID-темы
- исправлена ссылка на темы, а которвх присутствует знак "|"
- поиск внутри форума осуществляется по всем темам данного форума, вклюяая его подфорумы любого уровня вложенности
- результаты поиска отсортированы так, что в начале идут темы, начинающиеся с введённой лексемы, затем все остальные в алфавитном порядке
- включен фикс для перенесённых тем от vulkan3
[BETA] Search Topic JQAutocomplete (ссылки и темы присутствуют в поисковой выборке, т.е. дублирование остается, но переход по ссылкам выполняется корректно, в нужную тему)...
для приведенного ниже кода (после его установки) можно доработать фикс от vulkan3 кодом от АЛГ, который исключает ссылки на темы из поисковой выборки, т.е. дублирование ссылок и тем отсутствует - я использую этот вариант.
напоминаю о необходимости создания резервных копий редактируемых файлов!
в файле js/search_topic.js
1 - найти
добавить перед
Код: Выделить всё
sortResults:false,
width: 600,
maxItemsToShow:20,
2 - найти
заменить на
3 - найти
Код: Выделить всё
goto_topic = function()
{
var id = $("#live_search_id").val();
//$("#live_search").removeClass("search");
//$("#live_search").addClass("loader");
//$("#live_search").attr("disabled", 'disabled');
if(id)
{
window.location.href = url_topic+"?t="+id;
}
заменить на
Код: Выделить всё
goto_topic = function(item)
{
var t = item.data[0];
var f = item.data[1];
if(t)
{
window.location.href = url_topic+"?f=" + f + "&t="+ t;
}
В файле ajax/vajax.php
1 - найти
Код: Выделить всё
else
{
$sql_where = ' AND UPPER(t.topic_title) ' . $db->sql_like_expression($db->any_char . $q . $db->any_char);
$sql_approved = 'AND t.topic_approved = 1';
$sql_forum = ($forum_id) ? 'AND t.forum_id = ' . $forum_id : '';
$sql = "SELECT t.topic_id, t.topic_title
FROM " . TOPICS_TABLE . " t
WHERE t.topic_type IN (" . POST_NORMAL . ', ' . POST_STICKY . ")
$sql_where
$sql_approved
$sql_forum
ORDER BY topic_title";
$result = $db->sql_query_limit($sql,$config['search_topic_num']);
$topic_list = array();
while ($row = $db->sql_fetchrow($result))
{
$topic_id = (int)$row['topic_id'];
$topic_list[$row['topic_title']] = $topic_id;
if (strpos(utf8_strtoupper($row['topic_title']), $q) !== false)
{
$key = htmlspecialchars_decode($row['topic_title']);
echo $row['topic_title'] . "|$topic_id\n";
}
}
$db->sql_freeresult($result);
}
заменить на
Код: Выделить всё
else
{
$sql_where = ' AND UPPER(t.topic_title) ' . $db->sql_like_expression($db->any_char . $q . $db->any_char);
$sql_approved = 'AND t.topic_approved = 1';
$sql_forum = build_subforums_search($forum_id);
$sql = "SELECT t.topic_id, t.topic_title, t.topic_status, t.topic_moved_id, t.forum_id, f.forum_name " .
" FROM " . TOPICS_TABLE .
" t JOIN " . FORUMS_TABLE . " f on t.forum_id = f.forum_id " .
" WHERE t.topic_type IN (" . POST_NORMAL . ', ' . POST_STICKY . ")
$sql_where
$sql_approved
$sql_forum
ORDER BY topic_title";
$result = $db->sql_query($sql);
$arr_res = $arr_priority1 = $arr_priority2 = array();
while ($row = $db->sql_fetchrow($result))
{
$pos = strpos(utf8_strtoupper($row['topic_title']), $q);
if ($pos !== false && $auth->acl_get('f_read', $row['forum_id']))
{
$row['pos'] = $pos;
if($pos == 0)
$arr_priority1[] = $row;
else
$arr_priority2[] = $row;
}
}
$db->sql_freeresult($result);
$arr_res = array_merge((array)$arr_priority1, (array)$arr_priority2);
foreach ($arr_res as $topic_info)
{
$forum_id = $topic_info['forum_id'];
$topic_id = ($topic_info['topic_status'] == 2) ? (int)$topic_info['topic_moved_id'] : (int)$topic_info['topic_id'];
$topic_info['topic_title'] = str_replace('|', ' ', $topic_info['topic_title']);
$key = htmlspecialchars_decode($topic_info['topic_title'] . ' // ' . $topic_info['forum_name'] );
echo $key . "|$topic_id|$forum_id\n";
}
}
2 - найти
добавить перед
Код: Выделить всё
function build_subforums_search($forum_id)
{
global $db;
if ($forum_id == 0) return '';
$sql = "SELECT left_id, right_id " .
" FROM " . FORUMS_TABLE .
" WHERE forum_id = " . $forum_id ;
$result = $db->sql_query($sql);
$row = $db->sql_fetchrow($result);
$db->sql_freeresult($result);
$sql = "SELECT forum_id " .
" FROM " . FORUMS_TABLE .
" WHERE left_id >= " . $row['left_id'] .
" AND right_id <= " . $row['right_id'] .
" ORDER BY left_id" ;
$result = $db->sql_query($sql);
$subforums = 'AND t.forum_id IN (';
while ($row = $db->sql_fetchrow($result))
{
$subforums .= ( $row['forum_id'] . ',');
}
$subforums = substr($subforums, 0, -1) . " )";
return $subforums;
}
Заменить старую версию файла js/src/jquery.autocomplete.js, новым из вложения