[Модуль] Simple Calendar (app_calendar)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

grifindorec
Сообщения: 72
Зарегистрирован: Вт фев 02, 2021 12:54 pm
Благодарил (а): 18 раз
Поблагодарили: 6 раз

Re: [Модуль] Simple Calendar (app_calendar)

Сообщение grifindorec » Вт окт 12, 2021 6:25 pm

Alexander Znamensky писал(а):
Вс авг 30, 2020 3:36 pm
fandaymon писал(а):
Пн авг 17, 2020 11:11 pm
Alexander Znamensky писал(а):
Пн авг 17, 2020 10:50 pm

Спасибо. Вроде бы суточный диапазон указал, как у Вас а примере. Я его сейчас раздвинул до 3 дней.
Но в основной календарь все равно ничего не залетает.....
Хотя из Google calendar данные начали приходить.....
Можно попробовать не добавлять сразу в календарь, а вывести сначала на экран, чтобы посмотреть что именно считывается. + обязательно добавить проверку на существование такой записи в календаре. Чтобы не добавлять каждый раз, когда запускается сценарий
Добрый день, уважаемый Fandaymon! Спасибо Вам за помощь, советы и разъяснения. Все сделал, настроил, все прекрасно работает!

Для тех, кто, как и я, не очень разбирается в тонкостях php, как и обещал, выкладываю пошаговую инструкцию (все сделано исключительно по рекомендациям Fandaymona - моей заслуги никакой).

1. Делаем сервисный аккаунт. По ссылке https://console.cloud.google.com создаем новый проект - Create project, даем ему имя, создаем Service account, называем его (например, Google synchroinisation), Role – owner, DONE. Видим созданный сервисный e-mail.
СпойлерПоказать
google.pngService account.png
Проваливаемся в сервисный e-mail (его нужно будет тоже скопировать и потом добавить в скрипт), Add key – добавляем ключ JSON. Json (это файл) сохраняем, например, в /home/pi/. Это позволит авторизоваться в Гугле используя файл, вместо временных токенов.
СпойлерПоказать
google2.png
СпойлерПоказать
json.png
2. Далее, идем в свой Гугл-календарь https://calendar.google.com/calendar/r?tab=rc – настройка – настройка моих календарей – разрешения на доступ. Даем доступ нашему сервисному аккаунту (в доступе для отдельных пользователей добавляем свой сервисный e-mail, который был скопирован).
СпойлерПоказать
google3.png
3. Скачиваем новую библиотеку https://github.com/googleapis/google-api-php-client. Распаковываем и копируем, например, в /var/www/html/modules/.

4. Если будете использовать скрипт Fandaymona, исправьте кавычки в строке $client->setApplicationName(‘TestCalendarAPI’); Также имейте ввиду, что модуль Ивана Google Calendar использует старую библиотеку Гугла, поэтому в скрипте делаем обращение к новой библиотеке, не перепутайте, а то будут сыпаться ошибки при выполнении скрипта.

5. Далее, правим скрипт:
- убеждаемся, что путь к нашей новой библиотеке прописан верно: require_once '/var/www/html/modules/google-api-php-client/vendor/autoload.php';
- проверяем, что json доступен для пользователя МДМ и находится в /home/pi/;
- указываем ID своего календаря – он совпадает с вашим e-mail $calendarId = 'e-mail@gmail.com';

Код: Выделить всё

//Источники:
//https://mjdm.ru/forum/viewtopic.php?f=5&t=34&start=290#p96440
//https://github.com/googleapis/google-api-php-client
//https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-php

//Скачиваем и распаковываем папку google-api-php-client с google-api-php-client
//Делаем сервисный аккаунт
//Календарь с задачами расшаривается для этого аккаунта
//Создаём json для авторизации от сервисного аккаунта
//Помещаем json на сервер (например, в /var/www/html/)
//Раз в день (или чаще) считываются задачи из гугл-календаря и записываются в МДМ

//Тут надо поставить правильный путь до файла autoload.php из новой библиотеки:
//include your composer dependencies
require_once '/var/www/html/modules/google-api-php-client/vendor/autoload.php'; 

