Modules/devices/devices schedule inc php
Материал из MajorDoMo инфо
ᐂ В корневой раздел ᐃ В директорию расположения файла
<?php
// Получаем ID точки из запроса
$point_id = gr('point_id');
// Если ID точки предоставлен
if ($point_id) {
// Выбираем точку из базы данных по ID
$point = SQLSelectOne("SELECT * FROM devices_scheduler_points WHERE ID=" . (int)$point_id);
// Если текущий режим - обновление
if ($this->mode == 'update') {
// Флаг успешности операции
$ok = 1;
// Устанавливаем ID устройства
$point['DEVICE_ID'] = $rec['ID'];
// Получаем связанный метод из запроса
$point['LINKED_METHOD'] = gr('linked_method', 'trim');
// Если связанный метод не указан
if (!$point['LINKED_METHOD']) {
// Устанавливаем ошибку
$out['ERR_LINKED_METHOD'] = 1;
// Отменяем операцию
$ok = 0;
}
// Получаем значение из запроса
$point['VALUE'] = gr('value', 'trim');
// Устанавливаем время
$set_time = gr('hour') . ':' . gr('minute');
// Получаем дни недели
$set_days = gr('set_days');
// Если дни недели не указаны, устанавливаем все дни недели
if (!isset($set_days[0])) {
$set_days = array(0, 1, 2, 3, 4, 5, 6);
}
// Если время и дни недели указаны корректно
if (isset($set_days[0]) && preg_match('/^\d+:\d+$/', $set_time)) {
// Устанавливаем время
$point['SET_TIME'] = $set_time;
// Устанавливаем дни недели
$point['SET_DAYS'] = implode(',', $set_days);
} else {
// Отменяем операцию
$ok = 0;
}
// Если все проверки прошли успешно
if ($ok) {
// Если ID точки не установлен, создаем новую точку
if (!$point['ID']) {
// Активируем точку
$point['ACTIVE'] = 1;
// Сохраняем точку в базу данных
$point['ID'] = SQLInsert('devices_scheduler_points', $point);
} else {
// Иначе обновляем существующую точку
SQLUpdate('devices_scheduler_points', $point);
}
// Перенаправляем пользователя на страницу с сообщением об успехе
$this->redirect("?id=" . $rec['ID'] . "&view_mode=" . $this->view_mode . "&tab=" . $this->tab . "&ok_msg=" . urlencode(LANG_DATA_SAVED));
}
}
// Добавляем данные точки в вывод
foreach ($point as $k => $v) {
$out['POINT_' . $k] = $v;
}
// Если установлено время
if ($point['SET_TIME']) {
}
// Проверяем, определено ли правило доступа для точки
if (checkAccessDefined('spoint', $point_id)) {
// Устанавливаем флаг, что правило доступа определено
$out['POINT_ACCESS_DEFINED'] = 1;
}
}
// Определяем дни недели
$days = array(
array('VALUE' => 0, 'TITLE' => LANG_WEEK_SUN),
array('VALUE' => 1, 'TITLE' => LANG_WEEK_MON),
array('VALUE' => 2, 'TITLE' => LANG_WEEK_TUE),
array('VALUE' => 3, 'TITLE' => LANG_WEEK_WED),
array('VALUE' => 4, 'TITLE' => LANG_WEEK_THU),
array('VALUE' => 5, 'TITLE' => LANG_WEEK_FRI),
array('VALUE' => 6, 'TITLE' => LANG_WEEK_SAT),
);
// Выбираем все точки для устройства
$points = SQLSelect("SELECT * FROM devices_scheduler_points WHERE DEVICE_ID=" . (int)$rec['ID']);
// Если найдены точки
if (isset($points[0]['ID'])) {
foreach ($points as &$point_item) {
// Разбиваем дни недели на массив
$point_days = explode(',', $point_item['SET_DAYS']);
// Массив для названий дней недели
$point_days_title = array();
foreach ($days as $k => $v) {
// Если день недели входит в массив дней точки
if (in_array($v['VALUE'], $point_days)) {
// Добавляем название дня недели в массив
$point_days_title[] = $v['TITLE'];
}
}
// Находим метод, связанный с точкой
foreach ($out['SHOW_METHODS'] as $method) {
if ($method['NAME'] == $point_item['LINKED_METHOD']) {
// Заменяем название метода на его описание
$point_item['LINKED_METHOD'] = $method['DESCRIPTION'];
break;
}
}
// Объединяем названия дней недели в строку
$point_item['SET_DAYS'] = implode(', ', $point_days_title);
// Проверяем, определено ли правило доступа для точки
if (checkAccessDefined('spoint', $point_item['ID'])) {
// Устанавливаем флаг, что правило доступа определено
$point_item['HAS_RULE'] = 1;
}
}
// Добавляем точки в вывод
$out['POINTS'] = $points;
}
// Если запрос на удаление точки
if (gr('delete_id', 'int')) {
// Удаляем точку из базы данных
SQLExec("DELETE FROM devices_scheduler_points WHERE DEVICE_ID=" . $rec['ID'] . " AND ID='" . gr('delete_id', 'int') . "'");
// Перенаправляем пользователя на страницу без сообщения об удалении
$this->redirect("?id=" . $rec['ID'] . "&view_mode=" . $this->view_mode . "&tab=" . $this->tab);
}
// Добавляем дни недели в вывод
$out['DAYS'] = $days;
// Если установлены дни недели для точки
if (isset($point['SET_DAYS']) && $point['SET_DAYS'] != '') {
// Разбиваем дни недели на массив
$tmp = explode(',', $point['SET_DAYS']);
foreach ($out['DAYS'] as &$day) {
// Если день недели входит в массив дней точки
if (in_array($day['VALUE'], $tmp)) {
// Устанавливаем флаг, что день выбран
$day['SELECTED'] = 1;
}
}
}
// Если установлено время для точки
if (isset($point['SET_TIME']) && $point['SET_TIME'] != '') {
// Разбиваем время на часы и минуты
$tmp = explode(':', $point['SET_TIME']);
// Устанавливаем часы
$out['HOUR'] = $tmp[0];
// Устанавливаем минуты
$out['MINUTE'] = $tmp[1];
}
// Генерируем массив часов
$hours = array();
for ($i = 0; $i < 24; $i++) {
// Добавляем часы в массив
$hours[] = array('VALUE' => str_pad($i, 2, '0', STR_PAD_LEFT));
}
// Добавляем массив часов в вывод
$out['HOURS'] = $hours;
// Генерируем массив минут
$minutes = array();
for ($i = 0; $i < 60; $i++) {
// Добавляем минуты в массив
$minutes[] = array('VALUE' => str_pad($i, 2, '0', STR_PAD_LEFT));
}
// Добавляем массив минут в вывод
$out['MINUTES'] = $minutes;
// Закомментированный на гите участок кода
/*
devices_scheduler_points: ID int(10) unsigned NOT NULL auto_increment
- ID: Уникальный идентификатор точки расписания.
- Тип данных: int(10) unsigned, что означает целое число без знака, длиной до 10 цифр.
- NOT NULL: Поле не может быть пустым.
- auto_increment: Значение автоматически увеличивается при добавлении новой записи.
devices_scheduler_points: LINKED_METHOD varchar(255) NOT NULL DEFAULT ''
- LINKED_METHOD: Связанный метод, который будет вызываться по расписанию.
- Тип данных: varchar(255), что означает строку символов длиной до 255 символов.
- NOT NULL: Поле не может быть пустым.
- DEFAULT '': По умолчанию поле будет пустым.
devices_scheduler_points: VALUE varchar(255) NOT NULL DEFAULT ''
- VALUE: Значение, которое будет передано в связанный метод.
- Тип данных: varchar(255), что означает строку символов длиной до 255 символов.
- NOT NULL: Поле не может быть пустым.
- DEFAULT '': По умолчанию поле будет пустым.
devices_scheduler_points: SET_TIME varchar(50) NOT NULL DEFAULT ''
- SET_TIME: Время, когда должен быть вызван связанный метод.
- Тип данных: varchar(50), что означает строку символов длиной до 50 символов.
- NOT NULL: Поле не может быть пустым.
- DEFAULT '': По умолчанию поле будет пустым.
devices_scheduler_points: SET_DAYS varchar(50) NOT NULL DEFAULT ''
- SET_DAYS: Дни недели, когда должен быть вызван связанный метод.
- Тип данных: varchar(50), что означает строку символов длиной до 50 символов.
- NOT NULL: Поле не может быть пустым.
- DEFAULT '': По умолчанию поле будет пустым.
devices_scheduler_points: DEVICE_ID int(10) NOT NULL DEFAULT '0'
- DEVICE_ID: Идентификатор устройства, к которому относится точка расписания.
- Тип данных: int(10), что означает целое число длиной до 10 цифр.
- NOT NULL: Поле не может быть пустым.
- DEFAULT '0': По умолчанию поле будет равно 0.
devices_scheduler_points: ACTIVE int(3) NOT NULL DEFAULT '1'
- ACTIVE: Статус активности точки расписания (1 - активна, 0 - не активна).
- Тип данных: int(3), что означает целое число длиной до 3 цифр.
- NOT NULL: Поле не может быть пустым.
- DEFAULT '1': По умолчанию точка расписания будет активна.
devices_scheduler_points: LATEST_RUN datetime
- LATEST_RUN: Время последнего выполнения связанного метода.
- Тип данных: datetime, что означает дату и время.
*/