Modules/devices/devices links inc php: различия между версиями
Материал из MajorDoMo инфо
Elmax (обсуждение | вклад) (+ devices_links.inc.php) |
(нет различий)
|
Текущая версия от 00:10, 31 марта 2024
ᐂ В корневой раздел ᐃ В директорию расположения файла
<?php
// Проверяем, если режим редактирования установлен на 'delete_link'
if ($this->edit_mode=='delete_link') {
// Объявляем глобальную переменную $link_id
global $link_id;
// Выполняем SQL-запрос для удаления связанных правил безопасности
SQLExec("DELETE FROM security_rules WHERE OBJECT_TYPE='sdevice' AND OBJECT_ID=".(int)$link_id);
// Выполняем SQL-запрос для удаления связи устройств
SQLExec("DELETE FROM devices_linked WHERE ID=".(int)$link_id);
// Перенаправляем пользователя на страницу с обновленными данными
$this->redirect("?id=".$rec['ID']."&tab=".$this->tab."&view_mode=".$this->view_mode);
}
// Проверяем, если режим редактирования установлен на 'edit_link'
if ($this->edit_mode=='edit_link') {
// Объявляем глобальные переменные $link_name и $link_id
global $link_name;
global $link_id;
// Получаем детали связи
$link_details=$this->getLinkDetails($link_name);
// Выполняем SQL-запрос для получения записи связи
$link_rec=SQLSelectOne("SELECT * FROM devices_linked WHERE ID=".(int)$link_id);
// Проверяем, если запись существует
if ($link_rec['ID']) {
// Заполняем массив $out данными из записи связи
$out['DEVICE2_ID']=$link_rec['DEVICE2_ID'];
$out['LINK_ID']=$link_rec['ID'];
$out['COMMENT']=$link_rec['COMMENT'];
// Десериализуем настройки связи
$settings=unserialize($link_rec['LINK_SETTINGS']);
// Проверяем, если параметры связи существуют
if (is_array($link_details['PARAMS'])) {
foreach($link_details['PARAMS'] as &$p) {
// Проверяем, если параметр установлен в настройках
if (isset($settings[$p['PARAM_NAME']])) {
$p['VALUE']=$settings[$p['PARAM_NAME']];
// Если тип параметра 'duration', преобразуем его в формат времени
if ($p['PARAM_TYPE']=='duration') {
$p['VALUE'] = gmdate("H:i:s", $p['VALUE']);
}
}
}
}
}
// Проверяем, если текущий режим 'update'
if ($this->mode=='update') {
$ok=1;
// Обновляем данные связи
$link_rec['DEVICE1_ID']=$rec['ID'];
$link_rec['LINK_TYPE']=$link_name;
global $device2_id;
$link_rec['DEVICE2_ID']=(int)$device2_id;
// Проверяем, если ID второго устройства установлен
if (!$link_rec['DEVICE2_ID']) {
$ok=0;
}
global $comment;
$link_rec['COMMENT']=$comment;
$params=$link_details['PARAMS'];
$config=array();
$total = count($params);
// Проходим по всем параметрам связи
for ($i = 0; $i < $total; $i++) {
// Получаем значение параметра из глобальной переменной
$config[$params[$i]['PARAM_NAME']] = gr($params[$i]['PARAM_NAME'].'_value');
// Если тип параметра 'duration', преобразуем его в секунды
if ($params[$i]['PARAM_TYPE']=='duration' && preg_match('/(\d+):(\d+):(\d+)/',$config[$params[$i]['PARAM_NAME']],$m)) {
$config[$params[$i]['PARAM_NAME']] = $m[1]*60*60+$m[2]*60+$m[3];
}
}
// Сериализуем обновленные настройки связи
$link_rec['LINK_SETTINGS']=serialize($config);
// Если все в порядке, обновляем запись связи
if ($ok) {
if ($link_rec['ID']) {
SQLUpdate('devices_linked',$link_rec);
} else {
$link_rec['ID']=SQLInsert('devices_linked',$link_rec);
}
}
// Перенаправляем пользователя на страницу с обновленными данными
$this->redirect("?id=".$rec['ID']."&tab=".$this->tab."&view_mode=".$this->view_mode);
}
// Заполняем массив $out деталями связи
foreach($link_details as $k=>$v) {
$out['LINK_DETAILS_'.$k]=$v;
}
// Разбиваем классы целей на массив
$target_classes=explode(',',$link_details['TARGET_CLASS']);
$target_classes=array_map('trim',$target_classes);
$second_devices=array();
// Выполняем SQL-запрос для получения других устройств
$other_devices=SQLSelect("SELECT * FROM devices WHERE ID!=".(int)$rec['ID']." ORDER BY TITLE");
$total = count($other_devices);
// Проходим по всем другим устройствам
for ($i = 0; $i < $total; $i++) {
// Получаем детали типа устройства
$type_details=$this->getTypeDetails($other_devices[$i]['TYPE']);
// Проверяем, если класс или родительский класс устройства совпадает с целевыми классами
if (in_array($type_details['CLASS'],$target_classes) || in_array($type_details['PARENT_CLASS'],$target_classes)) {
$second_devices[]=$other_devices[$i];
}
}
// Заполняем массив $out вторыми устройствами
$out['SECOND_DEVICES']=$second_devices;
}
// Выполняем SQL-запрос для получения связей устройств
$links=SQLSelect("SELECT devices_linked.*, devices.TITLE FROM devices_linked LEFT JOIN devices ON devices.ID=DEVICE2_ID WHERE (DEVICE1_ID=".(int)$rec['ID']." OR DEVICE2_ID=".(int)$rec['ID'].") ORDER BY ID");
// Проверяем, если связи существуют
if ($links[0]['ID']) {
$total = count($links);
// Проходим по всем связям
for ($i = 0; $i < $total; $i++) {
// Получаем запись первого устройства
$device1=SQLSelectOne("SELECT ID, TITLE FROM devices WHERE ID=".(int)$links[$i]['DEVICE1_ID']);
$links[$i]['DEVICE1_TITLE']=$device1['TITLE'];
// Проверяем, если настройки связи не пусты
if ($links[$i]['LINK_SETTINGS']!='') {
// Десериализуем настройки связи
$settings=unserialize($links[$i]['LINK_SETTINGS']);
$new_settings='';
// Проходим по всем настройкам связи
foreach($settings as $k=>$v) {
// Проверяем, если значение настройки не пустое
if ($v=='' || $v=='0') continue;
$new_settings.=$k.': <i>'.$v.'</i>; ';
}
// Обновляем настройки связи
$links[$i]['LINK_SETTINGS']=$new_settings;
}
// Проверяем, если для связи существует правило безопасности
$rule=SQLSelectOne("SELECT ID FROM security_rules WHERE OBJECT_TYPE='sdevice' AND OBJECT_ID=". $links[$i]['ID']);
if ($rule['ID']) {
$links[$i]['HAS_RULE']=1;
}
}
// Заполняем массив $out связями устройств
$out['LINKS']=$links;
}
// Получаем доступные связи для типа устройства
$avail_links=$this->getTypeLinks($rec['TYPE']);
// Проверяем, если доступные связи существуют
if (isset($avail_links[0])) {
// Заполняем массив $out доступными связями
$out['AVAIL_LINKS']=$avail_links;
}