[Google Agenda] Récupérer les différents calendriers cochés + les événements des x prochaines semaines

Tags: #<Tag:0x00007f3861681a50>

Bonjour, j’ai configuré avec succès le plugin Google Agenda !
J’ai alors coché les 2 calendriers à surveiller.

J’aimerais récupérer dans un bloc code les calendriers cochés + les événements correspondants des 4 prochaines semaines (comme je l’ai fait pour le plugin « Agenda » non Google)
Mais ce plugin :

  • Cumul tous les événements de tous les calendriers cochés
  • Permet de lister les événements du jour et du lendemain, sans détail (date de début, date de fin …)

[EDIT]Une bonne soirée de dev et j’ai réussi à faire ce que je voulais
Je mets donc le code, ça peut servir à quelqu’un.
Il me reste plus qu’à trouver le nom du calendrier, parce que l’ID sur 50 caractères c’est moyen :slight_smile:

Voici mon code :

$tags = $scenario->getTags();
$current_month = date('m');

$gcalendar = eqLogic::byId($tags['#calid#']); // Récupération de l'ID de l'agenda Google en paramètre
$calindex = 0;

if(isset($gcalendar)) {
  
  // Liste des calendriers sélectionnés
  $calendarList = $gcalendar->getConfiguration('calendars');
  
  foreach ($calendarList as $calendarId => $value){
	if ($value == 0) {
		continue;
	}
    
    // Variable test pour chaque calendrier
    $calindex += 1;
    $var = "read_calendar_test_" . $calindex;
    $calendarStr = "";
    
	try {
      	$eventsG = getEvents4weeks($gcalendar, $calendarId); 
      	$events = array();
      
      	// Lecture des occurences ... et regroupement par événement du même nom
		foreach ($eventsG as $eventG) {
          	$event = array();
          	$event['start'] = (isset($eventG['start']['date'])) ? $eventG['start']['date'] : date('Y-m-d', strtotime($eventG['start']['dateTime']));
          	$event['end'] = (isset($eventG['end']['date'])) ? $eventG['end']['date'] : date('Y-m-d', strtotime($eventG['end']['dateTime']));
          	$events[$eventG['summary']][] = $event;
		}
      
      	// Lecture des événements
      	foreach ($events as $evenement => $occurences) {
          
     		if(count($occurences) > 0){
     			if($calendarStr != "") $calendarStr .= '||';
     			$calendarStr .= $evenement.'|'.count($occurences);
     		}
          
          	// Tri des occurences par date
          	asort($occurences);
          
          	// Lecture des occurences de chaque événement + mise en forme
     		foreach ($occurences as $occurence){
				$start = date_create($occurence['start']);
       			$startStr = date_format($start, 'd/m');
       			$startMonth = substr($startStr, -2);
       
        		$end = date_create($occurence['end']);
       			$endStr = date_format($end, 'd/m');
        		$endMonth = substr($endStr, -2);
 
 				if($current_month == $startMonth && $startMonth == $endMonth){
        			$startStr = substr($startStr,0,2);
            		$endStr = substr($endStr,0,2);
        		}
 
       			$calendarStr .= '|'.$startStr;
       			if($endStr != $startStr)
       				$calendarStr .= '-'.$endStr;
     		}
          
        }
      
      	// Variable test pour chaque calendrier
      	$scenario->setData($var, $calendarStr);
      
	} catch (Exception $e) {
		log::add('gCalendar', 'error', __('Erreur sur : ', __FILE__) . $calendarId . ' => ' . $e->getMessage());
	}
    
  }  

}
else {
  $calendarStr = "Non trouvé";
}

// Commande info cible
if($tags['#calinfo#'] == 'test'){
	$scenario->setData("read_calendar_test", $calendarStr);
}
else{
	$cmd = cmd::byId($tags['#calinfo#']);
	$cmd->event($calendarStr);
}

// Lectures des événements pour les 4 prochaines semaines
function getEvents4weeks($gcalendar, $_calendarId) {
	$result = $gcalendar->request('GET', '/calendars/' . $_calendarId . '/events?singleEvents=true&timeMin=' . urlencode(date(DATE_RFC3339)) . '&timeMax=' . urlencode(date(DATE_RFC3339, strtotime('+4 weeks'))));
	return (isset($result['items'])) ? $result['items'] : array();
}

Voici le rendu dans un design :
Capture

1 J'aime

Bonjour sACLe,
Intéressant :slight_smile:
Tu l’insères dans un bloc « code » ?
Si oui peux tu me dire comment tu l’utilises pour pouvoir le mettre dans ton désign et comment interagir avec pour lancer une action ?
D’avance merci

Bonjour,

Oui dans un bloc code. Maintenant j’en ai même 3.

  • Un scénario en bloc code qui sert de fonction pour lire un agenda dans le plugin officiel et stocke le résultat dans une info virtuelle (tag d’entrée : id du calendrier et id du virtuel)

  • Un scénario en bloc code qui sert de fonction pour lire un agenda Google et stocke le résultat dans des variables au nom gcal_[id_objet_calendrier_google]_[Nom du calendrier google] (tag d’entrée : id du calendrier)

  • Et mon 3ième scénario : appelle les fonctions citées plus haut, et récupère les variables gcal_* vers un virtuel
    Capture
    –> Ce scénario est déclenché chaque nuit à 00h15

Le résultat est un virtuel avec 1 info pour chaque calendrier à afficher
image
J’ai stocké les informations de cette manière :
[Evénément] | [Nombre d’occurences] | Dates …
Exemple : Poubelles|4|20|27|04/10|11/10
Chaque info a un paramètre widget « cal_icon » pour définir l’icone qui sera affiché dans le widget
Capture2

Ensuite les plugins découpent ces chaines pour l’affichage :
Capture3

Au niveau du widget, c’est transparent si la source est un calendrier du plugin officiel ou du plugin Google Calendar

… et le widget est inclut tel quel dans le design
Capture

Ca fait un peu usine à gaz mais ça marche bien :slight_smile:

Merci pour ta réponse, je vais regarder ça de plus près. C’est très intéressant. Merci