Modules/devices/devices search inc php: различия между версиями
Материал из MajorDoMo инфо
Elmax (обсуждение | вклад) (Заготовка) |
Elmax (обсуждение | вклад) (+ file devices_search.inc.php) |
||
| Строка 4: | Строка 4: | ||
<pre> | <pre> | ||
<?php | |||
/* | |||
* @version 0.1 (wizard) | |||
*/ | |||
// Глобальная переменная $session используется для хранения данных сессии. | |||
global $session; | |||
// Проверяем, является ли текущий объект панелью управления. | |||
// Если это так, то устанавливаем флаг CONTROLPANEL в 1, что может быть использовано для определения, | |||
// нужно ли отображать элементы управления панелью. | |||
if ($this->owner->name == 'panel') { | |||
$out['CONTROLPANEL'] = 1; | |||
} | |||
// Инициализируем запрос с условием, что все записи должны быть выбраны. | |||
// Значение "1" в SQL означает, что условие всегда истинно, и запрос будет выбирать все записи. | |||
$qry = "1"; | |||
// Фильтры поиска. | |||
// Здесь предполагается, что будут добавлены дополнительные условия для фильтрации результатов поиска. | |||
// Получаем тип устройства из запроса. | |||
// Функция gr('type') предположительно извлекает параметр 'type' из запроса. | |||
$type = gr('type'); | |||
// Если тип устройства указан, добавляем его в запрос. | |||
// Это позволяет фильтровать результаты поиска по типу устройства. | |||
if ($type != '') { | |||
// Добавляем условие в запрос, чтобы выбрать только устройства с указанным типом. | |||
// Функция DBSafe($type) предположительно очищает входные данные от потенциально вредоносного кода. | |||
$qry .= " AND devices.TYPE='" . DBSafe($type) . "'"; | |||
// Сохраняем тип устройства в массиве $out для дальнейшего использования. | |||
$out['TYPE'] = $type; | |||
} | |||
// Получаем ID местоположения из запроса. | |||
// Функция gr('location_id') предположительно извлекает параметр 'location_id' из запроса. | |||
$location_id = gr('location_id'); | |||
// Проверяем, указан ли параметр управления местоположениями. | |||
// Если параметр равен 'manage_locations', перенаправляем пользователя на страницу управления местоположениями. | |||
if ($location_id == 'manage_locations') { | |||
$this->redirect("?(panel:{action=locations})"); | |||
} elseif ($location_id) { | |||
// Если указан ID местоположения, добавляем его в запрос. | |||
// Приведение к типу int гарантирует, что ID будет числом, что необходимо для корректного SQL-запроса. | |||
$out['LOCATION_ID'] = (int)$location_id; | |||
// Добавляем условие в запрос, чтобы выбрать только устройства с указанным ID местоположения. | |||
$qry .= " AND devices.LOCATION_ID=" . $out['LOCATION_ID']; | |||
} | |||
// Получаем имя группы устройств из запроса. | |||
// Функция gr('group_name') предположительно извлекает параметр 'group_name' из запроса. | |||
$group_name = gr('group_name'); | |||
// Проверяем, указан ли параметр управления группами. | |||
// Если параметр равен 'manage_groups', перенаправляем пользователя на страницу управления группами. | |||
if ($group_name == 'manage_groups') { | |||
$this->redirect("?view_mode=manage_groups"); | |||
} elseif ($group_name == 'is:archived') { | |||
// Если указан параметр архивированных устройств, добавляем его в запрос. | |||
// Это позволяет фильтровать результаты поиска, отображая только архивированные устройства. | |||
$qry .= " AND devices.ARCHIVED=1"; | |||
} elseif ($group_name == 'is:system') { | |||
// Если указан параметр системных устройств, добавляем его в запрос. | |||
// Это позволяет фильтровать результаты поиска, отображая только системные устройства. | |||
$qry .= " AND devices.SYSTEM_DEVICE=1"; | |||
} elseif ($group_name == 'is:inactive') { | |||
// Получаем имена объектов, которые не активны (например, устройства, не отвечающие на запросы). | |||
$object_names = getObjectsByProperty('alive'); | |||
if (!is_array($object_names)) { | |||
$object_names = array(0); | |||
} | |||
$total = count($object_names); | |||
if ($total > 0) { | |||
for ($i = 0; $i < $total; $i++) { | |||
// Проверяем, является ли объект активным. | |||
$val = getGlobal($object_names[$i].'.alive'); | |||
if (!$val) { | |||
// Если объект не активен, добавляем его в список для фильтрации. | |||
$res_object_names[] = "'" . $object_names[$i] . "'"; | |||
} | |||
} | |||
// Добавляем условие в запрос для фильтрации по именам неактивных объектов. | |||
$qry .= " AND devices.LINKED_OBJECT IN (" . implode(',', $res_object_names) . ")"; | |||
} else { | |||
// Если список объектов пуст, добавляем условие, которое не позволит выбрать ни одного устройства. | |||
$qry .= " AND 0"; | |||
} | |||
} elseif ($group_name == 'is:battery') { | |||
// Получаем имена объектов, работающих от батареи. | |||
// Функция getObjectsByProperty('batteryOperated', 1) предположительно возвращает список объектов, | |||
// которые работают от батареи. | |||
$object_names = getObjectsByProperty('batteryOperated', 1); | |||
if (!is_array($object_names)) { | |||
$object_names = array(0); | |||
} | |||
$total = count($object_names); | |||
if ($total > 0) { | |||
for ($i = 0; $i < $total; $i++) { | |||
$object_names[$i] = "'" . $object_names[$i] . "'"; | |||
} | |||
// Добавляем имена объектов в запрос, чтобы фильтровать результаты поиска по объектам, | |||
// работающим от батареи. | |||
$qry .= " AND devices.LINKED_OBJECT IN (" . implode(',', $object_names) . ")"; | |||
} else { | |||
// Если список объектов пуст, добавляем условие, которое не позволит выбрать ни одного устройства. | |||
$qry .= " AND 0"; | |||
} | |||
} elseif ($group_name == 'is:battery_low') { | |||
// Получаем имена объектов с низким уровнем заряда батареи. | |||
// Функция getObjectsByProperty('batteryWarning', 1) предположительно возвращает список объектов, | |||
// у которых уровень заряда батареи низкий. | |||
$object_names = getObjectsByProperty('batteryWarning', 1); | |||
if (!is_array($object_names)) { | |||
$object_names = array(0); | |||
} | |||
$total = count($object_names); | |||
if ($total > 0) { | |||
for ($i = 0; $i < $total; $i++) { | |||
$object_names[$i] = "'" . $object_names[$i] . "'"; | |||
} | |||
// Добавляем имена объектов в запрос, чтобы фильтровать результаты поиска по объектам, | |||
// у которых уровень заряда батареи низкий. | |||
$qry .= " AND devices.LINKED_OBJECT IN (" . implode(',', $object_names) . ")"; | |||
} else { | |||
$qry .= " AND 0"; | |||
} | |||
} elseif ($group_name) { | |||
// Получаем имена объектов по имени группы. | |||
// Функция getObjectsByProperty('group' . $group_name, 1) предположительно возвращает список объектов, | |||
// соответствующих указанному имени группы. | |||
$object_names = getObjectsByProperty('group' . $group_name, 1); | |||
if (!is_array($object_names)) { | |||
$object_names = array(0); | |||
} | |||
$total = count($object_names); | |||
if ($total > 0) { | |||
for ($i = 0; $i < $total; $i++) { | |||
$object_names[$i] = "'" . $object_names[$i] . "'"; | |||
} | |||
// Добавляем имена объектов в запрос, чтобы фильтровать результаты поиска по объектам, | |||
// соответствующим указанному имени группы. | |||
$qry .= " AND devices.LINKED_OBJECT IN (" . implode(',', $object_names) . ")"; | |||
} else { | |||
$qry .= " AND 0"; | |||
} | |||
} | |||
// Сохраняем имя группы устройств в массиве $out для дальнейшего использования. | |||
$out['GROUP_NAME'] = $group_name; | |||
// Если не указан параметр архивированных устройств, добавляем условие выбора неархивированных устройств. | |||
// Это условие гарантирует, что в результатах поиска будут отображаться только устройства, которые не были помечены как архивированные. | |||
if ($group_name != 'is:archived') { | |||
$qry .= " AND devices.ARCHIVED=0"; | |||
} | |||
// QUERY READY//Запрос к базе данных готов к выполнению | |||
// Глобальная переменная $save_qry используется для определения, следует ли сохранять текущий запрос или использовать сохраненный. | |||
global $save_qry; | |||
// Если установлено сохранение запроса, используем сохраненный запрос. | |||
// Это может быть полезно для сохранения состояния фильтрации между различными запросами. | |||
if ($save_qry) { | |||
$qry = $session->data['devices_qry']; | |||
} else { | |||
// Иначе сохраняем текущий запрос в сессии для возможного использования в будущем. | |||
$session->data['devices_qry'] = $qry; | |||
} | |||
// Если запрос пуст, устанавливаем его как "1" для выбора всех записей. | |||
// Это обеспечивает, что в любом случае будет выполнен запрос, даже если не было указано никаких фильтров. | |||
if (!$qry) $qry = "1"; | |||
// Получаем общее количество устройств, не архивированных. | |||
// Это делается для отображения общего количества доступных устройств в пользовательском интерфейсе. | |||
$tmp = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM devices WHERE devices.ARCHIVED!=1"); | |||
$out['TOTAL'] = (int)$tmp['TOTAL']; | |||
$loc_title = ''; | |||
// Сортировка результатов по приоритету местоположения, названию местоположения, ID местоположения, типу устройства и названию устройства | |||
$sortby_devices = "locations.PRIORITY DESC, locations.TITLE, devices.LOCATION_ID, devices.TYPE, devices.TITLE"; | |||
$out['SORTBY'] = $sortby_devices; | |||
// РЕЗУЛЬТАТЫ ПОИСКА | |||
// Выполняем SQL-запрос для получения результатов поиска устройств, включая информацию о местоположении каждого устройства. | |||
// Запрос сортируется по заданным критериям сортировки. | |||
$res = SQLSelect("SELECT devices.*, locations.TITLE as LOCATION_TITLE FROM devices LEFT JOIN locations ON devices.LOCATION_ID=locations.ID WHERE $qry ORDER BY " . $sortby_devices); | |||
// Проверяем, есть ли результаты поиска. | |||
if (isset($res[0])) { | |||
//paging($res, 100, $out); // search result paging | |||
// Подсчитываем общее количество найденных устройств. | |||
$total = count($res); | |||
$out['TOTAL_FOUND'] = $total; | |||
// Обрабатываем каждый результат поиска. | |||
for ($i = 0; $i < $total; $i++) { | |||
// Если название местоположения изменилось, устанавливаем флаг NEW_LOCATION. | |||
if ($res[$i]['LOCATION_TITLE'] != $loc_title) { | |||
$res[$i]['NEW_LOCATION'] = 1; | |||
$loc_title = $res[$i]['LOCATION_TITLE']; | |||
} | |||
// Если у устройства есть связанный объект, обрабатываем его. | |||
if ($res[$i]['LINKED_OBJECT']) { | |||
// Обработка устройства в зависимости от его типа. | |||
if ($res[$i]['TYPE'] == 'camera' || $res[$i]['TYPE'] == 'mark') { | |||
$processed = $this->processDevice($res[$i]['ID'], 'list'); | |||
} else { | |||
$processed = $this->processDevice($res[$i]['ID']); | |||
} | |||
// Добавляем HTML-представление устройства. | |||
$res[$i]['HTML'] = $processed['HTML']; | |||
// Получаем свойства связанного объекта. | |||
$object_rec = SQLSelectOne("SELECT ID FROM objects WHERE TITLE='" . $res[$i]['LINKED_OBJECT'] . "'"); | |||
if ($object_rec['ID']) { | |||
$properties = SQLSelect("SELECT pvalues.*, properties.TITLE as PROPERTY FROM pvalues LEFT JOIN properties ON properties.ID=pvalues.PROPERTY_ID WHERE pvalues.OBJECT_ID=" . $object_rec['ID'] . " AND pvalues.LINKED_MODULES!='' ORDER BY UPDATED"); | |||
$totalp = count($properties); | |||
if ($totalp > 0) { | |||
// Обрабатываем свойства, связанные с модулями. | |||
$linked_modules = array(); | |||
for ($ip = 0; $ip < $totalp; $ip++) { | |||
$tmp = explode(',', $properties[$ip]['LINKED_MODULES']); | |||
$tmp = array_map('trim', $tmp); | |||
foreach ($tmp as $linked_module) { | |||
$linked_modules[$linked_module] = array('OBJECT' => $res[$i]['LINKED_OBJECT'], 'PROPERTY' => $properties[$ip]['PROPERTY']); | |||
} | |||
} | |||
foreach ($linked_modules as $k => $v) { | |||
$v['MODULE'] = $k; | |||
$res[$i]['LINKED_MODULES'][] = $v; | |||
} | |||
} | |||
} | |||
} | |||
// Добавляем название типа устройства. | |||
$res[$i]['TYPE_TITLE'] = $this->device_types[$res[$i]['TYPE']]['TITLE']; | |||
// Получаем количество связанных устройств. | |||
$linked = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM devices_linked WHERE (DEVICE1_ID=" . $res[$i]['ID'] . " OR DEVICE2_ID=" . $res[$i]['ID'] . ")"); | |||
if ($linked['TOTAL']) { | |||
$res[$i]['LINKED'] = $linked['TOTAL']; | |||
} | |||
// Получаем количество методов устройства. | |||
$methods = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM methods WHERE CODE!='' AND OBJECT_ID=".(int)$object_rec['ID']); | |||
if ($methods['TOTAL']) { | |||
$res[$i]['METHODS'] = $methods['TOTAL']; | |||
} | |||
} | |||
// Сохраняем результаты поиска в массиве $out. | |||
$out['RESULT'] = $res; | |||
} | |||
// Подготовка к формированию списка типов устройств. | |||
$types = array(); | |||
// Формирование списка типов устройств | |||
// Проходим по всем типам устройств, определенным в $this->device_types. | |||
foreach ($this->device_types as $k => $v) { | |||
// Проверяем, установлено ли название для типа устройства. | |||
if (isset($v['TITLE'])) { | |||
// Создаем запись для типа устройства с его названием и именем. | |||
$type_rec = array('NAME' => $k, 'TITLE' => $v['TITLE']); | |||
// Выполняем запрос к базе данных для подсчета количества устройств данного типа, которые не архивированы. | |||
$tmp = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM devices WHERE TYPE='" . $k . "' AND ARCHIVED!=1"); | |||
// Сохраняем количество устройств в записи типа устройства. | |||
$type_rec['TOTAL'] = (int)$tmp['TOTAL']; | |||
// Если количество устройств больше нуля, добавляем запись типа устройства в список. | |||
if ($type_rec['TOTAL'] > 0) { | |||
$types[] = $type_rec; | |||
} | |||
} | |||
} | |||
// Сортируем список типов устройств по названию. | |||
usort($types, function ($a, $b) { | |||
return strcmp($a["TITLE"], $b["TITLE"]); | |||
}); | |||
// Сохраняем отсортированный список типов устройств в массиве $out. | |||
$out['TYPES'] = $types; | |||
// Получение списка местоположений | |||
// Выполняем запрос к базе данных для получения списка местоположений. | |||
$locations = SQLSelect("SELECT ID, TITLE FROM locations ORDER BY TITLE+0"); | |||
$total = count($locations); | |||
// Получение количества устройств для каждого местоположения | |||
// Проходим по всем местоположениям и выполняем запрос к базе данных для подсчета количества устройств в каждом местоположении. | |||
for ($i = 0; $i < $total; $i++) { | |||
$tmp = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM devices WHERE LOCATION_ID='" . $locations[$i]['ID'] . "'"); | |||
// Сохраняем количество устройств в записи местоположения. | |||
$locations[$i]['TOTAL'] = (int)$tmp['TOTAL']; | |||
} | |||
// Сохраняем список местоположений с количеством устройств в массиве $out. | |||
$out['LOCATIONS'] = $locations; | |||
// Получение списка групп устройств | |||
// Выполняем запрос к базе данных для получения списка групп устройств. | |||
$groups = SQLSelect("SELECT * FROM devices_groups ORDER BY TITLE"); | |||
// Добавляем системные группы в список групп. | |||
$groups[] = array('SYS_NAME' => 'Eco', 'TITLE' => LANG_DEVICES_GROUP_ECO); | |||
$groups[] = array('SYS_NAME' => 'EcoOn', 'TITLE' => LANG_DEVICES_GROUP_ECO_ON); | |||
$groups[] = array('SYS_NAME' => 'Sunrise', 'TITLE' => LANG_DEVICES_GROUP_SUNRISE); | |||
$groups[] = array('SYS_NAME' => 'Sunset', 'TITLE' => LANG_DEVICES_GROUP_SUNSET); | |||
$groups[] = array('SYS_NAME' => 'Night', 'TITLE' => LANG_DEVICES_GROUP_NIGHT); | |||
// Сохраняем список групп устройств в массиве $out. | |||
$out['GROUPS'] = $groups; | |||
</pre> | </pre> | ||
Текущая версия от 21:29, 3 апреля 2024
ᐂ В корневой раздел ᐃ В директорию расположения файла
<?php
/*
* @version 0.1 (wizard)
*/
// Глобальная переменная $session используется для хранения данных сессии.
global $session;
// Проверяем, является ли текущий объект панелью управления.
// Если это так, то устанавливаем флаг CONTROLPANEL в 1, что может быть использовано для определения,
// нужно ли отображать элементы управления панелью.
if ($this->owner->name == 'panel') {
$out['CONTROLPANEL'] = 1;
}
// Инициализируем запрос с условием, что все записи должны быть выбраны.
// Значение "1" в SQL означает, что условие всегда истинно, и запрос будет выбирать все записи.
$qry = "1";
// Фильтры поиска.
// Здесь предполагается, что будут добавлены дополнительные условия для фильтрации результатов поиска.
// Получаем тип устройства из запроса.
// Функция gr('type') предположительно извлекает параметр 'type' из запроса.
$type = gr('type');
// Если тип устройства указан, добавляем его в запрос.
// Это позволяет фильтровать результаты поиска по типу устройства.
if ($type != '') {
// Добавляем условие в запрос, чтобы выбрать только устройства с указанным типом.
// Функция DBSafe($type) предположительно очищает входные данные от потенциально вредоносного кода.
$qry .= " AND devices.TYPE='" . DBSafe($type) . "'";
// Сохраняем тип устройства в массиве $out для дальнейшего использования.
$out['TYPE'] = $type;
}
// Получаем ID местоположения из запроса.
// Функция gr('location_id') предположительно извлекает параметр 'location_id' из запроса.
$location_id = gr('location_id');
// Проверяем, указан ли параметр управления местоположениями.
// Если параметр равен 'manage_locations', перенаправляем пользователя на страницу управления местоположениями.
if ($location_id == 'manage_locations') {
$this->redirect("?(panel:{action=locations})");
} elseif ($location_id) {
// Если указан ID местоположения, добавляем его в запрос.
// Приведение к типу int гарантирует, что ID будет числом, что необходимо для корректного SQL-запроса.
$out['LOCATION_ID'] = (int)$location_id;
// Добавляем условие в запрос, чтобы выбрать только устройства с указанным ID местоположения.
$qry .= " AND devices.LOCATION_ID=" . $out['LOCATION_ID'];
}
// Получаем имя группы устройств из запроса.
// Функция gr('group_name') предположительно извлекает параметр 'group_name' из запроса.
$group_name = gr('group_name');
// Проверяем, указан ли параметр управления группами.
// Если параметр равен 'manage_groups', перенаправляем пользователя на страницу управления группами.
if ($group_name == 'manage_groups') {
$this->redirect("?view_mode=manage_groups");
} elseif ($group_name == 'is:archived') {
// Если указан параметр архивированных устройств, добавляем его в запрос.
// Это позволяет фильтровать результаты поиска, отображая только архивированные устройства.
$qry .= " AND devices.ARCHIVED=1";
} elseif ($group_name == 'is:system') {
// Если указан параметр системных устройств, добавляем его в запрос.
// Это позволяет фильтровать результаты поиска, отображая только системные устройства.
$qry .= " AND devices.SYSTEM_DEVICE=1";
} elseif ($group_name == 'is:inactive') {
// Получаем имена объектов, которые не активны (например, устройства, не отвечающие на запросы).
$object_names = getObjectsByProperty('alive');
if (!is_array($object_names)) {
$object_names = array(0);
}
$total = count($object_names);
if ($total > 0) {
for ($i = 0; $i < $total; $i++) {
// Проверяем, является ли объект активным.
$val = getGlobal($object_names[$i].'.alive');
if (!$val) {
// Если объект не активен, добавляем его в список для фильтрации.
$res_object_names[] = "'" . $object_names[$i] . "'";
}
}
// Добавляем условие в запрос для фильтрации по именам неактивных объектов.
$qry .= " AND devices.LINKED_OBJECT IN (" . implode(',', $res_object_names) . ")";
} else {
// Если список объектов пуст, добавляем условие, которое не позволит выбрать ни одного устройства.
$qry .= " AND 0";
}
} elseif ($group_name == 'is:battery') {
// Получаем имена объектов, работающих от батареи.
// Функция getObjectsByProperty('batteryOperated', 1) предположительно возвращает список объектов,
// которые работают от батареи.
$object_names = getObjectsByProperty('batteryOperated', 1);
if (!is_array($object_names)) {
$object_names = array(0);
}
$total = count($object_names);
if ($total > 0) {
for ($i = 0; $i < $total; $i++) {
$object_names[$i] = "'" . $object_names[$i] . "'";
}
// Добавляем имена объектов в запрос, чтобы фильтровать результаты поиска по объектам,
// работающим от батареи.
$qry .= " AND devices.LINKED_OBJECT IN (" . implode(',', $object_names) . ")";
} else {
// Если список объектов пуст, добавляем условие, которое не позволит выбрать ни одного устройства.
$qry .= " AND 0";
}
} elseif ($group_name == 'is:battery_low') {
// Получаем имена объектов с низким уровнем заряда батареи.
// Функция getObjectsByProperty('batteryWarning', 1) предположительно возвращает список объектов,
// у которых уровень заряда батареи низкий.
$object_names = getObjectsByProperty('batteryWarning', 1);
if (!is_array($object_names)) {
$object_names = array(0);
}
$total = count($object_names);
if ($total > 0) {
for ($i = 0; $i < $total; $i++) {
$object_names[$i] = "'" . $object_names[$i] . "'";
}
// Добавляем имена объектов в запрос, чтобы фильтровать результаты поиска по объектам,
// у которых уровень заряда батареи низкий.
$qry .= " AND devices.LINKED_OBJECT IN (" . implode(',', $object_names) . ")";
} else {
$qry .= " AND 0";
}
} elseif ($group_name) {
// Получаем имена объектов по имени группы.
// Функция getObjectsByProperty('group' . $group_name, 1) предположительно возвращает список объектов,
// соответствующих указанному имени группы.
$object_names = getObjectsByProperty('group' . $group_name, 1);
if (!is_array($object_names)) {
$object_names = array(0);
}
$total = count($object_names);
if ($total > 0) {
for ($i = 0; $i < $total; $i++) {
$object_names[$i] = "'" . $object_names[$i] . "'";
}
// Добавляем имена объектов в запрос, чтобы фильтровать результаты поиска по объектам,
// соответствующим указанному имени группы.
$qry .= " AND devices.LINKED_OBJECT IN (" . implode(',', $object_names) . ")";
} else {
$qry .= " AND 0";
}
}
// Сохраняем имя группы устройств в массиве $out для дальнейшего использования.
$out['GROUP_NAME'] = $group_name;
// Если не указан параметр архивированных устройств, добавляем условие выбора неархивированных устройств.
// Это условие гарантирует, что в результатах поиска будут отображаться только устройства, которые не были помечены как архивированные.
if ($group_name != 'is:archived') {
$qry .= " AND devices.ARCHIVED=0";
}
// QUERY READY//Запрос к базе данных готов к выполнению
// Глобальная переменная $save_qry используется для определения, следует ли сохранять текущий запрос или использовать сохраненный.
global $save_qry;
// Если установлено сохранение запроса, используем сохраненный запрос.
// Это может быть полезно для сохранения состояния фильтрации между различными запросами.
if ($save_qry) {
$qry = $session->data['devices_qry'];
} else {
// Иначе сохраняем текущий запрос в сессии для возможного использования в будущем.
$session->data['devices_qry'] = $qry;
}
// Если запрос пуст, устанавливаем его как "1" для выбора всех записей.
// Это обеспечивает, что в любом случае будет выполнен запрос, даже если не было указано никаких фильтров.
if (!$qry) $qry = "1";
// Получаем общее количество устройств, не архивированных.
// Это делается для отображения общего количества доступных устройств в пользовательском интерфейсе.
$tmp = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM devices WHERE devices.ARCHIVED!=1");
$out['TOTAL'] = (int)$tmp['TOTAL'];
$loc_title = '';
// Сортировка результатов по приоритету местоположения, названию местоположения, ID местоположения, типу устройства и названию устройства
$sortby_devices = "locations.PRIORITY DESC, locations.TITLE, devices.LOCATION_ID, devices.TYPE, devices.TITLE";
$out['SORTBY'] = $sortby_devices;
// РЕЗУЛЬТАТЫ ПОИСКА
// Выполняем SQL-запрос для получения результатов поиска устройств, включая информацию о местоположении каждого устройства.
// Запрос сортируется по заданным критериям сортировки.
$res = SQLSelect("SELECT devices.*, locations.TITLE as LOCATION_TITLE FROM devices LEFT JOIN locations ON devices.LOCATION_ID=locations.ID WHERE $qry ORDER BY " . $sortby_devices);
// Проверяем, есть ли результаты поиска.
if (isset($res[0])) {
//paging($res, 100, $out); // search result paging
// Подсчитываем общее количество найденных устройств.
$total = count($res);
$out['TOTAL_FOUND'] = $total;
// Обрабатываем каждый результат поиска.
for ($i = 0; $i < $total; $i++) {
// Если название местоположения изменилось, устанавливаем флаг NEW_LOCATION.
if ($res[$i]['LOCATION_TITLE'] != $loc_title) {
$res[$i]['NEW_LOCATION'] = 1;
$loc_title = $res[$i]['LOCATION_TITLE'];
}
// Если у устройства есть связанный объект, обрабатываем его.
if ($res[$i]['LINKED_OBJECT']) {
// Обработка устройства в зависимости от его типа.
if ($res[$i]['TYPE'] == 'camera' || $res[$i]['TYPE'] == 'mark') {
$processed = $this->processDevice($res[$i]['ID'], 'list');
} else {
$processed = $this->processDevice($res[$i]['ID']);
}
// Добавляем HTML-представление устройства.
$res[$i]['HTML'] = $processed['HTML'];
// Получаем свойства связанного объекта.
$object_rec = SQLSelectOne("SELECT ID FROM objects WHERE TITLE='" . $res[$i]['LINKED_OBJECT'] . "'");
if ($object_rec['ID']) {
$properties = SQLSelect("SELECT pvalues.*, properties.TITLE as PROPERTY FROM pvalues LEFT JOIN properties ON properties.ID=pvalues.PROPERTY_ID WHERE pvalues.OBJECT_ID=" . $object_rec['ID'] . " AND pvalues.LINKED_MODULES!='' ORDER BY UPDATED");
$totalp = count($properties);
if ($totalp > 0) {
// Обрабатываем свойства, связанные с модулями.
$linked_modules = array();
for ($ip = 0; $ip < $totalp; $ip++) {
$tmp = explode(',', $properties[$ip]['LINKED_MODULES']);
$tmp = array_map('trim', $tmp);
foreach ($tmp as $linked_module) {
$linked_modules[$linked_module] = array('OBJECT' => $res[$i]['LINKED_OBJECT'], 'PROPERTY' => $properties[$ip]['PROPERTY']);
}
}
foreach ($linked_modules as $k => $v) {
$v['MODULE'] = $k;
$res[$i]['LINKED_MODULES'][] = $v;
}
}
}
}
// Добавляем название типа устройства.
$res[$i]['TYPE_TITLE'] = $this->device_types[$res[$i]['TYPE']]['TITLE'];
// Получаем количество связанных устройств.
$linked = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM devices_linked WHERE (DEVICE1_ID=" . $res[$i]['ID'] . " OR DEVICE2_ID=" . $res[$i]['ID'] . ")");
if ($linked['TOTAL']) {
$res[$i]['LINKED'] = $linked['TOTAL'];
}
// Получаем количество методов устройства.
$methods = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM methods WHERE CODE!='' AND OBJECT_ID=".(int)$object_rec['ID']);
if ($methods['TOTAL']) {
$res[$i]['METHODS'] = $methods['TOTAL'];
}
}
// Сохраняем результаты поиска в массиве $out.
$out['RESULT'] = $res;
}
// Подготовка к формированию списка типов устройств.
$types = array();
// Формирование списка типов устройств
// Проходим по всем типам устройств, определенным в $this->device_types.
foreach ($this->device_types as $k => $v) {
// Проверяем, установлено ли название для типа устройства.
if (isset($v['TITLE'])) {
// Создаем запись для типа устройства с его названием и именем.
$type_rec = array('NAME' => $k, 'TITLE' => $v['TITLE']);
// Выполняем запрос к базе данных для подсчета количества устройств данного типа, которые не архивированы.
$tmp = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM devices WHERE TYPE='" . $k . "' AND ARCHIVED!=1");
// Сохраняем количество устройств в записи типа устройства.
$type_rec['TOTAL'] = (int)$tmp['TOTAL'];
// Если количество устройств больше нуля, добавляем запись типа устройства в список.
if ($type_rec['TOTAL'] > 0) {
$types[] = $type_rec;
}
}
}
// Сортируем список типов устройств по названию.
usort($types, function ($a, $b) {
return strcmp($a["TITLE"], $b["TITLE"]);
});
// Сохраняем отсортированный список типов устройств в массиве $out.
$out['TYPES'] = $types;
// Получение списка местоположений
// Выполняем запрос к базе данных для получения списка местоположений.
$locations = SQLSelect("SELECT ID, TITLE FROM locations ORDER BY TITLE+0");
$total = count($locations);
// Получение количества устройств для каждого местоположения
// Проходим по всем местоположениям и выполняем запрос к базе данных для подсчета количества устройств в каждом местоположении.
for ($i = 0; $i < $total; $i++) {
$tmp = SQLSelectOne("SELECT COUNT(*) AS TOTAL FROM devices WHERE LOCATION_ID='" . $locations[$i]['ID'] . "'");
// Сохраняем количество устройств в записи местоположения.
$locations[$i]['TOTAL'] = (int)$tmp['TOTAL'];
}
// Сохраняем список местоположений с количеством устройств в массиве $out.
$out['LOCATIONS'] = $locations;
// Получение списка групп устройств
// Выполняем запрос к базе данных для получения списка групп устройств.
$groups = SQLSelect("SELECT * FROM devices_groups ORDER BY TITLE");
// Добавляем системные группы в список групп.
$groups[] = array('SYS_NAME' => 'Eco', 'TITLE' => LANG_DEVICES_GROUP_ECO);
$groups[] = array('SYS_NAME' => 'EcoOn', 'TITLE' => LANG_DEVICES_GROUP_ECO_ON);
$groups[] = array('SYS_NAME' => 'Sunrise', 'TITLE' => LANG_DEVICES_GROUP_SUNRISE);
$groups[] = array('SYS_NAME' => 'Sunset', 'TITLE' => LANG_DEVICES_GROUP_SUNSET);
$groups[] = array('SYS_NAME' => 'Night', 'TITLE' => LANG_DEVICES_GROUP_NIGHT);
// Сохраняем список групп устройств в массиве $out.
$out['GROUPS'] = $groups;