Как создать представление списка Календаря Google с переполнением стека

Мне нужно разместить Список событий из Календаря Google на веб-странице.
Список, который мне нужен, можно увидеть в самом Календаре Google, это список событий (в стиле повестки дня) с содержимым из нескольких календарей разного цвета.
Календарь Google также позволяет иметь этот список в Iframe, но проблема в том, что для просмотра этих списков пользователь должен войти в систему, или мне нужно было бы сделать календарь общедоступным, чего я не могу сделать.

Раньше для календарей существовал частный URL, но теперь только канал iCal доступен в частном порядке.

Поэтому я попытался найти скрипт PHP для создания такого списка.
Удивительно, но я не нашел много.
Большинство страниц основаны на общедоступном календаре или являются просто очень простыми примерами подключения, как пример Google php здесь.
https://developers.google.com/google-apps/calendar/quickstart/php#step_3_set_up_the_sample
что мне удалось получить работу, но это довольно далеко от того, что мне нужно.
Мне нужен вывод html, который я могу отформатировать, и данные из 3 разных календарей.

Сделать это немного над моей головой, но, может быть, кто-то делал что-то подобное раньше, видел, как это было сделано где-то еще?
Или может просто вытряхнуть его из рукава?
Или есть лучшее предложение?

Еще одна попытка, которую я предпринял, заключалась в использовании phantomjs для входа в календарь и создания снимка экрана, но я не могу запустить это на своем веб-сервере.

0

Решение

Мне удалось подражать представлению повестки дня с кодом ниже.

Для меня было несколько ошибок, а именно: конечная дата для событий полного дня — следующий день, а события, не относящиеся к полному дню, возвращающие dateTime против единственной даты для полного дня.

Я думаю, что код слишком сложный, это то, что я достигаю решения медленными итеративными шагами …

