Онлайн-руководство разработчика NetCat
Модуль «Поиск по сайту» 12.2.1Начало работы с модулем 12.2.2Язык запросов 12.2.3Способы хранения индекса 12.2.4Интерфейс модуля в панели управления сайтом 12.2.5Области индексирования 12.2.6Области HTML-страниц 12.2.7Области поиска на сайте 12.2.8Индексирование по расписанию, запуск индексирования в фоновом режиме 12.2.9Правила индексирования 12.2.10Постановка задачи переиндексирования в очередь 12.2.11Интеграция модуля в макеты дизайна сайта 12.2.12Простая форма поиска 12.2.13Расширенная форма поиска 12.2.14Вывод результатов поиска 12.2.15Стилизация списка подсказок 12.2.16Расширенные настройки 12.2.17Разработка расширений модуля 12.2.18Обзор архитектуры модуля 12.2.19Обработчики документов различных типов 12.2.20Текстовые фильтры 12.2.21Анализаторы текста 12.2.22Корректировщики запросов 12.2.23Подключение других поисковых систем 12.2.24Решение проблем с поиском 12.2.25Решение проблем с индексированием 12.2.26Справочник API

Системные настройки

Поле «Системные настройки» представляет собой PHP-консоль и работает при отображении списка объектов, полном отображении и выводе форм. При помощи системных настроек можно, в частности, модифицировать SQL-запрос, возвращающий выборку объектов, в том числе и при полном отображении.

Изначально основной SQL-запрос, возвращающий список объектов на страницу, выглядит приблизительно следующим образом:

SELECT список_полей FROM `user` WHERE условия_выборки

Условиями выборки могут являться:

  • выбрать объекты только в текущем разделе
  • выбрать объекты только в текущем компоненте раздела
  • выбрать объекты только текущего пользователя
  • выбрать только включённые объекты
  • выбрать только родительские объекты

На данные условия могут влиять следующие значения:

Флаг Описание
$ignore_catalogue если 1, игнорирует выборку объектов по текущему сайту (по умолчанию 0)
$ignore_sub  если 1, игнорирует выборку объектов по текущему разделу (по умолчанию 0)
$ignore_cc если 1, игнорирует выборку объектов по текущему компоненту раздела (по умолчанию 0)
$ignore_user если 1, игнорирует выборку объектов по текущему пользователю (по умолчанию 1)
$ignore_check если 1, игнорирует выборку только включенных объектов (по умолчанию 0)
$ignore_parent если 1, игнорирует выборку только родительских объектов (по умолчанию 0)
$ignore_all позволяет создать свой запрос, вместо системного. При установке значения 1 - основной запрос не будет составлен системой и его можно будет скомпоновать вручную, посредствам использования переменных $query_select, $query_from и подобных (по умолчанию 0)
$ignore_limit позволяет игнорировать ограничение на выбор объектов. При установке значения 1 - будут выбраны все объекты (по умолчанию 0). Если в компоненте и инфоблоке не задано ограничение "Показывать по ХХ объектов на сранице", то $ignore_limit устанавливается в 1
$query_limit позволяет задать ограничение на выборку объектов. Например "20, 10", в запросе отобразится "... LIMIT 20, 10". Данный флаг активен если включен $ignore_limit или не задано ограничение "Показывать по ХХ объектов на сранице" в настройках компонента и инфоблока, а также при $ignore_all
$distinct если 1, добавляет к запросу DISTINCT, т.е. получается SELECT DISTINCT fields FROM
$distinctrow если 1, добавляет к запросу DISTINCTROW, т.е. получается SELECT DISTINCTROW fields FROM
$ignore_link
(с версии 5.02)
если 1, изменяет ссылки на полное отображение объекта ($fullLink).

В нормальном режиме ссылки на объекты ведут в тот инфоблок и раздел, в котором они были добавлены, что удобно при выводе списка объектов из разных разделов: каждый объект открывается в своем разделе. При включении $ignore_link все ссылки ведут в инфоблок и раздел, в котором прикреплен компонент (инфоблок) с $ignore_cc, то есть ссылки относительные, и все ведут в один раздел.

Важно: если у объектов есть ключевые слова (и, соответственно, путь к страницам объектов содержит ключевое слово), при использовании $ignore_link не гарантируется, что по указанному адресу всегда будет конкретный объект, так как ключевые слова объектов уникальны только в пределах инфоблока. В случае наличия объектов с одинаковыми ключевыми словами выбор объекта для страницы полного вывода осуществляется в следующем порядке:
  1. из текущего инфоблока;
  2. из текущего раздела;
  3. с текущего сайта (при $ignore_sub = 1);
  4. из любых сайтов (при $ignore_catalogue = 1).

При наличии нескольких объектов с указанным ключевым словом (в пределах раздела, сайта, всех сайтов) будет выбран объект, который был создан раньше других. Страницы полного вывода других объектов с тем же ключевым словом будут недоступны по ссылке с $ignore_link.

Несколько примеров использования переопределений запроса.

  • На сайте есть раздел с категориями товаров. Каждый товар выводится в определённой категории. Нужно в разделе «Все товары» вывести товары из всех категорий. Для этого в системных настройках достаточно прописать условие: $ignore_sub = $ignore_cc = 1.
  • Вывести все разделы независимо от того выключены они или нет: $ignore_check = 1;
  • В случае когда вам нужно вывести объекты с «подобъектами» (пример – иерархический форум), необходимо установить значение переменной $ignore_parent в единицу. В противном случае, отображаются только родительские объекты.

