} $entity = get_entity($guid); if (!$entity instanceof Calendar) { forward('', '404'); } $owner = $entity->getOwnerEntity(); elgg_set_page_owner_guid($owner->guid); //elgg_push_breadcrumb(elgg_echo('events:calendar'), "calendar/all"); elgg_push_breadcrumb($owner->name, "calendar/owner/{$owner->username}"); elgg_push_breadcrumb($entity->getDisplayName()); $start = (int) get_input('start', time()); $start = (int) Util::getMonthStart($start); $end = (int) Util::getMonthEnd($start); $timezone = Util::getClientTimezone(); $start_local = $start - Util::getOffset($start, Util::UTC, $timezone); $end_local = $end - Util::getOffset($end, Util::UTC, $timezone); $events = $entity->getAllEventInstances($start_local, $end_local); if (!$is_logged_in) { logout(); } elgg_register_menu_item('title', array('name' => 'calendar_view', 'href' => elgg_http_add_url_query_elements("calendar/view/{$entity->guid}", array('start' => $start, 'end' => $end)), 'text' => elgg_echo('events:view:calendar'), 'title' => elgg_echo('events:view:calendar:switch'), 'link_class' => 'elgg-button elgg-button-action')); elgg_register_menu_item('title', array('name' => 'ical_view', 'href' => $entity->getIcalURL("calendar/ical/{$entity->guid}/calendar{$entity->guid}.ics", array()), 'text' => elgg_echo('events:view:ical'), 'title' => elgg_echo('events:view:ical'), 'link_class' => 'elgg-button elgg-button-action js-events-ui-ical-modal-trigger')); $dt = new DateTime(null, new DateTimeZone(Util::UTC)); $prev_start = $dt->setTimestamp($start)->modify('-1 month')->getTimestamp(); $next_start = $dt->setTimestamp($start)->modify('+1 month')->getTimestamp(); elgg_register_menu_item('title', array('name' => 'prev_month', 'text' => "« " . $dt->setTimestamp($prev_start)->format('F'), 'href' => elgg_http_add_url_query_elements("calendar/feed/{$entity->guid}", array('start' => $prev_start)), 'link_class' => 'elgg-button elgg-button-action mlm', 'priority' => 100)); elgg_register_menu_item('title', array('name' => 'next_month', 'text' => $dt->setTimestamp($next_start)->format('F') . " »", 'href' => elgg_http_add_url_query_elements("calendar/feed/{$entity->guid}", array('start' => $next_start)), 'link_class' => 'elgg-button elgg-button-action', 'priority' => 101)); $title = elgg_echo('events:feed:month', array($dt->setTimestamp($start)->format('F'))); $content = elgg_view('events_ui/feed', array('events' => $events)); $layout = elgg_view_layout('content', array('title' => $title, 'content' => $content, 'sidebar' => false, 'filter' => false, 'entity' => $entity)); echo elgg_view_page($title, $layout, 'default', array('entity' => $entity));
/** * @dataProvider providerTestConvert */ public function testGetOffset($ts, $timezone, $target_timezone, $expected) { $this->assertEquals($expected, $this->util->getOffset($ts, $timezone, $target_timezone)); }
/** * Calculates the end (or start) timestamp of the last event in a sequence of occurrences * * @param int $occurrences Max number of occurrences * @param int $from_timestamp Initial time to calculate from (defaults to event start time) * @param bool $at_event_end If true, will return the timestamp of the event end, otherwise event start * @return int */ public function calculateEndAfterTimestamp($occurrences = 1, $from_timestamp = null, $at_event_end = true) { $occurrences = (int) $occurrences; $start_timestamp = $this->getStartTimestamp(); $start_day = $start_timestamp; $test_day = $start_timestamp > $from_timestamp ? $start_timestamp : $from_timestamp; while ($occurrences > 0) { $shows = false; $offset_on_test_day = Util::getOffset($test_day, Util::UTC, $this->getTimezone()); // next increment $next_test_day = $test_day + Util::SECONDS_IN_A_DAY; switch ($this->repeat_frequency) { default: $occurrences = 0; break; case Util::FREQUENCY_DAILY: $shows = true; break; case Util::FREQUENCY_WEEKDAY: $repeat_weekly_days = array(Util::SATURDAY, Util::SUNDAY); foreach ($repeat_weekly_days as $key => $day) { $repeat_weekly_days[$key] = Util::getDayOfWeek(strtotime($day, $test_day) - $offset_on_test_day); } $D = Util::getDayOfWeek($test_day); $shows = !in_array($D, $repeat_weekly_days); break; case Util::FREQUENCY_WEEKDAY_ODD: $repeat_weekly_days = array(Util::MONDAY, Util::WEDNESDAY, Util::FRIDAY); foreach ($repeat_weekly_days as $key => $day) { $repeat_weekly_days[$key] = Util::getDayOfWeek(strtotime($day, $test_day) - $offset_on_test_day); } $D = Util::getDayOfWeek($test_day); $shows = in_array($D, $repeat_weekly_days); break; case Util::FREQUENCY_WEEKDAY_EVEN: $repeat_weekly_days = array(Util::TUESDAY, Util::THURSDAY); foreach ($repeat_weekly_days as $key => $day) { $repeat_weekly_days[$key] = Util::getDayOfWeek(strtotime($day, $test_day) - $offset_on_test_day); } $D = Util::getDayOfWeek($test_day); $shows = in_array($D, $repeat_weekly_days); break; case Util::FREQUENCY_WEEKLY: $repeat_weekly_days = $this->repeat_weekly_days; if (!$repeat_weekly_days) { $repeat_weekly_days = Util::getDayOfWeek($this->getStartTimestamp()); } if (!is_array($repeat_weekly_days)) { $repeat_weekly_days = array($repeat_weekly_days); } $D = Util::getDayOfWeek($test_day); foreach ($repeat_weekly_days as $key => $day) { // use offsets // Monday in Sydney can still be Sunday at UTC $repeat_weekly_days[$key] = Util::getDayOfWeek(strtotime($day, $test_day) - $offset_on_test_day); } $shows = in_array($D, $repeat_weekly_days); break; case Util::FREQUENCY_MONTHLY: if ($this->repeat_monthly_by == Util::REPEAT_MONTHLY_BY_DAY_OF_WEEK) { $shows = Util::isOnSameWeekDayOfMonth($test_day, $this->getStartTimestamp()); if ($shows) { // we can skip 4 weeks $next_test_day = strtotime('+28 days', $test_day); } } else { $shows = Util::isOnSameDayOfMonth($test_day, $this->getStartTimestamp()); if ($shows) { // we can skip a month $next_test_day = strtotime('+1 month', $test_day); } } break; case Util::FREQUENCY_YEARLY: $shows = Util::isOnSameDayOfYear($test_day, $this->getStartTimestamp()); if ($shows) { // we can skip a year $next_test_day = strtotime('+1 year', $test_day); } break; } if ($shows) { $occurrences--; $start_timestamp = (int) Util::getTimeOfDay($this->getStartTimestamp(), $test_day); } $test_day = $next_test_day; } return $at_event_end ? $start_timestamp + $this->end_delta : $start_timestamp; }