//Здесь полный путь и название json:
//Set the path to these credentials using the GOOGLE_APPLICATION_CREDENTIALS environment variable:
putenv('GOOGLE_APPLICATION_CREDENTIALS=/home/pi/google_calendar.json');

//Tell the Google client to use your service account credentials to authenticate:
$client = new Google_Client();
$client->useApplicationDefaultCredentials();

//Set the scopes required for the API you are going to call
$client->setApplicationName('TestCalendarAPI');
$client->setScopes('https://www.googleapis.com/auth/calendar');
$service = new Google_Service_Calendar($client);

// Берём 20 задач за сегодня 
$calendarId = 'e-mail@gmail.com'; // id основного календаря совпадает с е-мейлом

$optParams = array(
  'maxResults' => 20,
  'orderBy' => 'startTime',
  'singleEvents' => TRUE,
  'timeMin' => date('Y-m-d',strtotime('today')) .'T00:00:00+03:00',
  'timeMax' => date('Y-m-d',strtotime('+1 day')) .'T00:00:00+03:00',
);
//удаляем записи из базы
$dateMin = date('Y-m-d',strtotime('today'));
$dateMax = date('Y-m-d',strtotime('+1 day'));
SQLExec("DELETE FROM calendar_events WHERE DUE='".$dateMin."' AND CALENDAR_CATEGORY_ID=20"); 
SQLExec("DELETE FROM calendar_events WHERE DUE='".$dateMax."' AND CALENDAR_CATEGORY_ID=20"); 

$results = $service->events->listEvents($calendarId, $optParams);

if (count($results->getItems()) > 0) 
	{
	foreach ($results->getItems() as $event) 
    	{
		$rec=array();
		$rec['TITLE']=$event->getSummary();
		// Notes
		$notes = $event->getDescription();
		if ($notes){
		$rec['NOTES'] = $event->getDescription();
		}
		// DUE
		$due = $event->getStart();
		if ($due) {
			if ($due['dateTime']){
			$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['dateTime'] ));
			} else if ($due['date']){
			$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['date'] ));
			} else {
			$RESULT_LOG[] = "Invalid start date :".print_r($due, true);
			}
		}			  			  
    	// DONE_WHEN
		$done_when = $event->getEnd();
		if ($done_when) {
			if ($done_when['dateTime']){
			$rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['dateTime'] ));
			} else if ($done_when['date']){
		    $rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['date'] ));
			} else {
			$RESULT_LOG[] = "Invalid end date :".print_r($done_when, true);
			}
		}    
		$rec['CALENDAR_CATEGORY_ID']=20;
		$rec['IS_TASK']=0; //1-Задача, 0-Событие
		// ADDED
		$added = $event->getCreated();
		if ($added) {				
		$rec['ADDED'] = date('Y-m-d H:i:s', strtotime( $added ));
		}
		$rec['ID']=SQLInsert('calendar_events', $rec); 
//    	echo json_encode($rec).'<br/>\n';
    	}
	}

include_once('./modules/app_calendar/app_calendar.class.php');
$calendar = new app_calendar();
$calendar->calendar_getholidays();
Все, наслаждаемся обновлением календаря (я сделал под себя: 20 задач в день, синхронизация событий на предстоящий день в 00-00 часов). Естественно, можно все исправить под себя.

Еще лайф-хак – у меня рабочая почта из outlook синхронизируется с Гугл-календарем используя приложение для Винды gSyncit.
Таким образом получаем утром напоминание из МДМ о всех делах на сегодня (и личные и рабочие).

Говорим спасибо Ивану и Fandaymonу.

Всем удачи!
СпойлерПоказать
script.php.rar
Добрый день.
Подскажите пожалуйста, этот script.php.txt надо сохранить в какую-нибудь директорию под именем script.php и запустить в браузере, или это текст для сценария в mjdm? На самом деле я и то и то попробовал, ошибок не выдает, но данные не подтягиваются в календарь. Как можно задебажить?
grifindorec
Сообщения: 72
Зарегистрирован: Вт фев 02, 2021 12:54 pm
Благодарил (а): 18 раз
Поблагодарили: 6 раз

