Modules/devices/devices links inc php
Материал из MajorDoMo инфо
ᐂ В корневой раздел ᐃ В директорию расположения файла
<?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; }