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;