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;
}