Re: [Модуль] Simple Calendar (app_calendar)

Сообщение grifindorec » Вт окт 26, 2021 6:06 pm

grifindorec писал(а):
Вт окт 12, 2021 6:25 pm
Alexander Znamensky писал(а):
Вс авг 30, 2020 3:36 pm
fandaymon писал(а):
Пн авг 17, 2020 11:11 pm
Alexander Znamensky писал(а):
Пн авг 17, 2020 10:50 pm

Спасибо. Вроде бы суточный диапазон указал, как у Вас а примере. Я его сейчас раздвинул до 3 дней.
Но в основной календарь все равно ничего не залетает.....
Хотя из Google calendar данные начали приходить.....
Можно попробовать не добавлять сразу в календарь, а вывести сначала на экран, чтобы посмотреть что именно считывается. + обязательно добавить проверку на существование такой записи в календаре. Чтобы не добавлять каждый раз, когда запускается сценарий
Добрый день, уважаемый Fandaymon! Спасибо Вам за помощь, советы и разъяснения. Все сделал, настроил, все прекрасно работает!

Для тех, кто, как и я, не очень разбирается в тонкостях php, как и обещал, выкладываю пошаговую инструкцию (все сделано исключительно по рекомендациям Fandaymona - моей заслуги никакой).

1. Делаем сервисный аккаунт. По ссылке https://console.cloud.google.com создаем новый проект - Create project, даем ему имя, создаем Service account, называем его (например, Google synchroinisation), Role – owner, DONE. Видим созданный сервисный e-mail.
СпойлерПоказать
google.pngService account.png
Проваливаемся в сервисный e-mail (его нужно будет тоже скопировать и потом добавить в скрипт), Add key – добавляем ключ JSON. Json (это файл) сохраняем, например, в /home/pi/. Это позволит авторизоваться в Гугле используя файл, вместо временных токенов.
СпойлерПоказать
google2.png
СпойлерПоказать
json.png
2. Далее, идем в свой Гугл-календарь https://calendar.google.com/calendar/r?tab=rc – настройка – настройка моих календарей – разрешения на доступ. Даем доступ нашему сервисному аккаунту (в доступе для отдельных пользователей добавляем свой сервисный e-mail, который был скопирован).
СпойлерПоказать
google3.png
3. Скачиваем новую библиотеку https://github.com/googleapis/google-api-php-client. Распаковываем и копируем, например, в /var/www/html/modules/.

4. Если будете использовать скрипт Fandaymona, исправьте кавычки в строке $client->setApplicationName(‘TestCalendarAPI’); Также имейте ввиду, что модуль Ивана Google Calendar использует старую библиотеку Гугла, поэтому в скрипте делаем обращение к новой библиотеке, не перепутайте, а то будут сыпаться ошибки при выполнении скрипта.

5. Далее, правим скрипт:
- убеждаемся, что путь к нашей новой библиотеке прописан верно: require_once '/var/www/html/modules/google-api-php-client/vendor/autoload.php';
- проверяем, что json доступен для пользователя МДМ и находится в /home/pi/;
- указываем ID своего календаря – он совпадает с вашим e-mail $calendarId = 'e-mail@gmail.com';

Код: Выделить всё

//Источники:
//https://mjdm.ru/forum/viewtopic.php?f=5&t=34&start=290#p96440
//https://github.com/googleapis/google-api-php-client
//https://cloud.google.com/docs/authentication/production#auth-cloud-implicit-php

//Скачиваем и распаковываем папку google-api-php-client с google-api-php-client
//Делаем сервисный аккаунт
//Календарь с задачами расшаривается для этого аккаунта
//Создаём json для авторизации от сервисного аккаунта
//Помещаем json на сервер (например, в /var/www/html/)
//Раз в день (или чаще) считываются задачи из гугл-календаря и записываются в МДМ

//Тут надо поставить правильный путь до файла autoload.php из новой библиотеки:
//include your composer dependencies
require_once '/var/www/html/modules/google-api-php-client/vendor/autoload.php'; 

//Здесь полный путь и название json:
//Set the path to these credentials using the GOOGLE_APPLICATION_CREDENTIALS environment variable:
putenv('GOOGLE_APPLICATION_CREDENTIALS=/home/pi/google_calendar.json');

//Tell the Google client to use your service account credentials to authenticate:
$client = new Google_Client();
$client->useApplicationDefaultCredentials();

//Set the scopes required for the API you are going to call
$client->setApplicationName('TestCalendarAPI');
$client->setScopes('https://www.googleapis.com/auth/calendar');
$service = new Google_Service_Calendar($client);

// Берём 20 задач за сегодня 
$calendarId = 'e-mail@gmail.com'; // id основного календаря совпадает с е-мейлом

$optParams = array(
  'maxResults' => 20,
  'orderBy' => 'startTime',
  'singleEvents' => TRUE,
  'timeMin' => date('Y-m-d',strtotime('today')) .'T00:00:00+03:00',
  'timeMax' => date('Y-m-d',strtotime('+1 day')) .'T00:00:00+03:00',
);
//удаляем записи из базы
$dateMin = date('Y-m-d',strtotime('today'));
$dateMax = date('Y-m-d',strtotime('+1 day'));
SQLExec("DELETE FROM calendar_events WHERE DUE='".$dateMin."' AND CALENDAR_CATEGORY_ID=20"); 
SQLExec("DELETE FROM calendar_events WHERE DUE='".$dateMax."' AND CALENDAR_CATEGORY_ID=20"); 

$results = $service->events->listEvents($calendarId, $optParams);

if (count($results->getItems()) > 0) 
	{
	foreach ($results->getItems() as $event) 
    	{
		$rec=array();
		$rec['TITLE']=$event->getSummary();
		// Notes
		$notes = $event->getDescription();
		if ($notes){
		$rec['NOTES'] = $event->getDescription();
		}
		// DUE
		$due = $event->getStart();
		if ($due) {
			if ($due['dateTime']){
			$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['dateTime'] ));
			} else if ($due['date']){
			$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['date'] ));
			} else {
			$RESULT_LOG[] = "Invalid start date :".print_r($due, true);
			}
		}			  			  
    	// DONE_WHEN
		$done_when = $event->getEnd();
		if ($done_when) {
			if ($done_when['dateTime']){
			$rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['dateTime'] ));
			} else if ($done_when['date']){
		    $rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['date'] ));
			} else {
			$RESULT_LOG[] = "Invalid end date :".print_r($done_when, true);
			}
		}    
		$rec['CALENDAR_CATEGORY_ID']=20;
		$rec['IS_TASK']=0; //1-Задача, 0-Событие
		// ADDED
		$added = $event->getCreated();
		if ($added) {				
		$rec['ADDED'] = date('Y-m-d H:i:s', strtotime( $added ));
		}
		$rec['ID']=SQLInsert('calendar_events', $rec); 
//    	echo json_encode($rec).'<br/>\n';
    	}
	}

include_once('./modules/app_calendar/app_calendar.class.php');
$calendar = new app_calendar();
$calendar->calendar_getholidays();
Все, наслаждаемся обновлением календаря (я сделал под себя: 20 задач в день, синхронизация событий на предстоящий день в 00-00 часов). Естественно, можно все исправить под себя.

Еще лайф-хак – у меня рабочая почта из outlook синхронизируется с Гугл-календарем используя приложение для Винды gSyncit.
Таким образом получаем утром напоминание из МДМ о всех делах на сегодня (и личные и рабочие).

Говорим спасибо Ивану и Fandaymonу.

