Выделение найденных поисковых слов

Найти записи, содержащие поисковые слова, это еще не всё – при выводе нужно как-то выделить эти слова. Для этого в дескриптор нужно добавить параметр highlight (см. код)

songs.tdd
<?php

    $titles[1] = 'Имя исполнителя';
    $titles[2] = 'Название песни';

    $types[1] = 'varchar(255)';
    $types[2] = 'varchar(255)';

    $params['multi-record'] = true;
    $params['search']['highlight'] = true;
?>

Единственное, что надо иметь в виду, что после добавления параметра highlight, найденные слова будут автоматически обрамлены кодом <span class='blox-searchword'>...</span>.

А это означает, что в таблице стилей нужно задать класс blox-searchword, для найденных слов, например, с такими свойствами:

songs.css
span.blox-searchword {background:yellow; font-weight:inherit}

Теперь в результатах поиска поисковые слова будут выделяться.

Другие способы выделения найденных слов

В методе, описанном выше, на шаблон поступают данные уже с дополнительным кодом, выделяющим найденные слова. Но бывают случаи, когда в шаблоне нужно иметь данные в чистом виде без лишних тегов. Или, например, к тексту в предобработчике применялась php-функция strip_tags(), которая убирает все теги.

В этом случае найденные слова можно выделить отдельно с помощью php-функции preg_replace(). При этом, в качестве параметров можно взять готовые переменные шаблона, а именно: массив паттернов и массив текстов для замены, соответственно, $request['search']['patterns'] и $request['search']['replacements'] (см. данные запроса). В следующем примере показано, как с помощью этих массивов вывести данные одного поля с выделенными поисковыми словами:

.tpl
<?php
    $request = Request::get($block);
    echo preg_replace($request['search']['patterns'][1], $request['search']['replacements'][1], $dat[1]);

?>

Массив паттернов для поиска и массив текстов для замены можно подготовить самому с помощью массива поисковых слов $request['search']['words'] (см. данные запроса).

.tpl
<?php
    $request = Request::get($block);
    foreach ($request['search']['words'] as $field => $words)
    {
        foreach ($words as $word)
        {
            # В значении поля ищется вхождение поискового слова (без учета регистра)
            $patterns[$field][] = "/($word)/iu";
            # Найденное слово заменяется на само себя с тегами для выделения
            $replacements[$field][] = '<b>$1</b>';
        }
    }

?>

Имейте в виду, в случае поиска фрагментов в начале слов, паттерн будет немного другим.


Примечания