Поле «Системные настройки» представляет собой 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 не гарантируется, что по указанному адресу всегда будет конкретный объект, так как ключевые слова объектов уникальны только в пределах инфоблока. В случае наличия объектов с одинаковыми ключевыми словами выбор объекта для страницы полного вывода осуществляется в следующем порядке: При наличии нескольких объектов с указанным ключевым словом (в пределах раздела, сайта, всех сайтов) будет выбран объект, который был создан раньше других. Страницы полного вывода других объектов с тем же ключевым словом будут недоступны по ссылке с $ignore_link. |
Несколько примеров использования переопределений запроса.
Кроме этого у разработчика есть возможность влияния на 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
Для влияния на запрос необходимо вставить в системные настройки соответствующую переменную (выделены цветом) и прописать своё условие.
Теперь в полях компонента будут доступны переменные, содержащие данные о пользователе: имя и город.
Кроме того, «Системным настройкам» доступны:
<?=nc_objects_list(10, 20, “¶m1=$_GET['param1']&us_id=$f_UserID”); ?>.
Обратите внимание: В версии 5.0 для компонентов нового типа массив $result_vars не используется. Для того, чтобы получить доступ к результатам выборки, нужно задать алиасы для полей, а потом обращаться к переменным с соответствующими именами. Например в результате запроса с использованием $query_select = "a.Name as `Name`", будет доступна для использования переменная $f_Name.
Полезная информация: Для отладки запроса на этапе разработки можно вывести переменную $message_select в префиксе компонента, в этом случае, после обновления целевой страницы, на экране будет отображён полный MySQL-запрос вывода данных.
Комментарии 8
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 решает проблему "двойного запроса", но лишает возможности пользоваться штатным механизмом постраничной навигации. Поэтому при установке этого флага необходимо делать либо навигацию своими силами, либо не пользоваться навигацией.
В некоторых случаях трудозатраты на изготовление "самодельной" навигации экономически оправданы (в угоду быстродействию).
А где документация о переменной $result_vars.
Пришлось потратить время, чтобы понять, что к чему.