 
Выделение найденных поисковых слов
Найти записи, содержащие поисковые слова, это еще не всё – при выводе нужно как-то выделить эти слова. Для этого в дескриптор нужно добавить параметр 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>';
}
}
?>
Имейте в виду, в случае поиска фрагментов в начале слов, паттерн будет немного другим.
Примечания
|