Example #1
0
function event_calendar_migration()
{
    $ia = elgg_set_ignore_access(true);
    // don't want to send notifications for these events
    elgg_unregister_event_handler('events_api', 'add_to_calendar', __NAMESPACE__ . '\\add_to_calendar');
    $dbprefix = elgg_get_config('dbprefix');
    $options = array('type' => 'object', 'subtype' => 'event_calendar', 'limit' => false);
    $old_events = new \ElggBatch('elgg_get_entities', $options, null, 25, false);
    foreach ($old_events as $old_event) {
        elgg_set_plugin_setting('migration_process', time(), 'events_ui');
        $container = $old_event->getContainerEntity();
        if (!$container) {
            // nothing we can do about this
            $old_event->delete();
            continue;
        }
        $tza = DateTimeZone::listAbbreviations();
        $tzlist = array();
        foreach ($tza as $zone) {
            foreach ($zone as $item) {
                if (is_string($item['timezone_id']) && $item['timezone_id'] != '') {
                    $tzlist[] = $item['timezone_id'];
                }
            }
        }
        // a list of all valid timezones
        $tzlist = array_unique($tzlist);
        $event = new Event();
        $event->owner_guid = $old_event->owner_guid;
        $event->container_guid = $old_event->container_guid;
        $event->access_id = $old_event->access_id;
        $event->title = $old_event->title;
        $event->description = $old_event->long_description ? $old_event->long_description : $old_event->description;
        $event->location = $old_event->location;
        $event->tags = $old_event->tags;
        // date and time
        $start_date = $old_event->start_date ? date('Y-m-d', $old_event->start_date) : date('Y-m-d', $old_event->time_created);
        $event->start_date = $start_date;
        $end_date = $old_event->end_date ? date('Y-m-d', $old_event->end_date) : $start_date;
        $event->end_date = $end_date;
        if ($old_event->start_time !== '') {
            $hr = floor((int) $old_event->start_time / 15 / 4);
            $min = (int) $old_event->start_time / 15 % 4 * 15;
            $am = $hr < 12 ? 'am' : 'pm';
            if ($hr > 12) {
                $hr -= 12;
            }
            if ($hr == 0) {
                $hr = 12;
            }
            if (!$min) {
                $min = '00';
            }
            $start_time = $hr . ":" . $min . $am;
        } else {
            $start_time = '12:00am';
            $end_time = '1:00am';
        }
        if ($old_event->end_time !== '') {
            $hr = floor((int) $old_event->end_time / 15 / 4);
            $min = (int) $old_event->end_time / 15 % 4 * 15;
            $am = $hr < 12 ? 'am' : 'pm';
            if ($hr > 12) {
                $hr -= 12;
            }
            if ($hr == 0) {
                $hr = 12;
            }
            if (!$min) {
                $min = '00';
            }
            $end_time = $hr . ":" . $min . $am;
        } else {
            if (!$end_time) {
                $hr++;
                $am = $hr < 12 ? 'am' : 'pm';
                if ($hr > 12) {
                    $hr -= 12;
                }
                if ($hr == 0) {
                    $hr = 12;
                }
                $end_time = $hr . ":" . $min . $am;
            }
        }
        $event->start_time = $start_time;
        $event->end_time = $end_time;
        $timezone = in_array($old_event->time_zone, $tzlist) ? $old_event->time_zone : 'America/New_York';
        // event calendar used some invalid timezones...
        // default to UTC if it fails
        try {
            $dt = new DateTime(null, new DateTimeZone($timezone));
        } catch (Exception $exc) {
            $dt = new DateTime(null, new DateTimeZone('America/New_York'));
            $timezone = 'America/New_York';
            // good as any, and requested by client
        }
        $start_timestamp = $dt->modify("{$start_date} {$start_time}")->getTimestamp();
        $start_timestamp_iso = $dt->format('c');
        $end_timestamp = $dt->modify("{$end_date} {$end_time}")->getTimestamp();
        $end_timestamp_iso = $dt->format('c');
        $event->start_timestamp = $start_timestamp;
        $event->end_timestamp = $end_timestamp;
        $event->start_timestamp_iso = $start_timestamp_iso;
        $event->end_timestamp_iso = $end_timestamp_iso;
        $event->timezone = $timezone;
        $event->all_day = 0;
        $event->end_delta = abs($end_timestamp - $start_timestamp);
        $event->repeat = 0;
        if (!$event->save()) {
            // something went wrong
            continue;
        }
        $event->repeat_end_timestamp = $event->calculateRepeatEndTimestamp();
        $event->time_created = $old_event->time_created;
        // might as well preserve this
        $event->save();
        // time_created can only be updated, not set on creation
        // now we need to add the event to calendars
        // first add to the container calendar
        $calendar = Calendar::getPublicCalendar($container);
        $calendar->addEvent($event);
        // now add to any other calendars
        $user_options = array('type' => 'user', 'joins' => array("JOIN {$dbprefix}entity_relationships r ON r.guid_one = e.guid"), 'wheres' => array("r.relationship = 'personal_event' AND r.guid_two = {$old_event->guid}"), 'limit' => false);
        $users = new \ElggBatch('elgg_get_entities', $user_options);
        foreach ($users as $u) {
            $ucal = Calendar::getPublicCalendar($u);
            $ucal->addEvent($event);
        }
        // all done, lets kill the old event
        $old_event->delete();
    }
    elgg_set_plugin_setting('migration_process', 0, 'events_ui');
    elgg_set_ignore_access($ia);
}
Example #2
0
$event->repeat_end_type = $repeat ? $repeat_end_type : Util::REPEAT_END_ONE_TIME;
// how to determine how to end the repeat (never | occurrances | date)
unset($event->repeat_monthly_by);
unset($event->repeat_weekly_days);
switch ($event->repeat_frequency) {
    case Util::FREQUENCY_WEEKLY:
        $repeat_weekly_days = get_input('repeat_weekly_days');
        $repeat_weekly_days = is_array($repeat_weekly_days) ? $repeat_weekly_days : date('D', $event->getStartTimestamp());
        $event->repeat_weekly_days = $repeat_weekly_days;
        break;
    case Util::FREQUENCY_MONTHLY:
        $repeat_monthly_by = get_input('repeat_monthly_by', Util::REPEAT_MONTHLY_BY_DATE);
        $event->repeat_monthly_by = $repeat_monthly_by;
        break;
}
$event->repeat_end_timestamp = $event->calculateRepeatEndTimestamp();
if (!$event->save()) {
    register_error(elgg_echo('events:error:save'));
    forward(REFERER);
}
$event->setLocation($location);
elgg_delete_metadata(array('guids' => $event->guid, 'metadata_names' => 'reminder', 'limit' => 0));
$has_reminders = get_input('has_reminders');
$reminders = get_input('reminders', array());
if ($has_reminders && !empty($reminders)) {
    $size = count($reminders['value']) - 1;
    // last one is the template
    for ($i = 0; $i < $size; $i++) {
        $reminder_value = round($reminders['value'][$i]);
        switch ($reminders['increment'][$i]) {
            default: