Modules/devices/devices quick edit inc php

Материал из MajorDoMo инфо
(перенаправлено с «Devices quick edit inc php»)


ᐂ В корневой раздел ᐃ В директорию расположения файла

<?php

// Если текущий режим обновления
if ($this->mode=='update') {
    //dprint($_REQUEST);
    $location_ids=array();
    // Проходим по всем запросам
    foreach($_REQUEST as $k=>$v) {
        // Если ключ соответствует шаблону location с числом
        if (preg_match('/location(\d+)/',$k,$m)) {
            // Получаем запись о локации по ID
            $location_rec=SQLSelectOne("SELECT * FROM locations WHERE ID=".$m[1]);
            // Если запись найдена
            if ($location_rec['ID']) {
                // Обновляем название локации
                $location_rec['TITLE']=gr($k);
                // Обновляем запись в базе данных
                SQLUpdate('locations',$location_rec);
            } else {
                // Создаем новую запись о локации
                $location_rec=array();
                $location_rec['TITLE']=gr($k);
                $location_rec['ID']=SQLInsert('locations',$location_rec);
            }
            // Добавляем ID локация в массив
            $location_ids[$m[1]]=$location_rec['ID'];
        }
        // Если ключ соответствует шаблону device с числом
        if (preg_match('/device(\d+)/',$k,$m)) {
            // Получаем запись о устройстве по ID
            $device=SQLSelectOne("SELECT * FROM devices WHERE ID=".$m[1]);
            // Если запись найдена и название устройства изменилось
            if ($device['ID'] && $device['TITLE']!=gr($k)) {
                // Обновляем название устройства
                $device['TITLE']=gr($k);
                // Обновляем запись в базе данных
                SQLUpdate('devices',$device);
                // Получаем запись о связанном объекте
                $object_rec = SQLSelectOne("SELECT * FROM objects WHERE TITLE='" . DBSafe($device['LINKED_OBJECT'])."'");
                // Если запись о связанном объекте найдена
                if ($object_rec['ID']) {
                    // Обновляем описание связанного объекта
                    $object_rec['DESCRIPTION'] = $device['TITLE'];
                    // Обновляем запись в базе данных
                    SQLUpdate('objects',$object_rec);
                }
            }
        }
    }
    //dprint($_REQUEST);
    $devices_added=0;
    // Проходим по всем запросам еще раз
    foreach($_REQUEST as $k=>$v) {
        // Если ключ соответствует шаблону newdevice с числами
        if (preg_match('/newdevice(\d+)_l(\d+)/',$k,$m)) {
            // Получаем название нового устройства и его тип
            $device_title = gr('newdevice'.$m[1].'_l'.$m[2]);
            $device_type= gr('newtype'.$m[1].'_l'.$m[2]);
            // Получаем ID локация
            $location_id=$location_ids[$m[2]];
            // Если все данные предоставлены
            if ($device_title && $device_type && $location_id) {
                // Создаем новую запись о устройстве
                $rec=array();
                $rec['TITLE']=$device_title;
                $rec['LOCATION_ID']=$location_id;
                $rec['TYPE']=$device_type;
                $rec['ID']=SQLInsert('devices',$rec);

                // Получаем название комнаты по ID локации
                $location_title = getRoomObjectByLocation($rec['LOCATION_ID'], 1);

                // Получаем детали типа устройства
                $type_details = $this->getTypeDetails($rec['TYPE']);
                // Формируем префикс для нового объекта
                $prefix = ucfirst($rec['TYPE']);
                // Получаем новое название объекта
                $new_object_title = $prefix . $this->getNewObjectIndex($type_details['CLASS'], $prefix);
                // Добавляем новый объект
                $object_id = addClassObject($type_details['CLASS'], $new_object_title, 'sdevice' . $rec['ID']);
                // Обновляем связанный объект устройства
                $rec['LINKED_OBJECT'] = $new_object_title;
                SQLUpdate('devices', $rec);

                // Добавляем новый объект еще раз (похоже, дублирование кода)
                $object_id = addClassObject($type_details['CLASS'], $rec['LINKED_OBJECT'], 'sdevice' . $rec['ID']);
                // Получаем ID класса
                $class_id = current(SQLSelectOne("SELECT ID FROM classes WHERE TITLE LIKE '" . DBSafe($type_details['CLASS']) . "'"));

                // Получаем запись о новом объекте
                $object_rec = SQLSelectOne("SELECT * FROM objects WHERE ID=" . $object_id);
                // Обновляем описание и локацие объекта
                $object_rec['DESCRIPTION'] = $rec['TITLE'];
                $object_rec['LOCATION_ID'] = $rec['LOCATION_ID'];
                SQLUpdate('objects', $object_rec);

                // Если название комнаты предоставлено
                if ($location_title) {
                    // Устанавливаем глобальную переменную для связи объекта с комнатой
                    setGlobal($object_rec['TITLE'] . '.linkedRoom', $location_title);
                }

                // Устанавливаем минимальное и максимальное значения для датчиков температуры
                if ($rec['TYPE'] == 'sensor_temp') {
                    setGlobal($object_rec['TITLE'] . '.minValue', 16);
                    setGlobal($object_rec['TITLE'] . '.maxValue', 25);
                }
                // Устанавливаем минимальное и максимальное значения для датчиков влажности
                if ($rec['TYPE'] == 'sensor_humidity') {
                    setGlobal($object_rec['TITLE'] . '.minValue', 30);
                    setGlobal($object_rec['TITLE'] . '.maxValue', 60);
                }
                // Увеличиваем счетчик добавленных устройств
                $devices_added++;
            }
        }
    }
    
    // Добавляем задачу в очередь синхронизации устройств
    addToOperationsQueue('connect_sync_devices', 'required');
    // Выполняем синхронизацию с Homebridge
    $this->homebridgeSync();

    // Перенаправляем пользователя на главную страницу
    $this->redirect("?");
}

// Получаем список всех локаций
$locations = SQLSelect("SELECT * FROM locations ORDER BY TITLE");
$total = count($locations);
// Проходим по всем локациям
for($i=0;$i<$total;$i++) {
    // Получаем список устройств для каждой комнаты
    $devices=SQLSelect("SELECT * FROM devices WHERE LOCATION_ID=".$locations[$i]['ID']." ORDER BY TITLE");
    // Добавляем список устройств в массив локаций
    $locations[$i]['DEVICES']=$devices;
}
$out['LOCATIONS'] = $locations;

// Получаем список всех типов устройств
$types = array();
foreach ($this->device_types as $k => $v) {
    // Если тип устройства имеет название
    if ($v['TITLE']) {
        // Добавляем тип устройства в массив
        $types[] = array('NAME' => $k, 'TITLE' => $v['TITLE']);
    }
}

// Сортируем типы устройств по названию
usort($types, function ($a, $b) {
    return strcmp($a['TITLE'], $b['TITLE']);
});
$out['TYPES'] = $types;

// Формируем HTML-код для выпадающего списка типов устройств
$types_options='<option value="">'.LANG_TYPE;
foreach($out['TYPES'] as $type) {
    $types_options.='<option value="'.$type['NAME'].'">'.$type['TITLE'];
}
$out['TYPES_OPTIONS']=$types_options;