Adding ical for events
authorSteve Sutton <steve@gaslightmedia.com>
Wed, 18 May 2016 17:44:30 +0000 (13:44 -0400)
committerSteve Sutton <steve@gaslightmedia.com>
Wed, 18 May 2016 17:44:30 +0000 (13:44 -0400)
If no eventId is given it will give all events from the current date on.

models/front/events/baseAction.php
models/front/events/detail.php
models/front/events/icalFeed.php

index a6405ed..9e77a85 100644 (file)
@@ -151,11 +151,9 @@ abstract class GlmMembersFront_events_baseAction extends GlmDataEvents
      */
     public function getModelEventData($eventId)
     {
-        //echo '<pre>$eventId: ' . print_r($eventId, true) . '</pre>';
         $this->postAddTimes     = true;
         $this->postAddLocations = true;
         $event                  = $this->getEntry($eventId);
-        //echo '<pre>$event: ' . print_r($event, true) . '</pre>';
         if ( $event['url'] ) {
             if ( !preg_match( '/^http:|https:/', $event['url'] ) ) {
                 $event['url'] = 'http://' . $event['url'];
index 50f2193..1e5fae3 100644 (file)
@@ -19,7 +19,7 @@ require_once GLM_MEMBERS_EVENTS_PLUGIN_PATH . '/models/front/events/baseAction.p
  * @author    Steve Sutton <steve@gaslightmedia.com>
  * @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
index 10587f3..b873abc 100644 (file)
@@ -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 <steve@gaslightmedia.com>
- * @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 '<pre>$event: ' . print_r($event, true) . '</pre>';
-$icalHeader = <<<EOD
+            $output = $this->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 = <<<EOD
 BEGIN:VCALENDAR
 PRODID:-//Gaslight Media Inc//Gaslight Events Calendar v2.0/EN
 VERSION:2.0
@@ -56,11 +97,11 @@ CALSCALE:GREGORIAN
 METHOD:PUBLISH
 EOD;
 
-$icalFooter = <<<EOD
+        $icalFooter = <<<EOD
 \nEND:VCALENDAR
 EOD;
 
-$eventTemplateStart = <<<EOD
+        $eventTemplateStart = <<<EOD
 \nBEGIN:VEVENT
 UID:%d@%s
 CREATED:%s
@@ -71,142 +112,132 @@ DTEND:%s
 SUMMARY:%s
 STATUS:CONFIRMED
 EOD;
-$eventTemplateEnd = <<<EOD
+        $eventTemplateEnd = <<<EOD
 \nEND:VEVENT
 EOD;
-            $dateTimeFormat  = '%s %s:%s %s';
-            $dateFormat      = '%s';
-            $timeStampFormat = 'Ymd\THis';
-            $weekdays        =
-                array(1 => 'SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA');
-            header('Content-type: text/calendar; charset=utf-8');
-            header('Content-Disposition: inline; filename=event-' . $eventId . '.ics');
-            //$output .= '<pre>';
-            $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 .= '</pre>';
-            echo $output;
-            exit;
-            break;
-        default:
-            die('should not reach this');
-            break;
         }
+        $output .= $eventTemplateEnd;
+        $output .= $icalFooter;
+        return $output;
     }
 
     /**