Hello, Terry. Long time, no chat.
I’ve been hacking this snippet for a long time on-and-off and don’t use the list option. Below find the modified version which is my latest release. It has support for private calendar URLs which are important to me.
I hope this helps.
<?php
#$basePath = '/Users/prowebscape/Sites/CMS/MODx/current/assets/snippets/calendar/';
require_once($basePath.'classes/simplepie/simplepie.inc');
require_once($basePath.'classes/class.simplepie-gcalendar.php');
require_once($basePath.'classes/class.Calendar_Events.php');
/* Snippet Parameters */
$useModx = (isset($useModx)) ? $useModx : true;
$emails = (isset($emails)) ? $emails : "[email protected]";
$offset = (isset($offset)) ? $offset : "now";
$order = (isset($order)) ? $order : true;
$useCache = (isset($useCache)) ? $useCache : true;
$template = (isset($template)) ? $template : 'default';
$eachEvent = (isset($eachEvent)) ? $eachEvent : 'default';
$eachAltEvent = (isset($eachAltEvent)) ? $eachAltEvent : 'default';
$wrapper = (isset($wrapper)) ? $wrapper : 'default';
$display = (isset($display)) ? $display : 'calendar';
$limit = (isset($limit)) ? $limit : 10;
$showPastEvents = (isset($showPastEvents)) ? $showPastEvents : true;
$debug = (isset($debug)) ? $debug : false;
/* end of Snippet Parameters */
extract($_GET);
$year = isset($_GET['year']) ? $year : date('Y');
$month = isset($_GET['month']) ? $month : date('n');
$startMin = gmdate('Y-m-d',mktime(0, 0, 0, gmdate($month)-2 , gmdate("d"), gmdate($year)));
$startMax = gmdate('Y-m-d',mktime(0, 0, 0, gmdate($month)+2 , gmdate("d"), gmdate($year)));
if (!$showPastEvents) {
$startMin = date("Y-m-d");
}
/* Set Correct Offset */
$offset = (strtotime("now")-strtotime($offset));
/* Set URL to use */
if ($useModx) {
/* Modx Site */
$docId = $modx->documentIdentifier;
$this_page = $modx->makeUrl($docId);
$url_arg = '&';
if($modx->config['friendly_urls'] == 1) {
$arg = '?';
}
$this_page .= $url_arg;
}
else {
/* Non-Modx Site */
$this_page = basename($_SERVER['REQUEST_URI']);
if (strpos($this_page, "?") !== false) $this_page = reset(explode("?", $this_page));
$this_page = 'index.php';
$this_page .= '?';
}
$emails = explode(',', $emails);
$urls = array();
foreach ($emails as $email){
if (preg_match('/([\w\d]*@[\w.]*google.com)\/private-([\w\d]*)/', $email, $email_chunks))
$urls[] = trim(SimplePie_GCalendar::create_feed_url($email_chunks[1], $email_chunks[2]));
else
$urls[] = trim(SimplePie_GCalendar::create_feed_url($email));
}
$feed = new SimplePie_GCalendar();
/* GCalendar Parameters */
$feed->set_show_past_events(1);
$feed->set_sort_ascending(1);
$feed->set_orderby_by_start_date(1);
$feed->set_expand_single_events(1);
$feed->set_start_min_date($startMin);
$feed->set_start_max_date($startMax);
$feed->set_max_results();
$feed->set_cal_query();
/* SimplePie Parameters */
if ($useCache)
$feed->set_cache_location($basePath . 'cache');
else
$feed->enable_cache(false);
$feed->set_feed_url($urls);
$feed->enable_order_by_date(FALSE);
$feed->init();
$feed->handle_content_type();
$gcalendar_data = $feed->get_items();
$events = array();
for ($i = 0; $i < sizeof($gcalendar_data) ; $i++){
$items = $gcalendar_data[$i];
$startDate = $items->get_start_time();
$startDateOffset = $startDate - $offset;
$endDate = $items->get_end_time();
$endDateOffset = $endDate - $offset;
$calName = $items->get_name();
$events[] = array(
'sortDate' => $startDate,
'startDate' => date("M j, y g:i", $startDateOffset),
'endDate' => date("M j, y g:i", $endDateOffset),
'pubDate' => date("M j, y g:i", $items->get_publish_date()),
'title' => $items->get_title(),
'where' => $items->get_location(),
'link' => $items->get_link(),
'status' => $items->get_status(),
'description' => $items->get_description(),
'startDay' => date('j', $startDateOffset),
'startMonth' => date('n', $startDateOffset),
'startMonthName'=> date('F', $startDateOffset),
'startYear' => date('Y', $startDateOffset),
'startHour' => date('g', $startDateOffset),
'startMinute' => date('i', $startDateOffset),
'startMeridiem' => date('a', $startDateOffset),
'endDay' => date('j', $endDateOffset),
'endMonth' => date('n', $endDateOffset),
'endYear' => date('Y', $endDateOffset),
'endHour' => date('g', $endDateOffset),
'endMinute' => date('i', $endDateOffset),
'endMeridiem' => date('a', $endDateOffset),
'calName' => $calName,
'calNameClean' => str_replace(' ', '-', strtolower($calName)),
'calEmail' => $items->get_email()
);
}
if ($debug) {
echo '<h3>Event Data</h3>';
print_r($events);
}
$feed->__destruct();
unset($feed);
/* end of SimplePie code */
/* beginning of Sorting */
if ($events) {
$date = array();
foreach ($events as $key => $row) {
$date[$key] = $row['sortDate'];
}
if ($order)
array_multisort($date, SORT_ASC, $events);
else
array_multisort($date, SORT_DESC, $events);
}
/* end of Sorting */
/* Beginning of Calendar Output Code */
if ($display == 'calendar') {
if ($debug) echo '<br/><br/><p>display = ' . $display . '</p>';
$cal = new Calendar_Events ($year, $month);
/*Calendar Parser parameters */
$cal->setDayNameFormat('%a');
$cal->url = $this_page;
if ($template) {
$cal->tpl['calendar'] = file_get_contents($basePath. 'templates/' .$template. '/calendar.tpl');
$cal->tpl['dayNoEvent'] = file_get_contents($basePath. 'templates/' .$template. '/dayNoEvent.tpl');
$cal->tpl['dayWithEvent'] = file_get_contents($basePath. 'templates/' .$template. '/dayWithEvent.tpl');
$cal->tpl['eachEvent'] = file_get_contents($basePath. 'templates/' .$template. '/eachEvent.tpl');
$cal->tpl['notInMonth'] = file_get_contents($basePath. 'templates/' .$template. '/notInMonth.tpl');
}
else {
$cal->tpl['calendar'] = file_get_contents($basePath. 'templates/default/calendar.tpl');
$cal->tpl['dayNoEvent'] = file_get_contents($basePath. 'templates/default/dayNoEvent.tpl');
$cal->tpl['dayWithEvent'] = file_get_contents($basePath. 'templates/default/dayWithEvent.tpl');
$cal->tpl['eachEvent'] = file_get_contents($basePath. 'templates/default/eachEvent.tpl');
$cal->tpl['notInMonth'] = file_get_contents($basePath. 'templates/default/notInMonth.tpl');
}
if ($events) {
foreach ($events as $date) {
if ($date['status'] != "canceled" && $date['startMonth'] == $month && strlen(trim($date['sortDate'])) > 0) {
$cal->addEvent($date['startDay'], $date);
}
}
#echo '<pre>';
#print_r($events);
#echo '</pre>';
}
$output = $cal->display();
}
/* End of Calendar Output */
/* Beginning of List Output */
elseif ($display == 'list') {
if ($debug) echo '<br/><br/><p>display = ' . $display . '</p>';
$tpl['wrapper'] = file_get_contents($basePath. 'templates/' .$template. '/wrapper.tpl');
$tpl['eachEvent'] = file_get_contents($basePath. 'templates/' .$template. '/eachEvent.tpl');
$tpl['eachEventAlt'] = file_get_contents($basePath. 'templates/' .$template. '/eachEventAlt.tpl');
if ($events)
{
$innerList = '';
for ($i = 0; $i < $limit; $i++) {
if ($events[$i]['startMonth'] == $month )
{
if($i % 2)
$eachEvent = $tpl['eachEvent'];
else
$eachEvent = $tpl['eachEventAlt'];
foreach ($events[$i] as $key => $value)
{
$eachEvent = str_replace('[+' . $key . '+]', $value, $eachEvent);
}
$innerList .= $eachEvent;
}
}
$output = str_replace('[+events+]', $innerList, $tpl['wrapper']);
}
}
/* End of List Output */
/* Beginning of Custom Output */
elseif ($display == 'custom') {
if ($debug) echo '<br/><br/><p>display = ' . $display . '</p>';
if ($events) {
$innerList = '';
$i = 0;
foreach ($events as $event) {
if ($event['startMonth'] == $month ) {
if($i % 2)
$innerList .= $modx->parseChunk($eachEvent, $event, '[+', '+]');
else
$innerList .= $modx->parseChunk($eachAltEvent, $event, '[+', '+]');
}
$i = $i + 1;
}
$str = $modx->getChunk($wrapper);
$output = str_replace('[+events+]', $innerList, $modx->getChunk($wrapper));
}
}
/* End of Custom Output */
/*Do the Output */
echo $output;