Merge branch 'MDL-62065-master' of git://github.com/cescobedo/moodle
[moodle.git] / lib / deprecatedlib.php
1 <?php
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/>.
18 /**
19  * deprecatedlib.php - Old functions retained only for backward compatibility
20  *
21  * Old functions retained only for backward compatibility.  New code should not
22  * use any of these functions.
23  *
24  * @package    core
25  * @subpackage deprecated
26  * @copyright  1999 onwards Martin Dougiamas  {@link http://moodle.com}
27  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
28  * @deprecated
29  */
31 defined('MOODLE_INTERNAL') || die();
33 /* === Functions that needs to be kept longer in deprecated lib than normal time period === */
35 /**
36  * Add an entry to the legacy log table.
37  *
38  * @deprecated since 2.7 use new events instead
39  *
40  * @param    int     $courseid  The course id
41  * @param    string  $module  The module name  e.g. forum, journal, resource, course, user etc
42  * @param    string  $action  'view', 'update', 'add' or 'delete', possibly followed by another word to clarify.
43  * @param    string  $url     The file and parameters used to see the results of the action
44  * @param    string  $info    Additional description information
45  * @param    int     $cm      The course_module->id if there is one
46  * @param    int|stdClass $user If log regards $user other than $USER
47  * @return void
48  */
49 function add_to_log($courseid, $module, $action, $url='', $info='', $cm=0, $user=0) {
50     debugging('add_to_log() has been deprecated, please rewrite your code to the new events API', DEBUG_DEVELOPER);
52     // This is a nasty hack that allows us to put all the legacy stuff into legacy storage,
53     // this way we may move all the legacy settings there too.
54     $manager = get_log_manager();
55     if (method_exists($manager, 'legacy_add_to_log')) {
56         $manager->legacy_add_to_log($courseid, $module, $action, $url, $info, $cm, $user);
57     }
58 }
60 /**
61  * @deprecated since 2.6
62  */
63 function events_trigger() {
64     throw new coding_exception('events_trigger() has been deprecated along with all Events 1 API in favour of Events 2 API.');
65 }
67 /**
68  * List all core subsystems and their location
69  *
70  * This is a whitelist of components that are part of the core and their
71  * language strings are defined in /lang/en/<<subsystem>>.php. If a given
72  * plugin is not listed here and it does not have proper plugintype prefix,
73  * then it is considered as course activity module.
74  *
75  * The location is optionally dirroot relative path. NULL means there is no special
76  * directory for this subsystem. If the location is set, the subsystem's
77  * renderer.php is expected to be there.
78  *
79  * @deprecated since 2.6, use core_component::get_core_subsystems()
80  *
81  * @param bool $fullpaths false means relative paths from dirroot, use true for performance reasons
82  * @return array of (string)name => (string|null)location
83  */
84 function get_core_subsystems($fullpaths = false) {
85     global $CFG;
87     // NOTE: do not add any other debugging here, keep forever.
89     $subsystems = core_component::get_core_subsystems();
91     if ($fullpaths) {
92         return $subsystems;
93     }
95     debugging('Short paths are deprecated when using get_core_subsystems(), please fix the code to use fullpaths instead.', DEBUG_DEVELOPER);
97     $dlength = strlen($CFG->dirroot);
99     foreach ($subsystems as $k => $v) {
100         if ($v === null) {
101             continue;
102         }
103         $subsystems[$k] = substr($v, $dlength+1);
104     }
106     return $subsystems;
109 /**
110  * Lists all plugin types.
111  *
112  * @deprecated since 2.6, use core_component::get_plugin_types()
113  *
114  * @param bool $fullpaths false means relative paths from dirroot
115  * @return array Array of strings - name=>location
116  */
117 function get_plugin_types($fullpaths = true) {
118     global $CFG;
120     // NOTE: do not add any other debugging here, keep forever.
122     $types = core_component::get_plugin_types();
124     if ($fullpaths) {
125         return $types;
126     }
128     debugging('Short paths are deprecated when using get_plugin_types(), please fix the code to use fullpaths instead.', DEBUG_DEVELOPER);
130     $dlength = strlen($CFG->dirroot);
132     foreach ($types as $k => $v) {
133         if ($k === 'theme') {
134             $types[$k] = 'theme';
135             continue;
136         }
137         $types[$k] = substr($v, $dlength+1);
138     }
140     return $types;
143 /**
144  * Use when listing real plugins of one type.
145  *
146  * @deprecated since 2.6, use core_component::get_plugin_list()
147  *
148  * @param string $plugintype type of plugin
149  * @return array name=>fulllocation pairs of plugins of given type
150  */
151 function get_plugin_list($plugintype) {
153     // NOTE: do not add any other debugging here, keep forever.
155     if ($plugintype === '') {
156         $plugintype = 'mod';
157     }
159     return core_component::get_plugin_list($plugintype);
162 /**
163  * Get a list of all the plugins of a given type that define a certain class
164  * in a certain file. The plugin component names and class names are returned.
165  *
166  * @deprecated since 2.6, use core_component::get_plugin_list_with_class()
167  *
168  * @param string $plugintype the type of plugin, e.g. 'mod' or 'report'.
169  * @param string $class the part of the name of the class after the
170  *      frankenstyle prefix. e.g 'thing' if you are looking for classes with
171  *      names like report_courselist_thing. If you are looking for classes with
172  *      the same name as the plugin name (e.g. qtype_multichoice) then pass ''.
173  * @param string $file the name of file within the plugin that defines the class.
174  * @return array with frankenstyle plugin names as keys (e.g. 'report_courselist', 'mod_forum')
175  *      and the class names as values (e.g. 'report_courselist_thing', 'qtype_multichoice').
176  */
177 function get_plugin_list_with_class($plugintype, $class, $file) {
179     // NOTE: do not add any other debugging here, keep forever.
181     return core_component::get_plugin_list_with_class($plugintype, $class, $file);
184 /**
185  * Returns the exact absolute path to plugin directory.
186  *
187  * @deprecated since 2.6, use core_component::get_plugin_directory()
188  *
189  * @param string $plugintype type of plugin
190  * @param string $name name of the plugin
191  * @return string full path to plugin directory; NULL if not found
192  */
193 function get_plugin_directory($plugintype, $name) {
195     // NOTE: do not add any other debugging here, keep forever.
197     if ($plugintype === '') {
198         $plugintype = 'mod';
199     }
201     return core_component::get_plugin_directory($plugintype, $name);
204 /**
205  * Normalize the component name using the "frankenstyle" names.
206  *
207  * @deprecated since 2.6, use core_component::normalize_component()
208  *
209  * @param string $component
210  * @return array two-items list of [(string)type, (string|null)name]
211  */
212 function normalize_component($component) {
214     // NOTE: do not add any other debugging here, keep forever.
216     return core_component::normalize_component($component);
219 /**
220  * Return exact absolute path to a plugin directory.
221  *
222  * @deprecated since 2.6, use core_component::normalize_component()
223  *
224  * @param string $component name such as 'moodle', 'mod_forum'
225  * @return string full path to component directory; NULL if not found
226  */
227 function get_component_directory($component) {
229     // NOTE: do not add any other debugging here, keep forever.
231     return core_component::get_component_directory($component);
234 /**
235  * Get the context instance as an object. This function will create the
236  * context instance if it does not exist yet.
237  *
238  * @deprecated since 2.2, use context_course::instance() or other relevant class instead
239  * @todo This will be deleted in Moodle 2.8, refer MDL-34472
240  * @param integer $contextlevel The context level, for example CONTEXT_COURSE, or CONTEXT_MODULE.
241  * @param integer $instance The instance id. For $level = CONTEXT_COURSE, this would be $course->id,
242  *      for $level = CONTEXT_MODULE, this would be $cm->id. And so on. Defaults to 0
243  * @param int $strictness IGNORE_MISSING means compatible mode, false returned if record not found, debug message if more found;
244  *      MUST_EXIST means throw exception if no record or multiple records found
245  * @return context The context object.
246  */
247 function get_context_instance($contextlevel, $instance = 0, $strictness = IGNORE_MISSING) {
249     debugging('get_context_instance() is deprecated, please use context_xxxx::instance() instead.', DEBUG_DEVELOPER);
251     $instances = (array)$instance;
252     $contexts = array();
254     $classname = context_helper::get_class_for_level($contextlevel);
256     // we do not load multiple contexts any more, PAGE should be responsible for any preloading
257     foreach ($instances as $inst) {
258         $contexts[$inst] = $classname::instance($inst, $strictness);
259     }
261     if (is_array($instance)) {
262         return $contexts;
263     } else {
264         return $contexts[$instance];
265     }
267 /* === End of long term deprecated api list === */
269 /**
270  * @deprecated since 2.7 - use new file picker instead
271  */
272 function clam_log_upload() {
273     throw new coding_exception('clam_log_upload() can not be used any more, please use file picker instead');
276 /**
277  * @deprecated since 2.7 - use new file picker instead
278  */
279 function clam_log_infected() {
280     throw new coding_exception('clam_log_infected() can not be used any more, please use file picker instead');
283 /**
284  * @deprecated since 2.7 - use new file picker instead
285  */
286 function clam_change_log() {
287     throw new coding_exception('clam_change_log() can not be used any more, please use file picker instead');
290 /**
291  * @deprecated since 2.7 - infected files are now deleted in file picker
292  */
293 function clam_replace_infected_file() {
294     throw new coding_exception('clam_replace_infected_file() can not be used any more, please use file picker instead');
297 /**
298  * @deprecated since 2.7
299  */
300 function clam_handle_infected_file() {
301     throw new coding_exception('clam_handle_infected_file() can not be used any more, please use file picker instead');
304 /**
305  * @deprecated since 2.7
306  */
307 function clam_scan_moodle_file() {
308     throw new coding_exception('clam_scan_moodle_file() can not be used any more, please use file picker instead');
312 /**
313  * @deprecated since 2.7 PHP 5.4.x should be always compatible.
314  */
315 function password_compat_not_supported() {
316     throw new coding_exception('Do not use password_compat_not_supported() - bcrypt is now always available');
319 /**
320  * @deprecated since 2.6
321  */
322 function session_get_instance() {
323     throw new coding_exception('session_get_instance() is removed, use \core\session\manager instead');
326 /**
327  * @deprecated since 2.6
328  */
329 function session_is_legacy() {
330     throw new coding_exception('session_is_legacy() is removed, do not use any more');
333 /**
334  * @deprecated since 2.6
335  */
336 function session_kill_all() {
337     throw new coding_exception('session_kill_all() is removed, use \core\session\manager::kill_all_sessions() instead');
340 /**
341  * @deprecated since 2.6
342  */
343 function session_touch() {
344     throw new coding_exception('session_touch() is removed, use \core\session\manager::touch_session() instead');
347 /**
348  * @deprecated since 2.6
349  */
350 function session_kill() {
351     throw new coding_exception('session_kill() is removed, use \core\session\manager::kill_session() instead');
354 /**
355  * @deprecated since 2.6
356  */
357 function session_kill_user() {
358     throw new coding_exception('session_kill_user() is removed, use \core\session\manager::kill_user_sessions() instead');
361 /**
362  * @deprecated since 2.6
363  */
364 function session_set_user() {
365     throw new coding_exception('session_set_user() is removed, use \core\session\manager::set_user() instead');
368 /**
369  * @deprecated since 2.6
370  */
371 function session_is_loggedinas() {
372     throw new coding_exception('session_is_loggedinas() is removed, use \core\session\manager::is_loggedinas() instead');
375 /**
376  * @deprecated since 2.6
377  */
378 function session_get_realuser() {
379     throw new coding_exception('session_get_realuser() is removed, use \core\session\manager::get_realuser() instead');
382 /**
383  * @deprecated since 2.6
384  */
385 function session_loginas() {
386     throw new coding_exception('session_loginas() is removed, use \core\session\manager::loginas() instead');
389 /**
390  * @deprecated since 2.6
391  */
392 function js_minify() {
393     throw new coding_exception('js_minify() is removed, use core_minify::js_files() or core_minify::js() instead.');
396 /**
397  * @deprecated since 2.6
398  */
399 function css_minify_css() {
400     throw new coding_exception('css_minify_css() is removed, use core_minify::css_files() or core_minify::css() instead.');
403 // === Deprecated before 2.6.0 ===
405 /**
406  * @deprecated
407  */
408 function check_gd_version() {
409     throw new coding_exception('check_gd_version() is removed, GD extension is always available now');
412 /**
413  * @deprecated
414  */
415 function update_login_count() {
416     throw new coding_exception('update_login_count() is removed, all calls need to be removed');
419 /**
420  * @deprecated
421  */
422 function reset_login_count() {
423     throw new coding_exception('reset_login_count() is removed, all calls need to be removed');
426 /**
427  * @deprecated
428  */
429 function update_log_display_entry() {
431     throw new coding_exception('The update_log_display_entry() is removed, please use db/log.php description file instead.');
434 /**
435  * @deprecated use the text formatting in a standard way instead (http://docs.moodle.org/dev/Output_functions)
436  *             this was abused mostly for embedding of attachments
437  */
438 function filter_text() {
439     throw new coding_exception('filter_text() can not be used anymore, use format_text(), format_string() etc instead.');
442 /**
443  * @deprecated Loginhttps is no longer supported
444  */
445 function httpsrequired() {
446     throw new coding_exception('httpsrequired() can not be used any more. Loginhttps is no longer supported.');
449 /**
450  * @deprecated since 3.1 - replacement legacy file API methods can be found on the moodle_url class, for example:
451  * The moodle_url::make_legacyfile_url() method can be used to generate a legacy course file url. To generate
452  * course module file.php url the moodle_url::make_file_url() should be used.
453  */
454 function get_file_url() {
455     throw new coding_exception('get_file_url() can not be used anymore. Please use ' .
456         'moodle_url factory methods instead.');
459 /**
460  * @deprecated use get_enrolled_users($context) instead.
461  */
462 function get_course_participants() {
463     throw new coding_exception('get_course_participants() can not be used any more, use get_enrolled_users() instead.');
466 /**
467  * @deprecated use is_enrolled($context, $userid) instead.
468  */
469 function is_course_participant() {
470     throw new coding_exception('is_course_participant() can not be used any more, use is_enrolled() instead.');
473 /**
474  * @deprecated
475  */
476 function get_recent_enrolments() {
477     throw new coding_exception('get_recent_enrolments() is removed as it returned inaccurate results.');
480 /**
481  * @deprecated use clean_param($string, PARAM_FILE) instead.
482  */
483 function detect_munged_arguments() {
484     throw new coding_exception('detect_munged_arguments() can not be used any more, please use clean_param(,PARAM_FILE) instead.');
488 /**
489  * Unzip one zip file to a destination dir
490  * Both parameters must be FULL paths
491  * If destination isn't specified, it will be the
492  * SAME directory where the zip file resides.
493  *
494  * @global object
495  * @param string $zipfile The zip file to unzip
496  * @param string $destination The location to unzip to
497  * @param bool $showstatus_ignored Unused
498  * @deprecated since 2.0 MDL-15919
499  */
500 function unzip_file($zipfile, $destination = '', $showstatus_ignored = true) {
501     debugging(__FUNCTION__ . '() is deprecated. '
502             . 'Please use the application/zip file_packer implementation instead.', DEBUG_DEVELOPER);
504     // Extract everything from zipfile.
505     $path_parts = pathinfo(cleardoubleslashes($zipfile));
506     $zippath = $path_parts["dirname"];       //The path of the zip file
507     $zipfilename = $path_parts["basename"];  //The name of the zip file
508     $extension = $path_parts["extension"];    //The extension of the file
510     //If no file, error
511     if (empty($zipfilename)) {
512         return false;
513     }
515     //If no extension, error
516     if (empty($extension)) {
517         return false;
518     }
520     //Clear $zipfile
521     $zipfile = cleardoubleslashes($zipfile);
523     //Check zipfile exists
524     if (!file_exists($zipfile)) {
525         return false;
526     }
528     //If no destination, passed let's go with the same directory
529     if (empty($destination)) {
530         $destination = $zippath;
531     }
533     //Clear $destination
534     $destpath = rtrim(cleardoubleslashes($destination), "/");
536     //Check destination path exists
537     if (!is_dir($destpath)) {
538         return false;
539     }
541     $packer = get_file_packer('application/zip');
543     $result = $packer->extract_to_pathname($zipfile, $destpath);
545     if ($result === false) {
546         return false;
547     }
549     foreach ($result as $status) {
550         if ($status !== true) {
551             return false;
552         }
553     }
555     return true;
558 /**
559  * Zip an array of files/dirs to a destination zip file
560  * Both parameters must be FULL paths to the files/dirs
561  *
562  * @global object
563  * @param array $originalfiles Files to zip
564  * @param string $destination The destination path
565  * @return bool Outcome
566  *
567  * @deprecated since 2.0 MDL-15919
568  */
569 function zip_files($originalfiles, $destination) {
570     debugging(__FUNCTION__ . '() is deprecated. '
571             . 'Please use the application/zip file_packer implementation instead.', DEBUG_DEVELOPER);
573     // Extract everything from destination.
574     $path_parts = pathinfo(cleardoubleslashes($destination));
575     $destpath = $path_parts["dirname"];       //The path of the zip file
576     $destfilename = $path_parts["basename"];  //The name of the zip file
577     $extension = $path_parts["extension"];    //The extension of the file
579     //If no file, error
580     if (empty($destfilename)) {
581         return false;
582     }
584     //If no extension, add it
585     if (empty($extension)) {
586         $extension = 'zip';
587         $destfilename = $destfilename.'.'.$extension;
588     }
590     //Check destination path exists
591     if (!is_dir($destpath)) {
592         return false;
593     }
595     //Check destination path is writable. TODO!!
597     //Clean destination filename
598     $destfilename = clean_filename($destfilename);
600     //Now check and prepare every file
601     $files = array();
602     $origpath = NULL;
604     foreach ($originalfiles as $file) {  //Iterate over each file
605         //Check for every file
606         $tempfile = cleardoubleslashes($file); // no doubleslashes!
607         //Calculate the base path for all files if it isn't set
608         if ($origpath === NULL) {
609             $origpath = rtrim(cleardoubleslashes(dirname($tempfile)), "/");
610         }
611         //See if the file is readable
612         if (!is_readable($tempfile)) {  //Is readable
613             continue;
614         }
615         //See if the file/dir is in the same directory than the rest
616         if (rtrim(cleardoubleslashes(dirname($tempfile)), "/") != $origpath) {
617             continue;
618         }
619         //Add the file to the array
620         $files[] = $tempfile;
621     }
623     $zipfiles = array();
624     $start = strlen($origpath)+1;
625     foreach($files as $file) {
626         $zipfiles[substr($file, $start)] = $file;
627     }
629     $packer = get_file_packer('application/zip');
631     return $packer->archive_to_pathname($zipfiles, $destpath . '/' . $destfilename);
634 /**
635  * @deprecated use groups_get_all_groups() instead.
636  */
637 function mygroupid() {
638     throw new coding_exception('mygroupid() can not be used any more, please use groups_get_all_groups() instead.');
641 /**
642  * @deprecated since Moodle 2.0 MDL-14617 - please do not use this function any more.
643  */
644 function groupmode() {
645     throw new coding_exception('groupmode() can not be used any more, please use groups_get_* instead.');
648 /**
649  * @deprecated Since year 2006 - please do not use this function any more.
650  */
651 function set_current_group() {
652     throw new coding_exception('set_current_group() can not be used anymore, please use $SESSION->currentgroup[$courseid] instead');
655 /**
656  * @deprecated Since year 2006 - please do not use this function any more.
657  */
658 function get_current_group() {
659     throw new coding_exception('get_current_group() can not be used any more, please use groups_get_* instead');
662 /**
663  * @deprecated Since Moodle 2.8
664  */
665 function groups_filter_users_by_course_module_visible() {
666     throw new coding_exception('groups_filter_users_by_course_module_visible() is removed. ' .
667             'Replace with a call to \core_availability\info_module::filter_user_list(), ' .
668             'which does basically the same thing but includes other restrictions such ' .
669             'as profile restrictions.');
672 /**
673  * @deprecated Since Moodle 2.8
674  */
675 function groups_course_module_visible() {
676     throw new coding_exception('groups_course_module_visible() is removed, use $cm->uservisible to decide whether the current
677         user can ' . 'access an activity.', DEBUG_DEVELOPER);
680 /**
681  * @deprecated since 2.0
682  */
683 function error() {
684     throw new coding_exception('notlocalisederrormessage', 'error', $link, $message, 'error() is a removed, please call
685             print_error() instead of error()');
689 /**
690  * @deprecated use $PAGE->theme->name instead.
691  */
692 function current_theme() {
693     throw new coding_exception('current_theme() can not be used any more, please use $PAGE->theme->name instead');
696 /**
697  * @deprecated
698  */
699 function formerr() {
700     throw new coding_exception('formerr() is removed. Please change your code to use $OUTPUT->error_text($string).');
703 /**
704  * @deprecated use $OUTPUT->skip_link_target() in instead.
705  */
706 function skip_main_destination() {
707     throw new coding_exception('skip_main_destination() can not be used any more, please use $OUTPUT->skip_link_target() instead.');
710 /**
711  * @deprecated use $OUTPUT->container() instead.
712  */
713 function print_container() {
714     throw new coding_exception('print_container() can not be used any more. Please use $OUTPUT->container() instead.');
717 /**
718  * @deprecated use $OUTPUT->container_start() instead.
719  */
720 function print_container_start() {
721     throw new coding_exception('print_container_start() can not be used any more. Please use $OUTPUT->container_start() instead.');
724 /**
725  * @deprecated use $OUTPUT->container_end() instead.
726  */
727 function print_container_end() {
728     throw new coding_exception('print_container_end() can not be used any more. Please use $OUTPUT->container_end() instead.');
731 /**
732  * @deprecated since Moodle 2.0 MDL-19077 - use $OUTPUT->notification instead.
733  */
734 function notify() {
735     throw new coding_exception('notify() is removed, please use $OUTPUT->notification() instead');
738 /**
739  * @deprecated use $OUTPUT->continue_button() instead.
740  */
741 function print_continue() {
742     throw new coding_exception('print_continue() can not be used any more. Please use $OUTPUT->continue_button() instead.');
745 /**
746  * @deprecated use $PAGE methods instead.
747  */
748 function print_header() {
750     throw new coding_exception('print_header() can not be used any more. Please use $PAGE methods instead.');
753 /**
754  * @deprecated use $PAGE methods instead.
755  */
756 function print_header_simple() {
758     throw new coding_exception('print_header_simple() can not be used any more. Please use $PAGE methods instead.');
761 /**
762  * @deprecated use $OUTPUT->block() instead.
763  */
764 function print_side_block() {
765     throw new coding_exception('print_side_block() can not be used any more, please use $OUTPUT->block() instead.');
768 /**
769  * Prints a basic textarea field.
770  *
771  * @deprecated since Moodle 2.0
772  *
773  * When using this function, you should
774  *
775  * @global object
776  * @param bool $unused No longer used.
777  * @param int $rows Number of rows to display  (minimum of 10 when $height is non-null)
778  * @param int $cols Number of columns to display (minimum of 65 when $width is non-null)
779  * @param null $width (Deprecated) Width of the element; if a value is passed, the minimum value for $cols will be 65. Value is otherwise ignored.
780  * @param null $height (Deprecated) Height of the element; if a value is passe, the minimum value for $rows will be 10. Value is otherwise ignored.
781  * @param string $name Name to use for the textarea element.
782  * @param string $value Initial content to display in the textarea.
783  * @param int $obsolete deprecated
784  * @param bool $return If false, will output string. If true, will return string value.
785  * @param string $id CSS ID to add to the textarea element.
786  * @return string|void depending on the value of $return
787  */
788 function print_textarea($unused, $rows, $cols, $width, $height, $name, $value='', $obsolete=0, $return=false, $id='') {
789     /// $width and height are legacy fields and no longer used as pixels like they used to be.
790     /// However, you can set them to zero to override the mincols and minrows values below.
792     // Disabling because there is not yet a viable $OUTPUT option for cases when mforms can't be used
793     // debugging('print_textarea() has been deprecated. You should be using mforms and the editor element.');
795     global $CFG;
797     $mincols = 65;
798     $minrows = 10;
799     $str = '';
801     if ($id === '') {
802         $id = 'edit-'.$name;
803     }
805     if ($height && ($rows < $minrows)) {
806         $rows = $minrows;
807     }
808     if ($width && ($cols < $mincols)) {
809         $cols = $mincols;
810     }
812     editors_head_setup();
813     $editor = editors_get_preferred_editor(FORMAT_HTML);
814     $editor->set_text($value);
815     $editor->use_editor($id, array('legacy'=>true));
817     $str .= "\n".'<textarea class="form-textarea" id="'. $id .'" name="'. $name .'" rows="'. $rows .'" cols="'. $cols .'" spellcheck="true">'."\n";
818     $str .= htmlspecialchars($value); // needed for editing of cleaned text!
819     $str .= '</textarea>'."\n";
821     if ($return) {
822         return $str;
823     }
824     echo $str;
827 /**
828  * Returns an image of an up or down arrow, used for column sorting. To avoid unnecessary DB accesses, please
829  * provide this function with the language strings for sortasc and sortdesc.
830  *
831  * @deprecated use $OUTPUT->arrow() instead.
832  * @todo final deprecation of this function once MDL-45448 is resolved
833  *
834  * If no sort string is associated with the direction, an arrow with no alt text will be printed/returned.
835  *
836  * @global object
837  * @param string $direction 'up' or 'down'
838  * @param string $strsort The language string used for the alt attribute of this image
839  * @param bool $return Whether to print directly or return the html string
840  * @return string|void depending on $return
841  *
842  */
843 function print_arrow($direction='up', $strsort=null, $return=false) {
844     global $OUTPUT;
846     debugging('print_arrow() is deprecated. Please use $OUTPUT->arrow() instead.', DEBUG_DEVELOPER);
848     if (!in_array($direction, array('up', 'down', 'right', 'left', 'move'))) {
849         return null;
850     }
852     $return = null;
854     switch ($direction) {
855         case 'up':
856             $sortdir = 'asc';
857             break;
858         case 'down':
859             $sortdir = 'desc';
860             break;
861         case 'move':
862             $sortdir = 'asc';
863             break;
864         default:
865             $sortdir = null;
866             break;
867     }
869     // Prepare language string
870     $strsort = '';
871     if (empty($strsort) && !empty($sortdir)) {
872         $strsort  = get_string('sort' . $sortdir, 'grades');
873     }
875     $return = ' ' . $OUTPUT->pix_icon('t/' . $direction, $strsort) . ' ';
877     if ($return) {
878         return $return;
879     } else {
880         echo $return;
881     }
884 /**
885  * @deprecated since Moodle 2.0
886  */
887 function choose_from_menu() {
888     throw new coding_exception('choose_from_menu() is removed. Please change your code to use html_writer::select().');
891 /**
892  * @deprecated use $OUTPUT->help_icon_scale($courseid, $scale) instead.
893  */
894 function print_scale_menu_helpbutton() {
895     throw new coding_exception('print_scale_menu_helpbutton() can not be used any more. '.
896         'Please use $OUTPUT->help_icon_scale($courseid, $scale) instead.');
899 /**
900  * @deprecated use html_writer::checkbox() instead.
901  */
902 function print_checkbox() {
903     throw new coding_exception('print_checkbox() can not be used any more. Please use html_writer::checkbox() instead.');
906 /**
907  * @deprecated since Moodle 3.2
908  */
909 function update_module_button() {
910     throw new coding_exception('update_module_button() can not be used anymore. Activity modules should ' .
911         'not add the edit module button, the link is already available in the Administration block. Themes ' .
912         'can choose to display the link in the buttons row consistently for all module types.');
915 /**
916  * @deprecated use $OUTPUT->navbar() instead
917  */
918 function print_navigation () {
919     throw new coding_exception('print_navigation() can not be used any more, please update use $OUTPUT->navbar() instead.');
922 /**
923  * @deprecated Please use $PAGE->navabar methods instead.
924  */
925 function build_navigation() {
926     throw new coding_exception('build_navigation() can not be used any more, please use $PAGE->navbar methods instead.');
929 /**
930  * @deprecated not relevant with global navigation in Moodle 2.x+
931  */
932 function navmenu() {
933     throw new coding_exception('navmenu() can not be used any more, it is no longer relevant with global navigation.');
936 /// CALENDAR MANAGEMENT  ////////////////////////////////////////////////////////////////
939 /**
940  * @deprecated please use calendar_event::create() instead.
941  */
942 function add_event() {
943     throw new coding_exception('add_event() can not be used any more, please use calendar_event::create() instead.');
946 /**
947  * @deprecated please calendar_event->update() instead.
948  */
949 function update_event() {
950     throw new coding_exception('update_event() is removed, please use calendar_event->update() instead.');
953 /**
954  * @deprecated please use calendar_event->delete() instead.
955  */
956 function delete_event() {
957     throw new coding_exception('delete_event() can not be used any more, please use '.
958         'calendar_event->delete() instead.');
961 /**
962  * @deprecated please use calendar_event->toggle_visibility(false) instead.
963  */
964 function hide_event() {
965     throw new coding_exception('hide_event() can not be used any more, please use '.
966         'calendar_event->toggle_visibility(false) instead.');
969 /**
970  * @deprecated please use calendar_event->toggle_visibility(true) instead.
971  */
972 function show_event() {
973     throw new coding_exception('show_event() can not be used any more, please use '.
974         'calendar_event->toggle_visibility(true) instead.');
977 /**
978  * @deprecated since Moodle 2.2 use core_text::xxxx() instead.
979  */
980 function textlib_get_instance() {
981     throw new coding_exception('textlib_get_instance() can not be used any more, please use '.
982         'core_text::functioname() instead.');
985 /**
986  * @deprecated since 2.4
987  */
988 function get_generic_section_name() {
989     throw new coding_exception('get_generic_section_name() is deprecated. Please use appropriate functionality from class format_base');
992 /**
993  * @deprecated since 2.4
994  */
995 function get_all_sections() {
996     throw new coding_exception('get_all_sections() is removed. See phpdocs for this function');
999 /**
1000  * @deprecated since 2.4
1001  */
1002 function add_mod_to_section() {
1003     throw new coding_exception('Function add_mod_to_section() is removed, please use course_add_cm_to_section()');
1006 /**
1007  * @deprecated since 2.4
1008  */
1009 function get_all_mods() {
1010     throw new coding_exception('Function get_all_mods() is removed. Use get_fast_modinfo() and get_module_types_names() instead. See phpdocs for details');
1013 /**
1014  * @deprecated since 2.4
1015  */
1016 function get_course_section() {
1017     throw new coding_exception('Function get_course_section() is removed. Please use course_create_sections_if_missing() and get_fast_modinfo() instead.');
1020 /**
1021  * @deprecated since 2.4
1022  */
1023 function format_weeks_get_section_dates() {
1024     throw new coding_exception('Function format_weeks_get_section_dates() is removed. It is not recommended to'.
1025             ' use it outside of format_weeks plugin');
1028 /**
1029  * @deprecated since 2.5
1030  */
1031 function get_print_section_cm_text() {
1032     throw new coding_exception('Function get_print_section_cm_text() is removed. Please use '.
1033             'cm_info::get_formatted_content() and cm_info::get_formatted_name()');
1036 /**
1037  * @deprecated since 2.5
1038  */
1039 function print_section_add_menus() {
1040     throw new coding_exception('Function print_section_add_menus() is removed. Please use course renderer '.
1041             'function course_section_add_cm_control()');
1044 /**
1045  * @deprecated since 2.5. Please use:
1046  * $courserenderer = $PAGE->get_renderer('core', 'course');
1047  * $actions = course_get_cm_edit_actions($mod, $indent, $section);
1048  * return ' ' . $courserenderer->course_section_cm_edit_actions($actions);
1049  */
1050 function make_editing_buttons() {
1051     throw new coding_exception('Function make_editing_buttons() is removed, please see PHPdocs in '.
1052             'lib/deprecatedlib.php on how to replace it');
1055 /**
1056  * @deprecated since 2.5
1057  */
1058 function print_section() {
1059     throw new coding_exception('Function print_section() is removed. Please use course renderer function '.
1060             'course_section_cm_list() instead.');
1063 /**
1064  * @deprecated since 2.5
1065  */
1066 function print_overview() {
1067     throw new coding_exception('Function print_overview() is removed. Use block course_overview to display this information');
1070 /**
1071  * @deprecated since 2.5
1072  */
1073 function print_recent_activity() {
1074     throw new coding_exception('Function print_recent_activity() is removed. It is not recommended to'.
1075             ' use it outside of block_recent_activity');
1078 /**
1079  * @deprecated since 2.5
1080  */
1081 function delete_course_module() {
1082     throw new coding_exception('Function delete_course_module() is removed. Please use course_delete_module() instead.');
1085 /**
1086  * @deprecated since 2.5
1087  */
1088 function update_category_button() {
1089     throw new coding_exception('Function update_category_button() is removed. Pages to view '.
1090             'and edit courses are now separate and no longer depend on editing mode.');
1093 /**
1094  * @deprecated since 2.5
1095  */
1096 function make_categories_list() {
1097     throw new coding_exception('Global function make_categories_list() is removed. Please use '.
1098             'coursecat::make_categories_list() and coursecat::get_parents()');
1101 /**
1102  * @deprecated since 2.5
1103  */
1104 function category_delete_move() {
1105     throw new coding_exception('Function category_delete_move() is removed. Please use coursecat::delete_move() instead.');
1108 /**
1109  * @deprecated since 2.5
1110  */
1111 function category_delete_full() {
1112     throw new coding_exception('Function category_delete_full() is removed. Please use coursecat::delete_full() instead.');
1115 /**
1116  * @deprecated since 2.5
1117  */
1118 function move_category() {
1119     throw new coding_exception('Function move_category() is removed. Please use coursecat::change_parent() instead.');
1122 /**
1123  * @deprecated since 2.5
1124  */
1125 function course_category_hide() {
1126     throw new coding_exception('Function course_category_hide() is removed. Please use coursecat::hide() instead.');
1129 /**
1130  * @deprecated since 2.5
1131  */
1132 function course_category_show() {
1133     throw new coding_exception('Function course_category_show() is removed. Please use coursecat::show() instead.');
1136 /**
1137  * @deprecated since 2.5. Please use coursecat::get($catid, IGNORE_MISSING) or coursecat::get($catid, MUST_EXIST).
1138  */
1139 function get_course_category() {
1140     throw new coding_exception('Function get_course_category() is removed. Please use coursecat::get(), see phpdocs for more details');
1143 /**
1144  * @deprecated since 2.5
1145  */
1146 function create_course_category() {
1147     throw new coding_exception('Function create_course_category() is removed. Please use coursecat::create()');
1150 /**
1151  * @deprecated since 2.5. Please use coursecat::get() and coursecat::get_children()
1152  */
1153 function get_all_subcategories() {
1154     throw new coding_exception('Function get_all_subcategories() is removed. Please use appropriate methods() ' .
1155             'of coursecat class.');
1158 /**
1159  * @deprecated since 2.5. Please use coursecat::get($parentid)->get_children().
1160  */
1161 function get_child_categories() {
1162     throw new coding_exception('Function get_child_categories() is removed. Use coursecat::get_children().');
1165 /**
1166  * @deprecated since 2.5
1167  */
1168 function get_categories() {
1169     throw new coding_exception('Function get_categories() is removed. Please use ' .
1170             'appropriate functions from class coursecat');
1173 /**
1174 * @deprecated since 2.5
1175 */
1176 function print_course_search() {
1177     throw new coding_exception('Function print_course_search() is removed, please use course renderer');
1180 /**
1181  * @deprecated since 2.5
1182  */
1183 function print_my_moodle() {
1184     throw new coding_exception('Function print_my_moodle() is removed, please use course renderer ' .
1185             'function frontpage_my_courses()');
1188 /**
1189  * @deprecated since 2.5
1190  */
1191 function print_remote_course() {
1192     throw new coding_exception('Function print_remote_course() is removed, please use course renderer');
1195 /**
1196  * @deprecated since 2.5
1197  */
1198 function print_remote_host() {
1199     throw new coding_exception('Function print_remote_host() is removed, please use course renderer');
1202 /**
1203  * @deprecated since 2.5
1204  */
1205 function print_whole_category_list() {
1206     throw new coding_exception('Function print_whole_category_list() is removed, please use course renderer');
1209 /**
1210  * @deprecated since 2.5
1211  */
1212 function print_category_info() {
1213     throw new coding_exception('Function print_category_info() is removed, please use course renderer');
1216 /**
1217  * @deprecated since 2.5
1218  */
1219 function get_course_category_tree() {
1220     throw new coding_exception('Function get_course_category_tree() is removed, please use course ' .
1221             'renderer or coursecat class, see function phpdocs for more info');
1224 /**
1225  * @deprecated since 2.5
1226  */
1227 function print_courses() {
1228     throw new coding_exception('Function print_courses() is removed, please use course renderer');
1231 /**
1232  * @deprecated since 2.5
1233  */
1234 function print_course() {
1235     throw new coding_exception('Function print_course() is removed, please use course renderer');
1238 /**
1239  * @deprecated since 2.5
1240  */
1241 function get_category_courses_array() {
1242     throw new coding_exception('Function get_category_courses_array() is removed, please use methods of coursecat class');
1245 /**
1246  * @deprecated since 2.5
1247  */
1248 function get_category_courses_array_recursively() {
1249     throw new coding_exception('Function get_category_courses_array_recursively() is removed, please use methods of coursecat class', DEBUG_DEVELOPER);
1252 /**
1253  * @deprecated since Moodle 2.5 MDL-27814 - please do not use this function any more.
1254  */
1255 function blog_get_context_url() {
1256     throw new coding_exception('Function  blog_get_context_url() is removed, getting params from context is not reliable for blogs.');
1259 /**
1260  * @deprecated since 2.5
1261  */
1262 function get_courses_wmanagers() {
1263     throw new coding_exception('Function get_courses_wmanagers() is removed, please use coursecat::get_courses()');
1266 /**
1267  * @deprecated since 2.5
1268  */
1269 function convert_tree_to_html() {
1270     throw new coding_exception('Function convert_tree_to_html() is removed. Consider using class tabtree and core_renderer::render_tabtree()');
1273 /**
1274  * @deprecated since 2.5
1275  */
1276 function convert_tabrows_to_tree() {
1277     throw new coding_exception('Function convert_tabrows_to_tree() is removed. Consider using class tabtree');
1280 /**
1281  * @deprecated since 2.5 - do not use, the textrotate.js will work it out automatically
1282  */
1283 function can_use_rotated_text() {
1284     debugging('can_use_rotated_text() is removed. JS feature detection is used automatically.');
1287 /**
1288  * @deprecated since Moodle 2.2 MDL-35009 - please do not use this function any more.
1289  */
1290 function get_context_instance_by_id() {
1291     throw new coding_exception('get_context_instance_by_id() is now removed, please use context::instance_by_id($id) instead.');
1294 /**
1295  * Returns system context or null if can not be created yet.
1296  *
1297  * @see context_system::instance()
1298  * @deprecated since 2.2
1299  * @param bool $cache use caching
1300  * @return context system context (null if context table not created yet)
1301  */
1302 function get_system_context($cache = true) {
1303     debugging('get_system_context() is deprecated, please use context_system::instance() instead.', DEBUG_DEVELOPER);
1304     return context_system::instance(0, IGNORE_MISSING, $cache);
1307 /**
1308  * @deprecated since 2.2, use $context->get_parent_context_ids() instead
1309  */
1310 function get_parent_contexts() {
1311     throw new coding_exception('get_parent_contexts() is removed, please use $context->get_parent_context_ids() instead.');
1314 /**
1315  * @deprecated since Moodle 2.2
1316  */
1317 function get_parent_contextid() {
1318     throw new coding_exception('get_parent_contextid() is removed, please use $context->get_parent_context() instead.');
1321 /**
1322  * @deprecated since 2.2
1323  */
1324 function get_child_contexts() {
1325     throw new coding_exception('get_child_contexts() is removed, please use $context->get_child_contexts() instead.');
1328 /**
1329  * @deprecated since 2.2
1330  */
1331 function create_contexts() {
1332     throw new coding_exception('create_contexts() is removed, please use context_helper::create_instances() instead.');
1335 /**
1336  * @deprecated since 2.2
1337  */
1338 function cleanup_contexts() {
1339     throw new coding_exception('cleanup_contexts() is removed, please use context_helper::cleanup_instances() instead.');
1342 /**
1343  * @deprecated since 2.2
1344  */
1345 function build_context_path() {
1346     throw new coding_exception('build_context_path() is removed, please use context_helper::build_all_paths() instead.');
1349 /**
1350  * @deprecated since 2.2
1351  */
1352 function rebuild_contexts() {
1353     throw new coding_exception('rebuild_contexts() is removed, please use $context->reset_paths(true) instead.');
1356 /**
1357  * @deprecated since Moodle 2.2
1358  */
1359 function preload_course_contexts() {
1360     throw new coding_exception('preload_course_contexts() is removed, please use context_helper::preload_course() instead.');
1363 /**
1364  * @deprecated since Moodle 2.2
1365  */
1366 function context_moved() {
1367     throw new coding_exception('context_moved() is removed, please use context::update_moved() instead.');
1370 /**
1371  * @deprecated since 2.2
1372  */
1373 function fetch_context_capabilities() {
1374     throw new coding_exception('fetch_context_capabilities() is removed, please use $context->get_capabilities() instead.');
1377 /**
1378  * @deprecated since 2.2
1379  */
1380 function context_instance_preload() {
1381     throw new coding_exception('context_instance_preload() is removed, please use context_helper::preload_from_record() instead.');
1384 /**
1385  * @deprecated since 2.2
1386  */
1387 function get_contextlevel_name() {
1388     throw new coding_exception('get_contextlevel_name() is removed, please use context_helper::get_level_name() instead.');
1391 /**
1392  * @deprecated since 2.2
1393  */
1394 function print_context_name() {
1395     throw new coding_exception('print_context_name() is removed, please use $context->get_context_name() instead.');
1398 /**
1399  * @deprecated since 2.2, use $context->mark_dirty() instead
1400  */
1401 function mark_context_dirty() {
1402     throw new coding_exception('mark_context_dirty() is removed, please use $context->mark_dirty() instead.');
1405 /**
1406  * @deprecated since Moodle 2.2
1407  */
1408 function delete_context() {
1409     throw new coding_exception('delete_context() is removed, please use context_helper::delete_instance() ' .
1410             'or $context->delete_content() instead.');
1413 /**
1414  * @deprecated since 2.2
1415  */
1416 function get_context_url() {
1417     throw new coding_exception('get_context_url() is removed, please use $context->get_url() instead.');
1420 /**
1421  * @deprecated since 2.2
1422  */
1423 function get_course_context() {
1424     throw new coding_exception('get_course_context() is removed, please use $context->get_course_context(true) instead.');
1427 /**
1428  * @deprecated since 2.2
1429  */
1430 function get_user_courses_bycap() {
1431     throw new coding_exception('get_user_courses_bycap() is removed, please use enrol_get_users_courses() instead.');
1434 /**
1435  * @deprecated since Moodle 2.2
1436  */
1437 function get_role_context_caps() {
1438     throw new coding_exception('get_role_context_caps() is removed, it is really slow. Don\'t use it.');
1441 /**
1442  * @deprecated since 2.2
1443  */
1444 function get_courseid_from_context() {
1445     throw new coding_exception('get_courseid_from_context() is removed, please use $context->get_course_context(false) instead.');
1448 /**
1449  * @deprecated since 2.2
1450  */
1451 function context_instance_preload_sql() {
1452     throw new coding_exception('context_instance_preload_sql() is removed, please use context_helper::get_preload_record_columns_sql() instead.');
1455 /**
1456  * @deprecated since 2.2
1457  */
1458 function get_related_contexts_string() {
1459     throw new coding_exception('get_related_contexts_string() is removed, please use $context->get_parent_context_ids(true) instead.');
1462 /**
1463  * @deprecated since 2.6
1464  */
1465 function get_plugin_list_with_file() {
1466     throw new coding_exception('get_plugin_list_with_file() is removed, please use core_component::get_plugin_list_with_file() instead.');
1469 /**
1470  * @deprecated since 2.6
1471  */
1472 function check_browser_operating_system() {
1473     throw new coding_exception('check_browser_operating_system is removed, please update your code to use core_useragent instead.');
1476 /**
1477  * @deprecated since 2.6
1478  */
1479 function check_browser_version() {
1480     throw new coding_exception('check_browser_version is removed, please update your code to use core_useragent instead.');
1483 /**
1484  * @deprecated since 2.6
1485  */
1486 function get_device_type() {
1487     throw new coding_exception('get_device_type is removed, please update your code to use core_useragent instead.');
1490 /**
1491  * @deprecated since 2.6
1492  */
1493 function get_device_type_list() {
1494     throw new coding_exception('get_device_type_list is removed, please update your code to use core_useragent instead.');
1497 /**
1498  * @deprecated since 2.6
1499  */
1500 function get_selected_theme_for_device_type() {
1501     throw new coding_exception('get_selected_theme_for_device_type is removed, please update your code to use core_useragent instead.');
1504 /**
1505  * @deprecated since 2.6
1506  */
1507 function get_device_cfg_var_name() {
1508     throw new coding_exception('get_device_cfg_var_name is removed, please update your code to use core_useragent instead.');
1511 /**
1512  * @deprecated since 2.6
1513  */
1514 function set_user_device_type() {
1515     throw new coding_exception('set_user_device_type is removed, please update your code to use core_useragent instead.');
1518 /**
1519  * @deprecated since 2.6
1520  */
1521 function get_user_device_type() {
1522     throw new coding_exception('get_user_device_type is removed, please update your code to use core_useragent instead.');
1525 /**
1526  * @deprecated since 2.6
1527  */
1528 function get_browser_version_classes() {
1529     throw new coding_exception('get_browser_version_classes is removed, please update your code to use core_useragent instead.');
1532 /**
1533  * @deprecated since Moodle 2.6
1534  */
1535 function generate_email_supportuser() {
1536     throw new coding_exception('generate_email_supportuser is removed, please use core_user::get_support_user');
1539 /**
1540  * @deprecated since Moodle 2.6
1541  */
1542 function badges_get_issued_badge_info() {
1543     throw new coding_exception('Function badges_get_issued_badge_info() is removed. Please use core_badges_assertion class and methods to generate badge assertion.');
1546 /**
1547  * @deprecated since 2.6
1548  */
1549 function can_use_html_editor() {
1550     throw new coding_exception('can_use_html_editor is removed, please update your code to assume it returns true.');
1554 /**
1555  * @deprecated since Moodle 2.7, use {@link user_count_login_failures()} instead.
1556  */
1557 function count_login_failures() {
1558     throw new coding_exception('count_login_failures() can not be used any more, please use user_count_login_failures().');
1561 /**
1562  * @deprecated since 2.7 MDL-33099/MDL-44088 - please do not use this function any more.
1563  */
1564 function ajaxenabled() {
1565     throw new coding_exception('ajaxenabled() can not be used anymore. Update your code to work with JS at all times.');
1568 /**
1569  * @deprecated Since Moodle 2.7 MDL-44070
1570  */
1571 function coursemodule_visible_for_user() {
1572     throw new coding_exception('coursemodule_visible_for_user() can not be used any more,
1573             please use \core_availability\info_module::is_user_visible()');
1576 /**
1577  * @deprecated since Moodle 2.8 MDL-36014, MDL-35618 this functionality is removed
1578  */
1579 function enrol_cohort_get_cohorts() {
1580     throw new coding_exception('Function enrol_cohort_get_cohorts() is removed, use '.
1581         'cohort_get_available_cohorts() instead');
1584 /**
1585  * @deprecated since Moodle 2.8 MDL-36014 please use cohort_can_view_cohort()
1586  */
1587 function enrol_cohort_can_view_cohort() {
1588     throw new coding_exception('Function enrol_cohort_can_view_cohort() is removed, use cohort_can_view_cohort() instead');
1591 /**
1592  * @deprecated since Moodle 2.8 MDL-36014 use cohort_get_available_cohorts() instead
1593  */
1594 function cohort_get_visible_list() {
1595     throw new coding_exception('Function cohort_get_visible_list() is removed. Please use function cohort_get_available_cohorts() ".
1596         "that correctly checks capabilities.');
1599 /**
1600  * @deprecated since Moodle 2.8 MDL-35618 this functionality is removed
1601  */
1602 function enrol_cohort_enrol_all_users() {
1603     throw new coding_exception('enrol_cohort_enrol_all_users() is removed. This functionality is moved to enrol_manual.');
1606 /**
1607  * @deprecated since Moodle 2.8 MDL-35618 this functionality is removed
1608  */
1609 function enrol_cohort_search_cohorts() {
1610     throw new coding_exception('enrol_cohort_search_cohorts() is removed. This functionality is moved to enrol_manual.');
1613 /* === Apis deprecated in since Moodle 2.9 === */
1615 /**
1616  * @deprecated since Moodle 2.9 MDL-49371 - please do not use this function any more.
1617  */
1618 function message_current_user_is_involved() {
1619     throw new coding_exception('message_current_user_is_involved() can not be used any more.');
1622 /**
1623  * @deprecated since Moodle 2.9 MDL-45898 - please do not use this function any more.
1624  */
1625 function profile_display_badges() {
1626     throw new coding_exception('profile_display_badges() can not be used any more.');
1629 /**
1630  * @deprecated since Moodle 2.9 MDL-45774 - Please do not use this function any more.
1631  */
1632 function useredit_shared_definition_preferences() {
1633     throw new coding_exception('useredit_shared_definition_preferences() can not be used any more.');
1637 /**
1638  * @deprecated since Moodle 2.9
1639  */
1640 function calendar_normalize_tz() {
1641     throw new coding_exception('calendar_normalize_tz() can not be used any more, please use core_date::normalise_timezone() instead.');
1644 /**
1645  * @deprecated since Moodle 2.9
1646  */
1647 function get_user_timezone_offset() {
1648     throw new coding_exception('get_user_timezone_offset() can not be used any more, please use standard PHP DateTimeZone class instead');
1652 /**
1653  * @deprecated since Moodle 2.9
1654  */
1655 function get_timezone_offset() {
1656     throw new coding_exception('get_timezone_offset() can not be used any more, please use standard PHP DateTimeZone class instead');
1659 /**
1660  * @deprecated since Moodle 2.9
1661  */
1662 function get_list_of_timezones() {
1663     throw new coding_exception('get_list_of_timezones() can not be used any more, please use core_date::get_list_of_timezones() instead');
1666 /**
1667  * @deprecated since Moodle 2.9
1668  */
1669 function update_timezone_records() {
1670     throw new coding_exception('update_timezone_records() can not be used any more, please use standard PHP DateTime class instead');
1673 /**
1674  * @deprecated since Moodle 2.9
1675  */
1676 function calculate_user_dst_table() {
1677     throw new coding_exception('calculate_user_dst_table() can not be used any more, please use standard PHP DateTime class instead');
1680 /**
1681  * @deprecated since Moodle 2.9
1682  */
1683 function dst_changes_for_year() {
1684     throw new coding_exception('dst_changes_for_year() can not be used any more, please use standard DateTime class instead');
1687 /**
1688  * @deprecated since Moodle 2.9
1689  */
1690 function get_timezone_record() {
1691     throw new coding_exception('get_timezone_record() can not be used any more, please use standard PHP DateTime class instead');
1694 /* === Apis deprecated since Moodle 3.0 === */
1695 /**
1696  * @deprecated since Moodle 3.0 MDL-49360 - please do not use this function any more.
1697  */
1698 function get_referer() {
1699     throw new coding_exception('get_referer() can not be used any more. Please use get_local_referer() instead.');
1702 /**
1703  * @deprecated since Moodle 3.0 use \core_useragent::is_web_crawler instead.
1704  */
1705 function is_web_crawler() {
1706     throw new coding_exception('is_web_crawler() can not be used any more. Please use core_useragent::is_web_crawler() instead.');
1709 /**
1710  * @deprecated since Moodle 3.0 MDL-50287 - please do not use this function any more.
1711  */
1712 function completion_cron() {
1713     throw new coding_exception('completion_cron() can not be used any more. Functionality has been moved to scheduled tasks.');
1716 /**
1717  * @deprecated since 3.0
1718  */
1719 function coursetag_get_tags() {
1720     throw new coding_exception('Function coursetag_get_tags() can not be used any more. ' .
1721             'Userid is no longer used for tagging courses.');
1724 /**
1725  * @deprecated since 3.0
1726  */
1727 function coursetag_get_all_tags() {
1728     throw new coding_exception('Function coursetag_get_all_tags() can not be used any more. Userid is no ' .
1729         'longer used for tagging courses.');
1732 /**
1733  * @deprecated since 3.0
1734  */
1735 function coursetag_get_jscript() {
1736     throw new coding_exception('Function coursetag_get_jscript() can not be used any more and is obsolete.');
1739 /**
1740  * @deprecated since 3.0
1741  */
1742 function coursetag_get_jscript_links() {
1743     throw new coding_exception('Function coursetag_get_jscript_links() can not be used any more and is obsolete.');
1746 /**
1747  * @deprecated since 3.0
1748  */
1749 function coursetag_get_records() {
1750     throw new coding_exception('Function coursetag_get_records() can not be used any more. ' .
1751             'Userid is no longer used for tagging courses.');
1754 /**
1755  * @deprecated since 3.0
1756  */
1757 function coursetag_store_keywords() {
1758     throw new coding_exception('Function coursetag_store_keywords() can not be used any more. ' .
1759             'Userid is no longer used for tagging courses.');
1762 /**
1763  * @deprecated since 3.0
1764  */
1765 function coursetag_delete_keyword() {
1766     throw new coding_exception('Function coursetag_delete_keyword() can not be used any more. ' .
1767             'Userid is no longer used for tagging courses.');
1770 /**
1771  * @deprecated since 3.0
1772  */
1773 function coursetag_get_tagged_courses() {
1774     throw new coding_exception('Function coursetag_get_tagged_courses() can not be used any more. ' .
1775             'Userid is no longer used for tagging courses.');
1778 /**
1779  * @deprecated since 3.0
1780  */
1781 function coursetag_delete_course_tags() {
1782     throw new coding_exception('Function coursetag_delete_course_tags() is deprecated. ' .
1783             'Use core_tag_tag::remove_all_item_tags().');
1786 /**
1787  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->update() instead
1788  */
1789 function tag_type_set() {
1790     throw new coding_exception('tag_type_set() can not be used anymore. Please use ' .
1791         'core_tag_tag::get($tagid)->update().');
1794 /**
1795  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->update() instead
1796  */
1797 function tag_description_set() {
1798     throw new coding_exception('tag_description_set() can not be used anymore. Please use ' .
1799         'core_tag_tag::get($tagid)->update().');
1802 /**
1803  * @deprecated since 3.1. Use core_tag_tag::get_item_tags() instead
1804  */
1805 function tag_get_tags() {
1806     throw new coding_exception('tag_get_tags() can not be used anymore. Please use ' .
1807         'core_tag_tag::get_item_tags().');
1810 /**
1811  * @deprecated since 3.1
1812  */
1813 function tag_get_tags_array() {
1814     throw new coding_exception('tag_get_tags_array() can not be used anymore. Please use ' .
1815         'core_tag_tag::get_item_tags_array().');
1818 /**
1819  * @deprecated since 3.1. Use core_tag_tag::get_item_tags_array() or $OUTPUT->tag_list(core_tag_tag::get_item_tags())
1820  */
1821 function tag_get_tags_csv() {
1822     throw new coding_exception('tag_get_tags_csv() can not be used anymore. Please use ' .
1823         'core_tag_tag::get_item_tags_array() or $OUTPUT->tag_list(core_tag_tag::get_item_tags()).');
1826 /**
1827  * @deprecated since 3.1. Use core_tag_tag::get_item_tags() instead
1828  */
1829 function tag_get_tags_ids() {
1830     throw new coding_exception('tag_get_tags_ids() can not be used anymore. Please consider using ' .
1831         'core_tag_tag::get_item_tags() or similar methods.');
1834 /**
1835  * @deprecated since 3.1. Use core_tag_tag::get_by_name() or core_tag_tag::get_by_name_bulk()
1836  */
1837 function tag_get_id() {
1838     throw new coding_exception('tag_get_id() can not be used anymore. Please use ' .
1839         'core_tag_tag::get_by_name() or core_tag_tag::get_by_name_bulk()');
1842 /**
1843  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->update() instead
1844  */
1845 function tag_rename() {
1846     throw new coding_exception('tag_rename() can not be used anymore. Please use ' .
1847         'core_tag_tag::get($tagid)->update()');
1850 /**
1851  * @deprecated since 3.1. Use core_tag_tag::remove_item_tag() instead
1852  */
1853 function tag_delete_instance() {
1854     throw new coding_exception('tag_delete_instance() can not be used anymore. Please use ' .
1855         'core_tag_tag::remove_item_tag()');
1858 /**
1859  * @deprecated since 3.1. Use core_tag_tag::get_by_name()->get_tagged_items() instead
1860  */
1861 function tag_find_records() {
1862     throw new coding_exception('tag_find_records() can not be used anymore. Please use ' .
1863         'core_tag_tag::get_by_name()->get_tagged_items()');
1866 /**
1867  * @deprecated since 3.1
1868  */
1869 function tag_add() {
1870     throw new coding_exception('tag_add() can not be used anymore. You can use ' .
1871         'core_tag_tag::create_if_missing(), however it should not be necessary since tags are ' .
1872         'created automatically when assigned to items');
1875 /**
1876  * @deprecated since 3.1. Use core_tag_tag::set_item_tags() or core_tag_tag::add_item_tag() instead
1877  */
1878 function tag_assign() {
1879     throw new coding_exception('tag_assign() can not be used anymore. Please use ' .
1880         'core_tag_tag::set_item_tags() or core_tag_tag::add_item_tag() instead. Tag instance ' .
1881         'ordering should not be set manually');
1884 /**
1885  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->count_tagged_items() instead
1886  */
1887 function tag_record_count() {
1888     throw new coding_exception('tag_record_count() can not be used anymore. Please use ' .
1889         'core_tag_tag::get($tagid)->count_tagged_items().');
1892 /**
1893  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->is_item_tagged_with() instead
1894  */
1895 function tag_record_tagged_with() {
1896     throw new coding_exception('tag_record_tagged_with() can not be used anymore. Please use ' .
1897         'core_tag_tag::get($tagid)->is_item_tagged_with().');
1900 /**
1901  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->flag() instead
1902  */
1903 function tag_set_flag() {
1904     throw new coding_exception('tag_set_flag() can not be used anymore. Please use ' .
1905         'core_tag_tag::get($tagid)->flag()');
1908 /**
1909  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->reset_flag() instead
1910  */
1911 function tag_unset_flag() {
1912     throw new coding_exception('tag_unset_flag() can not be used anymore. Please use ' .
1913         'core_tag_tag::get($tagid)->reset_flag()');
1916 /**
1917  * @deprecated since 3.1
1918  */
1919 function tag_print_cloud() {
1920     throw new coding_exception('tag_print_cloud() can not be used anymore. Please use ' .
1921         'core_tag_collection::get_tag_cloud(), templateable core_tag\output\tagcloud and ' .
1922         'template core_tag/tagcloud.');
1925 /**
1926  * @deprecated since 3.0
1927  */
1928 function tag_autocomplete() {
1929     throw new coding_exception('tag_autocomplete() can not be used anymore. New form ' .
1930         'element "tags" does proper autocomplete.');
1933 /**
1934  * @deprecated since 3.1
1935  */
1936 function tag_print_description_box() {
1937     throw new coding_exception('tag_print_description_box() can not be used anymore. ' .
1938         'See core_tag_renderer for similar code');
1941 /**
1942  * @deprecated since 3.1
1943  */
1944 function tag_print_management_box() {
1945     throw new coding_exception('tag_print_management_box() can not be used anymore. ' .
1946         'See core_tag_renderer for similar code');
1949 /**
1950  * @deprecated since 3.1
1951  */
1952 function tag_print_search_box() {
1953     throw new coding_exception('tag_print_search_box() can not be used anymore. ' .
1954         'See core_tag_renderer for similar code');
1957 /**
1958  * @deprecated since 3.1
1959  */
1960 function tag_print_search_results() {
1961     throw new coding_exception('tag_print_search_results() can not be used anymore. ' .
1962         'In /tag/search.php the search results are printed using the core_tag/tagcloud template.');
1965 /**
1966  * @deprecated since 3.1
1967  */
1968 function tag_print_tagged_users_table() {
1969     throw new coding_exception('tag_print_tagged_users_table() can not be used anymore. ' .
1970         'See core_user_renderer for similar code');
1973 /**
1974  * @deprecated since 3.1
1975  */
1976 function tag_print_user_box() {
1977     throw new coding_exception('tag_print_user_box() can not be used anymore. ' .
1978         'See core_user_renderer for similar code');
1981 /**
1982  * @deprecated since 3.1
1983  */
1984 function tag_print_user_list() {
1985     throw new coding_exception('tag_print_user_list() can not be used anymore. ' .
1986         'See core_user_renderer for similar code');
1989 /**
1990  * @deprecated since 3.1
1991  */
1992 function tag_display_name() {
1993     throw new coding_exception('tag_display_name() can not be used anymore. Please use ' .
1994         'core_tag_tag::make_display_name().');
1998 /**
1999  * @deprecated since 3.1
2000  */
2001 function tag_normalize() {
2002     throw new coding_exception('tag_normalize() can not be used anymore. Please use ' .
2003         'core_tag_tag::normalize().');
2006 /**
2007  * @deprecated since 3.1
2008  */
2009 function tag_get_related_tags_csv() {
2010     throw new coding_exception('tag_get_related_tags_csv() can not be used anymore. Please ' .
2011         'consider looping through array or using $OUTPUT->tag_list(core_tag_tag::get_item_tags()).');
2014 /**
2015  * @deprecated since 3.1
2016  */
2017 function tag_set() {
2018     throw new coding_exception('tag_set() can not be used anymore. Please use ' .
2019         'core_tag_tag::set_item_tags().');
2022 /**
2023  * @deprecated since 3.1
2024  */
2025 function tag_set_add() {
2026     throw new coding_exception('tag_set_add() can not be used anymore. Please use ' .
2027         'core_tag_tag::add_item_tag().');
2030 /**
2031  * @deprecated since 3.1
2032  */
2033 function tag_set_delete() {
2034     throw new coding_exception('tag_set_delete() can not be used anymore. Please use ' .
2035         'core_tag_tag::remove_item_tag().');
2038 /**
2039  * @deprecated since 3.1
2040  */
2041 function tag_get() {
2042     throw new coding_exception('tag_get() can not be used anymore. Please use ' .
2043         'core_tag_tag::get() or core_tag_tag::get_by_name().');
2046 /**
2047  * @deprecated since 3.1
2048  */
2049 function tag_get_related_tags() {
2050     throw new coding_exception('tag_get_related_tags() can not be used anymore. Please use ' .
2051         'core_tag_tag::get_correlated_tags(), core_tag_tag::get_related_tags() or ' .
2052         'core_tag_tag::get_manual_related_tags().');
2055 /**
2056  * @deprecated since 3.1
2057  */
2058 function tag_delete() {
2059     throw new coding_exception('tag_delete() can not be used anymore. Please use ' .
2060         'core_tag_tag::delete_tags().');
2063 /**
2064  * @deprecated since 3.1
2065  */
2066 function tag_delete_instances() {
2067     throw new coding_exception('tag_delete_instances() can not be used anymore. Please use ' .
2068         'core_tag_tag::delete_instances().');
2071 /**
2072  * @deprecated since 3.1
2073  */
2074 function tag_cleanup() {
2075     throw new coding_exception('tag_cleanup() can not be used anymore. Please use ' .
2076         '\core\task\tag_cron_task::cleanup().');
2079 /**
2080  * @deprecated since 3.1
2081  */
2082 function tag_bulk_delete_instances() {
2083     throw new coding_exception('tag_bulk_delete_instances() can not be used anymore. Please use ' .
2084         '\core\task\tag_cron_task::bulk_delete_instances().');
2088 /**
2089  * @deprecated since 3.1
2090  */
2091 function tag_compute_correlations() {
2092     throw new coding_exception('tag_compute_correlations() can not be used anymore. Please use ' .
2093         'use \core\task\tag_cron_task::compute_correlations().');
2096 /**
2097  * @deprecated since 3.1
2098  */
2099 function tag_process_computed_correlation() {
2100     throw new coding_exception('tag_process_computed_correlation() can not be used anymore. Please use ' .
2101         'use \core\task\tag_cron_task::process_computed_correlation().');
2104 /**
2105  * @deprecated since 3.1
2106  */
2107 function tag_cron() {
2108     throw new coding_exception('tag_cron() can not be used anymore. Please use ' .
2109         'use \core\task\tag_cron_task::execute().');
2112 /**
2113  * @deprecated since 3.1
2114  */
2115 function tag_find_tags() {
2116     throw new coding_exception('tag_find_tags() can not be used anymore.');
2119 /**
2120  * @deprecated since 3.1
2121  */
2122 function tag_get_name() {
2123     throw new coding_exception('tag_get_name() can not be used anymore.');
2126 /**
2127  * @deprecated since 3.1
2128  */
2129 function tag_get_correlated() {
2130     throw new coding_exception('tag_get_correlated() can not be used anymore. Please use ' .
2131         'use core_tag_tag::get_correlated_tags().');
2135 /**
2136  * @deprecated since 3.1
2137  */
2138 function tag_cloud_sort() {
2139     throw new coding_exception('tag_cloud_sort() can not be used anymore. Similar method can ' .
2140         'be found in core_tag_collection::cloud_sort().');
2143 /**
2144  * @deprecated since Moodle 3.1
2145  */
2146 function events_load_def() {
2147     throw new coding_exception('events_load_def() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2151 /**
2152  * @deprecated since Moodle 3.1
2153  */
2154 function events_queue_handler() {
2155     throw new coding_exception('events_queue_handler() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2158 /**
2159  * @deprecated since Moodle 3.1
2160  */
2161 function events_dispatch() {
2162     throw new coding_exception('events_dispatch() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2165 /**
2166  * @deprecated since Moodle 3.1
2167  */
2168 function events_process_queued_handler() {
2169     throw new coding_exception(
2170         'events_process_queued_handler() has been deprecated along with all Events 1 API in favour of Events 2 API.'
2171     );
2174 /**
2175  * @deprecated since Moodle 3.1
2176  */
2177 function events_update_definition() {
2178     throw new coding_exception(
2179         'events_update_definition has been deprecated along with all Events 1 API in favour of Events 2 API.'
2180     );
2183 /**
2184  * @deprecated since Moodle 3.1
2185  */
2186 function events_cron() {
2187     throw new coding_exception('events_cron() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2190 /**
2191  * @deprecated since Moodle 3.1
2192  */
2193 function events_trigger_legacy() {
2194     throw new coding_exception('events_trigger_legacy() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2197 /**
2198  * @deprecated since Moodle 3.1
2199  */
2200 function events_is_registered() {
2201     throw new coding_exception('events_is_registered() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2204 /**
2205  * @deprecated since Moodle 3.1
2206  */
2207 function events_pending_count() {
2208     throw new coding_exception('events_pending_count() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2211 /**
2212  * @deprecated since Moodle 3.0 - this is a part of clamav plugin now.
2213  */
2214 function clam_message_admins() {
2215     throw new coding_exception('clam_message_admins() can not be used anymore. Please use ' .
2216         'message_admins() method of \antivirus_clamav\scanner class.');
2219 /**
2220  * @deprecated since Moodle 3.0 - this is a part of clamav plugin now.
2221  */
2222 function get_clam_error_code() {
2223     throw new coding_exception('get_clam_error_code() can not be used anymore. Please use ' .
2224         'get_clam_error_code() method of \antivirus_clamav\scanner class.');
2227 /**
2228  * @deprecated since 3.1
2229  */
2230 function course_get_cm_rename_action() {
2231     throw new coding_exception('course_get_cm_rename_action() can not be used anymore. Please use ' .
2232         'inplace_editable https://docs.moodle.org/dev/Inplace_editable.');
2236 /**
2237  * @deprecated since Moodle 3.1
2238  */
2239 function course_scale_used() {
2240     throw new coding_exception('course_scale_used() can not be used anymore. Plugins can ' .
2241         'implement <modname>_scale_used_anywhere, all implementations of <modname>_scale_used are now ignored');
2244 /**
2245  * @deprecated since Moodle 3.1
2246  */
2247 function site_scale_used() {
2248     throw new coding_exception('site_scale_used() can not be used anymore. Plugins can implement ' .
2249         '<modname>_scale_used_anywhere, all implementations of <modname>_scale_used are now ignored');
2252 /**
2253  * @deprecated since Moodle 3.1. Use external_api::external_function_info().
2254  */
2255 function external_function_info() {
2256     throw new coding_exception('external_function_info() can not be used any'.
2257         'more. Please use external_api::external_function_info() instead.');
2260 /**
2261  * @deprecated since Moodle 3.2
2262  * @see csv_import_reader::load_csv_content()
2263  */
2264 function get_records_csv() {
2265     throw new coding_exception('get_records_csv() can not be used anymore. Please use ' .
2266         'lib/csvlib.class.php csv_import_reader() instead.');
2269 /**
2270  * @deprecated since Moodle 3.2
2271  * @see download_as_dataformat (lib/dataformatlib.php)
2272  */
2273 function put_records_csv() {
2274     throw new coding_exception('put_records_csv() can not be used anymore. Please use ' .
2275         'lib/dataformatlib.php download_as_dataformat() instead.');
2278 /**
2279  * @deprecated since Moodle 3.2
2280  */
2281 function css_is_colour() {
2282     throw new coding_exception('css_is_colour() can not be used anymore.');
2285 /**
2286  * @deprecated since Moodle 3.2
2287  */
2288 function css_is_width() {
2289     throw new coding_exception('css_is_width() can not be used anymore.');
2292 /**
2293  * @deprecated since Moodle 3.2
2294  */
2295 function css_sort_by_count() {
2296     throw new coding_exception('css_sort_by_count() can not be used anymore.');
2299 /**
2300  * @deprecated since Moodle 3.2
2301  */
2302 function message_get_course_contexts() {
2303     throw new coding_exception('message_get_course_contexts() can not be used anymore.');
2306 /**
2307  * @deprecated since Moodle 3.2
2308  */
2309 function message_remove_url_params() {
2310     throw new coding_exception('message_remove_url_params() can not be used anymore.');
2313 /**
2314  * @deprecated since Moodle 3.2
2315  */
2316 function message_count_messages() {
2317     throw new coding_exception('message_count_messages() can not be used anymore.');
2320 /**
2321  * @deprecated since Moodle 3.2
2322  */
2323 function message_count_blocked_users() {
2324     throw new coding_exception('message_count_blocked_users() can not be used anymore. Please use ' .
2325         '\core_message\api::count_blocked_users() instead.');
2328 /**
2329  * @deprecated since Moodle 3.2
2330  */
2331 function message_contact_link() {
2332     throw new coding_exception('message_contact_link() can not be used anymore.');
2335 /**
2336  * @deprecated since Moodle 3.2
2337  */
2338 function message_get_recent_notifications() {
2339     throw new coding_exception('message_get_recent_notifications() can not be used anymore.');
2342 /**
2343  * @deprecated since Moodle 3.2
2344  */
2345 function message_history_link() {
2346     throw new coding_exception('message_history_link() can not be used anymore.');
2349 /**
2350  * @deprecated since Moodle 3.2
2351  */
2352 function message_search() {
2353     throw new coding_exception('message_search() can not be used anymore.');
2356 /**
2357  * @deprecated since Moodle 3.2
2358  */
2359 function message_shorten_message() {
2360     throw new coding_exception('message_shorten_message() can not be used anymore.');
2363 /**
2364  * @deprecated since Moodle 3.2
2365  */
2366 function message_get_fragment() {
2367     throw new coding_exception('message_get_fragment() can not be used anymore.');
2370 /**
2371  * @deprecated since Moodle 3.2
2372  */
2373 function message_get_history() {
2374     throw new coding_exception('message_get_history() can not be used anymore.');
2377 /**
2378  * @deprecated since Moodle 3.2
2379  */
2380 function message_get_contact_add_remove_link() {
2381     throw new coding_exception('message_get_contact_add_remove_link() can not be used anymore.');
2384 /**
2385  * @deprecated since Moodle 3.2
2386  */
2387 function message_get_contact_block_link() {
2388     throw new coding_exception('message_get_contact_block_link() can not be used anymore.');
2391 /**
2392  * @deprecated since Moodle 3.2
2393  */
2394 function message_mark_messages_read() {
2395     throw new coding_exception('message_mark_messages_read() can not be used anymore. Please use ' .
2396         '\core_message\api::mark_all_messages_as_read() instead.');
2399 /**
2400  * @deprecated since Moodle 3.2
2401  */
2402 function message_page_type_list() {
2403     throw new coding_exception('message_page_type_list() can not be used anymore.');
2406 /**
2407  * @deprecated since Moodle 3.2
2408  */
2409 function message_can_post_message() {
2410     throw new coding_exception('message_can_post_message() can not be used anymore. Please use ' .
2411         '\core_message\api::can_post_message() instead.');
2414 /**
2415  * @deprecated since Moodle 3.2
2416  */
2417 function message_is_user_non_contact_blocked() {
2418     throw new coding_exception('message_is_user_non_contact_blocked() can not be used anymore. Please use ' .
2419         '\core_message\api::is_user_non_contact_blocked() instead.');
2422 /**
2423  * @deprecated since Moodle 3.2
2424  */
2425 function message_is_user_blocked() {
2426     throw new coding_exception('message_is_user_blocked() can not be used anymore. Please use ' .
2427         '\core_message\api::is_user_blocked() instead.');
2430 /**
2431  * @deprecated since Moodle 3.2
2432  */
2433 function print_log() {
2434     throw new coding_exception('print_log() can not be used anymore. Please use the ' .
2435         'report_log framework instead.');
2438 /**
2439  * @deprecated since Moodle 3.2
2440  */
2441 function print_mnet_log() {
2442     throw new coding_exception('print_mnet_log() can not be used anymore. Please use the ' .
2443         'report_log framework instead.');
2446 /**
2447  * @deprecated since Moodle 3.2
2448  */
2449 function print_log_csv() {
2450     throw new coding_exception('print_log_csv() can not be used anymore. Please use the ' .
2451         'report_log framework instead.');
2454 /**
2455  * @deprecated since Moodle 3.2
2456  */
2457 function print_log_xls() {
2458     throw new coding_exception('print_log_xls() can not be used anymore. Please use the ' .
2459         'report_log framework instead.');
2462 /**
2463  * @deprecated since Moodle 3.2
2464  */
2465 function print_log_ods() {
2466     throw new coding_exception('print_log_ods() can not be used anymore. Please use the ' .
2467         'report_log framework instead.');
2470 /**
2471  * @deprecated since Moodle 3.2
2472  */
2473 function build_logs_array() {
2474     throw new coding_exception('build_logs_array() can not be used anymore. Please use the ' .
2475         'report_log framework instead.');
2478 /**
2479  * @deprecated since Moodle 3.2
2480  */
2481 function get_logs_usercourse() {
2482     throw new coding_exception('get_logs_usercourse() can not be used anymore. Please use the ' .
2483         'report_log framework instead.');
2486 /**
2487  * @deprecated since Moodle 3.2
2488  */
2489 function get_logs_userday() {
2490     throw new coding_exception('get_logs_userday() can not be used anymore. Please use the ' .
2491         'report_log framework instead.');
2494 /**
2495  * @deprecated since Moodle 3.2
2496  */
2497 function get_logs() {
2498     throw new coding_exception('get_logs() can not be used anymore. Please use the ' .
2499         'report_log framework instead.');
2502 /**
2503  * @deprecated since Moodle 3.2
2504  */
2505 function prevent_form_autofill_password() {
2506     throw new coding_exception('prevent_form_autofill_password() can not be used anymore.');
2509 /**
2510  * @deprecated since Moodle 3.3 MDL-57370
2511  */
2512 function message_get_recent_conversations($userorid, $limitfrom = 0, $limitto = 100) {
2513     throw new coding_exception('message_get_recent_conversations() can not be used any more. ' .
2514         'Please use \core_message\api::get_conversations() instead.', DEBUG_DEVELOPER);
2517 /**
2518  * @deprecated since Moodle 3.2
2519  */
2520 function calendar_preferences_button() {
2521     throw new coding_exception('calendar_preferences_button() can not be used anymore. The calendar ' .
2522         'preferences are now linked to the user preferences page.');
2525 /**
2526  * Return the name of the weekday
2527  *
2528  * @deprecated since 3.3
2529  * @todo The final deprecation of this function will take place in Moodle 3.7 - see MDL-57617.
2530  * @param string $englishname
2531  * @return string of the weekeday
2532  */
2533 function calendar_wday_name($englishname) {
2534     debugging(__FUNCTION__ . '() is deprecated and no longer used in core.', DEBUG_DEVELOPER);
2535     return get_string(strtolower($englishname), 'calendar');
2538 /**
2539  * Get the upcoming event block.
2540  *
2541  * @deprecated since 3.3
2542  * @todo The final deprecation of this function will take place in Moodle 3.7 - see MDL-57617.
2543  * @param array $events list of events
2544  * @param moodle_url|string $linkhref link to event referer
2545  * @param boolean $showcourselink whether links to courses should be shown
2546  * @return string|null $content html block content
2547  */
2548 function calendar_get_block_upcoming($events, $linkhref = null, $showcourselink = false) {
2549     global $CFG;
2551     debugging(
2552             __FUNCTION__ . '() has been deprecated. ' .
2553             'Please see block_calendar_upcoming::get_content() for the correct API usage.',
2554             DEBUG_DEVELOPER
2555         );
2557     require_once($CFG->dirroot . '/blocks/moodleblock.class.php');
2558     require_once($CFG->dirroot . '/blocks/calendar_upcoming/block_calendar_upcoming.php');
2559     return block_calendar_upcoming::get_upcoming_content($events, $linkhref, $showcourselink);
2562 /**
2563  * Display month selector options.
2564  *
2565  * @deprecated since 3.3
2566  * @todo The final deprecation of this function will take place in Moodle 3.7 - see MDL-57617.
2567  * @param string $name for the select element
2568  * @param string|array $selected options for select elements
2569  */
2570 function calendar_print_month_selector($name, $selected) {
2571     debugging(__FUNCTION__ . '() is deprecated and no longer used in core.', DEBUG_DEVELOPER);
2572     $months = array();
2573     for ($i = 1; $i <= 12; $i++) {
2574         $months[$i] = userdate(gmmktime(12, 0, 0, $i, 15, 2000), '%B');
2575     }
2576     echo html_writer::label(get_string('months'), 'menu'. $name, false, array('class' => 'accesshide'));
2577     echo html_writer::select($months, $name, $selected, false);
2580 /**
2581  * Update calendar subscriptions.
2582  *
2583  * @deprecated since 3.3
2584  * @todo The final deprecation of this function will take place in Moodle 3.7 - see MDL-57617.
2585  * @return bool
2586  */
2587 function calendar_cron() {
2588     debugging(__FUNCTION__ . '() is deprecated and should not be used. Please use the core\task\calendar_cron_task instead.',
2589         DEBUG_DEVELOPER);
2591     global $CFG, $DB;
2593     require_once($CFG->dirroot . '/calendar/lib.php');
2594     // In order to execute this we need bennu.
2595     require_once($CFG->libdir.'/bennu/bennu.inc.php');
2597     mtrace('Updating calendar subscriptions:');
2598     cron_trace_time_and_memory();
2600     $time = time();
2601     $subscriptions = $DB->get_records_sql('SELECT * FROM {event_subscriptions} WHERE pollinterval > 0
2602       AND lastupdated + pollinterval < ?', array($time));
2603     foreach ($subscriptions as $sub) {
2604         mtrace("Updating calendar subscription {$sub->name} in course {$sub->courseid}");
2605         try {
2606             $log = calendar_update_subscription_events($sub->id);
2607             mtrace(trim(strip_tags($log)));
2608         } catch (moodle_exception $ex) {
2609             mtrace('Error updating calendar subscription: ' . $ex->getMessage());
2610         }
2611     }
2613     mtrace('Finished updating calendar subscriptions.');
2615     return true;
2618 /**
2619  * @deprecated since Moodle 3.4 and removed immediately. MDL-49398.
2620  */
2621 function load_course_context() {
2622     throw new coding_exception('load_course_context() is removed. Do not use private functions or data structures.');
2625 /**
2626  * @deprecated since Moodle 3.4 and removed immediately. MDL-49398.
2627  */
2628 function load_role_access_by_context() {
2629     throw new coding_exception('load_role_access_by_context() is removed. Do not use private functions or data structures.');
2632 /**
2633  * @deprecated since Moodle 3.4 and removed immediately. MDL-49398.
2634  */
2635 function dedupe_user_access() {
2636     throw new coding_exception('dedupe_user_access() is removed. Do not use private functions or data structures.');
2639 /**
2640  * Previous internal API, it was not supposed to be used anywhere.
2641  * Return a nested array showing role assignments
2642  * and all relevant role capabilities for the user.
2643  *
2644  * [ra]   => [/path][roleid]=roleid
2645  * [rdef] => ["$contextpath:$roleid"][capability]=permission
2646  *
2647  * @access private
2648  * @deprecated since Moodle 3.4. MDL-49398.
2649  * @param int $userid - the id of the user
2650  * @return array access info array
2651  */
2652 function get_user_access_sitewide($userid) {
2653     debugging('get_user_access_sitewide() is deprecated. Do not use private functions or data structures.', DEBUG_DEVELOPER);
2655     $accessdata = get_user_accessdata($userid);
2656     $accessdata['rdef'] = array();
2657     $roles = array();
2659     foreach ($accessdata['ra'] as $path => $pathroles) {
2660         $roles = array_merge($pathroles, $roles);
2661     }
2663     $rdefs = get_role_definitions($roles);
2665     foreach ($rdefs as $roleid => $rdef) {
2666         foreach ($rdef as $path => $caps) {
2667             $accessdata['rdef']["$path:$roleid"] = $caps;
2668         }
2669     }
2671     return $accessdata;
2674 /**
2675  * Generates the HTML for a miniature calendar.
2676  *
2677  * @param array $courses list of course to list events from
2678  * @param array $groups list of group
2679  * @param array $users user's info
2680  * @param int|bool $calmonth calendar month in numeric, default is set to false
2681  * @param int|bool $calyear calendar month in numeric, default is set to false
2682  * @param string|bool $placement the place/page the calendar is set to appear - passed on the the controls function
2683  * @param int|bool $courseid id of the course the calendar is displayed on - passed on the the controls function
2684  * @param int $time the unixtimestamp representing the date we want to view, this is used instead of $calmonth
2685  *     and $calyear to support multiple calendars
2686  * @return string $content return html table for mini calendar
2687  * @deprecated since Moodle 3.4. MDL-59333
2688  */
2689 function calendar_get_mini($courses, $groups, $users, $calmonth = false, $calyear = false, $placement = false,
2690                            $courseid = false, $time = 0) {
2691     global $PAGE;
2693     debugging('calendar_get_mini() has been deprecated. Please update your code to use calendar_get_view.',
2694         DEBUG_DEVELOPER);
2696     if (!empty($calmonth) && !empty($calyear)) {
2697         // Do this check for backwards compatibility.
2698         // The core should be passing a timestamp rather than month and year.
2699         // If a month and year are passed they will be in Gregorian.
2700         // Ensure it is a valid date, else we will just set it to the current timestamp.
2701         if (checkdate($calmonth, 1, $calyear)) {
2702             $time = make_timestamp($calyear, $calmonth, 1);
2703         } else {
2704             $time = time();
2705         }
2706     } else if (empty($time)) {
2707         // Get the current date in the calendar type being used.
2708         $time = time();
2709     }
2711     if ($courseid == SITEID) {
2712         $course = get_site();
2713     } else {
2714         $course = get_course($courseid);
2715     }
2716     $calendar = new calendar_information(0, 0, 0, $time);
2717     $calendar->prepare_for_view($course, $courses);
2719     $renderer = $PAGE->get_renderer('core_calendar');
2720     list($data, $template) = calendar_get_view($calendar, 'mini');
2721     return $renderer->render_from_template($template, $data);
2724 /**
2725  * Gets the calendar upcoming event.
2726  *
2727  * @param array $courses array of courses
2728  * @param array|int|bool $groups array of groups, group id or boolean for all/no group events
2729  * @param array|int|bool $users array of users, user id or boolean for all/no user events
2730  * @param int $daysinfuture number of days in the future we 'll look
2731  * @param int $maxevents maximum number of events
2732  * @param int $fromtime start time
2733  * @return array $output array of upcoming events
2734  * @deprecated since Moodle 3.4. MDL-59333
2735  */
2736 function calendar_get_upcoming($courses, $groups, $users, $daysinfuture, $maxevents, $fromtime=0) {
2737     debugging(
2738             'calendar_get_upcoming() has been deprecated. ' .
2739             'Please see block_calendar_upcoming::get_content() for the correct API usage.',
2740             DEBUG_DEVELOPER
2741         );
2743     global $COURSE;
2745     $display = new \stdClass;
2746     $display->range = $daysinfuture; // How many days in the future we 'll look.
2747     $display->maxevents = $maxevents;
2749     $output = array();
2751     $processed = 0;
2752     $now = time(); // We 'll need this later.
2753     $usermidnighttoday = usergetmidnight($now);
2755     if ($fromtime) {
2756         $display->tstart = $fromtime;
2757     } else {
2758         $display->tstart = $usermidnighttoday;
2759     }
2761     // This works correctly with respect to the user's DST, but it is accurate
2762     // only because $fromtime is always the exact midnight of some day!
2763     $display->tend = usergetmidnight($display->tstart + DAYSECS * $display->range + 3 * HOURSECS) - 1;
2765     // Get the events matching our criteria.
2766     $events = calendar_get_legacy_events($display->tstart, $display->tend, $users, $groups, $courses);
2768     // This is either a genius idea or an idiot idea: in order to not complicate things, we use this rule: if, after
2769     // possibly removing SITEID from $courses, there is only one course left, then clicking on a day in the month
2770     // will also set the $SESSION->cal_courses_shown variable to that one course. Otherwise, we 'd need to add extra
2771     // arguments to this function.
2772     $hrefparams = array();
2773     if (!empty($courses)) {
2774         $courses = array_diff($courses, array(SITEID));
2775         if (count($courses) == 1) {
2776             $hrefparams['course'] = reset($courses);
2777         }
2778     }
2780     if ($events !== false) {
2781         foreach ($events as $event) {
2782             if (!empty($event->modulename)) {
2783                 $instances = get_fast_modinfo($event->courseid)->get_instances_of($event->modulename);
2784                 if (empty($instances[$event->instance]->uservisible)) {
2785                     continue;
2786                 }
2787             }
2789             if ($processed >= $display->maxevents) {
2790                 break;
2791             }
2793             $event->time = calendar_format_event_time($event, $now, $hrefparams);
2794             $output[] = $event;
2795             $processed++;
2796         }
2797     }
2799     return $output;
2802 /**
2803  * Creates a record in the role_allow_override table
2804  *
2805  * @param int $sroleid source roleid
2806  * @param int $troleid target roleid
2807  * @return void
2808  * @deprecated since Moodle 3.4. MDL-50666
2809  */
2810 function allow_override($sroleid, $troleid) {
2811     debugging('allow_override() has been deprecated. Please update your code to use core_role_set_override_allowed.',
2812             DEBUG_DEVELOPER);
2814     core_role_set_override_allowed($sroleid, $troleid);
2817 /**
2818  * Creates a record in the role_allow_assign table
2819  *
2820  * @param int $fromroleid source roleid
2821  * @param int $targetroleid target roleid
2822  * @return void
2823  * @deprecated since Moodle 3.4. MDL-50666
2824  */
2825 function allow_assign($fromroleid, $targetroleid) {
2826     debugging('allow_assign() has been deprecated. Please update your code to use core_role_set_assign_allowed.',
2827             DEBUG_DEVELOPER);
2829     core_role_set_assign_allowed($fromroleid, $targetroleid);
2832 /**
2833  * Creates a record in the role_allow_switch table
2834  *
2835  * @param int $fromroleid source roleid
2836  * @param int $targetroleid target roleid
2837  * @return void
2838  * @deprecated since Moodle 3.4. MDL-50666
2839  */
2840 function allow_switch($fromroleid, $targetroleid) {
2841     debugging('allow_switch() has been deprecated. Please update your code to use core_role_set_switch_allowed.',
2842             DEBUG_DEVELOPER);
2844     core_role_set_switch_allowed($fromroleid, $targetroleid);
2847 /**
2848  * Organise categories into a single parent category (called the 'Top' category) per context.
2849  *
2850  * @param array $categories List of question categories in the format of ["$categoryid,$contextid" => $category].
2851  * @param array $pcontexts List of context ids.
2852  * @return array
2853  * @deprecated since Moodle 3.5. MDL-61132
2854  */
2855 function question_add_tops($categories, $pcontexts) {
2856     debugging('question_add_tops() has been deprecated. You may want to pass $top = true to get_categories_for_contexts().',
2857             DEBUG_DEVELOPER);
2859     $topcats = array();
2860     foreach ($pcontexts as $contextid) {
2861         $topcat = question_get_top_category($contextid, true);
2862         $context = context::instance_by_id($contextid);
2864         $newcat = new stdClass();
2865         $newcat->id = "{$topcat->id},$contextid";
2866         $newcat->name = get_string('topfor', 'question', $context->get_context_name(false));
2867         $newcat->parent = 0;
2868         $newcat->contextid = $contextid;
2869         $topcats["{$topcat->id},$contextid"] = $newcat;
2870     }
2871     // Put topcats in at beginning of array - they'll be sorted into different contexts later.
2872     return array_merge($topcats, $categories);
2875 /**
2876  * Checks if the question category is the highest-level category in the context that can be edited, and has no siblings.
2877  *
2878  * @param int $categoryid a category id.
2879  * @return bool
2880  * @deprecated since Moodle 3.5. MDL-61132
2881  */
2882 function question_is_only_toplevel_category_in_context($categoryid) {
2883     debugging('question_is_only_toplevel_category_in_context() has been deprecated. '
2884             . 'Please update your code to use question_is_only_child_of_top_category_in_context() instead.',
2885             DEBUG_DEVELOPER);
2887     return question_is_only_child_of_top_category_in_context($categoryid);
2890 /**
2891  * Moves messages from a particular user from the message table (unread messages) to message_read
2892  * This is typically only used when a user is deleted
2893  *
2894  * @param object $userid User id
2895  * @return boolean success
2896  * @deprecated since Moodle 3.5
2897  */
2898 function message_move_userfrom_unread2read($userid) {
2899     debugging('message_move_userfrom_unread2read() is deprecated and is no longer used.', DEBUG_DEVELOPER);
2901     global $DB;
2903     // Move all unread messages from message table to message_read.
2904     if ($messages = $DB->get_records_select('message', 'useridfrom = ?', array($userid), 'timecreated')) {
2905         foreach ($messages as $message) {
2906             message_mark_message_read($message, 0); // Set timeread to 0 as the message was never read.
2907         }
2908     }
2909     return true;
2912 /**
2913  * Retrieve users blocked by $user1
2914  *
2915  * @param object $user1 the user whose messages are being viewed
2916  * @param object $user2 the user $user1 is talking to. If they are being blocked
2917  *                      they will have a variable called 'isblocked' added to their user object
2918  * @return array the users blocked by $user1
2919  * @deprecated since Moodle 3.5
2920  */
2921 function message_get_blocked_users($user1=null, $user2=null) {
2922     debugging('message_get_blocked_users() is deprecated, please use \core_message\api::get_blocked_users() instead.',
2923         DEBUG_DEVELOPER);
2925     global $USER;
2927     if (empty($user1)) {
2928         $user1 = new stdClass();
2929         $user1->id = $USER->id;
2930     }
2932     return \core_message\api::get_blocked_users($user1->id);
2935 /**
2936  * Retrieve $user1's contacts (online, offline and strangers)
2937  *
2938  * @param object $user1 the user whose messages are being viewed
2939  * @param object $user2 the user $user1 is talking to. If they are a contact
2940  *                      they will have a variable called 'iscontact' added to their user object
2941  * @return array containing 3 arrays. array($onlinecontacts, $offlinecontacts, $strangers)
2942  * @deprecated since Moodle 3.5
2943  */
2944 function message_get_contacts($user1=null, $user2=null) {
2945     debugging('message_get_contacts() is deprecated and is no longer used.', DEBUG_DEVELOPER);
2947     global $DB, $CFG, $USER;
2949     if (empty($user1)) {
2950         $user1 = $USER;
2951     }
2953     if (!empty($user2)) {
2954         $user2->iscontact = false;
2955     }
2957     $timetoshowusers = 300; // Seconds default.
2958     if (isset($CFG->block_online_users_timetosee)) {
2959         $timetoshowusers = $CFG->block_online_users_timetosee * 60;
2960     }
2962     // Rime which a user is counting as being active since.
2963     $timefrom = time() - $timetoshowusers;
2965     // People in our contactlist who are online.
2966     $onlinecontacts  = array();
2967     // People in our contactlist who are offline.
2968     $offlinecontacts = array();
2969     // People who are not in our contactlist but have sent us a message.
2970     $strangers       = array();
2972     // Get all in our contact list who are not blocked in our and count messages we have waiting from each of them.
2973     $rs = \core_message\api::get_contacts_with_unread_message_count($user1->id);
2974     foreach ($rs as $rd) {
2975         if ($rd->lastaccess >= $timefrom) {
2976             // They have been active recently, so are counted online.
2977             $onlinecontacts[] = $rd;
2979         } else {
2980             $offlinecontacts[] = $rd;
2981         }
2983         if (!empty($user2) && $user2->id == $rd->id) {
2984             $user2->iscontact = true;
2985         }
2986     }
2988     // Get messages from anyone who isn't in our contact list and count the number of messages we have from each of them.
2989     $rs = \core_message\api::get_non_contacts_with_unread_message_count($user1->id);
2990     // Add user id as array index, so supportuser and noreply user don't get duplicated (if they are real users).
2991     foreach ($rs as $rd) {
2992         $strangers[$rd->id] = $rd;
2993     }
2995     // Add noreply user and support user to the list, if they don't exist.
2996     $supportuser = core_user::get_support_user();
2997     if (!isset($strangers[$supportuser->id]) && !$supportuser->deleted) {
2998         $supportuser->messagecount = message_count_unread_messages($USER, $supportuser);
2999         if ($supportuser->messagecount > 0) {
3000             $strangers[$supportuser->id] = $supportuser;
3001         }
3002     }
3004     $noreplyuser = core_user::get_noreply_user();
3005     if (!isset($strangers[$noreplyuser->id]) && !$noreplyuser->deleted) {
3006         $noreplyuser->messagecount = message_count_unread_messages($USER, $noreplyuser);
3007         if ($noreplyuser->messagecount > 0) {
3008             $strangers[$noreplyuser->id] = $noreplyuser;
3009         }
3010     }
3012     return array($onlinecontacts, $offlinecontacts, $strangers);
3015 /**
3016  * Mark a single message as read
3017  *
3018  * @param stdClass $message An object with an object property ie $message->id which is an id in the message table
3019  * @param int $timeread the timestamp for when the message should be marked read. Usually time().
3020  * @param bool $messageworkingempty Is the message_working table already confirmed empty for this message?
3021  * @return int the ID of the message in the messags table
3022  * @deprecated since Moodle 3.5
3023  */
3024 function message_mark_message_read($message, $timeread, $messageworkingempty=false) {
3025     debugging('message_mark_message_read() is deprecated, please use \core_message\api::mark_message_as_read()
3026         or \core_message\api::mark_notification_as_read().', DEBUG_DEVELOPER);
3028     if (!empty($message->notification)) {
3029         \core_message\api::mark_notification_as_read($message, $timeread);
3030     } else {
3031         \core_message\api::mark_message_as_read($message->useridto, $message, $timeread);
3032     }
3034     return $message->id;
3038 /**
3039  * Checks if a user can delete a message.
3040  *
3041  * @param stdClass $message the message to delete
3042  * @param string $userid the user id of who we want to delete the message for (this may be done by the admin
3043  *  but will still seem as if it was by the user)
3044  * @return bool Returns true if a user can delete the message, false otherwise.
3045  * @deprecated since Moodle 3.5
3046  */
3047 function message_can_delete_message($message, $userid) {
3048     debugging('message_can_delete_message() is deprecated, please use \core_message\api::can_delete_message() instead.',
3049         DEBUG_DEVELOPER);
3051     return \core_message\api::can_delete_message($userid, $message->id);
3054 /**
3055  * Deletes a message.
3056  *
3057  * This function does not verify any permissions.
3058  *
3059  * @param stdClass $message the message to delete
3060  * @param string $userid the user id of who we want to delete the message for (this may be done by the admin
3061  *  but will still seem as if it was by the user)
3062  * @return bool
3063  * @deprecated since Moodle 3.5
3064  */
3065 function message_delete_message($message, $userid) {
3066     debugging('message_delete_message() is deprecated, please use \core_message\api::delete_message() instead.',
3067         DEBUG_DEVELOPER);
3069     return \core_message\api::delete_message($userid, $message->id);
3072 /**
3073  * Get all of the allowed types for all of the courses and groups
3074  * the logged in user belongs to.
3075  *
3076  * The returned array will optionally have 5 keys:
3077  *      'user' : true if the logged in user can create user events
3078  *      'site' : true if the logged in user can create site events
3079  *      'category' : array of course categories that the user can create events for
3080  *      'course' : array of courses that the user can create events for
3081  *      'group': array of groups that the user can create events for
3082  *      'groupcourses' : array of courses that the groups belong to (can
3083  *                       be different from the list in 'course'.
3084  * @deprecated since 3.6
3085  * @return array The array of allowed types.
3086  */
3087 function calendar_get_all_allowed_types() {
3088     debugging('calendar_get_all_allowed_types() is deprecated. Please use calendar_get_allowed_types() instead.',
3089         DEBUG_DEVELOPER);
3091     global $CFG, $USER, $DB;
3093     require_once($CFG->libdir . '/enrollib.php');
3095     $types = [];
3097     $allowed = new stdClass();
3099     calendar_get_allowed_types($allowed);
3101     if ($allowed->user) {
3102         $types['user'] = true;
3103     }
3105     if ($allowed->site) {
3106         $types['site'] = true;
3107     }
3109     if (coursecat::has_manage_capability_on_any()) {
3110         $types['category'] = coursecat::make_categories_list('moodle/category:manage');
3111     }
3113     // This function warms the context cache for the course so the calls
3114     // to load the course context in calendar_get_allowed_types don't result
3115     // in additional DB queries.
3116     $courses = calendar_get_default_courses(null, 'id, groupmode, groupmodeforce', true);
3118     // We want to pre-fetch all of the groups for each course in a single
3119     // query to avoid calendar_get_allowed_types from hitting the DB for
3120     // each separate course.
3121     $groups = groups_get_all_groups_for_courses($courses);
3123     foreach ($courses as $course) {
3124         $coursegroups = isset($groups[$course->id]) ? $groups[$course->id] : null;
3125         calendar_get_allowed_types($allowed, $course, $coursegroups);
3127         if (!empty($allowed->courses)) {
3128             $types['course'][$course->id] = $course;
3129         }
3131         if (!empty($allowed->groups)) {
3132             $types['groupcourses'][$course->id] = $course;
3134             if (!isset($types['group'])) {
3135                 $types['group'] = array_values($allowed->groups);
3136             } else {
3137                 $types['group'] = array_merge($types['group'], array_values($allowed->groups));
3138             }
3139         }
3140     }
3142     return $types;
3145 /**
3146  * Gets array of all groups in a set of course.
3147  *
3148  * @category group
3149  * @param array $courses Array of course objects or course ids.
3150  * @return array Array of groups indexed by course id.
3151  */
3152 function groups_get_all_groups_for_courses($courses) {
3153     global $DB;
3155     if (empty($courses)) {
3156         return [];
3157     }
3159     $groups = [];
3160     $courseids = [];
3162     foreach ($courses as $course) {
3163         $courseid = is_object($course) ? $course->id : $course;
3164         $groups[$courseid] = [];
3165         $courseids[] = $courseid;
3166     }
3168     $groupfields = [
3169         'g.id as gid',
3170         'g.courseid',
3171         'g.idnumber',
3172         'g.name',
3173         'g.description',
3174         'g.descriptionformat',
3175         'g.enrolmentkey',
3176         'g.picture',
3177         'g.hidepicture',
3178         'g.timecreated',
3179         'g.timemodified'
3180     ];
3182     $groupsmembersfields = [
3183         'gm.id as gmid',
3184         'gm.groupid',
3185         'gm.userid',
3186         'gm.timeadded',
3187         'gm.component',
3188         'gm.itemid'
3189     ];
3191     $concatidsql = $DB->sql_concat_join("'-'", ['g.id', 'COALESCE(gm.id, 0)']) . ' AS uniqid';
3192     list($courseidsql, $params) = $DB->get_in_or_equal($courseids);
3193     $groupfieldssql = implode(',', $groupfields);
3194     $groupmembersfieldssql = implode(',', $groupsmembersfields);
3195     $sql = "SELECT {$concatidsql}, {$groupfieldssql}, {$groupmembersfieldssql}
3196               FROM {groups} g
3197          LEFT JOIN {groups_members} gm
3198                 ON gm.groupid = g.id
3199              WHERE g.courseid {$courseidsql}";
3201     $results = $DB->get_records_sql($sql, $params);
3203     // The results will come back as a flat dataset thanks to the left
3204     // join so we will need to do some post processing to blow it out
3205     // into a more usable data structure.
3206     //
3207     // This loop will extract the distinct groups from the result set
3208     // and add it's list of members to the object as a property called
3209     // 'members'. Then each group will be added to the result set indexed
3210     // by it's course id.
3211     //
3212     // The resulting data structure for $groups should be:
3213     // $groups = [
3214     //      '1' = [
3215     //          '1' => (object) [
3216     //              'id' => 1,
3217     //              <rest of group properties>
3218     //              'members' => [
3219     //                  '1' => (object) [
3220     //                      <group member properties>
3221     //                  ],
3222     //                  '2' => (object) [
3223     //                      <group member properties>
3224     //                  ]
3225     //              ]
3226     //          ],
3227     //          '2' => (object) [
3228     //              'id' => 2,
3229     //              <rest of group properties>
3230     //              'members' => [
3231     //                  '1' => (object) [
3232     //                      <group member properties>
3233     //                  ],
3234     //                  '3' => (object) [
3235     //                      <group member properties>
3236     //                  ]
3237     //              ]
3238     //          ]
3239     //      ]
3240     // ]
3241     //
3242     foreach ($results as $key => $result) {
3243         $groupid = $result->gid;
3244         $courseid = $result->courseid;
3245         $coursegroups = $groups[$courseid];
3246         $groupsmembersid = $result->gmid;
3247         $reducefunc = function($carry, $field) use ($result) {
3248             // Iterate over the groups properties and pull
3249             // them out into a separate object.
3250             list($prefix, $field) = explode('.', $field);
3252             if (property_exists($result, $field)) {
3253                 $carry[$field] = $result->{$field};
3254             }
3256             return $carry;
3257         };
3259         if (isset($coursegroups[$groupid])) {
3260             $group = $coursegroups[$groupid];
3261         } else {
3262             $initial = [
3263                 'id' => $groupid,
3264                 'members' => []
3265             ];
3266             $group = (object) array_reduce(
3267                 $groupfields,
3268                 $reducefunc,
3269                 $initial
3270             );
3271         }
3273         if (!empty($groupsmembersid)) {
3274             $initial = ['id' => $groupsmembersid];
3275             $groupsmembers = (object) array_reduce(
3276                 $groupsmembersfields,
3277                 $reducefunc,
3278                 $initial
3279             );
3281             $group->members[$groupsmembers->userid] = $groupsmembers;
3282         }
3284         $coursegroups[$groupid] = $group;
3285         $groups[$courseid] = $coursegroups;
3286     }
3288     return $groups;
3291 /**
3292  * Gets the capabilities that have been cached in the database for this
3293  * component.
3294  * @deprecated since Moodle 3.6. Please use the Events 2 API.
3295  * @todo final deprecation. To be removed in Moodle 4.0
3296  *
3297  * @access protected To be used from eventslib only
3298  *
3299  * @param string $component examples: 'moodle', 'mod_forum', 'block_quiz_results'
3300  * @return array of events
3301  */
3302 function events_get_cached($component) {
3303     global $DB;
3305     debugging('Events API using $handlers array has been deprecated in favour of Events 2 API, please use it instead.',
3306             DEBUG_DEVELOPER);
3308     $cachedhandlers = array();
3310     if ($storedhandlers = $DB->get_records('events_handlers', array('component'=>$component))) {
3311         foreach ($storedhandlers as $handler) {
3312             $cachedhandlers[$handler->eventname] = array (
3313                 'id'              => $handler->id,
3314                 'handlerfile'     => $handler->handlerfile,
3315                 'handlerfunction' => $handler->handlerfunction,
3316                 'schedule'        => $handler->schedule,
3317                 'internal'        => $handler->internal);
3318         }
3319     }
3321     return $cachedhandlers;
3324 /**
3325  * Remove all event handlers and queued events
3326  * @deprecated since Moodle 3.6. Please use the Events 2 API.
3327  * @todo final deprecation. To be removed in Moodle 4.0
3328  *
3329  * @category event
3330  * @param string $component examples: 'moodle', 'mod_forum', 'block_quiz_results'
3331  */
3332 function events_uninstall($component) {
3333     debugging('Events API using $handlers array has been deprecated in favour of Events 2 API, please use it instead.',
3334             DEBUG_DEVELOPER);
3335     $cachedhandlers = events_get_cached($component);
3336     events_cleanup($component, $cachedhandlers);
3338     events_get_handlers('reset');
3341 /**
3342  * Deletes cached events that are no longer needed by the component.
3343  * @deprecated since Moodle 3.6. Please use the Events 2 API.
3344  * @todo final deprecation. To be removed in Moodle 4.0
3345  *
3346  * @access protected To be used from eventslib only
3347  *
3348  * @param string $component examples: 'moodle', 'mod_forum', 'block_quiz_results'
3349  * @param array $cachedhandlers array of the cached events definitions that will be
3350  * @return int number of unused handlers that have been removed
3351  */
3352 function events_cleanup($component, $cachedhandlers) {
3353     global $DB;
3354     debugging('Events API using $handlers array has been deprecated in favour of Events 2 API, please use it instead.',
3355             DEBUG_DEVELOPER);
3356     $deletecount = 0;
3357     foreach ($cachedhandlers as $eventname => $cachedhandler) {
3358         if ($qhandlers = $DB->get_records('events_queue_handlers', array('handlerid'=>$cachedhandler['id']))) {
3359             //debugging("Removing pending events from queue before deleting of event handler: $component - $eventname");
3360             foreach ($qhandlers as $qhandler) {
3361                 events_dequeue($qhandler);
3362             }
3363         }
3364         $DB->delete_records('events_handlers', array('eventname'=>$eventname, 'component'=>$component));
3365         $deletecount++;
3366     }
3368     return $deletecount;
3371 /**
3372  * Removes this queued handler from the events_queued_handler table
3373  *
3374  * Removes events_queue record from events_queue if no more references to this event object exists
3375  * @deprecated since Moodle 3.6. Please use the Events 2 API.
3376  * @todo final deprecation. To be removed in Moodle 4.0
3377  *
3378  * @access protected To be used from eventslib only
3379  *
3380  * @param stdClass $qhandler A row from the events_queued_handler table
3381  */
3382 function events_dequeue($qhandler) {
3383     global $DB;
3384     debugging('Events API using $handlers array has been deprecated in favour of Events 2 API, please use it instead.',
3385             DEBUG_DEVELOPER);
3386     // first delete the queue handler
3387     $DB->delete_records('events_queue_handlers', array('id'=>$qhandler->id));
3389     // if no more queued handler is pointing to the same event - delete the event too
3390     if (!$DB->record_exists('events_queue_handlers', array('queuedeventid'=>$qhandler->queuedeventid))) {
3391         $DB->delete_records('events_queue', array('id'=>$qhandler->queuedeventid));
3392     }
3395 /**
3396  * Returns handlers for given event. Uses caching for better perf.
3397  * @deprecated since Moodle 3.6. Please use the Events 2 API.
3398  * @todo final deprecation. To be removed in Moodle 4.0
3399  *
3400  * @access protected To be used from eventslib only
3401  *
3402  * @staticvar array $handlers
3403  * @param string $eventname name of event or 'reset'
3404  * @return array|false array of handlers or false otherwise
3405  */
3406 function events_get_handlers($eventname) {
3407     global $DB;
3408     static $handlers = array();
3409     debugging('Events API using $handlers array has been deprecated in favour of Events 2 API, please use it instead.',
3410             DEBUG_DEVELOPER);
3412     if ($eventname === 'reset') {
3413         $handlers = array();
3414         return false;
3415     }
3417     if (!array_key_exists($eventname, $handlers)) {
3418         $handlers[$eventname] = $DB->get_records('events_handlers', array('eventname'=>$eventname));
3419     }
3421     return $handlers[$eventname];
3424 /**
3425  * This function finds the roles assigned directly to this context only
3426  * i.e. no roles in parent contexts
3427  *
3428  * @deprecated since Moodle 3.6. Please use the get_roles_used_in_context().
3429  * @todo final deprecation. To be removed in Moodle 4.0
3430  * @param context $context
3431  * @return array
3432  */
3433 function get_roles_on_exact_context(context $context) {
3434     debugging('get_roles_on_exact_context() is deprecated, please use get_roles_used_in_context() instead.',
3435         DEBUG_DEVELOPER);
3437     return get_roles_used_in_context($context, false);
3440 /**
3441  * Find out which roles has assignment on this context
3442  *
3443  * @deprecated since Moodle 3.6. Please use the get_roles_used_in_context().
3444  * @todo final deprecation. To be removed in Moodle 4.0
3445  * @param context $context
3446  * @return array
3447  */
3448 function get_roles_with_assignment_on_context(context $context) {
3449     debugging('get_roles_with_assignment_on_context() is deprecated, please use get_roles_used_in_context() instead.',
3450         DEBUG_DEVELOPER);
3452     return get_roles_used_in_context($context, false);