Допустим многозаписный блок представляет собой таблицу, в первом столбце которого записано имя исполнителя, а во втором - название песни (см. дескриптор songs.tdd). Наша задача - добавить возможность поиска по блоку как по имени исполнителя, так и по названию песни.
songs.tdd
<?php
$titles[1] = 'Имя исполнителя';
$titles[2] = 'Название песни';
$types[1] = 'varchar(255)';
$types[2] = 'varchar(255)';
$params['multi-record'] = true;
?>
Самый простой способ формирования поискового запроса – это форма.
Каждому полю таблицы, по которому вы хотите производить поиск, должен быть сопоставлен элемент формы input для ввода поисковых слов. В значении атрибута name этих элементов должно быть указано имя массива search с ключом, соответствующим номеру поля (см. шаблон songs.tpl).
Номер блока можно передавать как методом GET (в атрибуте action), так и методом POST (с помощью input). Второй вариант, пожалуй, эстетичнее.
songs.tpl<?php echo " <form action='?page=$page' method='post'> <input type='hidden' name='block' value='$block'> <input type='text' name='search[1]'>Имя исполнителя<br> <input type='text' name='search[2]'>Название песни<br> <input type='submit' value='Искать'> </form> <table>"; foreach ($tab as $dat) echo " <tr> <td>{$dat['edit']}</td> <td>$dat[1]</td> <td>$dat[2]</td> </tr> "; echo " </table>"; ?>
Теперь, когда пользователь вводит поисковые слова, будут показаны только те записи, в которых эти слова присутствуют.
Морфологический анализ слов не производится, то есть, ищется именно то сочетание букв, которое ввел пользователь. Поэтому желательно вводить не законченную форму какого слова (с суффиксом и окончанием), а только его фрагмент.
В каждое поле поиска можно вводить несколько фрагментов, разделенных пробелом. При этом, производится логическая операция "И", то есть, будут выведены только те записи, в значениях соответствующих полей которых присутствуют все введенные фрагменты. Такой же принцип действует при использовании нескольких полей - вводя поисковые строки в несколько полей, вы сужаете круг поиска (число записей).
Если оставить все поля ввода пустыми, то извлекутся все записи блока. Это один способов сброса поискового запроса.
Что касается формирования поискового запроса, то сам пользователь не может непосредственно формировать URL – он может только выбрать один из запросов, сформированный системой, то есть, щелкнуть по ссылке.
Ниже приведен шаблон, на основе предыдущего примера, где вместо формы для ввода поисковых слов, стоит список исполнителей. На основе массива исполнителей (код не показан) создаются ссылки, с помощью которых можно извлечь все записи, относящиеся к тому или иному исполнителю.
songs.tpl<?php $performersNames = ...; foreach ($performersNames as $name) echo "<a href='?page=$page&block=$block&search[1]=$name'>$name</a> | "; echo "<table>"; foreach ($tab as $dat) echo " <tr> <td>{$dat['edit']}</td> <td>$dat[1]</td> <td>$dat[2]</td> </tr> "; echo "</table>"; ?>
Кстати, мы рассмотрели пример простой навигации по блоку. Для более эффективной навигации, поисковые запросы лучше делать к полю типа ENUM или SET.
При поисковых запросах вместо параметра search[]
можно применять короткую форму записи: s[]
.
Это особенно удобно, если вы делаете поисковые запросы с помощью ссылок.
<?php echo " <a href='?page=$page&block=$block&s[1]=Иванов&s[2]=Петр'>Петр Иванов</a> "; ?>
Рекомендуем применять короткую форму, если вы с помощью поисковых запросов осуществляете навигацию по блоку, тогда вам не придется переписывать инструкции для поисковых роботов, находящихся в файле robots.txt.
Есть еще более короткая запись поискового запроса, когда не указывается и ключ, то есть, вместо search[1]= или s[1]= пишется search= или s=.
Чтобы исключить из результатов поиска записи, в которых отсутствует заданное слово, поставьте знак минус (дефис) перед таким словом. Например, чтобы получить записи, в которых встречается слово "калина", но не встречается слово "лада", используйте поисковый текст: "калина -лада".