Всем удачи!
СпойлерПоказать
script.php.rar
Добрый день.
Подскажите пожалуйста, этот script.php.txt надо сохранить в какую-нибудь директорию под именем script.php и запустить в браузере, или это текст для сценария в mjdm? На самом деле я и то и то попробовал, ошибок не выдает, но данные не подтягиваются в календарь. Как можно задебажить?
Отвечаю на свой же вопрос. Должен быть включен https://console.developers.google.com/a ... leapis.com
За это сообщение автора grifindorec поблагодарили (всего 2):
Alexander Znamensky (Пт дек 03, 2021 9:39 am) • IrisKo (Сб фев 18, 2023 11:58 pm)
Рейтинг: 2.33%
Аватара пользователя
vitosmaxim80sad145
Сообщения: 148
Зарегистрирован: Сб июл 07, 2018 12:48 am
Откуда: Днепр
Благодарил (а): 100 раз
Поблагодарили: 1 раз

Re: [Модуль] Simple Calendar (app_calendar)

Сообщение vitosmaxim80sad145 » Пт мар 25, 2022 10:25 pm

Поделитесь сценой календаря есои есть
shefus
Сообщения: 84
Зарегистрирован: Вт мар 08, 2016 4:57 pm
Благодарил (а): 17 раз
Поблагодарили: 2 раза

Re: [Модуль] Simple Calendar (app_calendar)

Сообщение shefus » Пт окт 14, 2022 12:43 pm

