CONTENT MANAGEMENT SYSTEM
Blox Logo
Blox CMS — блочный метод сайтостроения
.
 
Blox Help

←→

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

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

songs.tdd

<?php

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

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

    $params['isMultiRec'] = true;
    $params['search']['highlight'] = true;
?>

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

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

songs.css

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

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

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

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

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

.tpl

<?php

    echo preg_replace($search['patterns'][1], $search['replacements'][1], $dat[1]);

?>

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

.tpl

<?php

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

?>

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


Примечания