PageRenderTime 49ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/course/editsection_form.php

https://bitbucket.org/synergylearning/campusconnect
PHP | 340 lines | 256 code | 41 blank | 43 comment | 30 complexity | 4fd0d63a857f61e6e318b210891dcee3 MD5 | raw file
Possible License(s): MPL-2.0-no-copyleft-exception, LGPL-3.0, GPL-3.0, LGPL-2.1, Apache-2.0, BSD-3-Clause, AGPL-3.0
  1. <?php
  2. if (!defined('MOODLE_INTERNAL')) {
  3. die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page
  4. }
  5. require_once($CFG->libdir.'/formslib.php');
  6. require_once($CFG->libdir.'/filelib.php');
  7. require_once($CFG->libdir.'/completionlib.php');
  8. require_once($CFG->libdir.'/gradelib.php');
  9. /**
  10. * Default form for editing course section
  11. *
  12. * Course format plugins may specify different editing form to use
  13. */
  14. class editsection_form extends moodleform {
  15. function definition() {
  16. $mform = $this->_form;
  17. $course = $this->_customdata['course'];
  18. $mform->addElement('header', 'generalhdr', get_string('general'));
  19. $elementgroup = array();
  20. $elementgroup[] = $mform->createElement('text', 'name', '', array('size' => '30', 'maxlength' => '255'));
  21. $elementgroup[] = $mform->createElement('checkbox', 'usedefaultname', '', get_string('sectionusedefaultname'));
  22. $mform->addGroup($elementgroup, 'name_group', get_string('sectionname'), ' ', false);
  23. $mform->addGroupRule('name_group', array('name' => array(array(get_string('maximumchars', '', 255), 'maxlength', 255))));
  24. $mform->setDefault('usedefaultname', true);
  25. $mform->setType('name', PARAM_TEXT);
  26. $mform->disabledIf('name','usedefaultname','checked');
  27. /// Prepare course and the editor
  28. $mform->addElement('editor', 'summary_editor', get_string('summary'), null, $this->_customdata['editoroptions']);
  29. $mform->addHelpButton('summary_editor', 'summary');
  30. $mform->setType('summary_editor', PARAM_RAW);
  31. $mform->addElement('hidden', 'id');
  32. $mform->setType('id', PARAM_INT);
  33. // additional fields that course format has defined
  34. $courseformat = course_get_format($course);
  35. $formatoptions = $courseformat->section_format_options(true);
  36. if (!empty($formatoptions)) {
  37. $elements = $courseformat->create_edit_form_elements($mform, true);
  38. }
  39. $mform->_registerCancelButton('cancel');
  40. }
  41. public function definition_after_data() {
  42. global $CFG, $DB;
  43. $mform = $this->_form;
  44. $course = $this->_customdata['course'];
  45. $context = context_course::instance($course->id);
  46. if (!empty($CFG->enableavailability)) {
  47. $mform->addElement('header', 'availabilityconditions', get_string('availabilityconditions', 'condition'));
  48. $mform->setExpanded('availabilityconditions', false);
  49. // String used by conditions more than once
  50. $strcondnone = get_string('none', 'condition');
  51. // Grouping conditions - only if grouping is enabled at site level
  52. if (!empty($CFG->enablegroupmembersonly)) {
  53. $options = array();
  54. if ($groupings = $DB->get_records('groupings', array('courseid' => $course->id))) {
  55. foreach ($groupings as $grouping) {
  56. $options[$grouping->id] = format_string(
  57. $grouping->name, true, array('context' => $context));
  58. }
  59. }
  60. core_collator::asort($options);
  61. $options = array(0 => get_string('none')) + $options;
  62. $mform->addElement('select', 'groupingid', get_string('groupingsection', 'group'), $options);
  63. $mform->addHelpButton('groupingid', 'groupingsection', 'group');
  64. }
  65. // Available from/to defaults to midnight because then the display
  66. // will be nicer where it tells users when they can access it (it
  67. // shows only the date and not time).
  68. $date = usergetdate(time());
  69. $midnight = make_timestamp($date['year'], $date['mon'], $date['mday']);
  70. // Date and time conditions.
  71. $mform->addElement('date_time_selector', 'availablefrom',
  72. get_string('availablefrom', 'condition'),
  73. array('optional' => true, 'defaulttime' => $midnight));
  74. $mform->addElement('date_time_selector', 'availableuntil',
  75. get_string('availableuntil', 'condition'),
  76. array('optional' => true, 'defaulttime' => $midnight));
  77. // Conditions based on grades
  78. $gradeoptions = array();
  79. $items = grade_item::fetch_all(array('courseid' => $course->id));
  80. $items = $items ? $items : array();
  81. foreach ($items as $id => $item) {
  82. $gradeoptions[$id] = $item->get_name();
  83. }
  84. asort($gradeoptions);
  85. $gradeoptions = array(0 => $strcondnone) + $gradeoptions;
  86. $grouparray = array();
  87. $grouparray[] = $mform->createElement('select', 'conditiongradeitemid', '', $gradeoptions);
  88. $grouparray[] = $mform->createElement('static', '', '',
  89. ' ' . get_string('grade_atleast', 'condition').' ');
  90. $grouparray[] = $mform->createElement('text', 'conditiongrademin', '', array('size' => 3));
  91. $grouparray[] = $mform->createElement('static', '', '',
  92. '% ' . get_string('grade_upto', 'condition') . ' ');
  93. $grouparray[] = $mform->createElement('text', 'conditiongrademax', '', array('size' => 3));
  94. $grouparray[] = $mform->createElement('static', '', '', '%');
  95. $group = $mform->createElement('group', 'conditiongradegroup',
  96. get_string('gradecondition', 'condition'), $grouparray);
  97. // Get full version (including condition info) of section object
  98. $ci = new condition_info_section($this->_customdata['cs']);
  99. $fullcs = $ci->get_full_section();
  100. $count = count($fullcs->conditionsgrade) + 1;
  101. // Grade conditions
  102. $this->repeat_elements(array($group), $count, array(
  103. 'conditiongradegroup[conditiongrademin]' => array('type' => PARAM_RAW),
  104. 'conditiongradegroup[conditiongrademax]' => array('type' => PARAM_RAW)
  105. ), 'conditiongraderepeats', 'conditiongradeadds', 2, get_string('addgrades', 'condition'), true);
  106. $mform->addHelpButton('conditiongradegroup[0]', 'gradecondition', 'condition');
  107. // Conditions based on user fields
  108. $operators = condition_info::get_condition_user_field_operators();
  109. $useroptions = condition_info::get_condition_user_fields(array('context' => $context));
  110. asort($useroptions);
  111. $useroptions = array(0 => $strcondnone) + $useroptions;
  112. $grouparray = array();
  113. $grouparray[] =& $mform->createElement('select', 'conditionfield', '', $useroptions);
  114. $grouparray[] =& $mform->createElement('select', 'conditionfieldoperator', '', $operators);
  115. $grouparray[] =& $mform->createElement('text', 'conditionfieldvalue');
  116. $group = $mform->createElement('group', 'conditionfieldgroup', get_string('userfield', 'condition'), $grouparray);
  117. $fieldcount = count($fullcs->conditionsfield) + 1;
  118. $this->repeat_elements(array($group), $fieldcount, array(
  119. 'conditionfieldgroup[conditionfieldvalue]' => array('type' => PARAM_RAW)),
  120. 'conditionfieldrepeats', 'conditionfieldadds', 2, get_string('adduserfields', 'condition'), true);
  121. $mform->addHelpButton('conditionfieldgroup[0]', 'userfield', 'condition');
  122. // Conditions based on completion
  123. $completion = new completion_info($course);
  124. if ($completion->is_enabled()) {
  125. $completionoptions = array();
  126. $modinfo = get_fast_modinfo($course);
  127. foreach ($modinfo->cms as $id => $cm) {
  128. // Add each course-module if it:
  129. // (a) has completion turned on
  130. // (b) does not belong to current course-section
  131. if ($cm->completion && ($fullcs->id != $cm->section)) {
  132. $completionoptions[$id] = $cm->name;
  133. }
  134. }
  135. asort($completionoptions);
  136. $completionoptions = array(0 => $strcondnone) +
  137. $completionoptions;
  138. $completionvalues = array(
  139. COMPLETION_COMPLETE => get_string('completion_complete', 'condition'),
  140. COMPLETION_INCOMPLETE => get_string('completion_incomplete', 'condition'),
  141. COMPLETION_COMPLETE_PASS => get_string('completion_pass', 'condition'),
  142. COMPLETION_COMPLETE_FAIL => get_string('completion_fail', 'condition'));
  143. $grouparray = array();
  144. $grouparray[] = $mform->createElement('select', 'conditionsourcecmid', '',
  145. $completionoptions);
  146. $grouparray[] = $mform->createElement('select', 'conditionrequiredcompletion', '',
  147. $completionvalues);
  148. $group = $mform->createElement('group', 'conditioncompletiongroup',
  149. get_string('completioncondition', 'condition'), $grouparray);
  150. $count = count($fullcs->conditionscompletion) + 1;
  151. $this->repeat_elements(array($group), $count, array(),
  152. 'conditioncompletionrepeats', 'conditioncompletionadds', 2,
  153. get_string('addcompletions', 'condition'), true);
  154. $mform->addHelpButton('conditioncompletiongroup[0]',
  155. 'completionconditionsection', 'condition');
  156. }
  157. // Availability conditions - set up form values
  158. if (!empty($CFG->enableavailability)) {
  159. $num = 0;
  160. foreach ($fullcs->conditionsgrade as $gradeitemid => $minmax) {
  161. $groupelements = $mform->getElement(
  162. 'conditiongradegroup[' . $num . ']')->getElements();
  163. $groupelements[0]->setValue($gradeitemid);
  164. $groupelements[2]->setValue(is_null($minmax->min) ? '' :
  165. format_float($minmax->min, 5, true, true));
  166. $groupelements[4]->setValue(is_null($minmax->max) ? '' :
  167. format_float($minmax->max, 5, true, true));
  168. $num++;
  169. }
  170. $num = 0;
  171. foreach ($fullcs->conditionsfield as $fieldid => $data) {
  172. $groupelements = $mform->getElement(
  173. 'conditionfieldgroup[' . $num . ']')->getElements();
  174. $groupelements[0]->setValue($fieldid);
  175. $groupelements[1]->setValue(is_null($data->operator) ? '' :
  176. $data->operator);
  177. $groupelements[2]->setValue(is_null($data->value) ? '' :
  178. $data->value);
  179. $num++;
  180. }
  181. if ($completion->is_enabled()) {
  182. $num = 0;
  183. foreach ($fullcs->conditionscompletion as $othercmid => $state) {
  184. $groupelements = $mform->getElement('conditioncompletiongroup[' . $num . ']')->getElements();
  185. $groupelements[0]->setValue($othercmid);
  186. $groupelements[1]->setValue($state);
  187. $num++;
  188. }
  189. }
  190. }
  191. // Do we display availability info to students?
  192. $showhide = array(
  193. CONDITION_STUDENTVIEW_SHOW => get_string('showavailabilitysection_show', 'condition'),
  194. CONDITION_STUDENTVIEW_HIDE => get_string('showavailabilitysection_hide', 'condition'));
  195. $mform->addElement('select', 'showavailability',
  196. get_string('showavailabilitysection', 'condition'), $showhide);
  197. }
  198. $this->add_action_buttons();
  199. }
  200. public function validation($data, $files) {
  201. $errors = parent::validation($data, $files);
  202. // Conditions: Don't let them set dates which make no sense
  203. if (array_key_exists('availablefrom', $data) &&
  204. $data['availablefrom'] && $data['availableuntil'] &&
  205. $data['availablefrom'] >= $data['availableuntil']) {
  206. $errors['availablefrom'] = get_string('badavailabledates', 'condition');
  207. }
  208. // Conditions: Verify that the grade conditions are numbers, and make sense.
  209. if (array_key_exists('conditiongradegroup', $data)) {
  210. foreach ($data['conditiongradegroup'] as $i => $gradedata) {
  211. if ($gradedata['conditiongrademin'] !== '' &&
  212. !is_numeric(unformat_float($gradedata['conditiongrademin']))) {
  213. $errors["conditiongradegroup[{$i}]"] = get_string('gradesmustbenumeric', 'condition');
  214. continue;
  215. }
  216. if ($gradedata['conditiongrademax'] !== '' &&
  217. !is_numeric(unformat_float($gradedata['conditiongrademax']))) {
  218. $errors["conditiongradegroup[{$i}]"] = get_string('gradesmustbenumeric', 'condition');
  219. continue;
  220. }
  221. if ($gradedata['conditiongrademin'] !== '' && $gradedata['conditiongrademax'] !== '' &&
  222. unformat_float($gradedata['conditiongrademax']) <= unformat_float($gradedata['conditiongrademin'])) {
  223. $errors["conditiongradegroup[{$i}]"] = get_string('badgradelimits', 'condition');
  224. continue;
  225. }
  226. if ($gradedata['conditiongrademin'] === '' && $gradedata['conditiongrademax'] === '' &&
  227. $gradedata['conditiongradeitemid']) {
  228. $errors["conditiongradegroup[{$i}]"] = get_string('gradeitembutnolimits', 'condition');
  229. continue;
  230. }
  231. if (($gradedata['conditiongrademin'] !== '' || $gradedata['conditiongrademax'] !== '') &&
  232. !$gradedata['conditiongradeitemid']) {
  233. $errors["conditiongradegroup[{$i}]"] = get_string('gradelimitsbutnoitem', 'condition');
  234. continue;
  235. }
  236. }
  237. }
  238. // Conditions: Verify that the user profile field has not been declared more than once
  239. if (array_key_exists('conditionfieldgroup', $data)) {
  240. // Array to store the existing fields
  241. $arrcurrentfields = array();
  242. // Error message displayed if any condition is declared more than once. We use lang string because
  243. // this way we don't actually generate the string unless there is an error.
  244. $stralreadydeclaredwarning = new lang_string('fielddeclaredmultipletimes', 'condition');
  245. foreach ($data['conditionfieldgroup'] as $i => $fielddata) {
  246. if ($fielddata['conditionfield'] == 0) { // Don't need to bother if none is selected
  247. continue;
  248. }
  249. if (in_array($fielddata['conditionfield'], $arrcurrentfields)) {
  250. $errors["conditionfieldgroup[{$i}]"] = $stralreadydeclaredwarning->out();
  251. }
  252. // Add the field to the array
  253. $arrcurrentfields[] = $fielddata['conditionfield'];
  254. }
  255. }
  256. return $errors;
  257. }
  258. /**
  259. * Load in existing data as form defaults
  260. *
  261. * @param stdClass|array $default_values object or array of default values
  262. */
  263. function set_data($default_values) {
  264. if (!is_object($default_values)) {
  265. // we need object for file_prepare_standard_editor
  266. $default_values = (object)$default_values;
  267. }
  268. $editoroptions = $this->_customdata['editoroptions'];
  269. $default_values = file_prepare_standard_editor($default_values, 'summary', $editoroptions,
  270. $editoroptions['context'], 'course', 'section', $default_values->id);
  271. $default_values->usedefaultname = (is_null($default_values->name));
  272. parent::set_data($default_values);
  273. }
  274. /**
  275. * Return submitted data if properly submitted or returns NULL if validation fails or
  276. * if there is no submitted data.
  277. *
  278. * @return object submitted data; NULL if not valid or not submitted or cancelled
  279. */
  280. function get_data() {
  281. $data = parent::get_data();
  282. if ($data !== null) {
  283. $editoroptions = $this->_customdata['editoroptions'];
  284. if (!empty($data->usedefaultname)) {
  285. $data->name = null;
  286. }
  287. $data = file_postupdate_standard_editor($data, 'summary', $editoroptions,
  288. $editoroptions['context'], 'course', 'section', $data->id);
  289. $course = $this->_customdata['course'];
  290. foreach (course_get_format($course)->section_format_options() as $option => $unused) {
  291. // fix issue with unset checkboxes not being returned at all
  292. if (!isset($data->$option)) {
  293. $data->$option = null;
  294. }
  295. }
  296. }
  297. return $data;
  298. }
  299. }