Merge branch 'MDL-63012-master' of https://github.com/jobyh/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  * Prints the 'update this xxx' button that appears on module pages.
908  *
909  * @deprecated since Moodle 3.2
910  *
911  * @param string $cmid the course_module id.
912  * @param string $ignored not used any more. (Used to be courseid.)
913  * @param string $string the module name - get_string('modulename', 'xxx')
914  * @return string the HTML for the button, if this user has permission to edit it, else an empty string.
915  */
916 function update_module_button($cmid, $ignored, $string) {
917     global $CFG, $OUTPUT;
919     debugging('update_module_button() has been deprecated and should not be used anymore. Activity modules should not add the ' .
920         'edit module button, the link is already available in the Administration block. Themes can choose to display the link ' .
921         'in the buttons row consistently for all module types.', DEBUG_DEVELOPER);
923     if (has_capability('moodle/course:manageactivities', context_module::instance($cmid))) {
924         $string = get_string('updatethis', '', $string);
926         $url = new moodle_url("$CFG->wwwroot/course/mod.php", array('update' => $cmid, 'return' => true, 'sesskey' => sesskey()));
927         return $OUTPUT->single_button($url, $string);
928     } else {
929         return '';
930     }
933 /**
934  * @deprecated use $OUTPUT->navbar() instead
935  */
936 function print_navigation () {
937     throw new coding_exception('print_navigation() can not be used any more, please update use $OUTPUT->navbar() instead.');
940 /**
941  * @deprecated Please use $PAGE->navabar methods instead.
942  */
943 function build_navigation() {
944     throw new coding_exception('build_navigation() can not be used any more, please use $PAGE->navbar methods instead.');
947 /**
948  * @deprecated not relevant with global navigation in Moodle 2.x+
949  */
950 function navmenu() {
951     throw new coding_exception('navmenu() can not be used any more, it is no longer relevant with global navigation.');
954 /// CALENDAR MANAGEMENT  ////////////////////////////////////////////////////////////////
957 /**
958  * @deprecated please use calendar_event::create() instead.
959  */
960 function add_event() {
961     throw new coding_exception('add_event() can not be used any more, please use calendar_event::create() instead.');
964 /**
965  * @deprecated please calendar_event->update() instead.
966  */
967 function update_event() {
968     throw new coding_exception('update_event() is removed, please use calendar_event->update() instead.');
971 /**
972  * @deprecated please use calendar_event->delete() instead.
973  */
974 function delete_event() {
975     throw new coding_exception('delete_event() can not be used any more, please use '.
976         'calendar_event->delete() instead.');
979 /**
980  * @deprecated please use calendar_event->toggle_visibility(false) instead.
981  */
982 function hide_event() {
983     throw new coding_exception('hide_event() can not be used any more, please use '.
984         'calendar_event->toggle_visibility(false) instead.');
987 /**
988  * @deprecated please use calendar_event->toggle_visibility(true) instead.
989  */
990 function show_event() {
991     throw new coding_exception('show_event() can not be used any more, please use '.
992         'calendar_event->toggle_visibility(true) instead.');
995 /**
996  * @deprecated since Moodle 2.2 use core_text::xxxx() instead.
997  */
998 function textlib_get_instance() {
999     throw new coding_exception('textlib_get_instance() can not be used any more, please use '.
1000         'core_text::functioname() instead.');
1003 /**
1004  * @deprecated since 2.4
1005  */
1006 function get_generic_section_name() {
1007     throw new coding_exception('get_generic_section_name() is deprecated. Please use appropriate functionality from class format_base');
1010 /**
1011  * @deprecated since 2.4
1012  */
1013 function get_all_sections() {
1014     throw new coding_exception('get_all_sections() is removed. See phpdocs for this function');
1017 /**
1018  * @deprecated since 2.4
1019  */
1020 function add_mod_to_section() {
1021     throw new coding_exception('Function add_mod_to_section() is removed, please use course_add_cm_to_section()');
1024 /**
1025  * @deprecated since 2.4
1026  */
1027 function get_all_mods() {
1028     throw new coding_exception('Function get_all_mods() is removed. Use get_fast_modinfo() and get_module_types_names() instead. See phpdocs for details');
1031 /**
1032  * @deprecated since 2.4
1033  */
1034 function get_course_section() {
1035     throw new coding_exception('Function get_course_section() is removed. Please use course_create_sections_if_missing() and get_fast_modinfo() instead.');
1038 /**
1039  * @deprecated since 2.4
1040  */
1041 function format_weeks_get_section_dates() {
1042     throw new coding_exception('Function format_weeks_get_section_dates() is removed. It is not recommended to'.
1043             ' use it outside of format_weeks plugin');
1046 /**
1047  * @deprecated since 2.5
1048  */
1049 function get_print_section_cm_text() {
1050     throw new coding_exception('Function get_print_section_cm_text() is removed. Please use '.
1051             'cm_info::get_formatted_content() and cm_info::get_formatted_name()');
1054 /**
1055  * @deprecated since 2.5
1056  */
1057 function print_section_add_menus() {
1058     throw new coding_exception('Function print_section_add_menus() is removed. Please use course renderer '.
1059             'function course_section_add_cm_control()');
1062 /**
1063  * @deprecated since 2.5. Please use:
1064  * $courserenderer = $PAGE->get_renderer('core', 'course');
1065  * $actions = course_get_cm_edit_actions($mod, $indent, $section);
1066  * return ' ' . $courserenderer->course_section_cm_edit_actions($actions);
1067  */
1068 function make_editing_buttons() {
1069     throw new coding_exception('Function make_editing_buttons() is removed, please see PHPdocs in '.
1070             'lib/deprecatedlib.php on how to replace it');
1073 /**
1074  * @deprecated since 2.5
1075  */
1076 function print_section() {
1077     throw new coding_exception('Function print_section() is removed. Please use course renderer function '.
1078             'course_section_cm_list() instead.');
1081 /**
1082  * @deprecated since 2.5
1083  */
1084 function print_overview() {
1085     throw new coding_exception('Function print_overview() is removed. Use block course_overview to display this information');
1088 /**
1089  * @deprecated since 2.5
1090  */
1091 function print_recent_activity() {
1092     throw new coding_exception('Function print_recent_activity() is removed. It is not recommended to'.
1093             ' use it outside of block_recent_activity');
1096 /**
1097  * @deprecated since 2.5
1098  */
1099 function delete_course_module() {
1100     throw new coding_exception('Function delete_course_module() is removed. Please use course_delete_module() instead.');
1103 /**
1104  * @deprecated since 2.5
1105  */
1106 function update_category_button() {
1107     throw new coding_exception('Function update_category_button() is removed. Pages to view '.
1108             'and edit courses are now separate and no longer depend on editing mode.');
1111 /**
1112  * @deprecated since 2.5
1113  */
1114 function make_categories_list() {
1115     throw new coding_exception('Global function make_categories_list() is removed. Please use '.
1116             'coursecat::make_categories_list() and coursecat::get_parents()');
1119 /**
1120  * @deprecated since 2.5
1121  */
1122 function category_delete_move() {
1123     throw new coding_exception('Function category_delete_move() is removed. Please use coursecat::delete_move() instead.');
1126 /**
1127  * @deprecated since 2.5
1128  */
1129 function category_delete_full() {
1130     throw new coding_exception('Function category_delete_full() is removed. Please use coursecat::delete_full() instead.');
1133 /**
1134  * @deprecated since 2.5
1135  */
1136 function move_category() {
1137     throw new coding_exception('Function move_category() is removed. Please use coursecat::change_parent() instead.');
1140 /**
1141  * @deprecated since 2.5
1142  */
1143 function course_category_hide() {
1144     throw new coding_exception('Function course_category_hide() is removed. Please use coursecat::hide() instead.');
1147 /**
1148  * @deprecated since 2.5
1149  */
1150 function course_category_show() {
1151     throw new coding_exception('Function course_category_show() is removed. Please use coursecat::show() instead.');
1154 /**
1155  * @deprecated since 2.5. Please use coursecat::get($catid, IGNORE_MISSING) or coursecat::get($catid, MUST_EXIST).
1156  */
1157 function get_course_category() {
1158     throw new coding_exception('Function get_course_category() is removed. Please use coursecat::get(), see phpdocs for more details');
1161 /**
1162  * @deprecated since 2.5
1163  */
1164 function create_course_category() {
1165     throw new coding_exception('Function create_course_category() is removed. Please use coursecat::create()');
1168 /**
1169  * @deprecated since 2.5. Please use coursecat::get() and coursecat::get_children()
1170  */
1171 function get_all_subcategories() {
1172     throw new coding_exception('Function get_all_subcategories() is removed. Please use appropriate methods() ' .
1173             'of coursecat class.');
1176 /**
1177  * @deprecated since 2.5. Please use coursecat::get($parentid)->get_children().
1178  */
1179 function get_child_categories() {
1180     throw new coding_exception('Function get_child_categories() is removed. Use coursecat::get_children().');
1183 /**
1184  * @deprecated since 2.5
1185  */
1186 function get_categories() {
1187     throw new coding_exception('Function get_categories() is removed. Please use ' .
1188             'appropriate functions from class coursecat');
1191 /**
1192 * @deprecated since 2.5
1193 */
1194 function print_course_search() {
1195     throw new coding_exception('Function print_course_search() is removed, please use course renderer');
1198 /**
1199  * @deprecated since 2.5
1200  */
1201 function print_my_moodle() {
1202     throw new coding_exception('Function print_my_moodle() is removed, please use course renderer ' .
1203             'function frontpage_my_courses()');
1206 /**
1207  * @deprecated since 2.5
1208  */
1209 function print_remote_course() {
1210     throw new coding_exception('Function print_remote_course() is removed, please use course renderer');
1213 /**
1214  * @deprecated since 2.5
1215  */
1216 function print_remote_host() {
1217     throw new coding_exception('Function print_remote_host() is removed, please use course renderer');
1220 /**
1221  * @deprecated since 2.5
1222  */
1223 function print_whole_category_list() {
1224     throw new coding_exception('Function print_whole_category_list() is removed, please use course renderer');
1227 /**
1228  * @deprecated since 2.5
1229  */
1230 function print_category_info() {
1231     throw new coding_exception('Function print_category_info() is removed, please use course renderer');
1234 /**
1235  * @deprecated since 2.5
1236  */
1237 function get_course_category_tree() {
1238     throw new coding_exception('Function get_course_category_tree() is removed, please use course ' .
1239             'renderer or coursecat class, see function phpdocs for more info');
1242 /**
1243  * @deprecated since 2.5
1244  */
1245 function print_courses() {
1246     throw new coding_exception('Function print_courses() is removed, please use course renderer');
1249 /**
1250  * @deprecated since 2.5
1251  */
1252 function print_course() {
1253     throw new coding_exception('Function print_course() is removed, please use course renderer');
1256 /**
1257  * @deprecated since 2.5
1258  */
1259 function get_category_courses_array() {
1260     throw new coding_exception('Function get_category_courses_array() is removed, please use methods of coursecat class');
1263 /**
1264  * @deprecated since 2.5
1265  */
1266 function get_category_courses_array_recursively() {
1267     throw new coding_exception('Function get_category_courses_array_recursively() is removed, please use methods of coursecat class', DEBUG_DEVELOPER);
1270 /**
1271  * @deprecated since Moodle 2.5 MDL-27814 - please do not use this function any more.
1272  */
1273 function blog_get_context_url() {
1274     throw new coding_exception('Function  blog_get_context_url() is removed, getting params from context is not reliable for blogs.');
1277 /**
1278  * @deprecated since 2.5
1279  */
1280 function get_courses_wmanagers() {
1281     throw new coding_exception('Function get_courses_wmanagers() is removed, please use coursecat::get_courses()');
1284 /**
1285  * @deprecated since 2.5
1286  */
1287 function convert_tree_to_html() {
1288     throw new coding_exception('Function convert_tree_to_html() is removed. Consider using class tabtree and core_renderer::render_tabtree()');
1291 /**
1292  * @deprecated since 2.5
1293  */
1294 function convert_tabrows_to_tree() {
1295     throw new coding_exception('Function convert_tabrows_to_tree() is removed. Consider using class tabtree');
1298 /**
1299  * @deprecated since 2.5 - do not use, the textrotate.js will work it out automatically
1300  */
1301 function can_use_rotated_text() {
1302     debugging('can_use_rotated_text() is removed. JS feature detection is used automatically.');
1305 /**
1306  * @deprecated since Moodle 2.2 MDL-35009 - please do not use this function any more.
1307  */
1308 function get_context_instance_by_id() {
1309     throw new coding_exception('get_context_instance_by_id() is now removed, please use context::instance_by_id($id) instead.');
1312 /**
1313  * Returns system context or null if can not be created yet.
1314  *
1315  * @see context_system::instance()
1316  * @deprecated since 2.2
1317  * @param bool $cache use caching
1318  * @return context system context (null if context table not created yet)
1319  */
1320 function get_system_context($cache = true) {
1321     debugging('get_system_context() is deprecated, please use context_system::instance() instead.', DEBUG_DEVELOPER);
1322     return context_system::instance(0, IGNORE_MISSING, $cache);
1325 /**
1326  * @deprecated since 2.2, use $context->get_parent_context_ids() instead
1327  */
1328 function get_parent_contexts() {
1329     throw new coding_exception('get_parent_contexts() is removed, please use $context->get_parent_context_ids() instead.');
1332 /**
1333  * @deprecated since Moodle 2.2
1334  */
1335 function get_parent_contextid() {
1336     throw new coding_exception('get_parent_contextid() is removed, please use $context->get_parent_context() instead.');
1339 /**
1340  * @deprecated since 2.2
1341  */
1342 function get_child_contexts() {
1343     throw new coding_exception('get_child_contexts() is removed, please use $context->get_child_contexts() instead.');
1346 /**
1347  * @deprecated since 2.2
1348  */
1349 function create_contexts() {
1350     throw new coding_exception('create_contexts() is removed, please use context_helper::create_instances() instead.');
1353 /**
1354  * @deprecated since 2.2
1355  */
1356 function cleanup_contexts() {
1357     throw new coding_exception('cleanup_contexts() is removed, please use context_helper::cleanup_instances() instead.');
1360 /**
1361  * @deprecated since 2.2
1362  */
1363 function build_context_path() {
1364     throw new coding_exception('build_context_path() is removed, please use context_helper::build_all_paths() instead.');
1367 /**
1368  * @deprecated since 2.2
1369  */
1370 function rebuild_contexts() {
1371     throw new coding_exception('rebuild_contexts() is removed, please use $context->reset_paths(true) instead.');
1374 /**
1375  * @deprecated since Moodle 2.2
1376  */
1377 function preload_course_contexts() {
1378     throw new coding_exception('preload_course_contexts() is removed, please use context_helper::preload_course() instead.');
1381 /**
1382  * @deprecated since Moodle 2.2
1383  */
1384 function context_moved() {
1385     throw new coding_exception('context_moved() is removed, please use context::update_moved() instead.');
1388 /**
1389  * @deprecated since 2.2
1390  */
1391 function fetch_context_capabilities() {
1392     throw new coding_exception('fetch_context_capabilities() is removed, please use $context->get_capabilities() instead.');
1395 /**
1396  * @deprecated since 2.2
1397  */
1398 function context_instance_preload() {
1399     throw new coding_exception('context_instance_preload() is removed, please use context_helper::preload_from_record() instead.');
1402 /**
1403  * @deprecated since 2.2
1404  */
1405 function get_contextlevel_name() {
1406     throw new coding_exception('get_contextlevel_name() is removed, please use context_helper::get_level_name() instead.');
1409 /**
1410  * @deprecated since 2.2
1411  */
1412 function print_context_name() {
1413     throw new coding_exception('print_context_name() is removed, please use $context->get_context_name() instead.');
1416 /**
1417  * @deprecated since 2.2, use $context->mark_dirty() instead
1418  */
1419 function mark_context_dirty() {
1420     throw new coding_exception('mark_context_dirty() is removed, please use $context->mark_dirty() instead.');
1423 /**
1424  * @deprecated since Moodle 2.2
1425  */
1426 function delete_context() {
1427     throw new coding_exception('delete_context() is removed, please use context_helper::delete_instance() ' .
1428             'or $context->delete_content() instead.');
1431 /**
1432  * @deprecated since 2.2
1433  */
1434 function get_context_url() {
1435     throw new coding_exception('get_context_url() is removed, please use $context->get_url() instead.');
1438 /**
1439  * @deprecated since 2.2
1440  */
1441 function get_course_context() {
1442     throw new coding_exception('get_course_context() is removed, please use $context->get_course_context(true) instead.');
1445 /**
1446  * @deprecated since 2.2
1447  */
1448 function get_user_courses_bycap() {
1449     throw new coding_exception('get_user_courses_bycap() is removed, please use enrol_get_users_courses() instead.');
1452 /**
1453  * @deprecated since Moodle 2.2
1454  */
1455 function get_role_context_caps() {
1456     throw new coding_exception('get_role_context_caps() is removed, it is really slow. Don\'t use it.');
1459 /**
1460  * @deprecated since 2.2
1461  */
1462 function get_courseid_from_context() {
1463     throw new coding_exception('get_courseid_from_context() is removed, please use $context->get_course_context(false) instead.');
1466 /**
1467  * @deprecated since 2.2
1468  */
1469 function context_instance_preload_sql() {
1470     throw new coding_exception('context_instance_preload_sql() is removed, please use context_helper::get_preload_record_columns_sql() instead.');
1473 /**
1474  * @deprecated since 2.2
1475  */
1476 function get_related_contexts_string() {
1477     throw new coding_exception('get_related_contexts_string() is removed, please use $context->get_parent_context_ids(true) instead.');
1480 /**
1481  * @deprecated since 2.6
1482  */
1483 function get_plugin_list_with_file() {
1484     throw new coding_exception('get_plugin_list_with_file() is removed, please use core_component::get_plugin_list_with_file() instead.');
1487 /**
1488  * @deprecated since 2.6
1489  */
1490 function check_browser_operating_system() {
1491     throw new coding_exception('check_browser_operating_system is removed, please update your code to use core_useragent instead.');
1494 /**
1495  * @deprecated since 2.6
1496  */
1497 function check_browser_version() {
1498     throw new coding_exception('check_browser_version is removed, please update your code to use core_useragent instead.');
1501 /**
1502  * @deprecated since 2.6
1503  */
1504 function get_device_type() {
1505     throw new coding_exception('get_device_type is removed, please update your code to use core_useragent instead.');
1508 /**
1509  * @deprecated since 2.6
1510  */
1511 function get_device_type_list() {
1512     throw new coding_exception('get_device_type_list is removed, please update your code to use core_useragent instead.');
1515 /**
1516  * @deprecated since 2.6
1517  */
1518 function get_selected_theme_for_device_type() {
1519     throw new coding_exception('get_selected_theme_for_device_type is removed, please update your code to use core_useragent instead.');
1522 /**
1523  * @deprecated since 2.6
1524  */
1525 function get_device_cfg_var_name() {
1526     throw new coding_exception('get_device_cfg_var_name is removed, please update your code to use core_useragent instead.');
1529 /**
1530  * @deprecated since 2.6
1531  */
1532 function set_user_device_type() {
1533     throw new coding_exception('set_user_device_type is removed, please update your code to use core_useragent instead.');
1536 /**
1537  * @deprecated since 2.6
1538  */
1539 function get_user_device_type() {
1540     throw new coding_exception('get_user_device_type is removed, please update your code to use core_useragent instead.');
1543 /**
1544  * @deprecated since 2.6
1545  */
1546 function get_browser_version_classes() {
1547     throw new coding_exception('get_browser_version_classes is removed, please update your code to use core_useragent instead.');
1550 /**
1551  * @deprecated since Moodle 2.6
1552  */
1553 function generate_email_supportuser() {
1554     throw new coding_exception('generate_email_supportuser is removed, please use core_user::get_support_user');
1557 /**
1558  * @deprecated since Moodle 2.6
1559  */
1560 function badges_get_issued_badge_info() {
1561     throw new coding_exception('Function badges_get_issued_badge_info() is removed. Please use core_badges_assertion class and methods to generate badge assertion.');
1564 /**
1565  * @deprecated since 2.6
1566  */
1567 function can_use_html_editor() {
1568     throw new coding_exception('can_use_html_editor is removed, please update your code to assume it returns true.');
1572 /**
1573  * @deprecated since Moodle 2.7, use {@link user_count_login_failures()} instead.
1574  */
1575 function count_login_failures() {
1576     throw new coding_exception('count_login_failures() can not be used any more, please use user_count_login_failures().');
1579 /**
1580  * @deprecated since 2.7 MDL-33099/MDL-44088 - please do not use this function any more.
1581  */
1582 function ajaxenabled() {
1583     throw new coding_exception('ajaxenabled() can not be used anymore. Update your code to work with JS at all times.');
1586 /**
1587  * @deprecated Since Moodle 2.7 MDL-44070
1588  */
1589 function coursemodule_visible_for_user() {
1590     throw new coding_exception('coursemodule_visible_for_user() can not be used any more,
1591             please use \core_availability\info_module::is_user_visible()');
1594 /**
1595  * @deprecated since Moodle 2.8 MDL-36014, MDL-35618 this functionality is removed
1596  */
1597 function enrol_cohort_get_cohorts() {
1598     throw new coding_exception('Function enrol_cohort_get_cohorts() is removed, use '.
1599         'cohort_get_available_cohorts() instead');
1602 /**
1603  * @deprecated since Moodle 2.8 MDL-36014 please use cohort_can_view_cohort()
1604  */
1605 function enrol_cohort_can_view_cohort() {
1606     throw new coding_exception('Function enrol_cohort_can_view_cohort() is removed, use cohort_can_view_cohort() instead');
1609 /**
1610  * @deprecated since Moodle 2.8 MDL-36014 use cohort_get_available_cohorts() instead
1611  */
1612 function cohort_get_visible_list() {
1613     throw new coding_exception('Function cohort_get_visible_list() is removed. Please use function cohort_get_available_cohorts() ".
1614         "that correctly checks capabilities.');
1617 /**
1618  * @deprecated since Moodle 2.8 MDL-35618 this functionality is removed
1619  */
1620 function enrol_cohort_enrol_all_users() {
1621     throw new coding_exception('enrol_cohort_enrol_all_users() is removed. This functionality is moved to enrol_manual.');
1624 /**
1625  * @deprecated since Moodle 2.8 MDL-35618 this functionality is removed
1626  */
1627 function enrol_cohort_search_cohorts() {
1628     throw new coding_exception('enrol_cohort_search_cohorts() is removed. This functionality is moved to enrol_manual.');
1631 /* === Apis deprecated in since Moodle 2.9 === */
1633 /**
1634  * @deprecated since Moodle 2.9 MDL-49371 - please do not use this function any more.
1635  */
1636 function message_current_user_is_involved() {
1637     throw new coding_exception('message_current_user_is_involved() can not be used any more.');
1640 /**
1641  * @deprecated since Moodle 2.9 MDL-45898 - please do not use this function any more.
1642  */
1643 function profile_display_badges() {
1644     throw new coding_exception('profile_display_badges() can not be used any more.');
1647 /**
1648  * @deprecated since Moodle 2.9 MDL-45774 - Please do not use this function any more.
1649  */
1650 function useredit_shared_definition_preferences() {
1651     throw new coding_exception('useredit_shared_definition_preferences() can not be used any more.');
1655 /**
1656  * @deprecated since Moodle 2.9
1657  */
1658 function calendar_normalize_tz() {
1659     throw new coding_exception('calendar_normalize_tz() can not be used any more, please use core_date::normalise_timezone() instead.');
1662 /**
1663  * @deprecated since Moodle 2.9
1664  */
1665 function get_user_timezone_offset() {
1666     throw new coding_exception('get_user_timezone_offset() can not be used any more, please use standard PHP DateTimeZone class instead');
1670 /**
1671  * @deprecated since Moodle 2.9
1672  */
1673 function get_timezone_offset() {
1674     throw new coding_exception('get_timezone_offset() can not be used any more, please use standard PHP DateTimeZone class instead');
1677 /**
1678  * @deprecated since Moodle 2.9
1679  */
1680 function get_list_of_timezones() {
1681     throw new coding_exception('get_list_of_timezones() can not be used any more, please use core_date::get_list_of_timezones() instead');
1684 /**
1685  * @deprecated since Moodle 2.9
1686  */
1687 function update_timezone_records() {
1688     throw new coding_exception('update_timezone_records() can not be used any more, please use standard PHP DateTime class instead');
1691 /**
1692  * @deprecated since Moodle 2.9
1693  */
1694 function calculate_user_dst_table() {
1695     throw new coding_exception('calculate_user_dst_table() can not be used any more, please use standard PHP DateTime class instead');
1698 /**
1699  * @deprecated since Moodle 2.9
1700  */
1701 function dst_changes_for_year() {
1702     throw new coding_exception('dst_changes_for_year() can not be used any more, please use standard DateTime class instead');
1705 /**
1706  * @deprecated since Moodle 2.9
1707  */
1708 function get_timezone_record() {
1709     throw new coding_exception('get_timezone_record() can not be used any more, please use standard PHP DateTime class instead');
1712 /* === Apis deprecated since Moodle 3.0 === */
1713 /**
1714  * @deprecated since Moodle 3.0 MDL-49360 - please do not use this function any more.
1715  */
1716 function get_referer() {
1717     throw new coding_exception('get_referer() can not be used any more. Please use get_local_referer() instead.');
1720 /**
1721  * @deprecated since Moodle 3.0 use \core_useragent::is_web_crawler instead.
1722  */
1723 function is_web_crawler() {
1724     throw new coding_exception('is_web_crawler() can not be used any more. Please use core_useragent::is_web_crawler() instead.');
1727 /**
1728  * @deprecated since Moodle 3.0 MDL-50287 - please do not use this function any more.
1729  */
1730 function completion_cron() {
1731     throw new coding_exception('completion_cron() can not be used any more. Functionality has been moved to scheduled tasks.');
1734 /**
1735  * @deprecated since 3.0
1736  */
1737 function coursetag_get_tags() {
1738     throw new coding_exception('Function coursetag_get_tags() can not be used any more. ' .
1739             'Userid is no longer used for tagging courses.');
1742 /**
1743  * @deprecated since 3.0
1744  */
1745 function coursetag_get_all_tags() {
1746     throw new coding_exception('Function coursetag_get_all_tags() can not be used any more. Userid is no ' .
1747         'longer used for tagging courses.');
1750 /**
1751  * @deprecated since 3.0
1752  */
1753 function coursetag_get_jscript() {
1754     throw new coding_exception('Function coursetag_get_jscript() can not be used any more and is obsolete.');
1757 /**
1758  * @deprecated since 3.0
1759  */
1760 function coursetag_get_jscript_links() {
1761     throw new coding_exception('Function coursetag_get_jscript_links() can not be used any more and is obsolete.');
1764 /**
1765  * @deprecated since 3.0
1766  */
1767 function coursetag_get_records() {
1768     throw new coding_exception('Function coursetag_get_records() can not be used any more. ' .
1769             'Userid is no longer used for tagging courses.');
1772 /**
1773  * @deprecated since 3.0
1774  */
1775 function coursetag_store_keywords() {
1776     throw new coding_exception('Function coursetag_store_keywords() can not be used any more. ' .
1777             'Userid is no longer used for tagging courses.');
1780 /**
1781  * @deprecated since 3.0
1782  */
1783 function coursetag_delete_keyword() {
1784     throw new coding_exception('Function coursetag_delete_keyword() can not be used any more. ' .
1785             'Userid is no longer used for tagging courses.');
1788 /**
1789  * @deprecated since 3.0
1790  */
1791 function coursetag_get_tagged_courses() {
1792     throw new coding_exception('Function coursetag_get_tagged_courses() can not be used any more. ' .
1793             'Userid is no longer used for tagging courses.');
1796 /**
1797  * @deprecated since 3.0
1798  */
1799 function coursetag_delete_course_tags() {
1800     throw new coding_exception('Function coursetag_delete_course_tags() is deprecated. ' .
1801             'Use core_tag_tag::remove_all_item_tags().');
1804 /**
1805  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->update() instead
1806  */
1807 function tag_type_set() {
1808     throw new coding_exception('tag_type_set() can not be used anymore. Please use ' .
1809         'core_tag_tag::get($tagid)->update().');
1812 /**
1813  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->update() instead
1814  */
1815 function tag_description_set() {
1816     throw new coding_exception('tag_description_set() can not be used anymore. Please use ' .
1817         'core_tag_tag::get($tagid)->update().');
1820 /**
1821  * @deprecated since 3.1. Use core_tag_tag::get_item_tags() instead
1822  */
1823 function tag_get_tags() {
1824     throw new coding_exception('tag_get_tags() can not be used anymore. Please use ' .
1825         'core_tag_tag::get_item_tags().');
1828 /**
1829  * @deprecated since 3.1
1830  */
1831 function tag_get_tags_array() {
1832     throw new coding_exception('tag_get_tags_array() can not be used anymore. Please use ' .
1833         'core_tag_tag::get_item_tags_array().');
1836 /**
1837  * @deprecated since 3.1. Use core_tag_tag::get_item_tags_array() or $OUTPUT->tag_list(core_tag_tag::get_item_tags())
1838  */
1839 function tag_get_tags_csv() {
1840     throw new coding_exception('tag_get_tags_csv() can not be used anymore. Please use ' .
1841         'core_tag_tag::get_item_tags_array() or $OUTPUT->tag_list(core_tag_tag::get_item_tags()).');
1844 /**
1845  * @deprecated since 3.1. Use core_tag_tag::get_item_tags() instead
1846  */
1847 function tag_get_tags_ids() {
1848     throw new coding_exception('tag_get_tags_ids() can not be used anymore. Please consider using ' .
1849         'core_tag_tag::get_item_tags() or similar methods.');
1852 /**
1853  * @deprecated since 3.1. Use core_tag_tag::get_by_name() or core_tag_tag::get_by_name_bulk()
1854  */
1855 function tag_get_id() {
1856     throw new coding_exception('tag_get_id() can not be used anymore. Please use ' .
1857         'core_tag_tag::get_by_name() or core_tag_tag::get_by_name_bulk()');
1860 /**
1861  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->update() instead
1862  */
1863 function tag_rename() {
1864     throw new coding_exception('tag_rename() can not be used anymore. Please use ' .
1865         'core_tag_tag::get($tagid)->update()');
1868 /**
1869  * @deprecated since 3.1. Use core_tag_tag::remove_item_tag() instead
1870  */
1871 function tag_delete_instance() {
1872     throw new coding_exception('tag_delete_instance() can not be used anymore. Please use ' .
1873         'core_tag_tag::remove_item_tag()');
1876 /**
1877  * @deprecated since 3.1. Use core_tag_tag::get_by_name()->get_tagged_items() instead
1878  */
1879 function tag_find_records() {
1880     throw new coding_exception('tag_find_records() can not be used anymore. Please use ' .
1881         'core_tag_tag::get_by_name()->get_tagged_items()');
1884 /**
1885  * @deprecated since 3.1
1886  */
1887 function tag_add() {
1888     throw new coding_exception('tag_add() can not be used anymore. You can use ' .
1889         'core_tag_tag::create_if_missing(), however it should not be necessary since tags are ' .
1890         'created automatically when assigned to items');
1893 /**
1894  * @deprecated since 3.1. Use core_tag_tag::set_item_tags() or core_tag_tag::add_item_tag() instead
1895  */
1896 function tag_assign() {
1897     throw new coding_exception('tag_assign() can not be used anymore. Please use ' .
1898         'core_tag_tag::set_item_tags() or core_tag_tag::add_item_tag() instead. Tag instance ' .
1899         'ordering should not be set manually');
1902 /**
1903  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->count_tagged_items() instead
1904  */
1905 function tag_record_count() {
1906     throw new coding_exception('tag_record_count() can not be used anymore. Please use ' .
1907         'core_tag_tag::get($tagid)->count_tagged_items().');
1910 /**
1911  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->is_item_tagged_with() instead
1912  */
1913 function tag_record_tagged_with() {
1914     throw new coding_exception('tag_record_tagged_with() can not be used anymore. Please use ' .
1915         'core_tag_tag::get($tagid)->is_item_tagged_with().');
1918 /**
1919  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->flag() instead
1920  */
1921 function tag_set_flag() {
1922     throw new coding_exception('tag_set_flag() can not be used anymore. Please use ' .
1923         'core_tag_tag::get($tagid)->flag()');
1926 /**
1927  * @deprecated since 3.1. Use core_tag_tag::get($tagid)->reset_flag() instead
1928  */
1929 function tag_unset_flag() {
1930     throw new coding_exception('tag_unset_flag() can not be used anymore. Please use ' .
1931         'core_tag_tag::get($tagid)->reset_flag()');
1934 /**
1935  * @deprecated since 3.1
1936  */
1937 function tag_print_cloud() {
1938     throw new coding_exception('tag_print_cloud() can not be used anymore. Please use ' .
1939         'core_tag_collection::get_tag_cloud(), templateable core_tag\output\tagcloud and ' .
1940         'template core_tag/tagcloud.');
1943 /**
1944  * @deprecated since 3.0
1945  */
1946 function tag_autocomplete() {
1947     throw new coding_exception('tag_autocomplete() can not be used anymore. New form ' .
1948         'element "tags" does proper autocomplete.');
1951 /**
1952  * @deprecated since 3.1
1953  */
1954 function tag_print_description_box() {
1955     throw new coding_exception('tag_print_description_box() can not be used anymore. ' .
1956         'See core_tag_renderer for similar code');
1959 /**
1960  * @deprecated since 3.1
1961  */
1962 function tag_print_management_box() {
1963     throw new coding_exception('tag_print_management_box() can not be used anymore. ' .
1964         'See core_tag_renderer for similar code');
1967 /**
1968  * @deprecated since 3.1
1969  */
1970 function tag_print_search_box() {
1971     throw new coding_exception('tag_print_search_box() can not be used anymore. ' .
1972         'See core_tag_renderer for similar code');
1975 /**
1976  * @deprecated since 3.1
1977  */
1978 function tag_print_search_results() {
1979     throw new coding_exception('tag_print_search_results() can not be used anymore. ' .
1980         'In /tag/search.php the search results are printed using the core_tag/tagcloud template.');
1983 /**
1984  * @deprecated since 3.1
1985  */
1986 function tag_print_tagged_users_table() {
1987     throw new coding_exception('tag_print_tagged_users_table() can not be used anymore. ' .
1988         'See core_user_renderer for similar code');
1991 /**
1992  * @deprecated since 3.1
1993  */
1994 function tag_print_user_box() {
1995     throw new coding_exception('tag_print_user_box() can not be used anymore. ' .
1996         'See core_user_renderer for similar code');
1999 /**
2000  * @deprecated since 3.1
2001  */
2002 function tag_print_user_list() {
2003     throw new coding_exception('tag_print_user_list() can not be used anymore. ' .
2004         'See core_user_renderer for similar code');
2007 /**
2008  * @deprecated since 3.1
2009  */
2010 function tag_display_name() {
2011     throw new coding_exception('tag_display_name() can not be used anymore. Please use ' .
2012         'core_tag_tag::make_display_name().');
2016 /**
2017  * @deprecated since 3.1
2018  */
2019 function tag_normalize() {
2020     throw new coding_exception('tag_normalize() can not be used anymore. Please use ' .
2021         'core_tag_tag::normalize().');
2024 /**
2025  * @deprecated since 3.1
2026  */
2027 function tag_get_related_tags_csv() {
2028     throw new coding_exception('tag_get_related_tags_csv() can not be used anymore. Please ' .
2029         'consider looping through array or using $OUTPUT->tag_list(core_tag_tag::get_item_tags()).');
2032 /**
2033  * @deprecated since 3.1
2034  */
2035 function tag_set() {
2036     throw new coding_exception('tag_set() can not be used anymore. Please use ' .
2037         'core_tag_tag::set_item_tags().');
2040 /**
2041  * @deprecated since 3.1
2042  */
2043 function tag_set_add() {
2044     throw new coding_exception('tag_set_add() can not be used anymore. Please use ' .
2045         'core_tag_tag::add_item_tag().');
2048 /**
2049  * @deprecated since 3.1
2050  */
2051 function tag_set_delete() {
2052     throw new coding_exception('tag_set_delete() can not be used anymore. Please use ' .
2053         'core_tag_tag::remove_item_tag().');
2056 /**
2057  * @deprecated since 3.1
2058  */
2059 function tag_get() {
2060     throw new coding_exception('tag_get() can not be used anymore. Please use ' .
2061         'core_tag_tag::get() or core_tag_tag::get_by_name().');
2064 /**
2065  * @deprecated since 3.1
2066  */
2067 function tag_get_related_tags() {
2068     throw new coding_exception('tag_get_related_tags() can not be used anymore. Please use ' .
2069         'core_tag_tag::get_correlated_tags(), core_tag_tag::get_related_tags() or ' .
2070         'core_tag_tag::get_manual_related_tags().');
2073 /**
2074  * @deprecated since 3.1
2075  */
2076 function tag_delete() {
2077     throw new coding_exception('tag_delete() can not be used anymore. Please use ' .
2078         'core_tag_tag::delete_tags().');
2081 /**
2082  * @deprecated since 3.1
2083  */
2084 function tag_delete_instances() {
2085     throw new coding_exception('tag_delete_instances() can not be used anymore. Please use ' .
2086         'core_tag_tag::delete_instances().');
2089 /**
2090  * @deprecated since 3.1
2091  */
2092 function tag_cleanup() {
2093     throw new coding_exception('tag_cleanup() can not be used anymore. Please use ' .
2094         '\core\task\tag_cron_task::cleanup().');
2097 /**
2098  * @deprecated since 3.1
2099  */
2100 function tag_bulk_delete_instances() {
2101     throw new coding_exception('tag_bulk_delete_instances() can not be used anymore. Please use ' .
2102         '\core\task\tag_cron_task::bulk_delete_instances().');
2106 /**
2107  * @deprecated since 3.1
2108  */
2109 function tag_compute_correlations() {
2110     throw new coding_exception('tag_compute_correlations() can not be used anymore. Please use ' .
2111         'use \core\task\tag_cron_task::compute_correlations().');
2114 /**
2115  * @deprecated since 3.1
2116  */
2117 function tag_process_computed_correlation() {
2118     throw new coding_exception('tag_process_computed_correlation() can not be used anymore. Please use ' .
2119         'use \core\task\tag_cron_task::process_computed_correlation().');
2122 /**
2123  * @deprecated since 3.1
2124  */
2125 function tag_cron() {
2126     throw new coding_exception('tag_cron() can not be used anymore. Please use ' .
2127         'use \core\task\tag_cron_task::execute().');
2130 /**
2131  * @deprecated since 3.1
2132  */
2133 function tag_find_tags() {
2134     throw new coding_exception('tag_find_tags() can not be used anymore.');
2137 /**
2138  * @deprecated since 3.1
2139  */
2140 function tag_get_name() {
2141     throw new coding_exception('tag_get_name() can not be used anymore.');
2144 /**
2145  * @deprecated since 3.1
2146  */
2147 function tag_get_correlated() {
2148     throw new coding_exception('tag_get_correlated() can not be used anymore. Please use ' .
2149         'use core_tag_tag::get_correlated_tags().');
2153 /**
2154  * @deprecated since 3.1
2155  */
2156 function tag_cloud_sort() {
2157     throw new coding_exception('tag_cloud_sort() can not be used anymore. Similar method can ' .
2158         'be found in core_tag_collection::cloud_sort().');
2161 /**
2162  * @deprecated since Moodle 3.1
2163  */
2164 function events_load_def() {
2165     throw new coding_exception('events_load_def() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2169 /**
2170  * @deprecated since Moodle 3.1
2171  */
2172 function events_queue_handler() {
2173     throw new coding_exception('events_queue_handler() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2176 /**
2177  * @deprecated since Moodle 3.1
2178  */
2179 function events_dispatch() {
2180     throw new coding_exception('events_dispatch() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2183 /**
2184  * @deprecated since Moodle 3.1
2185  */
2186 function events_process_queued_handler() {
2187     throw new coding_exception(
2188         'events_process_queued_handler() has been deprecated along with all Events 1 API in favour of Events 2 API.'
2189     );
2192 /**
2193  * @deprecated since Moodle 3.1
2194  */
2195 function events_update_definition() {
2196     throw new coding_exception(
2197         'events_update_definition has been deprecated along with all Events 1 API in favour of Events 2 API.'
2198     );
2201 /**
2202  * @deprecated since Moodle 3.1
2203  */
2204 function events_cron() {
2205     throw new coding_exception('events_cron() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2208 /**
2209  * @deprecated since Moodle 3.1
2210  */
2211 function events_trigger_legacy() {
2212     throw new coding_exception('events_trigger_legacy() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2215 /**
2216  * @deprecated since Moodle 3.1
2217  */
2218 function events_is_registered() {
2219     throw new coding_exception('events_is_registered() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2222 /**
2223  * @deprecated since Moodle 3.1
2224  */
2225 function events_pending_count() {
2226     throw new coding_exception('events_pending_count() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2229 /**
2230  * @deprecated since Moodle 3.0 - this is a part of clamav plugin now.
2231  */
2232 function clam_message_admins() {
2233     throw new coding_exception('clam_message_admins() can not be used anymore. Please use ' .
2234         'message_admins() method of \antivirus_clamav\scanner class.');
2237 /**
2238  * @deprecated since Moodle 3.0 - this is a part of clamav plugin now.
2239  */
2240 function get_clam_error_code() {
2241     throw new coding_exception('get_clam_error_code() can not be used anymore. Please use ' .
2242         'get_clam_error_code() method of \antivirus_clamav\scanner class.');
2245 /**
2246  * @deprecated since 3.1
2247  */
2248 function course_get_cm_rename_action() {
2249     throw new coding_exception('course_get_cm_rename_action() can not be used anymore. Please use ' .
2250         'inplace_editable https://docs.moodle.org/dev/Inplace_editable.');
2254 /**
2255  * @deprecated since Moodle 3.1
2256  */
2257 function course_scale_used() {
2258     throw new coding_exception('course_scale_used() can not be used anymore. Plugins can ' .
2259         'implement <modname>_scale_used_anywhere, all implementations of <modname>_scale_used are now ignored');
2262 /**
2263  * @deprecated since Moodle 3.1
2264  */
2265 function site_scale_used() {
2266     throw new coding_exception('site_scale_used() can not be used anymore. Plugins can implement ' .
2267         '<modname>_scale_used_anywhere, all implementations of <modname>_scale_used are now ignored');
2270 /**
2271  * @deprecated since Moodle 3.1. Use external_api::external_function_info().
2272  */
2273 function external_function_info() {
2274     throw new coding_exception('external_function_info() can not be used any'.
2275         'more. Please use external_api::external_function_info() instead.');
2278 /**
2279  * Retrieves an array of records from a CSV file and places
2280  * them into a given table structure
2281  * This function is deprecated. Please use csv_import_reader() instead.
2282  *
2283  * @deprecated since Moodle 3.2 MDL-55126
2284  * @todo MDL-55195 for final deprecation in Moodle 3.6
2285  * @see csv_import_reader::load_csv_content()
2286  * @global stdClass $CFG
2287  * @global moodle_database $DB
2288  * @param string $file The path to a CSV file
2289  * @param string $table The table to retrieve columns from
2290  * @return bool|array Returns an array of CSV records or false
2291  */
2292 function get_records_csv($file, $table) {
2293     global $CFG, $DB;
2295     debugging('get_records_csv() is deprecated. Please use lib/csvlib.class.php csv_import_reader() instead.');
2297     if (!$metacolumns = $DB->get_columns($table)) {
2298         return false;
2299     }
2301     if(!($handle = @fopen($file, 'r'))) {
2302         print_error('get_records_csv failed to open '.$file);
2303     }
2305     $fieldnames = fgetcsv($handle, 4096);
2306     if(empty($fieldnames)) {
2307         fclose($handle);
2308         return false;
2309     }
2311     $columns = array();
2313     foreach($metacolumns as $metacolumn) {
2314         $ord = array_search($metacolumn->name, $fieldnames);
2315         if(is_int($ord)) {
2316             $columns[$metacolumn->name] = $ord;
2317         }
2318     }
2320     $rows = array();
2322     while (($data = fgetcsv($handle, 4096)) !== false) {
2323         $item = new stdClass;
2324         foreach($columns as $name => $ord) {
2325             $item->$name = $data[$ord];
2326         }
2327         $rows[] = $item;
2328     }
2330     fclose($handle);
2331     return $rows;
2334 /**
2335  * Create a file with CSV contents
2336  * This function is deprecated. Please use download_as_dataformat() instead.
2337  *
2338  * @deprecated since Moodle 3.2 MDL-55126
2339  * @todo MDL-55195 for final deprecation in Moodle 3.6
2340  * @see download_as_dataformat (lib/dataformatlib.php)
2341  * @global stdClass $CFG
2342  * @global moodle_database $DB
2343  * @param string $file The file to put the CSV content into
2344  * @param array $records An array of records to write to a CSV file
2345  * @param string $table The table to get columns from
2346  * @return bool success
2347  */
2348 function put_records_csv($file, $records, $table = NULL) {
2349     global $CFG, $DB;
2351     debugging('put_records_csv() is deprecated. Please use lib/dataformatlib.php download_as_dataformat()');
2353     if (empty($records)) {
2354         return true;
2355     }
2357     $metacolumns = NULL;
2358     if ($table !== NULL && !$metacolumns = $DB->get_columns($table)) {
2359         return false;
2360     }
2362     echo "x";
2364     if(!($fp = @fopen($CFG->tempdir.'/'.$file, 'w'))) {
2365         print_error('put_records_csv failed to open '.$file);
2366     }
2368     $proto = reset($records);
2369     if(is_object($proto)) {
2370         $fields_records = array_keys(get_object_vars($proto));
2371     }
2372     else if(is_array($proto)) {
2373         $fields_records = array_keys($proto);
2374     }
2375     else {
2376         return false;
2377     }
2378     echo "x";
2380     if(!empty($metacolumns)) {
2381         $fields_table = array_map(create_function('$a', 'return $a->name;'), $metacolumns);
2382         $fields = array_intersect($fields_records, $fields_table);
2383     }
2384     else {
2385         $fields = $fields_records;
2386     }
2388     fwrite($fp, implode(',', $fields));
2389     fwrite($fp, "\r\n");
2391     foreach($records as $record) {
2392         $array  = (array)$record;
2393         $values = array();
2394         foreach($fields as $field) {
2395             if(strpos($array[$field], ',')) {
2396                 $values[] = '"'.str_replace('"', '\"', $array[$field]).'"';
2397             }
2398             else {
2399                 $values[] = $array[$field];
2400             }
2401         }
2402         fwrite($fp, implode(',', $values)."\r\n");
2403     }
2405     fclose($fp);
2406     @chmod($CFG->tempdir.'/'.$file, $CFG->filepermissions);
2407     return true;
2410 /**
2411  * Determines if the given value is a valid CSS colour.
2412  *
2413  * A CSS colour can be one of the following:
2414  *    - Hex colour:  #AA66BB
2415  *    - RGB colour:  rgb(0-255, 0-255, 0-255)
2416  *    - RGBA colour: rgba(0-255, 0-255, 0-255, 0-1)
2417  *    - HSL colour:  hsl(0-360, 0-100%, 0-100%)
2418  *    - HSLA colour: hsla(0-360, 0-100%, 0-100%, 0-1)
2419  *
2420  * Or a recognised browser colour mapping {@link css_optimiser::$htmlcolours}
2421  *
2422  * @deprecated since Moodle 3.2
2423  * @todo MDL-56173 for final deprecation in Moodle 3.6
2424  * @param string $value The colour value to check
2425  * @return bool
2426  */
2427 function css_is_colour($value) {
2428     debugging('css_is_colour() is deprecated without a replacement. Please copy the implementation '.
2429         'into your plugin if you need this functionality.', DEBUG_DEVELOPER);
2431     $value = trim($value);
2433     $hex  = '/^#([a-fA-F0-9]{1,3}|[a-fA-F0-9]{6})$/';
2434     $rgb  = '#^rgb\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$#i';
2435     $rgba = '#^rgba\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1}(\.\d+)?)\s*\)$#i';
2436     $hsl  = '#^hsl\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\%\s*,\s*(\d{1,3})\%\s*\)$#i';
2437     $hsla = '#^hsla\s*\(\s*(\d{1,3})\s*,\s*(\d{1,3})\%\s*,\s*(\d{1,3})\%\s*,\s*(\d{1}(\.\d+)?)\s*\)$#i';
2439     if (in_array(strtolower($value), array('inherit'))) {
2440         return true;
2441     } else if (preg_match($hex, $value)) {
2442         return true;
2443     } else if (in_array(strtolower($value), array_keys(css_optimiser::$htmlcolours))) {
2444         return true;
2445     } else if (preg_match($rgb, $value, $m) && $m[1] < 256 && $m[2] < 256 && $m[3] < 256) {
2446         // It is an RGB colour.
2447         return true;
2448     } else if (preg_match($rgba, $value, $m) && $m[1] < 256 && $m[2] < 256 && $m[3] < 256) {
2449         // It is an RGBA colour.
2450         return true;
2451     } else if (preg_match($hsl, $value, $m) && $m[1] <= 360 && $m[2] <= 100 && $m[3] <= 100) {
2452         // It is an HSL colour.
2453         return true;
2454     } else if (preg_match($hsla, $value, $m) && $m[1] <= 360 && $m[2] <= 100 && $m[3] <= 100) {
2455         // It is an HSLA colour.
2456         return true;
2457     }
2458     // Doesn't look like a colour.
2459     return false;
2462 /**
2463  * Returns true is the passed value looks like a CSS width.
2464  * In order to pass this test the value must be purely numerical or end with a
2465  * valid CSS unit term.
2466  *
2467  * @param string|int $value
2468  * @return boolean
2469  * @deprecated since Moodle 3.2
2470  * @todo MDL-56173 for final deprecation in Moodle 3.6
2471  */
2472 function css_is_width($value) {
2473     debugging('css_is_width() is deprecated without a replacement. Please copy the implementation '.
2474         'into your plugin if you need this functionality.', DEBUG_DEVELOPER);
2476     $value = trim($value);
2477     if (in_array(strtolower($value), array('auto', 'inherit'))) {
2478         return true;
2479     }
2480     if ((string)$value === '0' || preg_match('#^(\-\s*)?(\d*\.)?(\d+)\s*(em|px|pt|\%|in|cm|mm|ex|pc)$#i', $value)) {
2481         return true;
2482     }
2483     return false;
2486 /**
2487  * A simple sorting function to sort two array values on the number of items they contain
2488  *
2489  * @param array $a
2490  * @param array $b
2491  * @return int
2492  * @deprecated since Moodle 3.2
2493  * @todo MDL-56173 for final deprecation in Moodle 3.6
2494  */
2495 function css_sort_by_count(array $a, array $b) {
2496     debugging('css_sort_by_count() is deprecated without a replacement. Please copy the implementation '.
2497         'into your plugin if you need this functionality.', DEBUG_DEVELOPER);
2499     $a = count($a);
2500     $b = count($b);
2501     if ($a == $b) {
2502         return 0;
2503     }
2504     return ($a > $b) ? -1 : 1;
2507 /**
2508  * A basic CSS optimiser that strips out unwanted things and then processes CSS organising and cleaning styles.
2509  * @deprecated since Moodle 3.2
2510  * @todo MDL-56173 for final deprecation in Moodle 3.6
2511  */
2512 class css_optimiser {
2513     /**
2514      * An array of the common HTML colours that are supported by most browsers.
2515      *
2516      * This reference table is used to allow us to unify colours, and will aid
2517      * us in identifying buggy CSS using unsupported colours.
2518      *
2519      * @var string[]
2520      * @deprecated since Moodle 3.2
2521      * @todo MDL-56173 for final deprecation in Moodle 3.6
2522      */
2523     public static $htmlcolours = array(
2524         'aliceblue' => '#F0F8FF',
2525         'antiquewhite' => '#FAEBD7',
2526         'aqua' => '#00FFFF',
2527         'aquamarine' => '#7FFFD4',
2528         'azure' => '#F0FFFF',
2529         'beige' => '#F5F5DC',
2530         'bisque' => '#FFE4C4',
2531         'black' => '#000000',
2532         'blanchedalmond' => '#FFEBCD',
2533         'blue' => '#0000FF',
2534         'blueviolet' => '#8A2BE2',
2535         'brown' => '#A52A2A',
2536         'burlywood' => '#DEB887',
2537         'cadetblue' => '#5F9EA0',
2538         'chartreuse' => '#7FFF00',
2539         'chocolate' => '#D2691E',
2540         'coral' => '#FF7F50',
2541         'cornflowerblue' => '#6495ED',
2542         'cornsilk' => '#FFF8DC',
2543         'crimson' => '#DC143C',
2544         'cyan' => '#00FFFF',
2545         'darkblue' => '#00008B',
2546         'darkcyan' => '#008B8B',
2547         'darkgoldenrod' => '#B8860B',
2548         'darkgray' => '#A9A9A9',
2549         'darkgrey' => '#A9A9A9',
2550         'darkgreen' => '#006400',
2551         'darkKhaki' => '#BDB76B',
2552         'darkmagenta' => '#8B008B',
2553         'darkolivegreen' => '#556B2F',
2554         'arkorange' => '#FF8C00',
2555         'darkorchid' => '#9932CC',
2556         'darkred' => '#8B0000',
2557         'darksalmon' => '#E9967A',
2558         'darkseagreen' => '#8FBC8F',
2559         'darkslateblue' => '#483D8B',
2560         'darkslategray' => '#2F4F4F',
2561         'darkslategrey' => '#2F4F4F',
2562         'darkturquoise' => '#00CED1',
2563         'darkviolet' => '#9400D3',
2564         'deeppink' => '#FF1493',
2565         'deepskyblue' => '#00BFFF',
2566         'dimgray' => '#696969',
2567         'dimgrey' => '#696969',
2568         'dodgerblue' => '#1E90FF',
2569         'firebrick' => '#B22222',
2570         'floralwhite' => '#FFFAF0',
2571         'forestgreen' => '#228B22',
2572         'fuchsia' => '#FF00FF',
2573         'gainsboro' => '#DCDCDC',
2574         'ghostwhite' => '#F8F8FF',
2575         'gold' => '#FFD700',
2576         'goldenrod' => '#DAA520',
2577         'gray' => '#808080',
2578         'grey' => '#808080',
2579         'green' => '#008000',
2580         'greenyellow' => '#ADFF2F',
2581         'honeydew' => '#F0FFF0',
2582         'hotpink' => '#FF69B4',
2583         'indianred ' => '#CD5C5C',
2584         'indigo ' => '#4B0082',
2585         'ivory' => '#FFFFF0',
2586         'khaki' => '#F0E68C',
2587         'lavender' => '#E6E6FA',
2588         'lavenderblush' => '#FFF0F5',
2589         'lawngreen' => '#7CFC00',
2590         'lemonchiffon' => '#FFFACD',
2591         'lightblue' => '#ADD8E6',
2592         'lightcoral' => '#F08080',
2593         'lightcyan' => '#E0FFFF',
2594         'lightgoldenrodyellow' => '#FAFAD2',
2595         'lightgray' => '#D3D3D3',
2596         'lightgrey' => '#D3D3D3',
2597         'lightgreen' => '#90EE90',
2598         'lightpink' => '#FFB6C1',
2599         'lightsalmon' => '#FFA07A',
2600         'lightseagreen' => '#20B2AA',
2601         'lightskyblue' => '#87CEFA',
2602         'lightslategray' => '#778899',
2603         'lightslategrey' => '#778899',
2604         'lightsteelblue' => '#B0C4DE',
2605         'lightyellow' => '#FFFFE0',
2606         'lime' => '#00FF00',
2607         'limegreen' => '#32CD32',
2608         'linen' => '#FAF0E6',
2609         'magenta' => '#FF00FF',
2610         'maroon' => '#800000',
2611         'mediumaquamarine' => '#66CDAA',
2612         'mediumblue' => '#0000CD',
2613         'mediumorchid' => '#BA55D3',
2614         'mediumpurple' => '#9370D8',
2615         'mediumseagreen' => '#3CB371',
2616         'mediumslateblue' => '#7B68EE',
2617         'mediumspringgreen' => '#00FA9A',
2618         'mediumturquoise' => '#48D1CC',
2619         'mediumvioletred' => '#C71585',
2620         'midnightblue' => '#191970',
2621         'mintcream' => '#F5FFFA',
2622         'mistyrose' => '#FFE4E1',
2623         'moccasin' => '#FFE4B5',
2624         'navajowhite' => '#FFDEAD',
2625         'navy' => '#000080',
2626         'oldlace' => '#FDF5E6',
2627         'olive' => '#808000',
2628         'olivedrab' => '#6B8E23',
2629         'orange' => '#FFA500',
2630         'orangered' => '#FF4500',
2631         'orchid' => '#DA70D6',
2632         'palegoldenrod' => '#EEE8AA',
2633         'palegreen' => '#98FB98',
2634         'paleturquoise' => '#AFEEEE',
2635         'palevioletred' => '#D87093',
2636         'papayawhip' => '#FFEFD5',
2637         'peachpuff' => '#FFDAB9',
2638         'peru' => '#CD853F',
2639         'pink' => '#FFC0CB',
2640         'plum' => '#DDA0DD',
2641         'powderblue' => '#B0E0E6',
2642         'purple' => '#800080',
2643         'red' => '#FF0000',
2644         'rosybrown' => '#BC8F8F',
2645         'royalblue' => '#4169E1',
2646         'saddlebrown' => '#8B4513',
2647         'salmon' => '#FA8072',
2648         'sandybrown' => '#F4A460',
2649         'seagreen' => '#2E8B57',
2650         'seashell' => '#FFF5EE',
2651         'sienna' => '#A0522D',
2652         'silver' => '#C0C0C0',
2653         'skyblue' => '#87CEEB',
2654         'slateblue' => '#6A5ACD',
2655         'slategray' => '#708090',
2656         'slategrey' => '#708090',
2657         'snow' => '#FFFAFA',
2658         'springgreen' => '#00FF7F',
2659         'steelblue' => '#4682B4',
2660         'tan' => '#D2B48C',
2661         'teal' => '#008080',
2662         'thistle' => '#D8BFD8',
2663         'tomato' => '#FF6347',
2664         'transparent' => 'transparent',
2665         'turquoise' => '#40E0D0',
2666         'violet' => '#EE82EE',
2667         'wheat' => '#F5DEB3',
2668         'white' => '#FFFFFF',
2669         'whitesmoke' => '#F5F5F5',
2670         'yellow' => '#FFFF00',
2671         'yellowgreen' => '#9ACD32'
2672     );
2674     /**
2675      * Used to orocesses incoming CSS optimising it and then returning it. Now just returns
2676      * what is sent to it. Do not use.
2677      *
2678      * @param string $css The raw CSS to optimise
2679      * @return string The optimised CSS
2680      * @deprecated since Moodle 3.2
2681      * @todo MDL-56173 for final deprecation in Moodle 3.6
2682      */
2683     public function process($css) {
2684         debugging('class css_optimiser is deprecated and no longer does anything, '.
2685             'please consider using stylelint to optimise your css.', DEBUG_DEVELOPER);
2687         return $css;
2688     }
2691 /**
2692  * Load the course contexts for all of the users courses
2693  *
2694  * @deprecated since Moodle 3.2
2695  * @param array $courses array of course objects. The courses the user is enrolled in.
2696  * @return array of course contexts
2697  */
2698 function message_get_course_contexts($courses) {
2699     debugging('message_get_course_contexts() is deprecated and is no longer used.', DEBUG_DEVELOPER);
2701     $coursecontexts = array();
2703     foreach($courses as $course) {
2704         $coursecontexts[$course->id] = context_course::instance($course->id);
2705     }
2707     return $coursecontexts;
2710 /**
2711  * strip off action parameters like 'removecontact'
2712  *
2713  * @deprecated since Moodle 3.2
2714  * @param moodle_url/string $moodleurl a URL. Typically the current page URL.
2715  * @return string the URL minus parameters that perform actions (like adding/removing/blocking a contact).
2716  */
2717 function message_remove_url_params($moodleurl) {
2718     debugging('message_remove_url_params() is deprecated and is no longer used.', DEBUG_DEVELOPER);
2720     $newurl = new moodle_url($moodleurl);
2721     $newurl->remove_params('addcontact','removecontact','blockcontact','unblockcontact');
2722     return $newurl->out();
2725 /**
2726  * Count the number of messages with a field having a specified value.
2727  * if $field is empty then return count of the whole array
2728  * if $field is non-existent then return 0
2729  *
2730  * @deprecated since Moodle 3.2
2731  * @param array $messagearray array of message objects
2732  * @param string $field the field to inspect on the message objects
2733  * @param string $value the value to test the field against
2734  */
2735 function message_count_messages($messagearray, $field='', $value='') {
2736     debugging('message_count_messages() is deprecated and is no longer used.', DEBUG_DEVELOPER);
2738     if (!is_array($messagearray)) return 0;
2739     if ($field == '' or empty($messagearray)) return count($messagearray);
2741     $count = 0;
2742     foreach ($messagearray as $message) {
2743         $count += ($message->$field == $value) ? 1 : 0;
2744     }
2745     return $count;
2748 /**
2749  * Count the number of users blocked by $user1
2750  *
2751  * @deprecated since Moodle 3.2
2752  * @param object $user1 user object
2753  * @return int the number of blocked users
2754  */
2755 function message_count_blocked_users($user1=null) {
2756     debugging('message_count_blocked_users() is deprecated, please use \core_message\api::count_blocked_users() instead.',
2757         DEBUG_DEVELOPER);
2759     return \core_message\api::count_blocked_users($user1);
2762 /**
2763  * Print a message contact link
2764  *
2765  * @deprecated since Moodle 3.2
2766  * @param int $userid the ID of the user to apply to action to
2767  * @param string $linktype can be add, remove, block or unblock
2768  * @param bool $return if true return the link as a string. If false echo the link.
2769  * @param string $script the URL to send the user to when the link is clicked. If null, the current page.
2770  * @param bool $text include text next to the icons?
2771  * @param bool $icon include a graphical icon?
2772  * @return string  if $return is true otherwise bool
2773  */
2774 function message_contact_link($userid, $linktype='add', $return=false, $script=null, $text=false, $icon=true) {
2775     debugging('message_contact_link() is deprecated and is no longer used.', DEBUG_DEVELOPER);
2777     global $OUTPUT, $PAGE;
2779     //hold onto the strings as we're probably creating a bunch of links
2780     static $str;
2782     if (empty($script)) {
2783         //strip off previous action params like 'removecontact'
2784         $script = message_remove_url_params($PAGE->url);
2785     }
2787     if (empty($str->blockcontact)) {
2788         $str = new stdClass();
2789         $str->blockcontact   =  get_string('blockcontact', 'message');
2790         $str->unblockcontact =  get_string('unblockcontact', 'message');
2791         $str->removecontact  =  get_string('removecontact', 'message');
2792         $str->addcontact     =  get_string('addcontact', 'message');
2793     }
2795     $command = $linktype.'contact';
2796     $string  = $str->{$command};
2798     $safealttext = s($string);
2800     $safestring = '';
2801     if (!empty($text)) {
2802         $safestring = $safealttext;
2803     }
2805     $img = '';
2806     if ($icon) {
2807         $iconpath = null;
2808         switch ($linktype) {
2809             case 'block':
2810                 $iconpath = 't/block';
2811                 break;
2812             case 'unblock':
2813                 $iconpath = 't/unblock';
2814                 break;
2815             case 'remove':
2816                 $iconpath = 't/removecontact';
2817                 break;
2818             case 'add':
2819             default:
2820                 $iconpath = 't/addcontact';
2821         }
2823         $img = $OUTPUT->pix_icon($iconpath, $safealttext);
2824     }
2826     $output = '<span class="'.$linktype.'contact">'.
2827         '<a href="'.$script.'&amp;'.$command.'='.$userid.
2828         '&amp;sesskey='.sesskey().'" title="'.$safealttext.'">'.
2829         $img.
2830         $safestring.'</a></span>';
2832     if ($return) {
2833         return $output;
2834     } else {
2835         echo $output;
2836         return true;
2837     }
2840 /**
2841  * @deprecated since Moodle 3.2
2842  */
2843 function message_get_recent_notifications($user, $limitfrom=0, $limitto=100) {
2844     throw new coding_exception('message_get_recent_notifications() can not be used any more.', DEBUG_DEVELOPER);
2847 /**
2848  * echo or return a link to take the user to the full message history between themselves and another user
2849  *
2850  * @deprecated since Moodle 3.2
2851  * @param int $userid1 the ID of the user displayed on the left (usually the current user)
2852  * @param int $userid2 the ID of the other user
2853  * @param bool $return true to return the link as a string. False to echo the link.
2854  * @param string $keywords any keywords to highlight in the message history
2855  * @param string $position anchor name to jump to within the message history
2856  * @param string $linktext optionally specify the link text
2857  * @return string|bool. Returns a string if $return is true. Otherwise returns a boolean.
2858  */
2859 function message_history_link($userid1, $userid2, $return=false, $keywords='', $position='', $linktext='') {
2860     debugging('message_history_link() is deprecated and is no longer used.', DEBUG_DEVELOPER);
2862     global $OUTPUT, $PAGE;
2863     static $strmessagehistory;
2865     if (empty($strmessagehistory)) {
2866         $strmessagehistory = get_string('messagehistory', 'message');
2867     }
2869     if ($position) {
2870         $position = "#$position";
2871     }
2872     if ($keywords) {
2873         $keywords = "&search=".urlencode($keywords);
2874     }
2876     if ($linktext == 'icon') {  // Icon only
2877         $fulllink = $OUTPUT->pix_icon('t/messages', $strmessagehistory);
2878     } else if ($linktext == 'both') {  // Icon and standard name
2879         $fulllink = $OUTPUT->pix_icon('t/messages', '');
2880         $fulllink .= '&nbsp;'.$strmessagehistory;
2881     } else if ($linktext) {    // Custom name
2882         $fulllink = $linktext;
2883     } else {                   // Standard name only
2884         $fulllink = $strmessagehistory;
2885     }
2887     $popupoptions = array(
2888         'height' => 500,
2889         'width' => 500,
2890         'menubar' => false,
2891         'location' => false,
2892         'status' => true,
2893         'scrollbars' => true,
2894         'resizable' => true);
2896     $link = new moodle_url('/message/index.php?history='.MESSAGE_HISTORY_ALL."&user1=$userid1&user2=$userid2$keywords$position");
2897     if ($PAGE->url && $PAGE->url->get_param('viewing')) {
2898         $link->param('viewing', $PAGE->url->get_param('viewing'));
2899     }
2900     $action = null;
2901     $str = $OUTPUT->action_link($link, $fulllink, $action, array('title' => $strmessagehistory));
2903     $str = '<span class="history">'.$str.'</span>';
2905     if ($return) {
2906         return $str;
2907     } else {
2908         echo $str;
2909         return true;
2910     }
2913 /**
2914  * @deprecated since Moodle 3.2
2915  */
2916 function message_search($searchterms, $fromme=true, $tome=true, $courseid='none', $userid=0) {
2917     throw new coding_exception('message_search() can not be used any more.', DEBUG_DEVELOPER);
2920 /**
2921  * Given a message object that we already know has a long message
2922  * this function truncates the message nicely to the first
2923  * sane place between $CFG->forum_longpost and $CFG->forum_shortpost
2924  *
2925  * @deprecated since Moodle 3.2
2926  * @param string $message the message
2927  * @param int $minlength the minimum length to trim the message to
2928  * @return string the shortened message
2929  */
2930 function message_shorten_message($message, $minlength = 0) {
2931     debugging('message_shorten_message() is deprecated and is no longer used.', DEBUG_DEVELOPER);
2933     $i = 0;
2934     $tag = false;
2935     $length = strlen($message);
2936     $count = 0;
2937     $stopzone = false;
2938     $truncate = 0;
2939     if ($minlength == 0) $minlength = MESSAGE_SHORTLENGTH;
2942     for ($i=0; $i<$length; $i++) {
2943         $char = $message[$i];
2945         switch ($char) {
2946             case "<":
2947                 $tag = true;
2948                 break;
2949             case ">":
2950                 $tag = false;
2951                 break;
2952             default:
2953                 if (!$tag) {
2954                     if ($stopzone) {
2955                         if ($char == '.' or $char == ' ') {
2956                             $truncate = $i+1;
2957                             break 2;
2958                         }
2959                     }
2960                     $count++;
2961                 }
2962                 break;
2963         }
2964         if (!$stopzone) {
2965             if ($count > $minlength) {
2966                 $stopzone = true;
2967             }
2968         }
2969     }
2971     if (!$truncate) {
2972         $truncate = $i;
2973     }
2975     return substr($message, 0, $truncate);
2978 /**
2979  * Given a string and an array of keywords, this function looks
2980  * for the first keyword in the string, and then chops out a
2981  * small section from the text that shows that word in context.
2982  *
2983  * @deprecated since Moodle 3.2
2984  * @param string $message the text to search
2985  * @param array $keywords array of keywords to find
2986  */
2987 function message_get_fragment($message, $keywords) {
2988     debugging('message_get_fragment() is deprecated and is no longer used.', DEBUG_DEVELOPER);
2990     $fullsize = 160;
2991     $halfsize = (int)($fullsize/2);
2993     $message = strip_tags($message);
2995     foreach ($keywords as $keyword) {  // Just get the first one
2996         if ($keyword !== '') {
2997             break;
2998         }
2999     }
3000     if (empty($keyword)) {   // None found, so just return start of message
3001         return message_shorten_message($message, 30);
3002     }
3004     $leadin = $leadout = '';
3006 /// Find the start of the fragment
3007     $start = 0;
3008     $length = strlen($message);
3010     $pos = strpos($message, $keyword);
3011     if ($pos > $halfsize) {
3012         $start = $pos - $halfsize;
3013         $leadin = '...';
3014     }
3015 /// Find the end of the fragment
3016     $end = $start + $fullsize;
3017     if ($end > $length) {
3018         $end = $length;
3019     } else {
3020         $leadout = '...';
3021     }
3023 /// Pull out the fragment and format it
3025     $fragment = substr($message, $start, $end - $start);
3026     $fragment = $leadin.highlight(implode(' ',$keywords), $fragment).$leadout;
3027     return $fragment;
3030 /**
3031  * @deprecated since Moodle 3.2
3032  */
3033 function message_get_history($user1, $user2, $limitnum=0, $viewingnewmessages=false) {
3034     throw new coding_exception('message_get_history() can not be used any more.', DEBUG_DEVELOPER);
3037 /**
3038  * Constructs the add/remove contact link to display next to other users
3039  *
3040  * @deprecated since Moodle 3.2
3041  * @param bool $incontactlist is the user a contact
3042  * @param bool $isblocked is the user blocked
3043  * @param stdClass $contact contact object
3044  * @param string $script the URL to send the user to when the link is clicked. If null, the current page.
3045  * @param bool $text include text next to the icons?
3046  * @param bool $icon include a graphical icon?
3047  * @return string
3048  */
3049 function message_get_contact_add_remove_link($incontactlist, $isblocked, $contact, $script=null, $text=false, $icon=true) {
3050     debugging('message_get_contact_add_remove_link() is deprecated and is no longer used.', DEBUG_DEVELOPER);
3052     $strcontact = '';
3054     if($incontactlist){
3055         $strcontact = message_contact_link($contact->id, 'remove', true, $script, $text, $icon);
3056     } else if ($isblocked) {
3057         $strcontact = message_contact_link($contact->id, 'add', true, $script, $text, $icon);
3058     } else{
3059         $strcontact = message_contact_link($contact->id, 'add', true, $script, $text, $icon);
3060     }
3062     return $strcontact;
3065 /**
3066  * Constructs the block contact link to display next to other users
3067  *
3068  * @deprecated since Moodle 3.2
3069  * @param bool $incontactlist is the user a contact?
3070  * @param bool $isblocked is the user blocked?
3071  * @param stdClass $contact contact object
3072  * @param string $script the URL to send the user to when the link is clicked. If null, the current page.
3073  * @param bool $text include text next to the icons?
3074  * @param bool $icon include a graphical icon?
3075  * @return string
3076  */
3077 function message_get_contact_block_link($incontactlist, $isblocked, $contact, $script=null, $text=false, $icon=true) {
3078     debugging('message_get_contact_block_link() is deprecated and is no longer used.', DEBUG_DEVELOPER);
3080     $strblock   = '';
3082     //commented out to allow the user to block a contact without having to remove them first
3083     /*if ($incontactlist) {
3084         //$strblock = '';
3085     } else*/
3086     if ($isblocked) {
3087         $strblock   = message_contact_link($contact->id, 'unblock', true, $script, $text, $icon);
3088     } else{
3089         $strblock   = message_contact_link($contact->id, 'block', true, $script, $text, $icon);
3090     }
3092     return $strblock;
3095 /**
3096  * marks ALL messages being sent from $fromuserid to $touserid as read
3097  *
3098  * @deprecated since Moodle 3.2
3099  * @param int $touserid the id of the message recipient
3100  * @param int $fromuserid the id of the message sender
3101  * @return void
3102  */
3103 function message_mark_messages_read($touserid, $fromuserid) {
3104     debugging('message_mark_messages_read() is deprecated and is no longer used, please use
3105         \core_message\api::mark_all_messages_as_read() instead.', DEBUG_DEVELOPER);
3107     \core_message\api::mark_all_messages_as_read($touserid, $fromuserid);
3110 /**
3111  * Return a list of page types
3112  *
3113  * @deprecated since Moodle 3.2
3114  * @param string $pagetype current page type
3115  * @param stdClass $parentcontext Block's parent context
3116  * @param stdClass $currentcontext Current context of block
3117  */
3118 function message_page_type_list($pagetype, $parentcontext, $currentcontext) {
3119     debugging('message_page_type_list() is deprecated and is no longer used.', DEBUG_DEVELOPER);
3121     return array('messages-*'=>get_string('page-message-x', 'message'));
3124 /**
3125  * Determines if a user is permitted to send another user a private message.
3126  * If no sender is provided then it defaults to the logged in user.
3127  *
3128  * @deprecated since Moodle 3.2
3129  * @param object $recipient User object.
3130  * @param object $sender User object.
3131  * @return bool true if user is permitted, false otherwise.
3132  */
3133 function message_can_post_message($recipient, $sender = null) {
3134     debugging('message_can_post_message() is deprecated and is no longer used, please use
3135         \core_message\api::can_post_message() instead.', DEBUG_DEVELOPER);
3137     return \core_message\api::can_post_message($recipient, $sender);
3140 /**
3141  * Checks if the recipient is allowing messages from users that aren't a
3142  * contact. If not then it checks to make sure the sender is in the
3143  * recipient's contacts.
3144  *
3145  * @deprecated since Moodle 3.2
3146  * @param object $recipient User object.
3147  * @param object $sender User object.
3148  * @return bool true if $sender is blocked, false otherwise.
3149  */
3150 function message_is_user_non_contact_blocked($recipient, $sender = null) {
3151     debugging('message_is_user_non_contact_blocked() is deprecated and is no longer used, please use
3152         \core_message\api::is_user_non_contact_blocked() instead.', DEBUG_DEVELOPER);
3154     return \core_message\api::is_user_non_contact_blocked($recipient, $sender);
3157 /**
3158  * Checks if the recipient has specifically blocked the sending user.
3159  *
3160  * Note: This function will always return false if the sender has the
3161  * readallmessages capability at the system context level.
3162  *
3163  * @deprecated since Moodle 3.2
3164  * @param object $recipient User object.
3165  * @param object $sender User object.
3166  * @return bool true if $sender is blocked, false otherwise.
3167  */
3168 function message_is_user_blocked($recipient, $sender = null) {
3169     debugging('message_is_user_blocked() is deprecated and is no longer used, please use
3170         \core_message\api::is_user_blocked() instead.', DEBUG_DEVELOPER);
3172     $senderid = null;
3173     if ($sender !== null && isset($sender->id)) {
3174         $senderid = $sender->id;
3175     }
3176     return \core_message\api::is_user_blocked($recipient->id, $senderid);
3179 /**
3180  * Display logs.
3181  *
3182  * @deprecated since 3.2
3183  */
3184 function print_log($course, $user=0, $date=0, $order="l.time ASC", $page=0, $perpage=100,
3185                    $url="", $modname="", $modid=0, $modaction="", $groupid=0) {
3186     debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
3188     global $CFG, $DB, $OUTPUT;
3190     if (!$logs = build_logs_array($course, $user, $date, $order, $page*$perpage, $perpage,
3191                        $modname, $modid, $modaction, $groupid)) {
3192         echo $OUTPUT->notification("No logs found!");
3193         echo $OUTPUT->footer();
3194         exit;
3195     }
3197     $courses = array();
3199     if ($course->id == SITEID) {
3200         $courses[0] = '';
3201         if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) {
3202             foreach ($ccc as $cc) {
3203                 $courses[$cc->id] = $cc->shortname;
3204             }
3205         }
3206     } else {
3207         $courses[$course->id] = $course->shortname;
3208     }
3210     $totalcount = $logs['totalcount'];
3211     $ldcache = array();
3213     $strftimedatetime = get_string("strftimedatetime");
3215     echo "<div class=\"info\">\n";
3216     print_string("displayingrecords", "", $totalcount);
3217     echo "</div>\n";
3219     echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage");
3221     $table = new html_table();
3222     $table->classes = array('logtable','generaltable');
3223     $table->align = array('right', 'left', 'left');
3224     $table->head = array(
3225         get_string('time'),
3226         get_string('ip_address'),
3227         get_string('fullnameuser'),
3228         get_string('action'),
3229         get_string('info')
3230     );
3231     $table->data = array();
3233     if ($course->id == SITEID) {
3234         array_unshift($table->align, 'left');
3235         array_unshift($table->head, get_string('course'));
3236     }
3238     // Make sure that the logs array is an array, even it is empty, to avoid warnings from the foreach.
3239     if (empty($logs['logs'])) {
3240         $logs['logs'] = array();
3241     }
3243     foreach ($logs['logs'] as $log) {
3245         if (isset($ldcache[$log->module][$log->action])) {
3246             $ld = $ldcache[$log->module][$log->action];
3247         } else {
3248             $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
3249             $ldcache[$log->module][$log->action] = $ld;
3250         }
3251         if ($ld && is_numeric($log->info)) {
3252             // ugly hack to make sure fullname is shown correctly
3253             if ($ld->mtable == 'user' && $ld->field == $DB->sql_concat('firstname', "' '" , 'lastname')) {
3254                 $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
3255             } else {
3256                 $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
3257             }
3258         }
3260         //Filter log->info
3261         $log->info = format_string($log->info);
3263         // If $log->url has been trimmed short by the db size restriction
3264         // code in add_to_log, keep a note so we don't add a link to a broken url
3265         $brokenurl=(core_text::strlen($log->url)==100 && core_text::substr($log->url,97)=='...');
3267         $row = array();
3268         if ($course->id == SITEID) {
3269             if (empty($log->course)) {
3270                 $row[] = get_string('site');
3271             } else {
3272                 $row[] = "<a href=\"{$CFG->wwwroot}/course/view.php?id={$log->course}\">". format_string($courses[$log->course])."</a>";
3273             }
3274         }
3276         $row[] = userdate($log->time, '%a').' '.userdate($log->time, $strftimedatetime);
3278         $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid");
3279         $row[] = $OUTPUT->action_link($link, $log->ip, new popup_action('click', $link, 'iplookup', array('height' => 440, 'width' => 700)));
3281         $row[] = html_writer::link(new moodle_url("/user/view.php?id={$log->userid}&course={$log->course}"), fullname($log, has_capability('moodle/site:viewfullnames', context_course::instance($course->id))));
3283         $displayaction="$log->module $log->action";
3284         if ($brokenurl) {
3285             $row[] = $displayaction;
3286         } else {
3287             $link = make_log_url($log->module,$log->url);
3288             $row[] = $OUTPUT->action_link($link, $displayaction, new popup_action('click', $link, 'fromloglive'), array('height' => 440, 'width' => 700));
3289         }
3290         $row[] = $log->info;
3291         $table->data[] = $row;
3292     }
3294     echo html_writer::table($table);
3295     echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage");
3298 /**
3299  * Display MNET logs.
3300  *
3301  * @deprecated since 3.2
3302  */
3303 function print_mnet_log($hostid, $course, $user=0, $date=0, $order="l.time ASC", $page=0, $perpage=100,
3304                    $url="", $modname="", $modid=0, $modaction="", $groupid=0) {
3305     debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
3307     global $CFG, $DB, $OUTPUT;
3309     if (!$logs = build_mnet_logs_array($hostid, $course, $user, $date, $order, $page*$perpage, $perpage,
3310                        $modname, $modid, $modaction, $groupid)) {
3311         echo $OUTPUT->notification("No logs found!");
3312         echo $OUTPUT->footer();
3313         exit;
3314     }
3316     if ($course->id == SITEID) {
3317         $courses[0] = '';
3318         if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname,c.visible')) {
3319             foreach ($ccc as $cc) {
3320                 $courses[$cc->id] = $cc->shortname;
3321             }
3322         }
3323     }
3325     $totalcount = $logs['totalcount'];
3326     $ldcache = array();
3328     $strftimedatetime = get_string("strftimedatetime");
3330     echo "<div class=\"info\">\n";
3331     print_string("displayingrecords", "", $totalcount);
3332     echo "</div>\n";
3334     echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage");
3336     echo "<table class=\"logtable\" cellpadding=\"3\" cellspacing=\"0\">\n";
3337     echo "<tr>";
3338     if ($course->id == SITEID) {
3339         echo "<th class=\"c0 header\">".get_string('course')."</th>\n";
3340     }
3341     echo "<th class=\"c1 header\">".get_string('time')."</th>\n";
3342     echo "<th class=\"c2 header\">".get_string('ip_address')."</th>\n";
3343     echo "<th class=\"c3 header\">".get_string('fullnameuser')."</th>\n";
3344     echo "<th class=\"c4 header\">".get_string('action')."</th>\n";
3345     echo "<th class=\"c5 header\">".get_string('info')."</th>\n";
3346     echo "</tr>\n";
3348     if (empty($logs['logs'])) {
3349         echo "</table>\n";
3350         return;
3351     }
3353     $row = 1;
3354     foreach ($logs['logs'] as $log) {
3356         $log->info = $log->coursename;
3357         $row = ($row + 1) % 2;
3359         if (isset($ldcache[$log->module][$log->action])) {
3360             $ld = $ldcache[$log->module][$log->action];
3361         } else {
3362             $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
3363             $ldcache[$log->module][$log->action] = $ld;
3364         }
3365         if (0 && $ld && !empty($log->info)) {
3366             // ugly hack to make sure fullname is shown correctly
3367             if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) {
3368                 $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
3369             } else {
3370                 $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
3371             }
3372         }
3374         //Filter log->info
3375         $log->info = format_string($log->info);
3377         echo '<tr class="r'.$row.'">';
3378         if ($course->id == SITEID) {
3379             $courseshortname = format_string($courses[$log->course], true, array('context' => context_course::instance(SITEID)));
3380             echo "<td class=\"r$row c0\" >\n";
3381             echo "    <a href=\"{$CFG->wwwroot}/course/view.php?id={$log->course}\">".$courseshortname."</a>\n";
3382             echo "</td>\n";
3383         }
3384         echo "<td class=\"r$row c1\" align=\"right\">".userdate($log->time, '%a').
3385              ' '.userdate($log->time, $strftimedatetime)."</td>\n";
3386         echo "<td class=\"r$row c2\" >\n";
3387         $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid");
3388         echo $OUTPUT->action_link($link, $log->ip, new popup_action('click', $link, 'iplookup', array('height' => 400, 'width' => 700)));
3389         echo "</td>\n";
3390         $fullname = fullname($log, has_capability('moodle/site:viewfullnames', context_course::instance($course->id)));
3391         echo "<td class=\"r$row c3\" >\n";
3392         echo "    <a href=\"$CFG->wwwroot/user/view.php?id={$log->userid}\">$fullname</a>\n";
3393         echo "</td>\n";
3394         echo "<td class=\"r$row c4\">\n";
3395         echo $log->action .': '.$log->module;
3396         echo "</td>\n";
3397         echo "<td class=\"r$row c5\">{$log->info}</td>\n";
3398         echo "</tr>\n";
3399     }
3400     echo "</table>\n";
3402     echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage");
3405 /**
3406  * Display logs in CSV format.
3407  *
3408  * @deprecated since 3.2
3409  */
3410 function print_log_csv($course, $user, $date, $order='l.time DESC', $modname,
3411                         $modid, $modaction, $groupid) {
3412     debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
3414     global $DB, $CFG;
3416     require_once($CFG->libdir . '/csvlib.class.php');
3418     $csvexporter = new csv_export_writer('tab');
3420     $header = array();
3421     $header[] = get_string('course');
3422     $header[] = get_string('time');
3423     $header[] = get_string('ip_address');
3424     $header[] = get_string('fullnameuser');
3425     $header[] = get_string('action');
3426     $header[] = get_string('info');
3428     if (!$logs = build_logs_array($course, $user, $date, $order, '', '',
3429                        $modname, $modid, $modaction, $groupid)) {
3430         return false;
3431     }
3433     $courses = array();
3435     if ($course->id == SITEID) {
3436         $courses[0] = '';
3437         if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) {
3438             foreach ($ccc as $cc) {
3439                 $courses[$cc->id] = $cc->shortname;
3440             }
3441         }
3442     } else {
3443         $courses[$course->id] = $course->shortname;
3444     }
3446     $count=0;
3447     $ldcache = array();
3448     $tt = getdate(time());
3449     $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]);
3451     $strftimedatetime = get_string("strftimedatetime");
3453     $csvexporter->set_filename('logs', '.txt');
3454     $title = array(get_string('savedat').userdate(time(), $strftimedatetime));
3455     $csvexporter->add_data($title);
3456     $csvexporter->add_data($header);
3458     if (empty($logs['logs'])) {
3459         return true;
3460     }
3462     foreach ($logs['logs'] as $log) {
3463         if (isset($ldcache[$log->module][$log->action])) {
3464             $ld = $ldcache[$log->module][$log->action];
3465         } else {
3466             $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
3467             $ldcache[$log->module][$log->action] = $ld;
3468         }
3469         if ($ld && is_numeric($log->info)) {
3470             // ugly hack to make sure fullname is shown correctly
3471             if (($ld->mtable == 'user') and ($ld->field ==  $DB->sql_concat('firstname', "' '" , 'lastname'))) {
3472                 $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
3473             } else {
3474                 $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
3475             }
3476         }
3478         //Filter log->info
3479         $log->info = format_string($log->info);
3480         $log->info = strip_tags(urldecode($log->info));    // Some XSS protection
3482         $coursecontext = context_course::instance($course->id);
3483         $firstField = format_string($courses[$log->course], true, array('context' => $coursecontext));
3484         $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
3485         $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
3486         $row = array($firstField, userdate($log->time, $strftimedatetime), $log->ip, $fullname, $log->module.' '.$log->action.' ('.$actionurl.')', $log->info);
3487         $csvexporter->add_data($row);
3488     }
3489     $csvexporter->download_file();
3490     return true;
3493 /**
3494  * Display logs in XLS format.
3495  *
3496  * @deprecated since 3.2
3497  */
3498 function print_log_xls($course, $user, $date, $order='l.time DESC', $modname,
3499                         $modid, $modaction, $groupid) {
3500     debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
3502     global $CFG, $DB;
3504     require_once("$CFG->libdir/excellib.class.php");
3506     if (!$logs = build_logs_array($course, $user, $date, $order, '', '',
3507                        $modname, $modid, $modaction, $groupid)) {
3508         return false;
3509     }
3511     $courses = array();
3513     if ($course->id == SITEID) {
3514         $courses[0] = '';
3515         if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) {
3516             foreach ($ccc as $cc) {
3517                 $courses[$cc->id] = $cc->shortname;
3518             }
3519         }
3520     } else {
3521         $courses[$course->id] = $course->shortname;
3522     }
3524     $count=0;
3525     $ldcache = array();
3526     $tt = getdate(time());
3527     $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]);
3529     $strftimedatetime = get_string("strftimedatetime");
3531     $nroPages = ceil(count($logs)/(EXCELROWS-FIRSTUSEDEXCELROW+1));
3532     $filename = 'logs_'.userdate(time(),get_string('backupnameformat', 'langconfig'),99,false);
3533     $filename .= '.xls';
3535     $workbook = new MoodleExcelWorkbook('-');
3536     $workbook->send($filename);
3538     $worksheet = array();
3539     $headers = array(get_string('course'), get_string('time'), get_string('ip_address'),
3540                         get_string('fullnameuser'),    get_string('action'), get_string('info'));
3542     // Creating worksheets
3543     for ($wsnumber = 1; $wsnumber <= $nroPages; $wsnumber++) {
3544         $sheettitle = get_string('logs').' '.$wsnumber.'-'.$nroPages;
3545         $worksheet[$wsnumber] = $workbook->add_worksheet($sheettitle);
3546         $worksheet[$wsnumber]->set_column(1, 1, 30);
3547         $worksheet[$wsnumber]->write_string(0, 0, get_string('savedat').
3548                                     userdate(time(), $strftimedatetime));
3549         $col = 0;
3550         foreach ($headers as $item) {
3551             $worksheet[$wsnumber]->write(FIRSTUSEDEXCELROW-1,$col,$item,'');
3552             $col++;
3553         }
3554     }
3556     if (empty($logs['logs'])) {
3557         $workbook->close();
3558         return true;
3559     }
3561     $formatDate =& $workbook->add_format();
3562     $formatDate->set_num_format(get_string('log_excel_date_format'));
3564     $row = FIRSTUSEDEXCELROW;
3565     $wsnumber = 1;
3566     $myxls =& $worksheet[$wsnumber];
3567     foreach ($logs['logs'] as $log) {
3568         if (isset($ldcache[$log->module][$log->action])) {
3569             $ld = $ldcache[$log->module][$log->action];
3570         } else {
3571             $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
3572             $ldcache[$log->module][$log->action] = $ld;
3573         }
3574         if ($ld && is_numeric($log->info)) {
3575             // ugly hack to make sure fullname is shown correctly
3576             if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) {
3577                 $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
3578             } else {
3579                 $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
3580             }
3581         }
3583         // Filter log->info
3584         $log->info = format_string($log->info);
3585         $log->info = strip_tags(urldecode($log->info));  // Some XSS protection
3587         if ($nroPages>1) {
3588             if ($row > EXCELROWS) {
3589                 $wsnumber++;
3590                 $myxls =& $worksheet[$wsnumber];
3591                 $row = FIRSTUSEDEXCELROW;
3592             }
3593         }
3595         $coursecontext = context_course::instance($course->id);
3597         $myxls->write($row, 0, format_string($courses[$log->course], true, array('context' => $coursecontext)), '');
3598         $myxls->write_date($row, 1, $log->time, $formatDate); // write_date() does conversion/timezone support. MDL-14934
3599         $myxls->write($row, 2, $log->ip, '');
3600         $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
3601         $myxls->write($row, 3, $fullname, '');
3602         $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
3603         $myxls->write($row, 4, $log->module.' '.$log->action.' ('.$actionurl.')', '');
3604         $myxls->write($row, 5, $log->info, '');
3606         $row++;
3607     }
3609     $workbook->close();
3610     return true;
3613 /**
3614  * Display logs in ODS format.
3615  *
3616  * @deprecated since 3.2
3617  */
3618 function print_log_ods($course, $user, $date, $order='l.time DESC', $modname,
3619                         $modid, $modaction, $groupid) {
3620     debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
3622     global $CFG, $DB;
3624     require_once("$CFG->libdir/odslib.class.php");
3626     if (!$logs = build_logs_array($course, $user, $date, $order, '', '',
3627                        $modname, $modid, $modaction, $groupid)) {
3628         return false;
3629     }
3631     $courses = array();
3633     if ($course->id == SITEID) {
3634         $courses[0] = '';
3635         if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) {
3636             foreach ($ccc as $cc) {
3637                 $courses[$cc->id] = $cc->shortname;
3638             }
3639         }
3640     } else {
3641         $courses[$course->id] = $course->shortname;
3642     }
3644     $ldcache = array();
3646     $strftimedatetime = get_string("strftimedatetime");
3648     $nroPages = ceil(count($logs)/(EXCELROWS-FIRSTUSEDEXCELROW+1));
3649     $filename = 'logs_'.userdate(time(),get_string('backupnameformat', 'langconfig'),99,false);
3650     $filename .= '.ods';
3652     $workbook = new MoodleODSWorkbook('-');
3653     $workbook->send($filename);
3655     $worksheet = array();
3656     $headers = array(get_string('course'), get_string('time'), get_string('ip_address'),
3657                         get_string('fullnameuser'),    get_string('action'), get_string('info'));
3659     // Creating worksheets
3660     for ($wsnumber = 1; $wsnumber <= $nroPages; $wsnumber++) {
3661         $sheettitle = get_string('logs').' '.$wsnumber.'-'.$nroPages;
3662         $worksheet[$wsnumber] = $workbook->add_worksheet($sheettitle);
3663         $worksheet[$wsnumber]->set_column(1, 1, 30);
3664         $worksheet[$wsnumber]->write_string(0, 0, get_string('savedat').
3665                                     userdate(time(), $strftimedatetime));
3666         $col = 0;
3667         foreach ($headers as $item) {
3668             $worksheet[$wsnumber]->write(FIRSTUSEDEXCELROW-1,$col,$item,'');
3669             $col++;
3670         }
3671     }
3673     if (empty($logs['logs'])) {
3674         $workbook->close();
3675         return true;
3676     }
3678     $formatDate =& $workbook->add_format();
3679     $formatDate->set_num_format(get_string('log_excel_date_format'));
3681     $row = FIRSTUSEDEXCELROW;
3682     $wsnumber = 1;
3683     $myxls =& $worksheet[$wsnumber];
3684     foreach ($logs['logs'] as $log) {
3685         if (isset($ldcache[$log->module][$log->action])) {
3686             $ld = $ldcache[$log->module][$log->action];
3687         } else {
3688             $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action));
3689             $ldcache[$log->module][$log->action] = $ld;
3690         }
3691         if ($ld && is_numeric($log->info)) {
3692             // ugly hack to make sure fullname is shown correctly
3693             if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) {
3694                 $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true);
3695             } else {
3696                 $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info));
3697             }
3698         }
3700         // Filter log->info
3701         $log->info = format_string($log->info);
3702         $log->info = strip_tags(urldecode($log->info));  // Some XSS protection
3704         if ($nroPages>1) {
3705             if ($row > EXCELROWS) {
3706                 $wsnumber++;
3707                 $myxls =& $worksheet[$wsnumber];
3708                 $row = FIRSTUSEDEXCELROW;
3709             }
3710         }
3712         $coursecontext = context_course::instance($course->id);
3714         $myxls->write_string($row, 0, format_string($courses[$log->course], true, array('context' => $coursecontext)));
3715         $myxls->write_date($row, 1, $log->time);
3716         $myxls->write_string($row, 2, $log->ip);
3717         $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext));
3718         $myxls->write_string($row, 3, $fullname);
3719         $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url);
3720         $myxls->write_string($row, 4, $log->module.' '.$log->action.' ('.$actionurl.')');
3721         $myxls->write_string($row, 5, $log->info);
3723         $row++;
3724     }
3726     $workbook->close();
3727     return true;
3730 /**
3731  * Build an array of logs.
3732  *
3733  * @deprecated since 3.2
3734  */
3735 function build_logs_array($course, $user=0, $date=0, $order="l.time ASC", $limitfrom='', $limitnum='',
3736                    $modname="", $modid=0, $modaction="", $groupid=0) {
3737     global $DB, $SESSION, $USER;
3739     debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER);
3740     // It is assumed that $date is the GMT time of midnight for that day,
3741     // and so the next 86400 seconds worth of logs are printed.
3743     // Setup for group handling.
3745     // If the group mode is separate, and this user does not have editing privileges,
3746     // then only the user's group can be viewed.
3747     if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/course:managegroups', context_course::instance($course->id))) {
3748         if (isset($SESSION->currentgroup[$course->id])) {
3749             $groupid =  $SESSION->currentgroup[$course->id];
3750         } else {
3751             $groupid = groups_get_all_groups($course->id, $USER->id);
3752             if (is_array($groupid)) {
3753                 $groupid = array_shift(array_keys($groupid));
3754                 $SESSION->currentgroup[$course->id] = $groupid;
3755             } else {
3756                 $groupid = 0;
3757             }
3758         }
3759     }
3760     // If this course doesn't have groups, no groupid can be specified.
3761     else if (!$course->groupmode) {
3762         $groupid = 0;
3763     }
3765     $joins = array();
3766     $params = array();
3768     if ($course->id != SITEID || $modid != 0) {
3769         $joins[] = "l.course = :courseid";
3770         $params['courseid'] = $course->id;
3771     }
3773     if ($modname) {
3774         $joins[] = "l.module = :modname";
3775         $params['modname'] = $modname;
3776     }
3778     if ('site_errors' === $modid) {
3779         $joins[] = "( l.action='error' OR l.action='infected' )";
3780     } else if ($modid) {
3781         $joins[] = "l.cmid = :modid";
3782         $params['modid'] = $modid;
3783     }
3785     if ($modaction) {
3786         $firstletter = substr($modaction, 0, 1);
3787         if ($firstletter == '-') {
3788             $joins[] = $DB->sql_like('l.action', ':modaction', false, true, true);
3789             $params['modaction'] = '%'.substr($modaction, 1).'%';
3790         } else {
3791             $joins[] = $DB->sql_like('l.action', ':modaction', false);
3792             $params['modaction'] = '%'.$modaction.'%';
3793         }
3794     }
3797     /// Getting all members of a group.
3798     if ($groupid and !$user) {
3799         if ($gusers = groups_get_members($groupid)) {
3800             $gusers = array_keys($gusers);
3801             $joins[] = 'l.userid IN (' . implode(',', $gusers) . ')';
3802         } else {
3803             $joins[] = 'l.userid = 0'; // No users in groups, so we want something that will always be false.
3804         }
3805     }
3806     else if ($user) {
3807         $joins[] = "l.userid = :userid";
3808         $params['userid'] = $user;
3809     }
3811     if ($date) {
3812         $enddate = $date + 86400;
3813         $joins[] = "l.time > :date AND l.time < :enddate";
3814         $params['date'] = $date;
3815         $params['enddate'] = $enddate;
3816     }