Кроме этого у разработчика есть возможность влияния на SQL-запрос.

SELECT $distinct a.список_полей, $query_select
FROM `MessageXX` AS a, $query_from
$query_join
WHERE условия_выборки AND $query_where
GROUP BY $query_group
HAVING $query_having
ORDER BY $query_order
LIMIT $query_limit

Для влияния на запрос необходимо вставить в системные настройки соответствующую переменную (выделены цветом) и прописать своё условие.

Теперь в полях компонента будут доступны переменные, содержащие данные о пользователе: имя и город.

Кроме того, «Системным настройкам» доступны:

  • ассоциативные массивы $current_catalogue, $current_sub, $current_cc, $current_user. Эти массивы содержат атрибуты сущностей «Сайт», «Текущий раздел», «Текущий инфоблок», «Авторизованный пользователь». Например, $current_sub[“Subdivision_Name”] содержит название текущего раздела. Чтобы увидеть все названия атрибутов (поля соответствующих таблиц), исполните в SQL-консоли запрос explain Subdivision (или Catalogue, Sub_Class, User)
  • все переменные, подаваемые на загружаемую страницу методом GET либо в функции nc_objects_list(). Мы уже писали о том, что в аттрибут $params функции nc_objects_list() можно передать дополнительные параметры. Выглядеть они могут следующим образом: 
    <?=nc_objects_list(10, 20, “&param1=$_GET['param1']&us_id=$f_UserID”); ?>.

Обратите внимание: В версии 5.0 для компонентов нового типа массив $result_vars не используется. Для того, чтобы получить доступ к результатам выборки, нужно задать алиасы для полей, а потом обращаться к переменным с соответствующими именами. Например в результате запроса с использованием $query_select = "a.Name as `Name`", будет доступна для использования переменная $f_Name.

Полезная информация: Для отладки запроса на этапе разработки можно вывести переменную $message_select в префиксе компонента, в этом случае, после обновления целевой страницы, на экране будет отображён полный MySQL-запрос вывода данных.

Комментарии 8

Добавьте описание переменной $ignore_calc, пожалуйста. Она позволяет потрясающе ускорить работу компонента на сложных проектах, очень полезная.
   
amigo 21 июня 2014, 07:38:16
Спасибо, Руслан. Вы можете оставить свой реальный пример из практики, это здорово поможет нам расширить документацию :)
   
Пара примеров:
1. Если в компоненте не требуется установка постраничной навигации, или заведомо точно известно, что количество строк в выборке будет меньше, чем максимально допустимое кол-во объектов на странице (т.е. $totRows<=$recNum), то поставив $ignore_calc=1, мы уменьшаем нагрузку на MySQL-сервер ровно в два раза, т.к. SELECT с использованием SQL_CALC_FOUND_ROWS (включенный по умолчанию) и ненулевым LIMIT'ом, выполняет (внутри mysql-сервера) фактически два запроса - один с LIMIT'ом (для получения данных из БД), и еще один без LIMIT'а (для подсчета кол-ва строк данных).
2. Количество записей в БД очень большое, много JOIN'ов и из иных источников известно количество записей в базе данных, удовлетворяющих условиям (если они - условия - заданы, конечно). При отсутствии $ignore_calc, SQL-выборка осуществляется, как и описано в первом примере, в два раза медленнее, чем с этим флажком. А если в компоненте более 1 млн объектов, то даже на выделенном сервере средней мощности выборка даже небольшого кол-ва записей из "середины" таблицы выливается в ожидание продолжительностью несколько секунд. Установка $ignore_calc=1 решает проблему "двойного запроса", но лишает возможности пользоваться штатным механизмом постраничной навигации. Поэтому при установке этого флага необходимо делать либо навигацию своими силами, либо не пользоваться навигацией.
В некоторых случаях трудозатраты на изготовление "самодельной" навигации экономически оправданы (в угоду быстродействию).
   
resident  Веб-группа «Дабл Ю» 05 апреля 2016, 08:53:23
при миллионах записей штатная навигация бессмысленна
   
VV  VVStudio 15 июля 2014, 13:33:22
Соглашусь с вышесказанным. Кроме этого, с запросами, в которых присутствуют SQL_CALC_FOUND_ROWS невозможно нормально распределить нагрузку между несколькими backend mysql серверами (для highload проектов), т.к. оба запроса должны падать на один и тот же сервер.
   
A.Popov  Kit.team 28 января 2016, 09:29:53
[QUOTE]Например в результате запроса с использованием $query_select = "a.Name as `Name`", будет доступна для использования переменная $f_Name.[/QUOTE]
А где документация о переменной $result_vars.
Пришлось потратить время, чтобы понять, что к чему.
   
$result_vars использовалась только в компонентах 4-й версии, видимо поэтому о ней не стали писать. Но с другой стороны, компоненты этой версии все еще существуют и все-таки довольно странно, что ее не описали в документации.
   
Дмитрий Коновалов  Activica 05 декабря 2017, 10:44:26
нельзя ли помимо $message_select сделать что-то типа $nc_core->db->getLastQuery() ? Постоянно забываю как называется переменная с не очевидным названием - $message_select
   
Описание проекта