[Модуль] Simple Calendar (app_calendar)
Модератор: immortal
-
- Сообщения: 2113
- Зарегистрирован: Пт апр 07, 2017 12:20 pm
- Благодарил (а): 317 раз
- Поблагодарили: 466 раз
Re: Календарь/менеджер задач
он последнюю версию модуля правил по тому что ранее на страницах описано (это не нужно все уже в модуле на маркете), вот и ошибки
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
- webms
- Сообщения: 498
- Зарегистрирован: Чт дек 15, 2016 3:13 am
- Благодарил (а): 221 раз
- Поблагодарили: 88 раз
Re: Календарь/менеджер задач
Немного измененный код вызова озвучки задач. Все работает
Сценарий: sayDela
Если НЕ нужно говорить пропущенные дела, то вызываем (я например утром не хочу слушать пропущенные, только сегодняшние ближайшие на три дня)
Сценарий: sayDela
Код: Выделить всё
function dayss($day)
{
$a = substr($day, strlen($day) - 1, 1);
if ($a == 1) $str = "день";
if ($a == 2 || $a == 3 || $a == 4) $str = "дня";
if ($a == 5 || $a == 6 || $a == 7 || $a == 8 || $a == 9 || $a == 0) $str = "дней";
return $str;
}
if (!empty($params['PropushhennyeDela'])) {
$stateOff = $params['PropushhennyeDela'];
}
else {
$stateOff = "";
}
if (file_exists('./modules/app_calendar/app_calendar.class.php'))
{
include_once('./modules/app_calendar/app_calendar.class.php');
$calendar = new app_calendar();
$calendar -> usual($out);
$events = $out['EVENTS_TODAY'];
$say_phrase = '';
if ($events)
{
$tasks = '';
$cals = '';
$i = 0;
$j = 0;
foreach($events as $ev)
{
if ($ev['IS_TASK'] == 1 and $ev['IS_DONE'] == 0)
{
$i++;
$tasks.= $i.'. '.$ev['TITLE'].'. ';
}
else
{
$j++;
$cals.= $j.'. '.$ev['TITLE'].'. ';
}
}
if ($i != 0) $say_phrase.= "У вас на сегодня запланированы задачи, ".$tasks;
if ($j != 0) $say_phrase.= "Сегодняшние события, ".$cals;
}
if ($stateOff != 'OFF') { //вызывается параметром, если ничего не пришло - будет говорить.
$events = $out['CALENDAR_CATEGORIES'];
$i = 0;
$tasks = '';
if ($events)
{
foreach($events as $category)
{
$events_past = $category['EVENTS_PAST'];
if ($events_past)
{
$tasks.= 'из категории: ' . $category['TITLE'] . '. '; //Если нужно перед пропущенными задачами указывать категорию
foreach($events_past as $ev)
{
$i++;
$tasks.= $i.'. '.$ev['TITLE'].'. ';
}
}
}
if ($i != 0) $say_phrase.= " Напоминаю пропущенные задачи, ".$tasks;
}
}
$events = $out['EVENTS_PASTPLAN'];
if ($events[0]['TITLE'])
{
$say_phrase.= "Напоминаю что";
$total_tasks = count($events);
for ($i = 0; $i < $total_tasks; $i++)
{
$datetime1 = date_create($events[$i]['DUE']);
$datetime2 = date_create(date('Y-m-d'));
$timeRASCHET = date_diff($datetime1, $datetime2);
$say_phrase.= " через ".$timeRASCHET -> days." ".dayss($timeRASCHET -> days)." ".$events[$i]['TITLE'].". ";
}
}
}
if ($say_phrase)
{
sleep(2);
echo $say_phrase;
//rs('DemoSay', $say_phrase); //Алиса говорит, но в чат не пишет.
//say($say_phrase,3);
}
Код: Выделить всё
rs("sayDela",array("PropushhennyeDela"=>"OFF"));
- Рейтинг: 1.16%
-
- Сообщения: 1570
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
- Благодарил (а): 40 раз
- Поблагодарили: 578 раз
Re: Календарь/менеджер задач
Кстати - $timeRASCHET не нужен, селект же возвращает AGE, где как раз и хранится сколько дней осталось до задачи
Можно написать просто так:
И повторюсь - если интересны только задачи, то в calendar.class надо вписать так
если же интересует ещё и категория задач, то
Тогда можно добавить вывод категорий
Можно написать просто так:
Код: Выделить всё
if ($events)
{
$say_phrase.= "Напоминаю что";
foreach ($events as $tasks)
{
$say_phrase.= " через ". $tasks['AGE'] ." ".dayss($tasks['AGE'])." ".$tasks['TITLE'].". ";
}
}
Код: Выделить всё
$events_pastplan=SQLSelect("SELECT *, (TO_DAYS(DUE)-TO_DAYS(NOW())) as AGE FROM calendar_events WHERE (TO_DAYS(DUE)>TO_DAYS(NOW()) AND (TO_DAYS(DUE)-TO_DAYS(NOW())<=3) AND IS_DONE=0 AND IS_TASK=1) ORDER BY AGE");
if ($events_pastplan) {
$out['EVENTS_PASTPLAN']=$events_pastplan;
}
Код: Выделить всё
$events_pastplan=SQLSelect("SELECT *, (TO_DAYS(DUE)-TO_DAYS(NOW())) as AGE,calendar_categories.TITLE as CATEGORY FROM calendar_events LEFT JOIN calendar_categories ON calendar_events.CALENDAR_CATEGORY_ID=calendar_categories.ID WHERE (TO_DAYS(DUE)>TO_DAYS(NOW()) AND (TO_DAYS(DUE)-TO_DAYS(NOW())<=3) AND IS_DONE=0 AND IS_TASK=1) ORDER BY calendar_categories.TITLE,AGE");
if ($events_pastplan) {
$out['EVENTS_PASTPLAN']=$events_pastplan;
}
Код: Выделить всё
if ($events)
{
$say_phrase.= "Напоминаю что";
$category='';
foreach ($events as $tasks)
{
if ($category!=$tasks['CATEGORY']) {
$category=$tasks['CATEGORY'];
$say_phrase.=" в категории " . $category;
}
$say_phrase.= " через ". $tasks['AGE'] ." ".dayss($tasks['AGE'])." ".$tasks['TITLE'].". ";
}
}
- Рейтинг: 1.16%
- webms
- Сообщения: 498
- Зарегистрирован: Чт дек 15, 2016 3:13 am
- Благодарил (а): 221 раз
- Поблагодарили: 88 раз
Re: Календарь/менеджер задач
fandaymon, очередное спасибо)
Pull requests отправил Сергею, но только убрал условие произносить только будущие задачи, не понимаю зачем это нужно (ведь события тоже нужно озвучивать
, например из категории ДР)
Pull requests отправил Сергею, но только убрал условие произносить только будущие задачи, не понимаю зачем это нужно (ведь события тоже нужно озвучивать

-
- Сообщения: 1570
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
- Благодарил (а): 40 раз
- Поблагодарили: 578 раз
Re: Календарь/менеджер задач
ДР в PAST_PLAN не попадёт, так как это повторяющееся событие и DUE там может быть любого года. Если мы, например вносили Новый Год в прошлом году, то в таблице будет запись с DUE='2017-01-01',IS_REPEATING=1,REPEAT_TYPE=1.webms писал(а):fandaymon, очередное спасибо)
Pull requests отправил Сергею, но только убрал условие произносить только будущие задачи, не понимаю зачем это нужно (ведь события тоже нужно озвучивать, например из категории ДР)
Если стоит задача озвучивать и то и другое, то есть же EVENTS_SOON. Туда попадают все будущие задачи и события, в диапазоне который задаётся в Настройках модуля. Работать с ними так же, как с EVENTS_PAST. И функция dayss тогда не нужна, потому что в массиве уже есть поле DAYS.
Код: Выделить всё
$events = $out['CALENDAR_CATEGORIES'];
$tasks = '';
if ($events)
{
foreach($events as $category)
{
$say_phrase.= "Напоминаю что";
$events_soon= $category['EVENTS_SOON'];
if ($events_soon)
{
$say_phrase.= 'в категории: ' . $category['TITLE'] . '. '; //Если нужно перед пропущенными задачами указывать категорию
foreach($events_soon as $ev)
{
$say_phrase.= " через ". $ev['AGE'] ." ". $ev['DAYS'] ." ".$ev['TITLE'].". ";
}
}
}
-
- Сообщения: 1570
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
- Благодарил (а): 40 раз
- Поблагодарили: 578 раз
Re: Календарь/менеджер задач
Наверное стоило всё-таки расписать как в этом модуле хранятся данные и что именно выдаёт функция usual
Все записи в календаре делятся на задачи (IS_TASK=1) и события (IS_TASK=0). Отличие задачи от события в том, что она может быть сделана.
И события и задачи бывают одноразовыми (IS_REPEATING=0) и повторяющимися (IS_REPEATING=1)
Одноразовое событие просто наступает в дату, указанную в поле DUE. Одноразовая задача может быть выполнена - IS_DONE становится равным 1 и в DONE_WHEN заносится дата, когда она выполнилась.
С повторяющимися событиями и задачами сложнее. В зависимости от REPEAT_TYPE событие повторяется ежегодно (1), ежемесячно (2) или еженедельно (3). В DUE заносится дата первого наступления события, а дальше при проверках (например мы отбираем сегодняшние события EVENTS_TODAY для того, чтобы вывести их в календарик) проверяются
REPEAT_TYPE=1 день и месяц DUE
REPEAT_TYPE=2 день DUE
REPEAT_TYPE=3 день недели DUE
С многоразовыми задачами ещё сложнее - у них IS_DONE всегда будет равен 0 (т.е. задача не выполнена). Просто когда мы нажимаем на крестик выполнить, в поле DONE_WHEN пишется текущая дата, в LOG добавляется что задача была выполнена такого-то числа и к текущему DUE добавляется
REPEAT_TYPE=1 год
REPEAT_TYPE=2 31 день и в полученной дате день меняется на тот же день что и был в DUE
REPEAT_TYPE=3 7 дней
Ежемесячные задачи забитые например на 31 будут изменятся неочевидным образом - после 31 января будет 31 марта...
Далее - что же делает функция usual? Она подготавливает 4 блока для вывода календаря
EVENTS_TODAY - здесь события и невыполненные задачи на сегодня, как одноразовые, так и повторяющиеся.
EVENTS_TODAY['TITLE'] - название задачи/события
EVENTS_TODAY['IS_TASK'] - это задача (1) или событие (0)
EVENTS_TODAY['IS_REPEATING'] - оно повторяющееся (1) или одноразовое (0)
EVENTS_TODAY['CALENDAR_CATEGORY'_ID] - id (число) категории. Если оно равно 0, значит у события/задачи нет категории
EVENTS_TODAY['ICON'] - название файла с иконкой категории
EVENTS_TODAY['USER_ID'] - это событие/задача для всех (0) или для конкретного пользователя (>0)
RECENTLY_DONE - если в настройках модуля стоит Показывать недавно выполненные задачи, то в этом блоке будут они. Недавно выполненные это значит в DONE_WHEN вчерашняя или сегодняшняя дата.
Поля тут будут те же самые что и выше, кроме ICON
И наконец блок CALENDAR_CATEGORIES в котором все категории событий и задач. У каждой категории свой блок EVENTS_PAST и EVENTS_SOON. Поэтому для того чтобы вывести все случившиеся недавно события нам нужны 2 цикла. Один переберает все категории, а второй, внутри первого, перебирает все задачи из блока EVENTS_PAST
В EVENTS_PAST попадаю несделанные просроченные задачи, т.е. IS_TASK=1 and IS_DONE=0 and DUE<текущей даты
В EVENTS_SOON не сделанные задачи и события DUE которых больше текущей даты, но меньше чем текущая дата + кол-во дней указанное в настройках модуля
Все записи в календаре делятся на задачи (IS_TASK=1) и события (IS_TASK=0). Отличие задачи от события в том, что она может быть сделана.
И события и задачи бывают одноразовыми (IS_REPEATING=0) и повторяющимися (IS_REPEATING=1)
Одноразовое событие просто наступает в дату, указанную в поле DUE. Одноразовая задача может быть выполнена - IS_DONE становится равным 1 и в DONE_WHEN заносится дата, когда она выполнилась.
С повторяющимися событиями и задачами сложнее. В зависимости от REPEAT_TYPE событие повторяется ежегодно (1), ежемесячно (2) или еженедельно (3). В DUE заносится дата первого наступления события, а дальше при проверках (например мы отбираем сегодняшние события EVENTS_TODAY для того, чтобы вывести их в календарик) проверяются
REPEAT_TYPE=1 день и месяц DUE
REPEAT_TYPE=2 день DUE
REPEAT_TYPE=3 день недели DUE
С многоразовыми задачами ещё сложнее - у них IS_DONE всегда будет равен 0 (т.е. задача не выполнена). Просто когда мы нажимаем на крестик выполнить, в поле DONE_WHEN пишется текущая дата, в LOG добавляется что задача была выполнена такого-то числа и к текущему DUE добавляется
REPEAT_TYPE=1 год
REPEAT_TYPE=2 31 день и в полученной дате день меняется на тот же день что и был в DUE
REPEAT_TYPE=3 7 дней
Ежемесячные задачи забитые например на 31 будут изменятся неочевидным образом - после 31 января будет 31 марта...
Далее - что же делает функция usual? Она подготавливает 4 блока для вывода календаря
EVENTS_TODAY - здесь события и невыполненные задачи на сегодня, как одноразовые, так и повторяющиеся.
EVENTS_TODAY['TITLE'] - название задачи/события
EVENTS_TODAY['IS_TASK'] - это задача (1) или событие (0)
EVENTS_TODAY['IS_REPEATING'] - оно повторяющееся (1) или одноразовое (0)
EVENTS_TODAY['CALENDAR_CATEGORY'_ID] - id (число) категории. Если оно равно 0, значит у события/задачи нет категории
EVENTS_TODAY['ICON'] - название файла с иконкой категории
EVENTS_TODAY['USER_ID'] - это событие/задача для всех (0) или для конкретного пользователя (>0)
RECENTLY_DONE - если в настройках модуля стоит Показывать недавно выполненные задачи, то в этом блоке будут они. Недавно выполненные это значит в DONE_WHEN вчерашняя или сегодняшняя дата.
Поля тут будут те же самые что и выше, кроме ICON
И наконец блок CALENDAR_CATEGORIES в котором все категории событий и задач. У каждой категории свой блок EVENTS_PAST и EVENTS_SOON. Поэтому для того чтобы вывести все случившиеся недавно события нам нужны 2 цикла. Один переберает все категории, а второй, внутри первого, перебирает все задачи из блока EVENTS_PAST
Код: Выделить всё
$events = $out['CALENDAR_CATEGORIES']; // в массиве $events у нас все категории
if ($events) { // проверяем есть ли у нас какие-нибудь категории
foreach($events as $category) { // если есть, то открываем цикл и заносим в массив $category все что относится к текущей категории
// в $category у нас будет (ID=>1,TITLE=>'1 категория'..., EVENTS_PAST=>array(задачи относящиеся к 1 категории))
$events_past= $category['EVENTS_PAST']; // в массив $event_past заносим блок EVENTS_PAST относящийся к текущей категории
if ($events_past) { //проверяем есть ли там что-нибудь
foreach($events_past as $ev) { // если есть, то открываем цикл и заносим в массив $ev одну запись из блока EVENTS_PAST
//$ev['AGE'] - количество дней от DUE до текущей даты
//$ev['DAYS'] - слово дней, согласованное с AGE
//$ev['TITLE'] - название задачи
//$ev['DUE'] - когда она должна была быть сделана
//$category['TITLE'] - название категории
//$category['ICON'] - иконка категории
}
}
}
В EVENTS_SOON не сделанные задачи и события DUE которых больше текущей даты, но меньше чем текущая дата + кол-во дней указанное в настройках модуля
- Рейтинг: 2.33%
-
- Сообщения: 2113
- Зарегистрирован: Пт апр 07, 2017 12:20 pm
- Благодарил (а): 317 раз
- Поблагодарили: 466 раз
Re: Календарь/менеджер задач
OperationalModes - TaskExistMode
https://connect.smartliving.ru/profile/57/objects.html
(автор, хз, вроде , видел в ветке про камень и что-то с Гарри Поттером)
с озвучкой совместить (у Багира вроде б тырил в modeChanged свич касе и туда озвучку?)
https://connect.smartliving.ru/profile/57/objects.html
(автор, хз, вроде , видел в ветке про камень и что-то с Гарри Поттером)
с озвучкой совместить (у Багира вроде б тырил в modeChanged свич касе и туда озвучку?)
Последний раз редактировалось Logrus Вс апр 01, 2018 1:50 am, всего редактировалось 1 раз.
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
-
- Сообщения: 2113
- Зарегистрирован: Пт апр 07, 2017 12:20 pm
- Благодарил (а): 317 раз
- Поблагодарили: 466 раз
Re: Календарь/менеджер задач
viewtopic.php?f=5&t=34#p7324 ага, автор нашелся, aka msh555 )))
не-е, но не суть как индикацию обозвать (сама идея и реализация, ну дальнейшее применение/использование интересны)
не-е, но не суть как индикацию обозвать (сама идея и реализация, ну дальнейшее применение/использование интересны)
Telegram | Блог
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
Raspberry Pi3, с образа от Сергея 3.31, PHP 7, флешка 16 Гб работает с 10.09.2017
Почти всё время уходит на исправление ошибок, оставшееся - на их повторение. (с) ))) Спасибо
-
- Сообщения: 1570
- Зарегистрирован: Сб янв 13, 2018 5:00 pm
- Благодарил (а): 40 раз
- Поблагодарили: 578 раз
Re: Календарь/менеджер задач
А зачем такие сложности с подключением модуля календаря и кучей циклов для того чтобы выяснить есть ли не выполненные задачи?!Logrus писал(а):viewtopic.php?f=5&t=34#p7324 ага, автор нашелся, aka msh555 )))
не-е, но не суть как индикацию обозвать (сама идея и реализация, ну дальнейшее применение/использование интересны)
Код: Выделить всё
$rec=SQLSelectOne("select id from calendar_events where IS_TASK=1 and IS_DONE=0 and TO_DAYS(DUE)<=TO_DAYS(NOW())");
if $rec {
echo 'Есть не выполненные задания'; \\ включаем лампочку
}
В модуль календаря в функцию task_done в конце добавляем эти же 4 строчки и в случае необходимости выключаем лампочку
И примерно тоже самое в функцию добавления таска - для включения лампы в случае добавления таска на сегодня или прошлое
И в функцию удаления таска
Нет смысла проверять что-то каждую минуту - с точки зрения расхода ресурсов лучше добавить проверки в местах изменения