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