В системе компонентов реализована встроенная система поиска и выборки. Поиск можно производить по любым полям. Так, по текстовым и строковым (а также файловым – т.к. в базе данных хранится URL файла) полям производится поиск подстроки (без морфологии), по числовым – по диапазону значений, по логическим – да/нет, по спискам (классификаторам) – по конкретному значению.
Прежде всего, выборку можно осуществлять только по тем полям компонента, у которых установлен атрибут «возможен поиск по данному полю». Каждому из таких полей соответствует элемент (или два элемента) массива srchPat[], значения которого нужно подавать на скрипт, чтобы произвести выборку. Для того чтобы лучше понять принцип работы механизмов выборки, приведем примерный алгоритм осуществления поиска:
1. Выбираем все поля, у которых установлено свойство «Искать по этому полю»;
2. Сортируем их по возрастанию приоритета;
3. С каждым из них ассоциируем элемент массива srchPat[] по порядку, начиная с нуля; если тип поля – Int или Float, ассоциируем два элемента массива;
4. Проверяем каждый элемент массива srchPat[], поданный на скрипт; если элемент не пустой – осуществляем выборку.
В следующей таблице приведен пример набора полей (только те поля, которые доступны для поиска) и соответствия им элементов srchPat[].
| Приоритет | Поле/название поля | Тип | Элементы srchPat[] | Содержание параметров |
| 1 | Имя / Name | Строка | srchPat[0] | Подается искомая подстрока. Поиск по полю не производится, если параметр пуст. |
| 5 | Возраст / Age | Целое число | srchPat[1], srchPat[2] | Подается начало (1) и конец (2) диапазона поиска. Если один из параметров пуст, соответствующей границы диапазона нет. Если оба пусты, поиск не производится. |
| 6 | Отдел / Depart | Список | srchPat[3] | Подается номер записи классификатора. Если значение содержит ноль или пустует, поиск не производится. |
| 18 | Пол мужской? / IsMale | Логическая переменная | srchPat[4] | Подается единица («да») или ноль («нет»). Если значение пустое, поиск не производится. |
Чтобы вызвать системную форму поиска для данного компонента раздела, нужно открыть страницу /sub/search_keyword.html , где sub – адрес раздела, keyword – ключевое слово компонента раздела.
Несколько примеров запросов:
1. Поиск только тех сотрудников, в имени которых есть подстрока «Bill»
…/staff/?srchPat[0]=Bill
2. Поиск только совершеннолетних сотрудников
…/staff/?srchPat[1]=16
3. Поиск сотрудников из некоторого отдела (которому соответствует, например, запись номер 4 в соответствующем классификаторе), которые не старше 60 лет
…/staff/?srchPat[3]=4&srchPat[2]=60
4. Поиск мужчин в возрасте от 20 до 30 лет
…/staff/?srchPat[1]=20&srchPat[2]=30&srchPat[4]=1
5. Поиск женщин по имени Jane из 4 отдела в возрасте от 30 до 35 лет
…/staff/?srchPat[0]=Jane&srchPat[1]=30&srchPat[2]=35&srchPat[3]=4&srchPat[4]=0
Механизмы поиска можно применять как вручную (добавляя параметры в поле ввода строки URL), так и автоматически. Приведем несколько примеров:
1. На титульной странице сайта нужно показывать список всех клиентов, у которых есть веб-сайт:
Предположим, что мы имеем компонент «Клиенты», среди полей которого есть поле «Адрес сайта» (необязательное), и раздел со списком клиентов. Установим для этого поля возможность поиска и внесем в нужное место макета титульной страницы вызов функции s_list_class():
“.s_list_class(1,2,”&srchPat[0]=http”).”
В этом примере 1 – номер раздела, 2 – номер компонента раздела. Также можно варьировать внешний вид списка клиентов в зависимости от того, выводится он в своем разделе или на титульной странице (об этом см. в следующей главе).
2. В некотором разделе первая страница должна представлять собой форму поиска по объектам:
Для того чтобы реализовать этот функционал, необходимо в настройках компонента раздела (по которому осуществляется поиск) значение «Действие по умолчанию» изменить на «Поиск». После этого, при заходе в данный раздел в режиме просмотра, будет показываться форма поиска по полям, поиск по которым возможен (устанавливается при создании поля). По умолчанию выводится форма, сгенерированная системой. При желании, можно сверстать собственную форму поиска по полям в разделе «Компоненты», колонка «Шаблоны действий» (Поиск), «Форма расширенного поиска». При создании собственной формы поиска обязательно следует указать значение «index» для скрытого (hidden) поля «action». Действие формы (action) следует установить в “.$current_sub[Hidden_URL].”, если компонент, по которому производится поиск, является компонентом по умолчанию (включен, наименьший приоритет) и “.$current_sub[Hidden_URL].$current_cc[EnglishName].”.html – для остальных компонентов. При этом метод запроса формы (method) должен быть «GET».
3. Несколько подразделов раздела должны представлять собой выборку данных из родительского раздела:
Подразумевается, что мы рассматриваем пример, приведенный в начале главы. Допустим, в разделе «Сотрудники» нам нужен список всех сотрудников, а каждый подраздел раздела «Сотрудники» должен содержать список сотрудников какого-либо отдела. Для этого создадим нужное количество разделов, соответствующее количеству отделов с аналогичными разделами, и укажем внешний URL следующим образом: «/staff/?srchPat[3]=1» для отдела, который соответствует первой записи в классификаторе «Отделы», «/staff/?srchPat[3]=2» для второй и т.д.