Ejemplo n.º 1
0
 /**
  * Check that the upgrade routine run for users updating EO after
  * updating to WP 4.2 is able to recover 'lost' data.
  */
 public function testPostSplitTermsUpgrade()
 {
     global $wpdb;
     if (version_compare(get_bloginfo('version'), '4.2-alpha-31007-src', '<')) {
         $this->markTestSkipped(sprintf('This test applies only to 4.2-alpha-31007-src+, running %s', get_bloginfo('version')));
         return;
     }
     remove_action('split_shared_term', '_eventorganiser_handle_split_shared_terms', 10);
     register_taxonomy('wptests_tax', 'event');
     //Create terms - they'll have unique term IDs
     $t1 = wp_insert_term('Foo', 'wptests_tax');
     $t2 = eo_insert_venue('Foo', array('address' => 'Edinburgh Castle', 'city' => 'Edinburgh', 'country' => 'UK'));
     $t3 = wp_insert_term('Foo', 'event-category');
     //Manually modify the terms so they share term IDs
     $wpdb->update($wpdb->term_taxonomy, array('term_id' => $t1['term_id']), array('term_taxonomy_id' => $t2['term_taxonomy_id']), array('%d'), array('%d'));
     $wpdb->update($wpdb->term_taxonomy, array('term_id' => $t1['term_id']), array('term_taxonomy_id' => $t3['term_taxonomy_id']), array('%d'), array('%d'));
     //Insert/move data so it is assigned to 'pre-split ID'.
     update_option('eo-event-category_' . $t1['term_id'], array('colour' => '#ff0000'));
     $wpdb->update($wpdb->eo_venuemeta, array('eo_venue_id' => $t1['term_id']), array('eo_venue_id' => $t2['term_id']));
     //Create event and assign terms so we can retrieve term IDs
     $events = $this->factory->event->create_many(3);
     wp_set_object_terms($events[0], array('Foo'), 'wptests_tax');
     wp_set_object_terms($events[1], array('Foo'), 'event-venue');
     wp_set_object_terms($events[2], array('Foo'), 'event-category');
     // Verify that the term IDs are shared.
     $t1_terms = wp_get_object_terms($events[0], 'wptests_tax');
     $t2_terms = wp_get_object_terms($events[1], 'event-venue');
     $t3_terms = wp_get_object_terms($events[2], 'event-category');
     $this->assertSame($t1_terms[0]->term_id, $t2_terms[0]->term_id);
     $this->assertSame($t1_terms[0]->term_id, $t3_terms[0]->term_id);
     //Split by updating venue
     eo_update_venue($t2_terms[0]->term_id, array('name' => 'Venue Foo'));
     wp_update_term($t3_terms[0]->term_id, 'event-category', array('name' => 'Category Foo'));
     //Check meta data is "lost"
     $t2_terms = wp_get_object_terms($events[1], 'event-venue');
     $t3_terms = wp_get_object_terms($events[2], 'event-category');
     $address = eo_get_venue_address($t2_terms[0]->term_id);
     $this->assertEquals('', '');
     $meta = get_option('eo-event-category_' . $t3_terms[0]->term_id);
     $this->assertEquals(false, $meta);
     //Run upgrade routine
     eventorganiser_021200_update();
     //Check data is recovered
     $t2_terms = wp_get_object_terms($events[1], 'event-venue');
     $t3_terms = wp_get_object_terms($events[2], 'event-category');
     $address = eo_get_venue_address($t2_terms[0]->term_id);
     $this->assertEquals('Edinburgh', $address['city']);
     $meta = get_option('eo-event-category_' . $t3_terms[0]->term_id);
     $this->assertEquals('#ff0000', $meta['colour']);
     add_action('split_shared_term', '_eventorganiser_handle_split_shared_terms', 10, 4);
 }
 function page_actions()
 {
     global $EO_Errors;
     add_action('admin_notices', array($this, 'admin_notices'));
     //Determine action if any
     $action = $this->current_action();
     $venue = isset($_REQUEST['event-venue']) ? $_REQUEST['event-venue'] : false;
     if ($action && $venue || $action == 'add') {
         if (!current_user_can('manage_venues')) {
             wp_die(__('You do not have permission to manage venues', 'eventorganiser'));
         }
         switch ($action) {
             case 'update':
                 if (!check_admin_referer('eventorganiser_update_venue_' . $venue)) {
                     wp_die(__('You do not have permission to edit this venue.', 'eventorganiser'));
                 }
                 $venue = get_term_by('slug', esc_attr($venue), 'event-venue');
                 $return = eo_update_venue($venue->term_id, $_POST['eo_venue']);
                 if (is_wp_error($return)) {
                     $EO_Errors->add('eo_error', __('Venue <strong>was not</strong> updated', 'eventorganiser') . ': ' . $return->get_error_message());
                 } else {
                     $term_id = (int) $return['term_id'];
                     $venue = get_term($term_id, 'event-venue');
                     $url = add_query_arg(array('page' => 'venues', 'action' => 'edit', 'event-venue' => $venue->slug, 'message' => 2), admin_url('edit.php?post_type=event'));
                     wp_redirect(esc_url_raw($url));
                     exit;
                 }
                 break;
             case 'add':
                 if (!check_admin_referer('eventorganiser_add_venue')) {
                     wp_die(__('You do not have permission to edit this venue.', 'eventorganiser'));
                 }
                 $args = $_POST['eo_venue'];
                 $name = isset($args['name']) ? $args['name'] : '';
                 //Venue may already exist in database since it may have been added via ajax (by pro plug-in);
                 if (!empty($args['venue_id']) && ($_venue = eo_get_venue_by('id', $args['venue_id']))) {
                     //Since we're updating, need to explicitly provide slug to update it. Slug will be 'new-venue'.
                     $args['slug'] = sanitize_title($args['name']);
                     $return = eo_update_venue($_venue->term_id, $args);
                 } else {
                     $return = eo_insert_venue($name, $args);
                 }
                 if (is_wp_error($return)) {
                     $EO_Errors->add('eo_error', __('Venue <strong>was not</strong> created', 'eventorganiser') . ': ' . $return->get_error_message());
                     $_REQUEST['action'] = 'create';
                 } else {
                     $term_id = (int) $return['term_id'];
                     $venue = get_term($term_id, 'event-venue');
                     $url = add_query_arg(array('page' => 'venues', 'action' => 'edit', 'event-venue' => $venue->slug, 'message' => 1), admin_url('edit.php?post_type=event'));
                     wp_redirect(esc_url_raw($url));
                     exit;
                 }
                 break;
             case 'delete':
                 if (is_array($_REQUEST['event-venue'])) {
                     $nonce = 'bulk-venues';
                 } else {
                     $nonce = 'eventorganiser_delete_venue_' . $venue;
                 }
                 if (!check_admin_referer($nonce)) {
                     wp_die(__('You do not have permission to delete this venue', 'eventorganiser'));
                 }
                 $venues = (array) $venue;
                 //Count the number of deleted venues
                 $deleted = 0;
                 foreach ($venues as $venue) {
                     $venue = get_term_by('slug', esc_attr($venue), 'event-venue');
                     $resp = eo_delete_venue($venue->term_id);
                     if (!is_wp_error($resp) && true === $resp) {
                         $deleted++;
                     }
                 }
                 if ($deleted > 0) {
                     $url = add_query_arg(array('page' => 'venues', 'message' => 3), admin_url('edit.php?post_type=event'));
                     wp_redirect(esc_url_raw($url));
                     exit;
                 } else {
                     $EO_Errors = new WP_Error('eo_error', __('Venue(s) <strong>were not </strong> deleted', 'eventorganiser'));
                 }
                 break;
         }
     }
     $action = $this->current_action();
     if (in_array($action, array('edit', 'update', 'create'))) {
         $venue = isset($_REQUEST['event-venue']) ? $_REQUEST['event-venue'] : false;
         //Venued edit page
         add_meta_box('submitdiv', __('Save', 'eventorganiser'), 'eventorganiser_venue_submit', 'event_page_venues', 'side', 'high');
         /**
          * Fires after all built-in meta boxes for venues have been added.
          *
          * @param Object $venue Venue (term object)
          */
         do_action('add_meta_boxes_event_page_venues', $venue);
         /**
          * @ignore
          */
         do_action('add_meta_boxes', 'event_page_venues', $venue);
         add_screen_option('layout_columns', array('max' => 2, 'default' => 2));
     } else {
         //Venue admin list
         require_once 'classes/class-eo-venue-list-table.php';
         add_filter('manage_event_page_venues_columns', 'eventorganiser_venue_admin_columns');
         add_screen_option('per_page', array('option' => 'edit_event_venue_per_page', 'label' => __('Venues', 'eventorganiser'), 'default' => 20));
     }
 }