<html>
<head>
<style type="text/css">
html {
font-family: sans-serif;
}
.trips {
color:red;
}
.courses {
color:blue;
}
.canceled {
color:orange;
text-decoration:line-through;
}
.marketing {
color:green;
}
tr>td {
vertical-align: top;
}
td.time {
width: 110px;
}
td.date {
width: 140px;
}
td.summary {
font-weight:bold;
}
td {
padding: 0 0 5px 0;
border-bottom: 2px solid grey;
}
td td {
border-bottom: none;
}
span.location {
font-weight:normal;
color:black;
margin-left:10px;
}
</style>
</head>
<body>
[html comment broken up, to keep syntax highlighting in the php below]
< ! -- // having a html comment around php keeps php debug output from echo, print_r etc in source view
<?php
/******************
* list calendar-events mimicking the google calendar agenda-view
* allows to show a non-public calendars to non-authenticated clients
* code fragments from
* http://www.daimto.com/google-calendar-api-with-php-service-account/
* https://developers.google.com/google-apps/calendar/v3/reference/events/list#response
* https://developers.google.com/google-apps/calendar/quickstart/php#step_3_set_up_the_sample
******************/
require_once 'google-api-php-client/src/Google/autoload.php';
session_start();
$Email_address = '[email protected]';
// for security reasons, keep key_file outside webroot:
$key_file_location = '/home/t...../...41.p12';
$client = new Google_Client();
$client-> setApplicationName("K....");
$key = file_get_contents($key_file_location);
// the calendars to query
$calendars = array(
'trips'    => '[email protected]',
'courses'  => '[email protected]',
'canceled' => '[email protected]',
);
$agenda = array(); // the merged result from all calendarsi
$maxResults = 15; // no. of results to get (per calendar)
$firstDate = new DateTime(); // the date from which on we want the agenda
$firstDate->setTime(0,0,0); // date "without" time, we think in full days only
// $firstDate->modify('+2 days'); // testing other start-dates
setlocale (LC_ALL, 'de_DE'); // to get weekdays & monthnames correct
$scopes ="https://www.googleapis.com/auth/calendar.readonly";
$cred = new Google_Auth_AssertionCredentials(
$Email_address,
array($scopes),
$key
);
$client->setAssertionCredentials($cred);
if($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
$service = new Google_Service_Calendar($client);

foreach($calendars as $cal_name => $cal_id) {
// get the dates from each calendar
$calendar_res = $service->calendars->get($cal_id);
$optParams = array(
'maxResults' => $maxResults,
'orderBy' => 'startTime',
'singleEvents' => true,
'timeMin' => $firstDate->format('c')
);
$events = $service->events->listEvents($calendar_res->id, $optParams);

foreach ($events->getItems() as $event) {
$startDate = new DateTime();
$endDate = new DateTime();
// full-day events use 'date', others 'dateTime' so we need to treat separately:
if(isset($event->start->date)){
// it's a full day event, only a date is given
$startDate->setTimestamp(strtotime($event->start->date));
$endDate->setTimestamp(strtotime($event->end->date));
// full-day end-date is returned by google as the next day (midnight),
// correct this for our display:
$endDate->sub(new DateInterval('P1D'));
// remove times, they would contain data from the last processed non- full-day event
// also, we will test ifset to recognize full- against non- full-day events
unset($startTime);
unset($endTime);
}else{
// it's a non-full day, having start/end dates AND times
$startDate->setTimestamp(strtotime($event->start->dateTime));
$endDate->setTimestamp(strtotime($event->end->dateTime));
// extract times
$startTime = $startDate->format('G:i');
$endTime = $endDate->format('G:i');
// set times to zero, so date comparison works correctly
$startDate->setTime(0,0,0);
$endDate->setTime(0,0,0);
}

// for every day of the event, make an entry in the agenda
$currDate = $startDate; // the date we are about to add an entry to
while ($endDate >= $currDate){
// don't add entries that are before our first wanted date
if ($currDate >= $firstDate){
if (isset ($startTime)){
$time = $startTime . " - " . $endTime;
}else{
$time = "Ganztägig";
};
// we save the date in a way so the agenda-array can later be sorted by it
$agenda[$currDate->format('Y-m-d')][] =
array(
'cal' => $cal_name,
'summary' => $event->getSummary(),
'location' => $event->getLocation(),
'start' => $startDate->format('Y-m-d') . " - " . $startTime,
'end' => $endDate->format('Y-m-d') . " - " . $endTime,
'time' => $time
);
};
// go to next day
$currDate->modify('+1 day');
};
}
}

// the agenda-array is not yet sorted, events were added by calendar by date, not just by date
ksort ($agenda); // sort by key (date)
//var_dump($agenda);
//print_r($agenda);
?>
// end of html comment around php (keeps debug output in source view) -->

<?
//output
echo "    <table>";
foreach ($agenda as $aDate => $events){
// a row for every date
echo "\n      <tr>";
echo "\n        <td class=\"date\">" . strftime('%a %e. %B', strtotime($aDate)) . "</td>";
echo "\n        <td>";
// a table of events for every day
echo "\n          <table >";
foreach ($events as $aEvent){
// a row for every event
echo "\n            <tr>";
echo "\n              <td class=\"time\">" . $aEvent['time'] ."</td>";
echo "\n              <td class=\"" . $aEvent['cal'] . " summary\">" . $aEvent['summary'];
echo "\n                <span class=\"location\">" . $aEvent['location'] . "</span>";
echo "\n              </td>";
echo "\n            </tr>";
};
echo "\n          </table>";
echo "\n        </td>";
echo "\n      </tr>";
};
echo "\n    <table>\n";
?>
</body>
</html>
1

Другие решения

Вот некоторый код, который будет отображать событие, если номер телефона GET находится где-то в поле события Google в 1 из 5 различных форматов телефонных номеров, вам понадобится служебная учетная запись, с которой открыт общий доступ к календарю, и файл My Project.json, который вы получить при создании учетной записи службы необходимо поместить в рабочую папку на вашем сервере (ту же папку, которую вы помещаете.

<?php

//error_reporting(E_ALL);
//ini_set("display_errors", 1);

require_once __DIR__.'/vendor/autoload.php';

$client = new Google_Client();
$credentialJson= __DIR__ . '/My Project-somehexidecimal.json'; //name of your My Project .json file
$calendarId='youremail'; //your google calendar id
$phone= $_GET['phone'];

$display = preg_replace('/^(\d{3})(\d{3})(\d{4})$/', '\1-\2-\3', $phone);
$display1 = preg_replace('/^(\d{3})(\d{3})(\d{4})$/', '(\1) \2-\3', $phone);
$display2 = preg_replace('/^(\d{3})(\d{3})(\d{4})$/', '\1\2\3', $phone);
$display3 = preg_replace('/^(\d{3})(\d{3})(\d{4})$/', '\1 \2 \3', $phone);
$display4 = preg_replace('/^(\d{3})(\d{3})(\d{4})$/', '(\1)\2-\3', $phone);

$client->setAuthConfig($credentialJson);
$client->addScope('https://www.googleapis.com/auth/calendar');

$service = new Google_Service_Calendar($client);

$params = array(
'q' => $display,
'singleEvents' => true,
//'orderBy' => 'startTime',
'timeMin' => date(DateTime::ATOM),
'maxResults' => 1
);
$params1 = array(
'q' => $display1,
'singleEvents' => true,
//'orderBy' => 'startTime',
'timeMin' => date(DateTime::ATOM),
'maxResults' => 1
);
$params2 = array(
'q' => $display2,
'singleEvents' => true,
//'orderBy' => 'startTime',
'timeMin' => date(DateTime::ATOM),
'maxResults' => 1
);
$params3 = array(
'q' => $display3,
'singleEvents' => true,
//'orderBy' => 'startTime',
'timeMin' => date(DateTime::ATOM),
'maxResults' => 1
);
$params4 = array(
'q' => $display4,
'singleEvents' => true,
//'orderBy' => 'startTime',
'timeMin' => date(DateTime::ATOM),
'maxResults' => 1
);

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

if (count($events->getItems()) == 0) {
$events = $service->events->listEvents($calendarId, $params1);
}
if (count($events->getItems()) == 0) {
$events = $service->events->listEvents($calendarId, $params2);
}
if (count($events->getItems()) == 0) {
$events = $service->events->listEvents($calendarId, $params3);
}
if (count($events->getItems()) == 0) {
$events = $service->events->listEvents($calendarId, $params4);
}
if (count($events->getItems()) == 0) {
print "No upcoming events found.\n";
}
$calTimeZone = $events->timeZone;

date_default_timezone_set($calTimeZone);

foreach ($events->getItems() as $event) {

$starttime= $event->getstart()['dateTime'];
$endtime= $event->getend()['dateTime'];
$description=$event->getDescription();
$summary=$event->getSummary();
$eventid = $event->getid();
$location = $event->getlocation();

$eventDateStr = $event->start->dateTime;
if(empty($eventDateStr))
{
$eventDateStr = $event->start->date;
}

$temp_timezone = $event->start->timeZone;

if (!empty($temp_timezone)) {
$timezone = new DateTimeZone($temp_timezone);
} else { $timezone = new DateTimeZone($calTimeZone);
}

$eventdate = new DateTime($eventDateStr,$timezone);
$link = $event->htmlLink;
$TZlink = $link . "&ctz=" . $calTimeZone;
$newmonth = $eventdate->format("M");
$newday = $eventdate->format("j");
}?>
<div class="event-container">
<div class="eventDate">
<span class="month"><?php

echo $newmonth;

?></span><br />
<span class="day"><?php

echo $newday;

?></span><span class="dayTrail"></span>
</div>
<div class="eventBody">
<a href="<?php echo $TZlink;
?>">

<?php echo $summary, '<br>', $location, '<br>', $description;
?>
</a>
</div>
</div>
<?php

$notes= html_entity_decode ($description)
?>
0

По вопросам рекламы [email protected]