/** * Echoes HTML code for booking table with all booking options and booking status * @param $booking object containing complete details of the booking instance * @param $user object of current user * @param $cm course module object * @param $allresponses array of all responses * @param $sorturl * @param $urlParams - fparameters of url * @param $optionid - if is set, show only this option * @return void */ function booking_show_form($booking, $user, $cm, $allresponses, $sorturl = '', $urlParams = array(), $optionid = NULL) { global $DB, $OUTPUT; //$optiondisplay is an array of the display info for a booking $cdisplay[$optionid]->text - text name of option. // ->maxanswers -maxanswers for this option // ->full - whether this option is full or not. 0=not full, 1=full // ->maxoverbooking - waitinglist places dor option // ->waitingfull - whether waitinglist is full or not 0=not, 1=full $bookingfull = false; $cdisplay = new stdClass(); if ($booking->booking->limitanswers) { //set bookingfull to true by default if limitanswers. $bookingfull = true; $waitingfull = true; } $context = context_module::instance($cm->id); $table = NULL; $displayoptions = new stdClass(); $displayoptions->para = false; $tabledata = array(); $current = array(); $rowclasses = array(); $hidden = ""; foreach ($urlParams as $key => $value) { if (!in_array($key, array('searchText', 'searchLocation', 'searchInstitution'))) { $hidden .= '<input value="' . $value . '" type="hidden" name="' . $key . '">'; } } $labelBooking = empty($booking->booking->lblbooking) ? get_string('booking', 'booking') : $booking->booking->lblbooking; $labelLocation = empty($booking->booking->lbllocation) ? get_string('location', 'booking') : $booking->booking->lbllocation; $labelInstitution = empty($booking->booking->lblinstitution) ? get_string('institution', 'booking') : $booking->booking->lblinstitution; $labelSearchName = empty($booking->booking->lblname) ? get_string('searchName', 'booking') : $booking->booking->lblname; $labelSearchSurname = empty($booking->booking->lblsurname) ? get_string('searchSurname', 'booking') : $booking->booking->lblsurname; $row = new html_table_row(array($labelBooking, $hidden . '<form><input value="' . $urlParams['searchText'] . '" type="text" id="searchText" name="searchText">', "", "")); $tabledata[] = $row; $rowclasses[] = ""; $row = new html_table_row(array($labelLocation, $hidden . '<input value="' . $urlParams['searchLocation'] . '" type="text" id="searchLocation" name="searchLocation">', "", "")); $tabledata[] = $row; $rowclasses[] = ""; $row = new html_table_row(array($labelInstitution, $hidden . '<input value="' . $urlParams['searchInstitution'] . '" type="text" id="searchInstitution" name="searchInstitution">', "", "")); $tabledata[] = $row; $rowclasses[] = ""; $row = new html_table_row(array($labelSearchName, '<form>' . $hidden . '<input value="' . $urlParams['searchName'] . '" type="text" id="searchName" name="searchName">', "", "")); $tabledata[] = $row; $rowclasses[] = ""; $row = new html_table_row(array($labelSearchSurname, '<input value="' . $urlParams['searchSurname'] . '" type="text" id="searchSurname" name="searchSurname">', "", "")); $tabledata[] = $row; $rowclasses[] = ""; $row = new html_table_row(array("", '<input id="searchButton" type="submit" value="' . get_string('search') . '"><input id="buttonclear" type="button" value="' . get_string('reset', 'booking') . '"></form>', "", "")); $tabledata[] = $row; $rowclasses[] = ""; $table = new html_table(); $table->head = array('', '', ''); $table->data = $tabledata; $table->id = "tableSearch"; if (empty($urlParams['searchText']) && empty($urlParams['searchLocation']) && empty($urlParams['searchName']) && empty($urlParams['searchInstitution']) && empty($urlParams['searchSurname'])) { $table->attributes = array('style' => "display: none;"); } echo html_writer::table($table); $table = NULL; $displayoptions = new stdClass(); $displayoptions->para = false; $tabledata = array(); $rowclasses = array(); $underlimit = $booking->booking->maxperuser == 0; $underlimit = $underlimit || booking_get_user_booking_count($booking, $user, $allresponses) < $booking->booking->maxperuser; // Show only one option if (isset($optionid)) { foreach ($booking->options as $option) { if ($optionid != $option->id) { unset($booking->options[$option->id]); } } } if (isset($booking->options)) { foreach ($booking->options as $option) { $current = array(); $optiondisplay = new stdClass(); $optiondisplay->delete = ""; $optiondisplay->button = ""; $hiddenfields = array('answer' => $option->id); $myBooking = $DB->get_record('booking_answers', array('userid' => $user->id, 'optionid' => $option->id)); $inpast = $option->courseendtime && $option->courseendtime < time(); $extraclass = $inpast ? ' inpast' : ''; if ($myBooking) { // If I'm booked if ($booking->booking->allowupdate and $option->status != 'closed') { $buttonoptions = array('id' => $cm->id, 'action' => 'delbooking', 'optionid' => $option->id, 'sesskey' => $user->sesskey); $url = new moodle_url('view.php', $buttonoptions); $optiondisplay->delete = $OUTPUT->single_button($url, empty($booking->booking->btncancelname) ? get_string('cancelbooking', 'booking') : $booking->booking->btncancelname, 'post') . '<br />'; } else { $optiondisplay->button = ""; } if ($myBooking->waitinglist) { $rowclasses[] = "mod-booking-watinglist" . $extraclass; $optiondisplay->booked = get_string('onwaitinglist', 'booking'); } else { $rowclasses[] = "mod-booking-booked" . $extraclass; if ($inpast) { $optiondisplay->booked = get_string('bookedpast', 'booking'); } else { $optiondisplay->booked = get_string('booked', 'booking'); } } } else { $optiondisplay->booked = get_string('notbooked', 'booking'); $rowclasses[] = $extraclass; $buttonoptions = array('answer' => $option->id, 'id' => $cm->id, 'sesskey' => $user->sesskey); $url = new moodle_url('view.php', $buttonoptions); $url->params($hiddenfields); $optiondisplay->button = $OUTPUT->single_button($url, empty($booking->booking->btnbooknowname) ? get_string('booknow', 'booking') : $booking->booking->btnbooknowname, 'post'); } if ($option->limitanswers && $option->status == "full" || $option->status == "closed" || !$underlimit) { $optiondisplay->button = ''; } if ($booking->booking->cancancelbook == 0 && $option->courseendtime > 0 && $option->courseendtime < time()) { $optiondisplay->button = ''; $optiondisplay->delete = ''; } // Dont display button Book now if it's disabled if ($option->disablebookingusers) { $optiondisplay->button = ''; } // check if user ist logged in if (has_capability('mod/booking:choose', $context, $user->id, false)) { //don't show booking button if the logged in user is the guest user. $bookingbutton = $optiondisplay->button; } else { $bookingbutton = get_string('havetologin', 'booking') . "<br />"; } if (!$option->limitanswers) { $stravailspaces = get_string("unlimited", 'booking'); } else { $stravailspaces = get_string("placesavailable", "booking") . ": " . $option->availspaces . " / " . $option->maxanswers . "<br />" . get_string("waitingplacesavailable", "booking") . ": " . $option->availwaitspaces . " / " . $option->maxoverbooking; } if (has_capability('mod/booking:readresponses', $context) || booking_check_if_teacher($option, $user)) { $numberofresponses = $option->count; $optiondisplay->manage = "<a href=\"report.php?id={$cm->id}&optionid={$option->id}\">" . get_string("viewallresponses", "booking", $numberofresponses) . "</a>"; } else { $optiondisplay->manage = ""; } $optiondisplay->bookotherusers = ""; $cTeachers = $DB->count_records("booking_teachers", array("optionid" => $option->id, 'bookingid' => $option->bookingid)); $teachers = $DB->get_records("booking_teachers", array("optionid" => $option->id, 'bookingid' => $option->bookingid)); $niceTeachers = array(); $printTeachers = ""; if ($cTeachers > 0) { $printTeachers = "<p>"; $printTeachers .= (empty($booking->booking->lblteachname) ? get_string('teachers', 'booking') : $booking->booking->lblteachname) . ': '; foreach ($teachers as $teacher) { $tmpuser = $DB->get_record('user', array('id' => $teacher->userid)); $niceTeachers[] = fullname($tmpuser); } $printTeachers .= implode(', ', $niceTeachers); $printTeachers .= "</p>"; } $additionalInfo = ''; if (strlen($option->location) > 0) { $additionalInfo .= '<p>' . get_string('location', "booking") . ': ' . $option->location . '</p>'; } if (strlen($option->institution) > 0) { $additionalInfo .= '<p>' . get_string('institution', "booking") . ': ' . $option->institution . '</p>'; } if (strlen($option->address) > 0) { $additionalInfo .= '<p>' . get_string('address', "booking") . ': ' . $option->address . '</p>'; } $row = new html_table_row(array("<span id=\"option{$option->id}\"></span>" . $bookingbutton . $optiondisplay->booked . ' <br />' . get_string($option->status, "booking") . ' <br />' . $optiondisplay->delete . $optiondisplay->manage . ' <br />' . $optiondisplay->bookotherusers, "<b>" . format_text($option->text . ' ', FORMAT_MOODLE, $displayoptions) . "</b>" . "<p>" . $option->description . "</p>" . $printTeachers . $additionalInfo, $option->coursestarttimetext . " " . get_string('to', "booking") . " <br />" . $option->courseendtimetext, $stravailspaces)); $tabledata[] = $row; } } $table = new html_table(); $table->attributes['class'] = 'box generalbox boxaligncenter boxwidthwide booking'; $table->attributes['style'] = ''; $table->data = array(); $strselect = get_string("select", "booking"); $strbooking = get_string("booking", "booking"); if (strlen($booking->booking->eventtype) > 0) { $strbooking = $booking->booking->eventtype; } $strdate = '<a href="' . $sorturl . '">' . get_string("coursedate", "booking") . '</a>'; $stravailability = get_string("availability", "booking"); $table->head = array($strselect, $strbooking, $strdate, $stravailability); $table->align = array("left", "left", "left", "left"); $table->rowclasses = $rowclasses; $table->data = $tabledata; echo html_writer::table($table); }
/** * Saves the booking for the user * @return boolean true if booking was possible, false if meanwhile the booking got full */ public function user_submit_response($user) { global $DB; if (null == $this->option) { return false; } $waitingList = $this->check_if_limit(); if ($waitingList === FALSE) { return FALSE; } $underlimit = $this->booking->maxperuser == 0; $underlimit = $underlimit || booking_get_user_booking_count($this, $user, NULL) < $this->booking->maxperuser; if (!$underlimit) { return FALSE; } if (!($currentanswerid = $DB->get_field('booking_answers', 'id', array('userid' => $user->id, 'optionid' => $this->optionid)))) { $newanswer = new stdClass(); $newanswer->bookingid = $this->id; $newanswer->userid = $user->id; $newanswer->optionid = $this->optionid; $newanswer->timemodified = time(); $newanswer->timecreated = time(); $newanswer->waitinglist = $waitingList; if (!$DB->insert_record("booking_answers", $newanswer)) { error("Could not register your booking because of a database error"); } //TODO replace booking_check_enrol_user($this->option, $this->booking, $user->id); } $event = \mod_booking\event\bookingoption_booked::create(array('objectid' => $this->optionid, 'context' => context_module::instance($this->cm->id), 'relateduserid' => $user->id, 'other' => array('userid' => $user->id))); $event->trigger(); if ($this->booking->sendmail) { $eventdata = new stdClass(); $eventdata->user = $user; $eventdata->booking = $this->booking; // TODO the next line is for backward compatibility only, delete when finished refurbishing the module ;-) $eventdata->booking->option[$this->optionid] = $this->option; $eventdata->optionid = $this->optionid; $eventdata->cmid = $this->cm->id; //TODO replace booking_send_confirm_message($eventdata); } return true; }