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;