From 337b937c687c63a2e0f1c96207f3defda47fe396 Mon Sep 17 00:00:00 2001 From: Steve Sutton Date: Wed, 18 May 2016 13:44:30 -0400 Subject: [PATCH] Adding ical for events If no eventId is given it will give all events from the current date on. --- models/front/events/baseAction.php | 2 - models/front/events/detail.php | 2 +- models/front/events/icalFeed.php | 299 ++++++++++++++++------------- 3 files changed, 166 insertions(+), 137 deletions(-) diff --git a/models/front/events/baseAction.php b/models/front/events/baseAction.php index a6405ed..9e77a85 100644 --- a/models/front/events/baseAction.php +++ b/models/front/events/baseAction.php @@ -151,11 +151,9 @@ abstract class GlmMembersFront_events_baseAction extends GlmDataEvents */ public function getModelEventData($eventId) { - //echo '
$eventId: ' . print_r($eventId, true) . '
'; $this->postAddTimes = true; $this->postAddLocations = true; $event = $this->getEntry($eventId); - //echo '
$event: ' . print_r($event, true) . '
'; if ( $event['url'] ) { if ( !preg_match( '/^http:|https:/', $event['url'] ) ) { $event['url'] = 'http://' . $event['url']; diff --git a/models/front/events/detail.php b/models/front/events/detail.php index 50f2193..1e5fae3 100644 --- a/models/front/events/detail.php +++ b/models/front/events/detail.php @@ -19,7 +19,7 @@ require_once GLM_MEMBERS_EVENTS_PLUGIN_PATH . '/models/front/events/baseAction.p * @author Steve Sutton * @license PHP Version 3.0 {@link http://www.php.net/license/3_0.txt} */ -class GLmMembersFront_events_detail extends GlmMembersFront_events_baseAction +class GlmMembersFront_events_detail extends GlmMembersFront_events_baseAction { /** * modelAction diff --git a/models/front/events/icalFeed.php b/models/front/events/icalFeed.php index 10587f3..b873abc 100644 --- a/models/front/events/icalFeed.php +++ b/models/front/events/icalFeed.php @@ -17,9 +17,9 @@ require_once GLM_MEMBERS_EVENTS_PLUGIN_PATH . '/models/front/events/baseAction.p * @version 0.0.1 * @copyright Copyright (c) 2010 All rights reserved. * @author Steve Sutton - * @license PHP Version 3.0 {@link http://www.php.net/license/3_0.txt} + * @license PHP Version 3.0 {@link http://www.php.net/license/3_0.txt} */ -class GLmMembersFront_events_icalFeed extends GlmMembersFront_events_baseAction +class GlmMembersFront_events_icalFeed extends GlmMembersFront_events_baseAction { /** * modelAction @@ -40,15 +40,56 @@ class GLmMembersFront_events_icalFeed extends GlmMembersFront_events_baseAction if ($ical = filter_var($_REQUEST['ical'], FILTER_VALIDATE_BOOLEAN)) { $action = 'event-ical'; } - } + } + + if ( !isset($eventId) || !$eventId ) { + $action = 'event-list-ical'; + } + + $output = ''; switch ($action) { case 'event-ical': - $this->postAddRecurrences = true; - $event = $this->getModelEventData($eventId); - $this->postAddRecurrences = false; - //echo '
$event: ' . print_r($event, true) . '
'; -$icalHeader = <<getEventOutput( $eventId ); + header('Content-type: text/calendar; charset=utf-8'); + header('Content-Disposition: inline; filename=event-' . $eventId . '.ics'); + echo $output; + exit; + break; + case 'event-list-ical': + $eventSql = " + SELECT id + FROM " . GLM_MEMBERS_EVENTS_PLUGIN_DB_PREFIX. "events + WHERE id IN ( + SELECT event + FROM " . GLM_MEMBERS_EVENTS_PLUGIN_DB_PREFIX . "times AS ET + WHERE active + AND " . $this->dateRange . " + ) + ORDER BY id"; + $events = $this->wpdb->get_results( $eventSql, ARRAY_A ); + if ( isset($events) && !empty($events) ) { + foreach ( $events as $key => $event ) { + $output .= $this->getEventOutput( $event['id'] ); + } + } + header('Content-type: text/calendar; charset=utf-8'); + header('Content-Disposition: inline; filename=events.ics'); + echo $output; + exit; + break; + default: + die('should not reach this'); + break; + } + } + + public function getEventOutput($eventId) + { + $this->postAddRecurrences = true; + $event = $this->getModelEventData($eventId); + $this->postAddRecurrences = false; + $icalHeader = << 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'); - header('Content-type: text/calendar; charset=utf-8'); - header('Content-Disposition: inline; filename=event-' . $eventId . '.ics'); - //$output .= '
';
-            $output .= $icalHeader;
-            // clean description
-            $description = 'DESCRIPTION:' . str_replace("\n", "\\n", strip_tags($event['descr']));
-            $description = str_replace("\r", '', $description);
-            $urlParts    = parse_url(get_bloginfo('url'), PHP_URL_HOST);
-            $urlHost     = str_replace('www.', '', $urlParts);
-            $eventDataStart = sprintf($eventTemplateStart,
-                $event['id'],
-                $urlHost,
-                $this->icalDateFormat($event['created']),
-                $this->icalDateFormat($event['starting_timestamp']),
-                $this->icalDateFormat($event['starting_timestamp']),
-                $this->icalDateFormat($event['ending_timestamp']),
-                $description,
-                $event['name']
-            );
-            $output .= $eventDataStart;
-            // geo location (lat lon)
-            if (   $event['use_member_location']['value'] 
-                && $event['member']
-            ) {
-                if ( $event['member']['lat'] && $event['member']['lon'] ) {
-                    $output .= "\nGEO:" . $event['member']['lat']
-                        . ';' . $event['member']['lon'];
+        $dateTimeFormat  = '%s %s:%s %s';
+        $dateFormat      = '%s';
+        $timeStampFormat = 'Ymd\THis';
+        $weekdays        =
+            array(1 => 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA');
+        $output .= $icalHeader;
+        // clean description
+        $description = 'DESCRIPTION:' . str_replace("\n", "\\n", strip_tags($event['descr']));
+        $description = str_replace("\r", '', $description);
+        $urlParts    = parse_url(get_bloginfo('url'), PHP_URL_HOST);
+        $urlHost     = str_replace('www.', '', $urlParts);
+        $eventDataStart = sprintf($eventTemplateStart,
+            $event['id'],
+            $urlHost,
+            $this->icalDateFormat($event['created']),
+            $this->icalDateFormat($event['starting_timestamp']),
+            $this->icalDateFormat($event['starting_timestamp']),
+            $this->icalDateFormat($event['ending_timestamp']),
+            $description,
+            $event['name']
+        );
+        $output .= $eventDataStart;
+        // geo location (lat lon)
+        if (   $event['use_member_location']['value'] 
+            && $event['member']
+        ) {
+            if ( $event['member']['lat'] && $event['member']['lon'] ) {
+                $output .= "\nGEO:" . $event['member']['lat']
+                    . ';' . $event['member']['lon'];
+            }
+            // location (address city state zip)
+            $output .= "\nLOCATION:" . $event['member']['member_name'] . ' - ';
+            if ( !$event['hide_address']['value'] ) {
+                if ( $event['member']['addr1'] ) {
+                    $output .= "{$event['member']['addr1']}";
                 }
-                // location (address city state zip)
-                $output .= "\nLOCATION:" . $event['member']['member_name'] . ' - ';
-                if ( !$event['hide_address']['value'] ) {
-                    if ( $event['member']['addr1'] ) {
-                        $output .= "{$event['member']['addr1']}";
-                    }
-                    if ( $event['member']['city'] ) {
-                        $output .= "\,{$event['member']['city']}";
-                    }
-                    if ( $event['member']['state']['value'] ) {
-                        $output .= "\,{$event['member']['state']['value']}";
-                    }
-                    if ( $event['member']['zip'] ) {
-                        $output .= "\,{$event['member']['zip']}";
-                    }
+                if ( $event['member']['city'] ) {
+                    $output .= "\,{$event['member']['city']}";
                 }
-            } else if ( !empty( $event['locations'] ) ) {
-                // location (address city state zip)
-                $output .= "\nLOCATION:" 
-                    . $event['locations']['name'] . ' - ';
-                if ( !$event['hide_address']['value'] ) {
-                    if ( $event['locations']['address'] ) {
-                        $output .= "{$event['locations']['address']}";
-                    }
-                    if ( $event['locations']['city'] ) {
-                        $output .= "\,{$event['locations']['city']['name']}";
-                    }
-                    if ( $event['locations']['state']['value'] ) {
-                        $output .= "\,{$event['locations']['state']['value']}";
-                    }
-                    if ( $event['locations']['zip'] ) {
-                        $output .= "\,{$event['locations']['zip']}";
-                    }
+                if ( $event['member']['state']['value'] ) {
+                    $output .= "\,{$event['member']['state']['value']}";
+                }
+                if ( $event['member']['zip'] ) {
+                    $output .= "\,{$event['member']['zip']}";
                 }
             }
-            // contact info
-            if (   $event['contact_name'] 
-                || $event['contact_email'] 
-                || $event['contact_phone'] 
-            ) {
-                $output .= "\nCONTACT:" . $event['contact_email'] . '\;;' 
-                    . $this->phoneFrmt( $event['contact_phone'] ) . '\;'
-                    . $event['contact_name'];
-            }
-            // Categories
-            if ( !empty($event['categories']) ) {
-                $output .= "\nCATEGORIES:";
-                $eventCategories = array();
-                foreach ( $event['categories'] as $eCategory ) {
-                    $eventCategories[] = strtoupper( $eCategory['name'] );
+        } else if ( !empty( $event['locations'] ) ) {
+            // location (address city state zip)
+            $output .= "\nLOCATION:" 
+                . $event['locations']['name'] . ' - ';
+            if ( !$event['hide_address']['value'] ) {
+                if ( $event['locations']['address'] ) {
+                    $output .= "{$event['locations']['address']}";
+                }
+                if ( $event['locations']['city'] ) {
+                    $output .= "\,{$event['locations']['city']['name']}";
+                }
+                if ( $event['locations']['state']['value'] ) {
+                    $output .= "\,{$event['locations']['state']['value']}";
+                }
+                if ( $event['locations']['zip'] ) {
+                    $output .= "\,{$event['locations']['zip']}";
                 }
-                $output .= implode( ',', $eventCategories);
             }
-            // frequency (recurring data)
-            if ( $event['recurrences'][0]['recurring']['value'] ) {
-                if ( $event['recurrences'][0]['day_of_week']['names'] ) {
-                    $daysOfWeek = array();
-                    foreach ( $event['recurrences'][0]['day_of_week']['names'] as $dow ) {
-                        $freq = 'FREQ=WEEKLY';
-                        switch ( $dow ) {
-                        case 'Sunday':
-                            $daysOfWeek[] = 'Sun';
-                            break;
-                        case 'Monday':
-                            $daysOfWeek[] = 'Mon';
-                            break;
-                        case 'Tuesday':
-                            $daysOfWeek[] = 'Tue';
-                            break;
-                        case 'Wednesday':
-                            $daysOfWeek[] = 'Wed';
-                            break;
-                        case 'Thursday':
-                            $daysOfWeek[] = 'Thu';
-                            break;
-                        case 'Friday':
-                            $daysOfWeek[] = 'Fri';
-                            break;
-                        case 'Saturday':
-                            $daysOfWeek[] = 'Sat';
-                            break;
-                        }
-                    }
-                    if (!empty($daysOfWeek)) {
-                        $daysInWeek = implode(',', $daysOfWeek);
+        }
+        // contact info
+        if (   $event['contact_name'] 
+            || $event['contact_email'] 
+            || $event['contact_phone'] 
+        ) {
+            $output .= "\nCONTACT:" . $event['contact_email'] . '\;;' 
+                . $this->phoneFrmt( $event['contact_phone'] ) . '\;'
+                . $event['contact_name'];
+        }
+        // Categories
+        if ( !empty($event['categories']) ) {
+            $output .= "\nCATEGORIES:";
+            $eventCategories = array();
+            foreach ( $event['categories'] as $eCategory ) {
+                $eventCategories[] = strtoupper( $eCategory['name'] );
+            }
+            $output .= implode( ',', $eventCategories);
+        }
+        // frequency (recurring data)
+        if ( $event['recurrences'][0]['recurring']['value'] ) {
+            if ( $event['recurrences'][0]['day_of_week']['names'] ) {
+                $daysOfWeek = array();
+                foreach ( $event['recurrences'][0]['day_of_week']['names'] as $dow ) {
+                    $freq = 'FREQ=WEEKLY';
+                    switch ( $dow ) {
+                    case 'Sunday':
+                        $daysOfWeek[] = 'Sun';
+                        break;
+                    case 'Monday':
+                        $daysOfWeek[] = 'Mon';
+                        break;
+                    case 'Tuesday':
+                        $daysOfWeek[] = 'Tue';
+                        break;
+                    case 'Wednesday':
+                        $daysOfWeek[] = 'Wed';
+                        break;
+                    case 'Thursday':
+                        $daysOfWeek[] = 'Thu';
+                        break;
+                    case 'Friday':
+                        $daysOfWeek[] = 'Fri';
+                        break;
+                    case 'Saturday':
+                        $daysOfWeek[] = 'Sat';
+                        break;
                     }
-                    $output .=  "\nRRULE:" . $freq .";BYDAY=" . $daysInWeek . ";UNTIL="
-                        . $this->icalDateFormat($event['ending_timestamp']);
                 }
+                if (!empty($daysOfWeek)) {
+                    $daysInWeek = implode(',', $daysOfWeek);
+                }
+                $output .=  "\nRRULE:" . $freq .";BYDAY=" . $daysInWeek . ";UNTIL="
+                    . $this->icalDateFormat($event['ending_timestamp']);
             }
-            $output .= $eventTemplateEnd;
-            $output .= $icalFooter;
-            //$output .= '
'; - echo $output; - exit; - break; - default: - die('should not reach this'); - break; } + $output .= $eventTemplateEnd; + $output .= $icalFooter; + return $output; } /** -- 2.17.1