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, что означает дату и время.
*/