Так как тут была ссылка на модуль Todoer
xor писал(а):
Пт фев 19, 2021 4:53 pm
а вот по-новее https://connect.smartliving.ru/profile/ ... odoer.html там ссылка на гит с новым модулем. там нет жпс
- спрошу здесь:
Как добавить задачу из скрипта?
И чтение задач на сегодня/завтра из скрипта?
Автор обещал:
"Подробнее об использовании модуля как планировщика в системе, об иерархии задач, о создании задач из кода - в следующей статье",
но статьи так и нет :(
Аватара пользователя
xor
Сообщения: 2038
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 284 раза
Поблагодарили: 629 раз

Re: [Модуль] Simple Calendar (app_calendar)

Сообщение xor » Сб окт 15, 2022 3:28 am

shefus писал(а):
Пт окт 14, 2022 12:43 pm
Как добавить задачу из скрипта?
И чтение задач на сегодня/завтра из скрипта?
Лучше бы не в этой теме вопрос(
создание задачи из скрипта

Код: Выделить всё

include_once(DIR_MODULES . 'todoer/todoer.class.php');
$todo = new todoer();
$tsk = array(
    'TITLE'			=> "test task",
    'DUE'			=> date('Y-m-d H:i:00', time() + 60*2), //or comment if IS_NODATE=1
	'END_TIME'		=> date('Y-m-d H:i:00', time() + 60*3), //or comment if IS_NODATE=1
	'NOTES'			=> "This task made from code...",//your notes
//	'IS_NODATE'		=> 1,
	'IS_REPEATING'	=> 1,
	'REPEAT_TYPE'	=> 6, // see repeat type list 0-year...6-minute
	'BEGIN_CODE'	=> "say('задача началась!',1);", //code for beginning
	'DONE_CODE'		=> "say('задача закончена!',1);", //code for ending
	'AUTODONE'		=> 1, //autoends at end_time and done_code execs
	'REPEAT_UNTIL'	=> date('Y-m-d H:i:00', time() + 60*10),
	'CATEGORY'		=> "Автомат",
//  ... and so on
);
//echoes id of new task
echo $todo->create_new_task($tsk);
//echo SETTINGS_TODOER_LOGGING;
формирование повестки на сегодня:

Код: Выделить всё

if (file_exists('./modules/todoer/todoer.class.php')) 
{ 
	$events = SQLSelect("SELECT  DATE_FORMAT( clnd_events.due, '%H:%i' ) due_time, 
    DATE_FORMAT( clnd_events.DONE_WHEN, '%H:%i %d.%m.%y' ) done_date, clnd_events.*, 
    clnd_categories.ICON, clnd_categories.title CAT_NAME 
    FROM clnd_events left join clnd_categories 
    on clnd_events.calendar_category_id=clnd_categories.id  
    WHERE TO_DAYS(DUE)<=TO_DAYS(NOW()) AND TO_DAYS(END_TIME)>=TO_DAYS(NOW())
    and IS_NODATE=0 AND ifnull(AT_CALENDAR,1)!=0 ORDER BY DUE");

    if ($events) 
    { 
        $tasks = ''; 
        $cals = ''; 
        $i = 0; 
        $j = 0; 
        foreach($events as $ev) 
        { 
            if($ev['ALL_DAY']) {
              $duetm = '<i>-день:</i> '; 
            }else{
              $duetm = '<i>'.$ev['due_time'].':</i> ';
            } 
            if( $ev['IS_DONE'] == 0) 
            { 
                $i++; 
            	$tsk = "<a href='/apps/todoer.html?md=todoer&view_mode=edit_clnd_events&id=".$ev['ID']."'>".$ev['TITLE']."</a>";
                $cat = '';
            	if($ev['ICON']) {   
            		$cat = "<img style='width: 25px;' src='".ROOTHTML."cms/todoer/".$ev['ICON']."'>";
                }
            	$tasks.= $duetm.' '.$cat.$tsk.'<br>'; 
            	//$tasks.= $duetm.$ev['TITLE'].' ['.$ev['CAT_NAME'].']<br>'; //или просто текст
                
            } elseif( $ev['IS_DONE'] == 1)  { 
                $j++; 
                $tsk = "<a href='/apps/todoer.html?md=todoer&view_mode=edit_clnd_events&id=".$ev['ID']."'>".$ev['TITLE']."</a>";
                $cat = '';
            	if($ev['ICON']){
            		$cat = "<img style='width: 25px;' src='".ROOTHTML."cms/todoer/".$ev['ICON']."'>";
                }
            	$cals.= $duetm.' '.$cat.$tsk.' <i>в '.$ev['done_date'].'</i><br>';
                //$cals.= $ev['TITLE'].' ['.$ev['CAT_NAME'].'] <i>в '.$ev['done_date'].'</i><br>'; 
            } 
        } 
        $say_phrase = "<b>Сегодня: <a href='/apps/todoer.html'>".date('d.m.y').' '.gg('ThisComputer.DayOfWeekTXT')."</a></b><br><br>";
        if ($i != 0) $say_phrase.= $tasks; 
        if ($j != 0) $say_phrase.= "<hr><b>Сделано:</b><br>".$cals; 
    } //overdue
        $events = SQLSelect("SELECT DATE_FORMAT( clnd_events.due, '%H:%i %d.%m.%y' ) due_time, 
        DATE_FORMAT( clnd_events.end_time,'%H:%i %d.%m.%y' ) end_time_frmt, 
        clnd_events.*,clnd_categories.ICON,clnd_categories.title CAT_NAME 
        FROM clnd_events left join clnd_categories 
        on clnd_events.calendar_category_id=clnd_categories.id  
        WHERE IS_DONE=2 AND ((ifnull(AT_CALENDAR,1)!=0 AND holidays=0) or clnd_categories.title is null)  ORDER BY DUE");
        $i = 0; 
        $tasks = ''; 
        if ($events) 
        { 
        foreach($events as $ev){ 
                $i++;
                $tsk = "<a href='/apps/todoer.html?md=todoer&view_mode=edit_clnd_events&id=".$ev['ID']."'>".$ev['TITLE']."</a><br>";
                $cat = '';
            	if($ev['ICON']){        
        			$cat = "<img style='width: 25px;' src='".ROOTHTML."cms/todoer/".$ev['ICON']."'>";
                }
        		$tasks.= '<i>до '.$ev['end_time_frmt'].': </i>'.$cat.$tsk.'<br>'; 
                //$tasks.= '<i>до '.$ev['end_time_frmt'].': </i> '.$ev['TITLE'].'.<br>';             
        }   
        if ($i != 0) $say_phrase.= "<hr><b>Пропущено:</b><br>".$tasks; 
        } 
 
    if ($say_phrase) 
    { 
        echo $say_phrase; 
    }else{
        $say_phrase = 'Нет дел';
    }

    $say_phrase = mb_strcut($say_phrase,0,2040);
    sg("msgAgenda.text",$say_phrase); 
    //saveToCache('MJD:msgAgenda.text',$say_phrase)." ...";
    //postToWebSocketQueue("msgAgenda.text",$say_phrase); 

} 
этот код формирует хтмл- повестку с гиперссылками на задачи
2022-10-15_03-26-02.png
2022-10-15_03-26-02.png (8.38 КБ) 763 просмотра
Вот ещё вывод из модуля есть для обработки

Код: Выделить всё

include_once('./modules/todoer/todoer.class.php');
$todoer_module = new todoer();
$out = $todoer_module->data_out("soon");
echo('<pre>');
print_r($out);
* data_out выдадим данные в массиве по параметру - для тех, кто не любит запросы писать
* what -> all, today, soon, latest, recently_done, done, overdue, nodate или явное выражение sql для фильтра where
function data_out($what='all')
IrisKo
Сообщения: 60
Зарегистрирован: Пт фев 15, 2019 12:19 pm
Благодарил (а): 19 раз
Поблагодарили: 4 раза

Re: [Модуль] Simple Calendar (app_calendar)

Сообщение IrisKo » Чт фев 16, 2023 2:52 am

grifindorec писал(а):
Вт окт 26, 2021 6:06 pm


Отвечаю на свой же вопрос. Должен быть включен https://console.developers.google.com/a ... leapis.com
Вроде как все делала по инструкции, но ничего не получается - выдает ошибку при запуске:
"Uncaught Error: Class 'Google_Client' not found in /var/www/html/modules/scripts/scripts.class.php(164) : eval()'d code:22 Stack trace: #0 /var/www/html/modules/scripts/scripts.class.php(164): eval() #1 /var/www/html/lib/common.class.php(431): scripts->runScript('Calendar', Array) #2 /var/www/html/objects/index.php(183): runScript('Calendar', Array) #3 {main} thrown"
Я что то видимо упустила?
fandaymon
Сообщения: 1553
Зарегистрирован: Сб янв 13, 2018 5:00 pm
Благодарил (а): 39 раз
Поблагодарили: 574 раза

Re: [Модуль] Simple Calendar (app_calendar)

Сообщение fandaymon » Чт фев 16, 2023 9:08 pm

IrisKo писал(а):
Чт фев 16, 2023 2:52 am
grifindorec писал(а):
Вт окт 26, 2021 6:06 pm


Отвечаю на свой же вопрос. Должен быть включен https://console.developers.google.com/a ... leapis.com
Вроде как все делала по инструкции, но ничего не получается - выдает ошибку при запуске:
"Uncaught Error: Class 'Google_Client' not found in /var/www/html/modules/scripts/scripts.class.php(164) : eval()'d code:22 Stack trace: #0 /var/www/html/modules/scripts/scripts.class.php(164): eval() #1 /var/www/html/lib/common.class.php(431): scripts->runScript('Calendar', Array) #2 /var/www/html/objects/index.php(183): runScript('Calendar', Array) #3 {main} thrown"
Я что то видимо упустила?
В начале скрипта подключается библиотека гугла. Нужен правильный путь к файлу и убедиться, что такой файл в принципе существует

Код: Выделить всё

require_once './Google/vendor/autoload.php';
IrisKo
Сообщения: 60
Зарегистрирован: Пт фев 15, 2019 12:19 pm
Благодарил (а): 19 раз
Поблагодарили: 4 раза

Re: [Модуль] Simple Calendar (app_calendar)

Сообщение IrisKo » Сб фев 18, 2023 11:51 pm

Спасибо, разобралась - была проблема из-за того что неправильную библиотеку скачала, нужно было для версии php7.0. Еще немного подправила под себя ваш код чтоб подтянуть с гугла праздники и раскидать их по категориям - праздники без выходного, перенесенные выходные и перенесенные рабочие. А также добавила проверку чтоб по нескольку раз не вносились одинаковые данные. Я еще тот мамкин кодер и возможно можно было бы более оптимально как то сдедать, но вроде как работает у меня, может кому то тоже будет полезен.

Код: Выделить всё

//Здесь указываем полный путь к файлу autoload.php со скачаной с github библиотеки, которую распаковали
require_once '/var/www/html/modules/google-api-php-client/vendor/autoload.php'; 

//Здесь полный путь и название json:
putenv('GOOGLE_APPLICATION_CREDENTIALS=/var/www/html/modules/sosnova-home-05ce048e82ef.json');

//Сообщаем Google client что нужно использовать service account для аунтефикации
$client = new Google_Client();
$client->useApplicationDefaultCredentials();

//Сообщаем что мы будем вызывать по API
$client->setApplicationName('TestCalendarAPI');
$client->setScopes('https://www.googleapis.com/auth/calendar');
$service = new Google_Service_Calendar($client);
$calendarId = 'ru.ukrainian#holiday@group.v.calendar.google.com'; // id календаря с праздниками Украины

//создаем массив с выборкой событий за этот год
$optParams = array(
  'orderBy' => 'startTime',
  'singleEvents' => TRUE,
  'timeMin' => date('Y-m-d',strtotime('1 January this year')) .'T00:00:00+02:00',
  'timeMax' => date('Y-m-d',strtotime('31 December this year')) .'T00:00:00+02:00',
);
$results = $service->events->listEvents($calendarId, $optParams);

//обрабатываем данные массива если он не пустой
if (count($results->getItems()) > 0) 
	{
	foreach ($results->getItems() as $event) 
    	{
		$rec=array();
    //название события
		$rec['TITLE']=$event->getSummary();
    //дата начала события
		$due = $event->getStart();
		if ($due) {
			if ($due['dateTime']){
			$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['dateTime'] ));
			} else if ($due['date']){
			$rec['DUE'] = date('Y-m-d H:i:s', strtotime( $due['date'] ));
			} else {
			$RESULT_LOG[] = "Invalid start date :".print_r($due, true);
			}
		}
    //дата окончания события
		$done_when = $event->getEnd();
		if ($done_when) {
			if ($done_when['dateTime']){
			$rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['dateTime'] ));
			} else if ($done_when['date']){
		    $rec['DONE_WHEN'] = date('Y-m-d H:i:s', strtotime( $done_when['date'] ));
			} else {
			$RESULT_LOG[] = "Invalid end date :".print_r($done_when, true);
			}
		}
    
    //присваиваем категорию
    $text=mb_strtolower($rec['TITLE']);//переводим в нижний регистр
    $hollidays = array('новый год', 'рождество', 'женский', 'пасхальное воскресенье','первое мая','победы','троица','конституции','независимости','защитников');//массив с гос. апаздниками
    $m = false;
        foreach($hollidays as $holliday) {
  if (strpos($text, $holliday) !== false) {
  $m = true;
  }
}
if (strpos($text, 'перенесенный выходной') !== false) {
    $rec['CALENDAR_CATEGORY_ID']=2; //перенесенные выходные
    }
elseif(strpos($text, 'перенесенный рабочий') !== false){
$rec['CALENDAR_CATEGORY_ID']=1; //перенесенные рабочие
}
    elseif(strpos($text, 'православный новый год') !== false){
$rec['CALENDAR_CATEGORY_ID']=5; //праздник без выходного
}
//условие если найден в массиве праздников еще ранее не присвоена категория 1 и 2
elseif($m && (!$rec['CALENDAR_CATEGORY_ID'])){
$rec['CALENDAR_CATEGORY_ID']=3; //гос.праздник
}
else $rec['CALENDAR_CATEGORY_ID']=5;
    
    //отмечаем какой тип события 1-Задача, 0-Событие
		$rec['IS_TASK']=0; 
	//когда добавлено в календарь
		$added = $event->getCreated();
		if ($added) {				
		$rec['ADDED'] = date('Y-m-d H:i:s', strtotime( $added ));
		}
    //проверка есть ли такая запись уже в базе
$test=SQLSelectOne("SELECT ID FROM calendar_events WHERE TITLE ='".$rec['TITLE']."' AND DUE ='".$rec['DUE']."'");
    if (!$test['ID']) {
     $rec['ID']=SQLInsert('calendar_events', $rec);//присваиваем ID и вносим в базу
    }
//echo json_encode($rec).'<br/>';//раскоментировать для тестирования 
    	}
	}
Ответить