Ejemplo n.º 3
0
/**
 * Saves the event data posted from the event metabox.
 * Hooked to the 'save_post' action
 * 
 * @since 1.0.0
 *
 * @param int $post_id the event post ID
 * @return int $post_id the event post ID
 */
function eventorganiser_details_save($post_id)
{
    //make sure data came from our meta box
    if (!isset($_POST['_eononce']) || !wp_verify_nonce($_POST['_eononce'], 'eventorganiser_event_update_' . $post_id . '_' . get_current_blog_id())) {
        return;
    }
    //verify this is not an auto save routine.
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    //authentication checks
    if (!current_user_can('edit_event', $post_id)) {
        return;
    }
    //Collect raw data
    $raw_data = isset($_POST['eo_input']) ? $_POST['eo_input'] : array();
    $raw_data = wp_parse_args($raw_data, array('StartDate' => '', 'EndDate' => '', 'StartTime' => '00:00', 'FinishTime' => '23:59', 'schedule' => 'once', 'event_frequency' => 1, 'schedule_end' => '', 'allday' => 0, 'schedule_meta' => '', 'days' => array(), 'include' => '', 'exclude' => ''));
    //Update venue
    $venue_id = !empty($raw_data['event-venue']) ? intval($raw_data['event-venue']) : null;
    //Maybe create a new venue
    if (empty($venue_id) && !empty($_POST['eo_venue']) && current_user_can('manage_venues')) {
        $venue = $_POST['eo_venue'];
        if (!empty($venue['name'])) {
            $new_venue = eo_insert_venue($venue['name'], $venue);
            if (!is_wp_error($new_venue)) {
                $venue_id = $new_venue['term_id'];
            } else {
                if ($new_venue->get_error_code() == 'term_exists') {
                    $venue_id = eo_get_venue($event_id);
                }
            }
        }
    }
    //Set venue
    $r = wp_set_post_terms($post_id, array($venue_id), 'event-venue', false);
    //If reocurring, but not editing occurrences, can abort here, but trigger hook.
    if (eo_reoccurs($post_id) && (!isset($raw_data['AlterRe']) || 'yes' != $raw_data['AlterRe'])) {
        /**
         * Triggered after an event has been updated.
         *
         * @param int $post_id The ID of the event
         */
        do_action('eventorganiser_save_event', $post_id);
        //Need this to update cache
        return;
    }
    //Check dates
    $date_format = eventorganiser_get_option('dateformat');
    $is24 = eventorganiser_blog_is_24();
    $time_format = $is24 ? 'H:i' : 'g:ia';
    $datetime_format = $date_format . ' ' . $time_format;
    //Set times for all day events
    $all_day = intval($raw_data['allday']);
    if ($all_day) {
        $raw_data['StartTime'] = $is24 ? '00:00' : '12:00am';
        $raw_data['FinishTime'] = $is24 ? '23:59' : '11:59pm';
    }
    $start = eo_check_datetime($datetime_format, trim($raw_data['StartDate']) . ' ' . trim($raw_data['StartTime']));
    $end = eo_check_datetime($datetime_format, trim($raw_data['EndDate']) . ' ' . trim($raw_data['FinishTime']));
    $until = eo_check_datetime($datetime_format, trim($raw_data['schedule_end']) . ' ' . trim($raw_data['StartTime']));
    //Collect schedule meta
    $schedule = $raw_data['schedule'];
    if ('weekly' == $schedule) {
        $schedule_meta = $raw_data['days'];
        $occurs_by = '';
    } elseif ('monthly' == $schedule) {
        $schedule_meta = $raw_data['schedule_meta'];
        $occurs_by = trim($schedule_meta, '=');
    } else {
        $schedule_meta = '';
        $occurs_by = '';
    }
    //Collect include/exclude
    $in_ex = array();
    $orig_schedule = eo_get_event_schedule($post_id);
    foreach (array('include', 'exclude') as $key) {
        $in_ex[$key] = array();
        $arr = explode(',', sanitize_text_field($raw_data[$key]));
        if (!empty($arr)) {
            foreach ($arr as $date) {
                if ($date_obj = eo_check_datetime('Y-m-d', trim($date))) {
                    $date_obj->setTime($start->format('H'), $start->format('i'));
                    $in_ex[$key][] = $date_obj;
                }
            }
            /* see https://github.com/stephenharris/Event-Organiser/issues/260
            			if( $orig = array_uintersect( $orig_schedule[$key], $in_ex[$key], '_eventorganiser_compare_dates' ) ){
            				$in_ex[$key] = array_merge( $orig, $in_ex[$key] );
            				$in_ex[$key] = _eventorganiser_remove_duplicates( $in_ex[$key] );
            			}*/
        }
    }
    $event_data = array('start' => $start, 'end' => $end, 'all_day' => $all_day, 'schedule' => $schedule, 'frequency' => (int) $raw_data['event_frequency'], 'until' => $until, 'schedule_meta' => $schedule_meta, 'occurs_by' => $occurs_by, 'include' => $in_ex['include'], 'exclude' => $in_ex['exclude']);
    $response = eo_update_event($post_id, $event_data);
    if (is_wp_error($response)) {
        global $EO_Errors;
        $code = $response->get_error_code();
        $message = $response->get_error_message($code);
        $errors[$post_id][] = __('Event dates were not saved.', 'eventorganiser');
        $errors[$post_id][] = $message;
        $EO_Errors->add('eo_error', $message);
        update_option('eo_notice', $errors);
    }
    return;
}
 /**
 * Returns the supplied array with the additional data parsed from the given property-value pair
 * May require the blog and/or calendar time-zone in date manipulations
 * May also require modifiers in date manipulations (e.g. TZID, VALUE)
 *
 * @since 1.1.0
 *
 * @param array $event_array - array of event details to be added to
 * @param string $property - the property being parsed
 * @param string $value - the value of the  property being parsed
 * @param string $modifiers - array of modifiers associated with the property
 * @param DateTimeZone $blog_tz - blog's timezone
 * @param DateTimeZone $cal_tzid - calendar's default timezone
 * @return DateTimeZone - the timezone with the given identifier or false if it isn't recognised
 */
 function parse_Event_Property($event_array, $property, $value, $modifiers, $blog_tz, $cal_tz)
 {
     extract($event_array);
     $import_venues = isset($_POST['eo_import_venue']) ? true : false;
     $import_cats = isset($_POST['eo_import_cat']) ? true : false;
     $date_tz = "";
     if (!empty($modifiers)) {
         foreach ($modifiers as $modifier) {
             if (stristr($modifier, 'TZID')) {
                 $date_tz = self::parse_TZID(substr($modifier, 5));
             } elseif (stristr($modifier, 'VALUE')) {
                 $meta = substr($modifier, 6);
             }
         }
     }
     //For dates - if there is not an associated timezone, use calendar default.
     if (empty($date_tz)) {
         $date_tz = $cal_tz;
     }
     switch ($property) {
         //Date properties
         case 'CREATED':
         case 'DTSTART':
         case 'DTEND':
             if (isset($meta) && $meta == 'DATE') {
                 $date = $this->parse_icalDate($value, $blog_tz);
                 $allday = 1;
             } else {
                 $date = $this->parse_icalDateTime($value, $date_tz);
                 $allday = 0;
             }
             if (empty($date)) {
                 break;
             }
             switch ($property) {
                 case 'DTSTART':
                     $event['start'] = $date;
                     $event['allday'] = $allday;
                     break;
                 case 'DTEND':
                     if ($allday == 1) {
                         $date->modify('-1 second');
                     }
                     $event['end'] = $date;
                     break;
                 case 'CREATED':
                     $date->setTimezone(new DateTImeZone('utc'));
                     $event_post['post_date_gmt'] = $date->format('Y-m-d H:i:s');
                     break;
             }
             break;
         case 'EXDATE':
             //The modifiers have been dealt with above. We do similiar to above, except for an array of dates...
             $value_array = explode(',', $value);
             //Note, we only consider the Date part and ignore the time
             foreach ($value_array as $val) {
                 $date = $this->parse_icalDate($val, $blog_tz);
                 $event['exception_dates'][] = $date;
             }
             break;
             //Reoccurrence rule properties
         //Reoccurrence rule properties
         case 'RRULE':
             $event += $this->parse_RRule($value);
             break;
             //The event's summary (AKA post title)
         //The event's summary (AKA post title)
         case 'SUMMARY':
             $event_post['post_title'] = $this->parse_icalText($value);
             break;
             //The event's description (AKA post content)
         //The event's description (AKA post content)
         case 'DESCRIPTION':
             $event_post['post_content'] = $this->parse_icalText($value);
             break;
             //Event venues, assign to existing venue - or if set, create new one
         //Event venues, assign to existing venue - or if set, create new one
         case 'LOCATION':
             $venue_ids = array();
             if (!empty($value)) {
                 $venue_name = trim($value);
                 $venue = get_term_by('name', $venue_name, 'event-venue');
                 if ($venue) {
                     $venue_ids[] = (int) $venue->term_id;
                 } elseif ($import_venues) {
                     //Create new venue, get ID. Count of venues created++
                     global $eventorganiser_venues_created;
                     $return = eo_insert_venue($venue_name);
                     if (!is_wp_error($return) && !$return) {
                         $venue_ids[] = (int) $return['term_id'];
                         $eventorganiser_venues_created++;
                         $event['venue'] = $return['term_id'];
                         //XXX This is depreciated
                     }
                 }
                 $venue_ids = array_filter($venue_ids);
                 if (!empty($venue_ids)) {
                     $event_post['tax_input']['event-venue'] = $venue_ids;
                 }
             }
             break;
             //Event categories, assign to existing categories - or if set, create new ones
         //Event categories, assign to existing categories - or if set, create new ones
         case 'CATEGORIES':
             $cats = explode(',', $value);
             $cat_ids = array();
             if (!empty($cats)) {
                 foreach ($cats as $cat_name) {
                     $cat_name = trim($cat_name);
                     $cat = get_term_by('name', $cat_name, 'event-category');
                     if ($cat) {
                         $cat_ids[] = (int) $cat->term_id;
                     } elseif ($import_cats) {
                         //Create new category, get ID. Count of cats created++
                         global $eventorganiser_cats_created;
                         $return = wp_insert_term($cat_name, 'event-category', array());
                         if (!is_wp_error($return)) {
                             $cat_ids[] = (int) $return['term_id'];
                             $eventorganiser_cats_created++;
                         }
                     }
                 }
                 $cat_ids = array_filter($cat_ids);
                 if (!empty($cat_ids)) {
                     $event_post['tax_input']['event-category'] = $cat_ids;
                 }
             }
             break;
             //The event's status
         //The event's status
         case 'STATUS':
             switch ($value) {
                 case 'CONFIRMED':
                     $event_post['post_status'] = 'publish';
                     break;
                 case 'CANCELLED':
                     $event_post['post_status'] = 'trash';
                     break;
                 default:
                     $event_post['post_status'] = 'draft';
             }
             break;
             //An url associated with the event
         //An url associated with the event
         case 'URL':
             $event_meta['eo_url'] = $value;
             break;
     }
     $event_array = array('event' => $event, 'event_post' => $event_post, 'event_meta' => $event_meta);
     return $event_array;
 }
 /**
  * Create an EO venue given a CiviEvent location
  *
  * @since 0.1
  *
  * @param array $location The CiviEvent location data
  * @return int $term_id The numeric ID of the venue
  */
 public function create_venue($location)
 {
     // check permissions
     if (!$this->allow_venue_edit()) {
         return false;
     }
     /**
      * Event Organiser will return a WP_Error object if there is already a
      * venue with the same name as the one being created. So, during the
      * sync process, it is possible that poorly-named (or partially-named)
      * locations will trigger this. For now, log the this and carry on.
      */
     if (empty($location['address']['street_address'])) {
         // log and move on
         error_log(print_r(array('method' => __METHOD__, 'message' => __('Street Address is empty.', 'civicrm-event-organiser'), 'location' => $location), true));
     }
     // construct name
     $name = !empty($location['address']['street_address']) ? $location['address']['street_address'] : 'Untitled venue';
     // construct args
     $args = array();
     // add street address if present
     if (isset($location['address']['street_address']) and !empty($location['address']['street_address'])) {
         $args['address'] = $location['address']['street_address'];
     }
     // add city if present
     if (isset($location['address']['city']) and !empty($location['address']['city'])) {
         $args['city'] = $location['address']['city'];
     }
     // add postcode if present
     if (isset($location['address']['postal_code']) and !empty($location['address']['postal_code'])) {
         $args['postcode'] = $location['address']['postal_code'];
     }
     // add geocodes if present
     if (isset($location['address']['geo_code_1']) and !empty($location['address']['geo_code_1'])) {
         $args['latitude'] = $location['address']['geo_code_1'];
     }
     if (isset($location['address']['geo_code_2']) and !empty($location['address']['geo_code_2'])) {
         $args['longtitude'] = $location['address']['geo_code_2'];
     }
     // remove actions to prevent recursion
     remove_action('eventorganiser_insert_venue', array($this, 'insert_venue'), 10);
     remove_action('eventorganiser_save_venue', array($this, 'save_venue'), 10);
     // retrieve venue with slug-to-be-used
     $existing_venue = eo_get_venue_by('slug', sanitize_title($name));
     /**
      * Check if there an existing venue with the slug about to be used. Also
      * allow overrides to force the creation of a unique slug.
      *
      * Force the use of a unique slug with the following code:
      * add_filter( 'civicrm_event_organiser_force_unique_slug', '__return_true' );
      *
      * @param bool False by default, which does not force unique slugs
      */
     if ($existing_venue or apply_filters('civicrm_event_organiser_force_unique_slug', false)) {
         // create a slug we know will be unique
         $args['slug'] = sanitize_title($name . '-' . $location['id']);
     }
     // insert venue
     $result = eo_insert_venue($name, $args);
     // add actions again
     add_action('eventorganiser_insert_venue', array($this, 'insert_venue'), 10, 1);
     add_action('eventorganiser_save_venue', array($this, 'save_venue'), 10, 1);
     // if not an error
     if (is_wp_error($result) or !isset($result['term_id'])) {
         // log
         error_log(print_r(array('method' => __METHOD__, 'message' => __('Venue not created.', 'civicrm-event-organiser'), 'result' => $result, 'location' => $location), true));
         return;
     }
     // create venue meta data
     // do we have an email for the location?
     if (isset($location['email']['email']) and !empty($location['email']['email'])) {
         // yes, get it
         $email = $location['email']['email'];
         // store email in meta
         eo_update_venue_meta($result['term_id'], '_civi_email', esc_sql($email));
     }
     // do we have a phone number for the location?
     if (isset($location['phone']['phone']) and !empty($location['phone']['phone'])) {
         // store phone in meta
         eo_update_venue_meta($result['term_id'], '_civi_phone', esc_sql($location['phone']['phone']));
     }
     // store location ID
     eo_update_venue_meta($result['term_id'], '_civi_loc_id', $location['id']);
     /*
     error_log( print_r( array(
     	'method' => __METHOD__,
     	'location' => $location,
     	'name' => $name,
     	'args' => $args,
     	'result' => $result,
     ), true ) );
     */
     // --<
     return $result['term_id'];
 }
