[ Index ] |
PHP Cross Reference of moodle-2.8 |
[Summary view] [Print] [Text view]
1 <?php 2 3 // This file is part of Moodle - http://moodle.org/ 4 // 5 // Moodle is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // Moodle is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 17 18 /** 19 * This file contains the renderers for the calendar within Moodle 20 * 21 * @copyright 2010 Sam Hemelryk 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 * @package calendar 24 */ 25 26 if (!defined('MOODLE_INTERNAL')) { 27 die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page 28 } 29 30 /** 31 * The primary renderer for the calendar. 32 */ 33 class core_calendar_renderer extends plugin_renderer_base { 34 35 /** 36 * Creates a basic export form 37 * 38 * @param bool $allowthisweek 39 * @param bool $allownextweek 40 * @param bool $allownextmonth 41 * @param int $userid 42 * @param string $authtoken 43 * @return string 44 */ 45 public function basic_export_form($allowthisweek, $allownextweek, $allownextmonth, $userid, $authtoken) { 46 global $CFG; 47 48 $output = html_writer::tag('div', get_string('export', 'calendar'), array('class'=>'header')); 49 $output .= html_writer::start_tag('fieldset'); 50 $output .= html_writer::tag('legend', get_string('commontasks', 'calendar')); 51 $output .= html_writer::start_tag('form', array('action'=>new moodle_url('/calendar/export_execute.php'), 'method'=>'get')); 52 53 $output .= html_writer::tag('div', get_string('iwanttoexport', 'calendar')); 54 55 $output .= html_writer::start_tag('div', array('class'=>'indent')); 56 $output .= html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'preset_what', 'id'=>'pw_all', 'value'=>'all', 'checked'=>'checked')); 57 $output .= html_writer::tag('label', get_string('eventsall', 'calendar'), array('for'=>'pw_all')); 58 $output .= html_writer::empty_tag('br'); 59 $output .= html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'preset_what', 'id'=>'pw_course', 'value'=>'courses')); 60 $output .= html_writer::tag('label', get_string('eventsrelatedtocourses', 'calendar'), array('for'=>'pw_course')); 61 $output .= html_writer::empty_tag('br'); 62 $output .= html_writer::end_tag('div'); 63 64 $output .= html_writer::tag('div', get_string('for', 'calendar').':'); 65 66 $output .= html_writer::start_tag('div', array('class'=>'indent')); 67 if ($allowthisweek) { 68 $output .= html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'preset_time', 'id'=>'pt_wknow', 'value'=>'weeknow', 'checked'=>'checked')); 69 $output .= html_writer::tag('label', get_string('weekthis', 'calendar'), array('for'=>'pt_wknow')); 70 $output .= html_writer::empty_tag('br'); 71 } 72 if ($allownextweek) { 73 $output .= html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'preset_time', 'id'=>'pt_wknext', 'value'=>'weeknext')); 74 $output .= html_writer::tag('label', get_string('weeknext', 'calendar'), array('for'=>'pt_wknext')); 75 $output .= html_writer::empty_tag('br'); 76 } 77 $output .= html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'preset_time', 'id'=>'pt_monnow', 'value'=>'monthnow')); 78 $output .= html_writer::tag('label', get_string('monththis', 'calendar'), array('for'=>'pt_monnow')); 79 $output .= html_writer::empty_tag('br'); 80 if ($allownextmonth) { 81 $output .= html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'preset_time', 'id'=>'pt_monnext', 'value'=>'monthnext')); 82 $output .= html_writer::tag('label', get_string('monthnext', 'calendar'), array('for'=>'pt_monnext')); 83 $output .= html_writer::empty_tag('br'); 84 } 85 $output .= html_writer::empty_tag('input', array('type'=>'radio', 'name'=>'preset_time', 'id'=>'pt_recupc', 'value'=>'recentupcoming')); 86 $output .= html_writer::tag('label', get_string('recentupcoming', 'calendar'), array('for'=>'pt_recupc')); 87 $output .= html_writer::empty_tag('br'); 88 89 if ($CFG->calendar_customexport) { 90 $a = new stdClass(); 91 $now = time(); 92 $time = $now - $CFG->calendar_exportlookback * DAYSECS; 93 $a->timestart = userdate($time, get_string('strftimedatefullshort', 'langconfig')); 94 $time = $now + $CFG->calendar_exportlookahead * DAYSECS; 95 $a->timeend = userdate($time, get_string('strftimedatefullshort', 'langconfig')); 96 $output .= html_writer::empty_tag('input', array('type' => 'radio', 'name' => 'preset_time', 'id' => 'pt_custom', 'value' => 'custom')); 97 $output .= html_writer::tag('label', get_string('customexport', 'calendar', $a), array('for' => 'pt_custom')); 98 $output .= html_writer::empty_tag('br'); 99 } 100 101 $output .= html_writer::end_tag('div'); 102 $output .= html_writer::start_tag('div', array('class'=>'rightalign')); 103 $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'cal_d', 'value'=>'')); 104 $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'cal_m', 'value'=>'')); 105 $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'cal_y', 'value'=>'')); 106 $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'userid', 'value'=>$userid)); 107 $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name'=>'authtoken', 'value'=>$authtoken)); 108 109 $output .= html_writer::empty_tag('input', array('type'=>'submit', 'name' => 'generateurl', 'id'=>'generateurl', 'value'=>get_string('generateurlbutton', 'calendar'))); 110 $output .= html_writer::empty_tag('input', array('type'=>'submit', 'value'=>get_string('exportbutton', 'calendar'))); 111 112 $output .= html_writer::end_tag('div'); 113 114 $output .= html_writer::end_tag('form'); 115 $output .= html_writer::end_tag('fieldset'); 116 117 $output .= html_writer::start_tag('div', array('id'=>'urlbox', 'style'=>'display:none;')); 118 $output .= html_writer::tag('p', get_string('urlforical', 'calendar')); 119 $output .= html_writer::tag('div', '', array('id'=>'url', 'style'=>'overflow:scroll;width:650px;')); 120 $output .= html_writer::end_tag('div'); 121 122 return $output; 123 } 124 125 /** 126 * Starts the standard layout for the page 127 * 128 * @return string 129 */ 130 public function start_layout() { 131 return html_writer::start_tag('div', array('class'=>'maincalendar')); 132 } 133 134 /** 135 * Creates the remainder of the layout 136 * 137 * @return string 138 */ 139 public function complete_layout() { 140 return html_writer::end_tag('div'); 141 } 142 143 /** 144 * Produces the content for the filters block (pretend block) 145 * 146 * @param int $courseid 147 * @param int $day 148 * @param int $month 149 * @param int $year 150 * @param int $view 151 * @param int $courses 152 * @return string 153 */ 154 public function fake_block_filters($courseid, $day, $month, $year, $view, $courses) { 155 $returnurl = $this->page->url; 156 $returnurl->param('course', $courseid); 157 return html_writer::tag('div', calendar_filter_controls($returnurl), array('class'=>'calendar_filters filters')); 158 } 159 160 /** 161 * Produces the content for the three months block (pretend block) 162 * 163 * This includes the previous month, the current month, and the next month 164 * 165 * @param calendar_information $calendar 166 * @return string 167 */ 168 public function fake_block_threemonths(calendar_information $calendar) { 169 // Get the calendar type we are using. 170 $calendartype = \core_calendar\type_factory::get_calendar_instance(); 171 172 $date = $calendartype->timestamp_to_date_array($calendar->time); 173 174 $prevmonth = calendar_sub_month($date['mon'], $date['year']); 175 $prevmonthtime = $calendartype->convert_to_gregorian($prevmonth[1], $prevmonth[0], 1); 176 $prevmonthtime = make_timestamp($prevmonthtime['year'], $prevmonthtime['month'], $prevmonthtime['day'], 177 $prevmonthtime['hour'], $prevmonthtime['minute']); 178 179 $nextmonth = calendar_add_month($date['mon'], $date['year']); 180 $nextmonthtime = $calendartype->convert_to_gregorian($nextmonth[1], $nextmonth[0], 1); 181 $nextmonthtime = make_timestamp($nextmonthtime['year'], $nextmonthtime['month'], $nextmonthtime['day'], 182 $nextmonthtime['hour'], $nextmonthtime['minute']); 183 184 $content = html_writer::start_tag('div', array('class' => 'minicalendarblock')); 185 $content .= calendar_get_mini($calendar->courses, $calendar->groups, $calendar->users, false, false, 'display', $calendar->courseid, $prevmonthtime); 186 $content .= html_writer::end_tag('div'); 187 $content .= html_writer::start_tag('div', array('class' => 'minicalendarblock')); 188 $content .= calendar_get_mini($calendar->courses, $calendar->groups, $calendar->users, false, false, 'display', $calendar->courseid, $calendar->time); 189 $content .= html_writer::end_tag('div'); 190 $content .= html_writer::start_tag('div', array('class' => 'minicalendarblock')); 191 $content .= calendar_get_mini($calendar->courses, $calendar->groups, $calendar->users, false, false, 'display', $calendar->courseid, $nextmonthtime); 192 $content .= html_writer::end_tag('div'); 193 return $content; 194 } 195 196 /** 197 * Adds a pretent calendar block 198 * 199 * @param block_contents $bc 200 * @param mixed $pos BLOCK_POS_RIGHT | BLOCK_POS_LEFT 201 */ 202 public function add_pretend_calendar_block(block_contents $bc, $pos=BLOCK_POS_RIGHT) { 203 $this->page->blocks->add_fake_block($bc, $pos); 204 } 205 206 /** 207 * Creates a button to add a new event 208 * 209 * @param int $courseid 210 * @param int $day 211 * @param int $month 212 * @param int $year 213 * @param int $time the unixtime, used for multiple calendar support. The values $day, 214 * $month and $year are kept for backwards compatibility. 215 * @return string 216 */ 217 protected function add_event_button($courseid, $day = null, $month = null, $year = null, $time = null) { 218 // If a day, month and year were passed then convert it to a timestamp. If these were passed 219 // then we can assume the day, month and year are passed as Gregorian, as no where in core 220 // should we be passing these values rather than the time. This is done for BC. 221 if (!empty($day) && !empty($month) && !empty($year)) { 222 if (checkdate($month, $day, $year)) { 223 $time = make_timestamp($year, $month, $day); 224 } else { 225 $time = time(); 226 } 227 } else if (empty($time)) { 228 $time = time(); 229 } 230 231 $output = html_writer::start_tag('div', array('class'=>'buttons')); 232 $output .= html_writer::start_tag('form', array('action' => CALENDAR_URL . 'event.php', 'method' => 'get')); 233 $output .= html_writer::start_tag('div'); 234 $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name' => 'action', 'value' => 'new')); 235 $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name' => 'course', 'value' => $courseid)); 236 $output .= html_writer::empty_tag('input', array('type'=>'hidden', 'name' => 'time', 'value' => $time)); 237 $output .= html_writer::empty_tag('input', array('type'=>'submit', 'value' => get_string('newevent', 'calendar'))); 238 $output .= html_writer::end_tag('div'); 239 $output .= html_writer::end_tag('form'); 240 $output .= html_writer::end_tag('div'); 241 return $output; 242 } 243 244 /** 245 * Displays the calendar for a single day 246 * 247 * @param calendar_information $calendar 248 * @return string 249 */ 250 public function show_day(calendar_information $calendar, moodle_url $returnurl = null) { 251 252 if ($returnurl === null) { 253 $returnurl = $this->page->url; 254 } 255 256 $events = calendar_get_upcoming($calendar->courses, $calendar->groups, $calendar->users, 1, 100, $calendar->timestamp_today()); 257 258 $output = html_writer::start_tag('div', array('class'=>'header')); 259 $output .= $this->course_filter_selector($returnurl, get_string('dayviewfor', 'calendar')); 260 if (calendar_user_can_add_event($calendar->course)) { 261 $output .= $this->add_event_button($calendar->course->id, 0, 0, 0, $calendar->time); 262 } 263 $output .= html_writer::end_tag('div'); 264 // Controls 265 $output .= html_writer::tag('div', calendar_top_controls('day', array('id' => $calendar->courseid, 'time' => $calendar->time)), array('class'=>'controls')); 266 267 if (empty($events)) { 268 // There is nothing to display today. 269 $output .= $this->output->heading(get_string('daywithnoevents', 'calendar'), 3); 270 } else { 271 $output .= html_writer::start_tag('div', array('class' => 'eventlist')); 272 $underway = array(); 273 // First, print details about events that start today 274 foreach ($events as $event) { 275 $event = new calendar_event($event); 276 $event->calendarcourseid = $calendar->courseid; 277 if ($event->timestart >= $calendar->timestamp_today() && $event->timestart <= $calendar->timestamp_tomorrow()-1) { // Print it now 278 $event->time = calendar_format_event_time($event, time(), null, false, $calendar->timestamp_today()); 279 $output .= $this->event($event); 280 } else { // Save this for later 281 $underway[] = $event; 282 } 283 } 284 285 // Then, show a list of all events that just span this day 286 if (!empty($underway)) { 287 $output .= $this->output->heading(get_string('spanningevents', 'calendar'), 3); 288 foreach ($underway as $event) { 289 $event->time = calendar_format_event_time($event, time(), null, false, $calendar->timestamp_today()); 290 $output .= $this->event($event); 291 } 292 } 293 294 $output .= html_writer::end_tag('div'); 295 } 296 297 return $output; 298 } 299 300 /** 301 * Displays an event 302 * 303 * @param calendar_event $event 304 * @param bool $showactions 305 * @return string 306 */ 307 public function event(calendar_event $event, $showactions=true) { 308 global $CFG; 309 310 $event = calendar_add_event_metadata($event); 311 $context = $event->context; 312 $output = ''; 313 314 if (!empty($event->icon)) { 315 $output .= $event->icon; 316 } else { 317 $output .= $this->output->spacer(array('height' => 16, 'width' => 16)); 318 } 319 320 if (!empty($event->referer)) { 321 $output .= $this->output->heading($event->referer, 3, array('class' => 'referer')); 322 } else { 323 $output .= $this->output->heading( 324 format_string($event->name, false, array('context' => $context)), 325 3, 326 array('class' => 'name') 327 ); 328 } 329 if (!empty($event->courselink)) { 330 $output .= html_writer::tag('div', $event->courselink, array('class' => 'course')); 331 } 332 // Show subscription source if needed. 333 if (!empty($event->subscription) && $CFG->calendar_showicalsource) { 334 if (!empty($event->subscription->url)) { 335 $source = html_writer::link($event->subscription->url, get_string('subsource', 'calendar', $event->subscription)); 336 } else { 337 // File based ical. 338 $source = get_string('subsource', 'calendar', $event->subscription); 339 } 340 $output .= html_writer::tag('div', $source, array('class' => 'subscription')); 341 } 342 if (!empty($event->time)) { 343 $output .= html_writer::tag('span', $event->time, array('class' => 'date')); 344 } else { 345 $output .= html_writer::tag('span', calendar_time_representation($event->timestart), array('class' => 'date')); 346 } 347 348 $eventdetailshtml = ''; 349 $eventdetailsclasses = ''; 350 351 $eventdetailshtml .= format_text($event->description, $event->format, array('context' => $context)); 352 $eventdetailsclasses .= 'description'; 353 if (isset($event->cssclass)) { 354 $eventdetailsclasses .= ' '.$event->cssclass; 355 } 356 357 $output .= html_writer::tag('div', $eventdetailshtml, array('class' => $eventdetailsclasses)); 358 359 if (calendar_edit_event_allowed($event) && $showactions) { 360 if (empty($event->cmid)) { 361 $editlink = new moodle_url(CALENDAR_URL.'event.php', array('action'=>'edit', 'id'=>$event->id)); 362 $deletelink = new moodle_url(CALENDAR_URL.'delete.php', array('id'=>$event->id)); 363 if (!empty($event->calendarcourseid)) { 364 $editlink->param('course', $event->calendarcourseid); 365 $deletelink->param('course', $event->calendarcourseid); 366 } 367 } else { 368 $editlink = new moodle_url('/course/mod.php', array('update'=>$event->cmid, 'return'=>true, 'sesskey'=>sesskey())); 369 $deletelink = null; 370 } 371 372 $commands = html_writer::start_tag('div', array('class'=>'commands')); 373 $commands .= html_writer::start_tag('a', array('href'=>$editlink)); 374 $commands .= html_writer::empty_tag('img', array('src'=>$this->output->pix_url('t/edit'), 'alt'=>get_string('tt_editevent', 'calendar'), 'title'=>get_string('tt_editevent', 'calendar'))); 375 $commands .= html_writer::end_tag('a'); 376 if ($deletelink != null) { 377 $commands .= html_writer::start_tag('a', array('href'=>$deletelink)); 378 $commands .= html_writer::empty_tag('img', array('src'=>$this->output->pix_url('t/delete'), 'alt'=>get_string('tt_deleteevent', 'calendar'), 'title'=>get_string('tt_deleteevent', 'calendar'))); 379 $commands .= html_writer::end_tag('a'); 380 } 381 $commands .= html_writer::end_tag('div'); 382 $output .= $commands; 383 } 384 return html_writer::tag('div', $output , array('class' => 'event', 'id' => 'event_' . $event->id)); 385 } 386 387 /** 388 * Displays a month in detail 389 * 390 * @param calendar_information $calendar 391 * @param moodle_url $returnurl the url to return to 392 * @return string 393 */ 394 public function show_month_detailed(calendar_information $calendar, moodle_url $returnurl = null) { 395 global $CFG; 396 397 if (empty($returnurl)) { 398 $returnurl = $this->page->url; 399 } 400 401 // Get the calendar type we are using. 402 $calendartype = \core_calendar\type_factory::get_calendar_instance(); 403 404 // Store the display settings. 405 $display = new stdClass; 406 $display->thismonth = false; 407 408 // Get the specified date in the calendar type being used. 409 $date = $calendartype->timestamp_to_date_array($calendar->time); 410 $thisdate = $calendartype->timestamp_to_date_array(time()); 411 if ($date['mon'] == $thisdate['mon'] && $date['year'] == $thisdate['year']) { 412 $display->thismonth = true; 413 $date = $thisdate; 414 $calendar->time = time(); 415 } 416 417 // Get Gregorian date for the start of the month. 418 $gregoriandate = $calendartype->convert_to_gregorian($date['year'], $date['mon'], 1); 419 // Store the gregorian date values to be used later. 420 list($gy, $gm, $gd, $gh, $gmin) = array($gregoriandate['year'], $gregoriandate['month'], $gregoriandate['day'], 421 $gregoriandate['hour'], $gregoriandate['minute']); 422 423 // Get the starting week day for this month. 424 $startwday = dayofweek(1, $date['mon'], $date['year']); 425 // Get the days in a week. 426 $daynames = calendar_get_days(); 427 // Store the number of days in a week. 428 $numberofdaysinweek = $calendartype->get_num_weekdays(); 429 430 $display->minwday = calendar_get_starting_weekday(); 431 $display->maxwday = $display->minwday + ($numberofdaysinweek - 1); 432 $display->maxdays = calendar_days_in_month($date['mon'], $date['year']); 433 434 // These are used for DB queries, so we want unixtime, so we need to use Gregorian dates. 435 $display->tstart = make_timestamp($gy, $gm, $gd, $gh, $gmin, 0); 436 $display->tend = $display->tstart + ($display->maxdays * DAYSECS) - 1; 437 438 // Align the starting weekday to fall in our display range 439 // This is simple, not foolproof. 440 if ($startwday < $display->minwday) { 441 $startwday += $numberofdaysinweek; 442 } 443 444 // Get events from database 445 $events = calendar_get_events($display->tstart, $display->tend, $calendar->users, $calendar->groups, $calendar->courses); 446 if (!empty($events)) { 447 foreach($events as $eventid => $event) { 448 $event = new calendar_event($event); 449 if (!empty($event->modulename)) { 450 $cm = get_coursemodule_from_instance($event->modulename, $event->instance); 451 if (!\core_availability\info_module::is_user_visible($cm, 0, false)) { 452 unset($events[$eventid]); 453 } 454 } 455 } 456 } 457 458 // Extract information: events vs. time 459 calendar_events_by_day($events, $date['mon'], $date['year'], $eventsbyday, $durationbyday, $typesbyday, $calendar->courses); 460 461 $output = html_writer::start_tag('div', array('class'=>'header')); 462 $output .= $this->course_filter_selector($returnurl, get_string('detailedmonthviewfor', 'calendar')); 463 if (calendar_user_can_add_event($calendar->course)) { 464 $output .= $this->add_event_button($calendar->course->id, 0, 0, 0, $calendar->time); 465 } 466 $output .= html_writer::end_tag('div', array('class'=>'header')); 467 // Controls 468 $output .= html_writer::tag('div', calendar_top_controls('month', array('id' => $calendar->courseid, 'time' => $calendar->time)), array('class' => 'controls')); 469 470 $table = new html_table(); 471 $table->attributes = array('class'=>'calendarmonth calendartable'); 472 $table->summary = get_string('calendarheading', 'calendar', userdate($calendar->time, get_string('strftimemonthyear'))); 473 $table->data = array(); 474 475 // Get the day names as the header. 476 $header = array(); 477 for($i = $display->minwday; $i <= $display->maxwday; ++$i) { 478 $header[] = $daynames[$i % $numberofdaysinweek]['shortname']; 479 } 480 $table->head = $header; 481 482 // For the table display. $week is the row; $dayweek is the column. 483 $week = 1; 484 $dayweek = $startwday; 485 486 $row = new html_table_row(array()); 487 488 // Paddding (the first week may have blank days in the beginning) 489 for($i = $display->minwday; $i < $startwday; ++$i) { 490 $cell = new html_table_cell(' '); 491 $cell->attributes = array('class'=>'nottoday dayblank'); 492 $row->cells[] = $cell; 493 } 494 495 // Now display all the calendar 496 $weekend = CALENDAR_DEFAULT_WEEKEND; 497 if (isset($CFG->calendar_weekend)) { 498 $weekend = intval($CFG->calendar_weekend); 499 } 500 501 $daytime = strtotime('-1 day', $display->tstart); 502 for ($day = 1; $day <= $display->maxdays; ++$day, ++$dayweek) { 503 $daytime = strtotime('+1 day', $daytime); 504 if($dayweek > $display->maxwday) { 505 // We need to change week (table row) 506 $table->data[] = $row; 507 $row = new html_table_row(array()); 508 $dayweek = $display->minwday; 509 ++$week; 510 } 511 512 // Reset vars 513 $cell = new html_table_cell(); 514 $dayhref = calendar_get_link_href(new moodle_url(CALENDAR_URL.'view.php', array('view' => 'day', 'course' => $calendar->courseid)), 0, 0, 0, $daytime); 515 516 $cellclasses = array(); 517 518 if ($weekend & (1 << ($dayweek % $numberofdaysinweek))) { 519 // Weekend. This is true no matter what the exact range is. 520 $cellclasses[] = 'weekend'; 521 } 522 523 // Special visual fx if an event is defined 524 if (isset($eventsbyday[$day])) { 525 if(count($eventsbyday[$day]) == 1) { 526 $title = get_string('oneevent', 'calendar'); 527 } else { 528 $title = get_string('manyevents', 'calendar', count($eventsbyday[$day])); 529 } 530 $cell->text = html_writer::tag('div', html_writer::link($dayhref, $day, array('title'=>$title)), array('class'=>'day')); 531 } else { 532 $cell->text = html_writer::tag('div', $day, array('class'=>'day')); 533 } 534 535 // Special visual fx if an event spans many days 536 $durationclass = false; 537 if (isset($typesbyday[$day]['durationglobal'])) { 538 $durationclass = 'duration_global'; 539 } else if (isset($typesbyday[$day]['durationcourse'])) { 540 $durationclass = 'duration_course'; 541 } else if (isset($typesbyday[$day]['durationgroup'])) { 542 $durationclass = 'duration_group'; 543 } else if (isset($typesbyday[$day]['durationuser'])) { 544 $durationclass = 'duration_user'; 545 } 546 if ($durationclass) { 547 $cellclasses[] = 'duration'; 548 $cellclasses[] = $durationclass; 549 } 550 551 // Special visual fx for today 552 if ($display->thismonth && $day == $date['mday']) { 553 $cellclasses[] = 'day today'; 554 } else { 555 $cellclasses[] = 'day nottoday'; 556 } 557 $cell->attributes = array('class'=>join(' ',$cellclasses)); 558 559 if (isset($eventsbyday[$day])) { 560 $cell->text .= html_writer::start_tag('ul', array('class'=>'events-new')); 561 foreach($eventsbyday[$day] as $eventindex) { 562 // If event has a class set then add it to the event <li> tag 563 $attributes = array(); 564 if (!empty($events[$eventindex]->class)) { 565 $attributes['class'] = $events[$eventindex]->class; 566 } 567 $dayhref->set_anchor('event_'.$events[$eventindex]->id); 568 $link = html_writer::link($dayhref, format_string($events[$eventindex]->name, true)); 569 $cell->text .= html_writer::tag('li', $link, $attributes); 570 } 571 $cell->text .= html_writer::end_tag('ul'); 572 } 573 if (isset($durationbyday[$day])) { 574 $cell->text .= html_writer::start_tag('ul', array('class'=>'events-underway')); 575 foreach($durationbyday[$day] as $eventindex) { 576 $cell->text .= html_writer::tag('li', '['.format_string($events[$eventindex]->name,true).']', array('class'=>'events-underway')); 577 } 578 $cell->text .= html_writer::end_tag('ul'); 579 } 580 $row->cells[] = $cell; 581 } 582 583 // Paddding (the last week may have blank days at the end) 584 for($i = $dayweek; $i <= $display->maxwday; ++$i) { 585 $cell = new html_table_cell(' '); 586 $cell->attributes = array('class'=>'nottoday dayblank'); 587 $row->cells[] = $cell; 588 } 589 $table->data[] = $row; 590 $output .= html_writer::table($table); 591 592 return $output; 593 } 594 595 /** 596 * Displays upcoming events 597 * 598 * @param calendar_information $calendar 599 * @param int $futuredays 600 * @param int $maxevents 601 * @return string 602 */ 603 public function show_upcoming_events(calendar_information $calendar, $futuredays, $maxevents, moodle_url $returnurl = null) { 604 605 if ($returnurl === null) { 606 $returnurl = $this->page->url; 607 } 608 609 $events = calendar_get_upcoming($calendar->courses, $calendar->groups, $calendar->users, $futuredays, $maxevents); 610 611 $output = html_writer::start_tag('div', array('class'=>'header')); 612 $output .= $this->course_filter_selector($returnurl, get_string('upcomingeventsfor', 'calendar')); 613 if (calendar_user_can_add_event($calendar->course)) { 614 $output .= $this->add_event_button($calendar->course->id); 615 } 616 $output .= html_writer::end_tag('div'); 617 618 if ($events) { 619 $output .= html_writer::start_tag('div', array('class' => 'eventlist')); 620 foreach ($events as $event) { 621 // Convert to calendar_event object so that we transform description 622 // accordingly 623 $event = new calendar_event($event); 624 $event->calendarcourseid = $calendar->courseid; 625 $output .= $this->event($event); 626 } 627 $output .= html_writer::end_tag('div'); 628 } else { 629 $output .= $this->output->heading(get_string('noupcomingevents', 'calendar')); 630 } 631 632 return $output; 633 } 634 635 /** 636 * Displays a course filter selector 637 * 638 * @param moodle_url $returnurl The URL that the user should be taken too upon selecting a course. 639 * @param string $label The label to use for the course select. 640 * @return string 641 */ 642 protected function course_filter_selector(moodle_url $returnurl, $label=null) { 643 global $USER, $SESSION, $CFG; 644 645 if (!isloggedin() or isguestuser()) { 646 return ''; 647 } 648 649 if (has_capability('moodle/calendar:manageentries', context_system::instance()) && !empty($CFG->calendar_adminseesall)) { 650 $courses = get_courses('all', 'c.shortname','c.id,c.shortname'); 651 } else { 652 $courses = enrol_get_my_courses(); 653 } 654 655 unset($courses[SITEID]); 656 657 $courseoptions = array(); 658 $courseoptions[SITEID] = get_string('fulllistofcourses'); 659 foreach ($courses as $course) { 660 $coursecontext = context_course::instance($course->id); 661 $courseoptions[$course->id] = format_string($course->shortname, true, array('context' => $coursecontext)); 662 } 663 664 if ($this->page->course->id !== SITEID) { 665 $selected = $this->page->course->id; 666 } else { 667 $selected = ''; 668 } 669 $courseurl = new moodle_url($returnurl); 670 $courseurl->remove_params('course'); 671 $select = new single_select($courseurl, 'course', $courseoptions, $selected, null); 672 $select->class = 'cal_courses_flt'; 673 if ($label !== null) { 674 $select->set_label($label); 675 } else { 676 $select->set_label(get_string('listofcourses'), array('class' => 'accesshide')); 677 } 678 return $this->output->render($select); 679 } 680 681 /** 682 * Renders a table containing information about calendar subscriptions. 683 * 684 * @param int $courseid 685 * @param array $subscriptions 686 * @param string $importresults 687 * @return string 688 */ 689 public function subscription_details($courseid, $subscriptions, $importresults = '') { 690 $table = new html_table(); 691 $table->head = array( 692 get_string('colcalendar', 'calendar'), 693 get_string('collastupdated', 'calendar'), 694 get_string('eventkind', 'calendar'), 695 get_string('colpoll', 'calendar'), 696 get_string('colactions', 'calendar') 697 ); 698 $table->align = array('left', 'left', 'left', 'center'); 699 $table->width = '100%'; 700 $table->data = array(); 701 702 if (empty($subscriptions)) { 703 $cell = new html_table_cell(get_string('nocalendarsubscriptions', 'calendar')); 704 $cell->colspan = 4; 705 $table->data[] = new html_table_row(array($cell)); 706 } 707 $strnever = new lang_string('never', 'calendar'); 708 foreach ($subscriptions as $sub) { 709 $label = $sub->name; 710 if (!empty($sub->url)) { 711 $label = html_writer::link($sub->url, $label); 712 } 713 if (empty($sub->lastupdated)) { 714 $lastupdated = $strnever->out(); 715 } else { 716 $lastupdated = userdate($sub->lastupdated, get_string('strftimedatetimeshort', 'langconfig')); 717 } 718 719 $cell = new html_table_cell($this->subscription_action_form($sub, $courseid)); 720 $cell->colspan = 2; 721 $type = $sub->eventtype . 'events'; 722 723 $table->data[] = new html_table_row(array( 724 new html_table_cell($label), 725 new html_table_cell($lastupdated), 726 new html_table_cell(get_string($type, 'calendar')), 727 $cell 728 )); 729 } 730 731 $out = $this->output->box_start('generalbox calendarsubs'); 732 733 $out .= $importresults; 734 $out .= html_writer::table($table); 735 $out .= $this->output->box_end(); 736 return $out; 737 } 738 739 /** 740 * Creates a form to perform actions on a given subscription. 741 * 742 * @param stdClass $subscription 743 * @param int $courseid 744 * @return string 745 */ 746 protected function subscription_action_form($subscription, $courseid) { 747 // Assemble form for the subscription row. 748 $html = html_writer::start_tag('form', array('action' => new moodle_url('/calendar/managesubscriptions.php'), 'method' => 'post')); 749 if (empty($subscription->url)) { 750 // Don't update an iCal file, which has no URL. 751 $html .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'pollinterval', 'value' => '0')); 752 } else { 753 // Assemble pollinterval control. 754 $html .= html_writer::start_tag('div', array('style' => 'float:left;')); 755 $html .= html_writer::start_tag('select', array('name' => 'pollinterval')); 756 foreach (calendar_get_pollinterval_choices() as $k => $v) { 757 $attributes = array(); 758 if ($k == $subscription->pollinterval) { 759 $attributes['selected'] = 'selected'; 760 } 761 $attributes['value'] = $k; 762 $html .= html_writer::tag('option', $v, $attributes); 763 } 764 $html .= html_writer::end_tag('select'); 765 $html .= html_writer::end_tag('div'); 766 } 767 $html .= html_writer::start_tag('div', array('style' => 'float:right;')); 768 $html .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'sesskey', 'value' => sesskey())); 769 $html .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'course', 'value' => $courseid)); 770 $html .= html_writer::empty_tag('input', array('type' => 'hidden', 'name' => 'id', 'value' => $subscription->id)); 771 if (!empty($subscription->url)) { 772 $html .= html_writer::tag('button', get_string('update'), array('type' => 'submit', 'name' => 'action', 773 'value' => CALENDAR_SUBSCRIPTION_UPDATE)); 774 } 775 $html .= html_writer::tag('button', get_string('remove'), array('type' => 'submit', 'name' => 'action', 776 'value' => CALENDAR_SUBSCRIPTION_REMOVE)); 777 $html .= html_writer::end_tag('div'); 778 $html .= html_writer::end_tag('form'); 779 return $html; 780 } 781 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:29:05 2014 | Cross-referenced by PHPXref 0.7.1 |