Поисковые подсказки / Autocomplete search

Exile

Администратор
#1
Где оно тут стабильное, кстати? Инсталл как минимум не полный.

Вот мой вариант. Изменения минимальные, но вдруг.

Для начала подключаем библиотеку jquery-ui на все страницы форума. У многих уже может быть подключена для модов в стиле всплывающего профиля пользователя.

ajax.php
Подключаем файл обработчика и все такое:
PHP:
        'getSearchHint'      => array('user'),
PHP:
    function getSearchHint ()
    {
        require(AJAX_DIR . 'getSearchHint.php');
    }
getSearchHint.php
Основной файл обработчик. Кеширует запросы чтобы совсем уж сильно не грузить.
PHP:
<?php
 
if (!defined('IN_AJAX')) die(basename(__FILE__));
 
$otvet = CACHE('bb_cache')->get('hint_'.md5($this->request['term']));
 
if ($otvet != '')
{
    $this->response['data'] = json_decode($otvet);
}
else
{
    $sql = "SELECT * FROM search_hint WHERE query LIKE '%".DB()->escape($this->request['term'])."%' ORDER BY hit DESC LIMIT 8";
    $result = DB()->sql_query($sql);
 
    while ($row = DB()->sql_fetchrow($result))
    {
        $otvet[] = $row['query'];
    }
 
    CACHE('bb_cache')->set('hint_'.md5($this->request['term']), json_encode($otvet), 300);
 
    $this->response['data'] = $otvet;
}
tracker.php
Вносим данные в таблицу запросов. Перед print_page('tracker.tpl'); вставляем:
PHP:
if (!empty($_REQUEST['nm']) && !empty($results))
{
    // поисковые подсказки
    DB()->sql_query("INSERT INTO search_hint (query, hit) VALUES ('".DB()->escape($_REQUEST['nm'])."', 1) ON DUPLICATE KEY UPDATE hit = hit + 1");
}
page_header.tpl
После подключения скрипта <script type="text/javascript" src="{STATIC_URL}/js/bbcode.js?v={$bb_cfg['js_ver']}"></script> (у меня свои пути, ищите по имени файла) вставляем:
HTML:
<script type="text/javascript">
$(function() {
    $("#search-text").autocomplete({
        source:function( request, response ) {
            $.ajax({
                url: "ajax.php",
                success: function(answer) {
                    var data = eval ("(" + answer + ")");
                    response(data.data);
                },
                type: "POST",
                data: "action=getSearchHint&term="+request.term
            });
        },
        minLength: 2
    });
});
</script>
tracker.tpl
Вставляем после <!-- ENDIF / AJAX_TOPICS -->:
HTML:
<script type="text/javascript">
$(function() {
    $("#post").autocomplete({
        source:function( request, response ) {
            $.ajax({
                url: "ajax.php",
                success: function(answer) {
                    var data = eval ("(" + answer + ")");
                    response(data.data);
                },
                type: "POST",
                data: "action=getSearchHint&term="+request.term
            });
        },
        minLength: 2
    });
});
</script>
Структура таблицы search_hint:
PHP:
CREATE TABLE IF NOT EXISTS `search_hint` (
  `query` varchar(250) NOT NULL,
  `hit` int(11) NOT NULL,
  UNIQUE KEY `hint` (`query`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Собственно вроде все. У кого есть вопросы - задавайте.

Подумаем над рациональностью впиливания данного чуда в движок. Не исключено что будет "из коробки".
 

Exile

Администратор
#2
У кого есть вопросы - задавайте
Задам вопрос сам себе и сам же и отвечу - почему такой гавнокод? Потому что стандартные средства движка использовать иногда возможности не было так как все делалось в страшной спешке и с планами на дальнейшее переписывание, но в итоге так и оставалось. Нет ничего более постоянное чем временное. При впиливании в движок, конечно, код будет приведен к другому виду.
 

drew

Пользователь
#4
Exile, есть не большой косяк, если подсказка уже существует то надо update, а в вашем коде я этого не нахожу.
По поводу инстала который я скинул, код полный.
 

Exile

Администратор
#5
Exile, есть не большой косяк, если подсказка уже существует то надо update, а в вашем коде я этого не нахожу.
ON DUPLICATE KEY UPDATE ни о чем не говорит?
По поводу инстала который я скинул, код полный.
Полный, да вот логика работы глупая, даже можно сказать совершенно тупая. Только сейчас заметил что вносит в базу только то, что пользователи набирают. Пользователь набрал три буквы - "абв", например. Ваш код это в базу внес. Пользователь набрал "где" - ваш код тоже это в базу внес. В чем смысл таких подсказок? Если я наберу "админ лох" - подсказка это и будет выводить для всех. Логично? Нет. В моем варианте в базу для подсказок вносятся те поисковые результаты, которые дали хоть какое-то количество найденных тем в поиске.
 
Сверху