Ejemplo n.º 6
0
/**
 * Saves the event data posted from the event metabox.
 * Hooked to the 'save_post' action
 * 
 * @since 1.0.0
 *
 * @param int $post_id the event post ID
 * @return int $post_id the event post ID
 */
function eventorganiser_details_save($post_id)
{
    //make sure data came from our meta box
    if (!isset($_POST['_eononce']) || !wp_verify_nonce($_POST['_eononce'], 'eventorganiser_event_update_' . $post_id)) {
        return;
    }
    // verify this is not an auto save routine.
    if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
        return;
    }
    //authentication checks
    if (!current_user_can('edit_event', $post_id)) {
        return;
    }
    //Collect raw data
    $raw_data = isset($_POST['eo_input']) ? $_POST['eo_input'] : array();
    $raw_data = wp_parse_args($raw_data, array('StartDate' => '', 'EndDate' => '', 'StartTime' => '00:00', 'FinishTime' => '23:59', 'schedule' => 'once', 'event_frequency' => 1, 'schedule_end' => '', 'allday' => 0, 'schedule_meta' => '', 'days' => array(), 'include' => '', 'exclude' => ''));
    //Update venue
    $venue_id = !empty($raw_data['event-venue']) ? intval($raw_data['event-venue']) : null;
    //Maybe create a new venue
    if (empty($venue_id) && !empty($_POST['eo_venue']) && current_user_can('manage_venues')) {
        $venue = $_POST['eo_venue'];
        if (!empty($venue['name'])) {
            $new_venue = eo_insert_venue($venue['name'], $venue);
            if (!is_wp_error($new_venue)) {
                $venue_id = $new_venue['term_id'];
            }
        }
    }
    //Set venue
    $r = wp_set_post_terms($post_id, array($venue_id), 'event-venue', false);
    //If reocurring, but not editing occurrences, can abort here, but trigger hook.
    if (eo_reoccurs($post_id) && (!isset($raw_data['AlterRe']) || 'yes' != $raw_data['AlterRe'])) {
        do_action('eventorganiser_save_event', $post_id);
        //Need this to update cache
        return;
    }
    //Set times for all day events
    $all_day = intval($raw_data['allday']);
    if ($all_day) {
        $raw_data['StartTime'] = '00:00';
        $raw_data['FinishTime'] = '23:59';
    } elseif (!eventorganiser_blog_is_24()) {
        //Potentially need to parse 24
        //TODO incorproate into _eventorganiser_check_datetime
        $raw_data['StartTime'] = date("H:i", strtotime($raw_data['StartTime']));
        $raw_data['FinishTime'] = date("H:i", strtotime($raw_data['FinishTime']));
    }
    //Check dates
    $start = _eventorganiser_check_datetime(trim($raw_data['StartDate']) . ' ' . trim($raw_data['StartTime']));
    $end = _eventorganiser_check_datetime(trim($raw_data['EndDate']) . ' ' . trim($raw_data['FinishTime']));
    $schedule_last = _eventorganiser_check_datetime(trim($raw_data['schedule_end']) . ' ' . trim($raw_data['StartTime']));
    //Collect schedule meta
    $schedule = $raw_data['schedule'];
    if ('weekly' == $schedule) {
        $schedule_meta = $raw_data['days'];
        $occurs_by = '';
    } elseif ('monthly' == $schedule) {
        $schedule_meta = $raw_data['schedule_meta'];
        $occurs_by = trim($schedule_meta, '=');
    } else {
        $schedule_meta = '';
        $occurs_by = '';
    }
    //Collect include/exclude
    $in_ex = array();
    foreach (array('include', 'exclude') as $key) {
        $in_ex[$key] = array();
        $arr = explode(',', sanitize_text_field($raw_data[$key]));
        if (!empty($arr)) {
            foreach ($arr as $date) {
                $date_obj = _eventorganiser_check_datetime($date . ' ' . $raw_data['StartTime'], 'Y-m-d');
                if ($date_obj) {
                    $in_ex[$key][] = $date_obj;
                }
            }
        }
    }
    $event_data = array('start' => $start, 'end' => $end, 'all_day' => $all_day, 'schedule' => $schedule, 'frequency' => (int) $raw_data['event_frequency'], 'schedule_last' => $schedule_last, 'schedule_meta' => $schedule_meta, 'occurs_by' => $occurs_by, 'include' => $in_ex['include'], 'exclude' => $in_ex['exclude']);
    $response = eo_update_event($post_id, $event_data);
    if (is_wp_error($response)) {
        global $EO_Errors;
        $code = $response->get_error_code();
        $message = $response->get_error_message($code);
        $errors[$post_id][] = __('Event dates were not saved.', 'eventorganiser');
        $errors[$post_id][] = $message;
        $EO_Errors->add('eo_error', $message);
        update_option('eo_notice', $errors);
    }
    return;
}
 /**
  * Reads in an ICAL file into an array, then parses the array and inserts events into database
  * @since 1.1.0
  * @param string $cal_file - the file to import
  */
 function import_file($ical_file)
 {
     global $EO_Errors;
     if (!current_user_can('manage_options') || !current_user_can('edit_events')) {
         wp_die(__('You do not have sufficient permissions to import events.', 'eventorganiser'));
     }
     $ical = new EO_ICAL_Parser();
     $ical->parse($ical_file);
     $import_venues = isset($_POST['eo_import_venue']) ? true : false;
     $import_cats = isset($_POST['eo_import_cat']) ? true : false;
     $events_imported = 0;
     $events_updated = 0;
     $venues_imported = 0;
     $categories_imported = 0;
     if ($import_venues && $ical->venues) {
         foreach ($ical->venues as $venue) {
             if (!eo_get_venue_by('name', $venue)) {
                 $args = array();
                 //If lat/lng meta data is set, include that
                 if (isset($ical->venue_meta[$venue]['latitude']) && isset($ical->venue_meta[$venue]['longtitude'])) {
                     $args['latitude'] = $ical->venue_meta[$venue]['latitude'];
                     $args['longtitude'] = $ical->venue_meta[$venue]['longtitude'];
                 }
                 $new_venue = eo_insert_venue($venue, $args);
                 if (!is_wp_error($new_venue) && $new_venue) {
                     $venues_imported++;
                 }
             }
         }
     }
     if ($import_cats && $ical->categories) {
         foreach ($ical->categories as $category) {
             if (!get_term_by('name', $category, 'event-category')) {
                 $new_cat = wp_insert_term($category, 'event-category', array());
                 if (!is_wp_error($new_cat) && $new_cat) {
                     $categories_imported++;
                 }
             }
         }
     }
     foreach ($ical->events as $event) {
         //TODO refactor eo_insert_event & eo_update_event...
         $uid = !empty($event['uid']) ? $event['uid'] : false;
         //TODO Check if event already exists
         //$found_event = eo_get_event_by_uid( $uid );
         //Create event
         if (!empty($event['event-venue'])) {
             $venue = eo_get_venue_by('name', $event['event-venue']);
             if ($venue) {
                 $event['tax_input']['event-venue'][] = intval($venue->term_id);
             }
         }
         if (!empty($event['event-category'])) {
             $event['tax_input']['event-category'] = array();
             foreach ($event['event-category'] as $category) {
                 $cat = get_term_by('name', $category, 'event-category');
                 if ($cat) {
                     $event['tax_input']['event-category'][] = intval($cat->term_id);
                 }
             }
         }
         $event_id = eo_insert_event($event);
         if (is_wp_error($event_id)) {
             $ical->errors[] = $event_id;
         } else {
             $events_updated++;
         }
     }
     if ($events_updated == 0) {
         $EO_Errors->add('eo_error', __("No events were imported.", 'eventorganiser'));
     }
     if (count($ical->errors) > 0) {
         foreach ($ical->errors as $error) {
             $codes = $error->get_error_codes();
             foreach ($codes as $code) {
                 $error_messages = $error->get_error_messages();
                 foreach ($error_messages as $error_message) {
                     $EO_Errors->add('eo_error', '<strong>' . __('Error:', 'eventorganiser') . '</strong> ' . $error_message);
                 }
             }
         }
     }
     $message = array();
     if ($ical->warnings) {
         foreach ($ical->warnings as $warning) {
             $message[] = '<strong>' . __('Warning:', 'eventorganiser') . '</strong> ' . $warning->get_error_message();
         }
     }
     if (count($ical->events) == 1) {
         $message[] = __("1 event was successfully imported", 'eventorganiser');
     } elseif (count($ical->events) > 1) {
         $message[] = sprintf(__("%d events were successfully imported", 'eventorganiser'), count($ical->events)) . ".";
     }
     if ($venues_imported == 1) {
         $message[] = __("1 venue was created", 'eventorganiser');
     } elseif ($venues_imported > 1) {
         $message[] = sprintf(__("%d venues were created", 'eventorganiser'), $venues_imported);
     }
     if ($categories_imported == 1) {
         $message[] = __("1 category was created", 'eventorganiser');
     } elseif ($categories_imported > 1) {
         $message[] = sprintf(__("%d categories were created", 'eventorganiser'), $categories_imported);
     }
     $EO_Errors->add('eo_notice', implode('<br/>', $message));
 }
 function page_actions()
 {
     global $EO_Errors;
     //Determine action if any
     $action = $this->current_action();
     $venue = isset($_REQUEST['event-venue']) ? $_REQUEST['event-venue'] : false;
     if ($action && $venue || $action == 'add') {
         if (!current_user_can('manage_venues')) {
             wp_die(__("You do not have permission to manage venues", 'eventorganiser'));
         }
         switch ($action) {
             case 'update':
                 if (!check_admin_referer('eventorganiser_update_venue_' . $venue)) {
                     wp_die(__("You do not have permission to edit this venue.", 'eventorganiser'));
                 }
                 $venue = get_term_by('slug', esc_attr($venue), 'event-venue');
                 $return = eo_update_venue($venue->term_id, $_POST['eo_venue']);
                 if (is_wp_error($return)) {
                     $EO_Errors->add('eo_error', __("Venue <strong>was not</strong> updated", 'eventorganiser') . ": " . $return->get_error_message());
                 } else {
                     $term_id = (int) $return['term_id'];
                     $venue = get_term($term_id, 'event-venue');
                     $_REQUEST['event-venue'] = $venue->slug;
                     $EO_Errors->add('eo_notice', __("Venue <strong>updated</strong>", 'eventorganiser'));
                 }
                 $_REQUEST['action'] = 'edit';
                 break;
             case 'add':
                 if (!check_admin_referer('eventorganiser_add_venue')) {
                     wp_die(__("You do not have permission to edit this venue.", 'eventorganiser'));
                 }
                 $args = $_POST['eo_venue'];
                 $name = isset($args['name']) ? $args['name'] : '';
                 $return = eo_insert_venue($name, $args);
                 if (is_wp_error($return)) {
                     $EO_Errors->add('eo_error', __("Venue <strong>was not</strong> created", 'eventorganiser') . ": " . $return->get_error_message());
                     $_REQUEST['action'] = 'create';
                 } else {
                     $EO_Errors->add('eo_notice', __("Venue <strong>created</strong>", 'eventorganiser'));
                     $term_id = (int) $return['term_id'];
                     $venue = get_term($term_id, 'event-venue');
                     $_REQUEST['action'] = 'edit';
                     $_REQUEST['event-venue'] = $venue->slug;
                 }
                 break;
             case 'delete':
                 if (is_array($_REQUEST['event-venue'])) {
                     $nonce = 'bulk-venues';
                 } else {
                     $nonce = 'eventorganiser_delete_venue_' . $venue;
                 }
                 if (!check_admin_referer($nonce)) {
                     wp_die(__("You do not have permission to delete this venue", 'eventorganiser'));
                 }
                 $venues = (array) $venue;
                 //Count the number of deleted venues
                 $deleted = 0;
                 foreach ($venues as $venue) {
                     $venue = get_term_by('slug', esc_attr($venue), 'event-venue');
                     $resp = eo_delete_venue($venue->term_id);
                     if (!is_wp_error($resp) && true === $resp) {
                         $deleted++;
                     }
                 }
                 if ($deleted > 0) {
                     $EO_Errors = new WP_Error('eo_notice', __("Venue(s) <strong>deleted</strong>", 'eventorganiser'));
                 } else {
                     $EO_Errors = new WP_Error('eo_error', __("Venue(s) <strong>were not </strong> deleted", 'eventorganiser'));
                 }
                 break;
         }
     }
     $action = $this->current_action();
     if (in_array($action, array('edit', 'update', 'create'))) {
         $venue = isset($_REQUEST['event-venue']) ? $_REQUEST['event-venue'] : false;
         //Venued edit page
         add_meta_box('submitdiv', __('Save', 'eventorganiser'), 'eventorganiser_venue_submit', 'event_page_venues', 'side', 'high');
         do_action('add_meta_boxes_event_page_venues', $venue);
         do_action('add_meta_boxes', 'event_page_venues', $venue);
     } else {
         //Venue admin list
         require_once "classes/class-eo-venue-list-table.php";
         add_filter('manage_event_page_venues_columns', 'eventorganiser_venue_admin_columns');
         add_screen_option('per_page', array('option' => 'edit_event_venue_per_page', 'label' => __('Venues', 'eventorganiser'), 'default' => 20));
     }
 }