Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 311 and 401] [Versions 39 and 401] [Versions 400 and 401] [Versions 401 and 402] [Versions 401 and 403]

   1  <?php
   2  
   3  // This file is part of Moodle - http://moodle.org/
   4  //
   5  // Moodle is free software: you can redistribute it and/or modify
   6  // it under the terms of the GNU General Public License as published by
   7  // the Free Software Foundation, either version 3 of the License, or
   8  // (at your option) any later version.
   9  //
  10  // Moodle is distributed in the hope that it will be useful,
  11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13  // GNU General Public License for more details.
  14  //
  15  // You should have received a copy of the GNU General Public License
  16  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  17  
  18  /**
  19   * 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   */
  30  
  31  defined('MOODLE_INTERNAL') || die();
  32  
  33  /* === Functions that needs to be kept longer in deprecated lib than normal time period === */
  34  
  35  /**
  36   * @deprecated since 2.7 use new events instead
  37   */
  38  function add_to_log() {
  39      throw new coding_exception('add_to_log() has been removed, please rewrite your code to the new events API');
  40  }
  41  
  42  /**
  43   * @deprecated since 2.6
  44   */
  45  function events_trigger() {
  46      throw new coding_exception('events_trigger() has been deprecated along with all Events 1 API in favour of Events 2 API.');
  47  }
  48  
  49  /**
  50   * List all core subsystems and their location
  51   *
  52   * This is a list of components that are part of the core and their
  53   * language strings are defined in /lang/en/<<subsystem>>.php. If a given
  54   * plugin is not listed here and it does not have proper plugintype prefix,
  55   * then it is considered as course activity module.
  56   *
  57   * The location is optionally dirroot relative path. NULL means there is no special
  58   * directory for this subsystem. If the location is set, the subsystem's
  59   * renderer.php is expected to be there.
  60   *
  61   * @deprecated since 2.6, use core_component::get_core_subsystems()
  62   *
  63   * @param bool $fullpaths false means relative paths from dirroot, use true for performance reasons
  64   * @return array of (string)name => (string|null)location
  65   */
  66  function get_core_subsystems($fullpaths = false) {
  67      global $CFG;
  68  
  69      // NOTE: do not add any other debugging here, keep forever.
  70  
  71      $subsystems = core_component::get_core_subsystems();
  72  
  73      if ($fullpaths) {
  74          return $subsystems;
  75      }
  76  
  77      debugging('Short paths are deprecated when using get_core_subsystems(), please fix the code to use fullpaths instead.', DEBUG_DEVELOPER);
  78  
  79      $dlength = strlen($CFG->dirroot);
  80  
  81      foreach ($subsystems as $k => $v) {
  82          if ($v === null) {
  83              continue;
  84          }
  85          $subsystems[$k] = substr($v, $dlength+1);
  86      }
  87  
  88      return $subsystems;
  89  }
  90  
  91  /**
  92   * Lists all plugin types.
  93   *
  94   * @deprecated since 2.6, use core_component::get_plugin_types()
  95   *
  96   * @param bool $fullpaths false means relative paths from dirroot
  97   * @return array Array of strings - name=>location
  98   */
  99  function get_plugin_types($fullpaths = true) {
 100      global $CFG;
 101  
 102      // NOTE: do not add any other debugging here, keep forever.
 103  
 104      $types = core_component::get_plugin_types();
 105  
 106      if ($fullpaths) {
 107          return $types;
 108      }
 109  
 110      debugging('Short paths are deprecated when using get_plugin_types(), please fix the code to use fullpaths instead.', DEBUG_DEVELOPER);
 111  
 112      $dlength = strlen($CFG->dirroot);
 113  
 114      foreach ($types as $k => $v) {
 115          if ($k === 'theme') {
 116              $types[$k] = 'theme';
 117              continue;
 118          }
 119          $types[$k] = substr($v, $dlength+1);
 120      }
 121  
 122      return $types;
 123  }
 124  
 125  /**
 126   * Use when listing real plugins of one type.
 127   *
 128   * @deprecated since 2.6, use core_component::get_plugin_list()
 129   *
 130   * @param string $plugintype type of plugin
 131   * @return array name=>fulllocation pairs of plugins of given type
 132   */
 133  function get_plugin_list($plugintype) {
 134  
 135      // NOTE: do not add any other debugging here, keep forever.
 136  
 137      if ($plugintype === '') {
 138          $plugintype = 'mod';
 139      }
 140  
 141      return core_component::get_plugin_list($plugintype);
 142  }
 143  
 144  /**
 145   * Get a list of all the plugins of a given type that define a certain class
 146   * in a certain file. The plugin component names and class names are returned.
 147   *
 148   * @deprecated since 2.6, use core_component::get_plugin_list_with_class()
 149   *
 150   * @param string $plugintype the type of plugin, e.g. 'mod' or 'report'.
 151   * @param string $class the part of the name of the class after the
 152   *      frankenstyle prefix. e.g 'thing' if you are looking for classes with
 153   *      names like report_courselist_thing. If you are looking for classes with
 154   *      the same name as the plugin name (e.g. qtype_multichoice) then pass ''.
 155   * @param string $file the name of file within the plugin that defines the class.
 156   * @return array with frankenstyle plugin names as keys (e.g. 'report_courselist', 'mod_forum')
 157   *      and the class names as values (e.g. 'report_courselist_thing', 'qtype_multichoice').
 158   */
 159  function get_plugin_list_with_class($plugintype, $class, $file) {
 160  
 161      // NOTE: do not add any other debugging here, keep forever.
 162  
 163      return core_component::get_plugin_list_with_class($plugintype, $class, $file);
 164  }
 165  
 166  /**
 167   * Returns the exact absolute path to plugin directory.
 168   *
 169   * @deprecated since 2.6, use core_component::get_plugin_directory()
 170   *
 171   * @param string $plugintype type of plugin
 172   * @param string $name name of the plugin
 173   * @return string full path to plugin directory; NULL if not found
 174   */
 175  function get_plugin_directory($plugintype, $name) {
 176  
 177      // NOTE: do not add any other debugging here, keep forever.
 178  
 179      if ($plugintype === '') {
 180          $plugintype = 'mod';
 181      }
 182  
 183      return core_component::get_plugin_directory($plugintype, $name);
 184  }
 185  
 186  /**
 187   * Normalize the component name using the "frankenstyle" names.
 188   *
 189   * @deprecated since 2.6, use core_component::normalize_component()
 190   *
 191   * @param string $component
 192   * @return array two-items list of [(string)type, (string|null)name]
 193   */
 194  function normalize_component($component) {
 195  
 196      // NOTE: do not add any other debugging here, keep forever.
 197  
 198      return core_component::normalize_component($component);
 199  }
 200  
 201  /**
 202   * Return exact absolute path to a plugin directory.
 203   *
 204   * @deprecated since 2.6, use core_component::normalize_component()
 205   *
 206   * @param string $component name such as 'moodle', 'mod_forum'
 207   * @return string full path to component directory; NULL if not found
 208   */
 209  function get_component_directory($component) {
 210  
 211      // NOTE: do not add any other debugging here, keep forever.
 212  
 213      return core_component::get_component_directory($component);
 214  }
 215  
 216  /**
 217   * Get the context instance as an object. This function will create the
 218   * context instance if it does not exist yet.
 219   *
 220   * @deprecated since 2.2, use context_course::instance() or other relevant class instead
 221   * @todo This will be deleted in Moodle 2.8, refer MDL-34472
 222   * @param integer $contextlevel The context level, for example CONTEXT_COURSE, or CONTEXT_MODULE.
 223   * @param integer $instance The instance id. For $level = CONTEXT_COURSE, this would be $course->id,
 224   *      for $level = CONTEXT_MODULE, this would be $cm->id. And so on. Defaults to 0
 225   * @param int $strictness IGNORE_MISSING means compatible mode, false returned if record not found, debug message if more found;
 226   *      MUST_EXIST means throw exception if no record or multiple records found
 227   * @return context The context object.
 228   */
 229  function get_context_instance($contextlevel, $instance = 0, $strictness = IGNORE_MISSING) {
 230  
 231      debugging('get_context_instance() is deprecated, please use context_xxxx::instance() instead.', DEBUG_DEVELOPER);
 232  
 233      $instances = (array)$instance;
 234      $contexts = array();
 235  
 236      $classname = context_helper::get_class_for_level($contextlevel);
 237  
 238      // we do not load multiple contexts any more, PAGE should be responsible for any preloading
 239      foreach ($instances as $inst) {
 240          $contexts[$inst] = $classname::instance($inst, $strictness);
 241      }
 242  
 243      if (is_array($instance)) {
 244          return $contexts;
 245      } else {
 246          return $contexts[$instance];
 247      }
 248  }
 249  /* === End of long term deprecated api list === */
 250  
 251  /**
 252   * @deprecated since 2.7 - use new file picker instead
 253   */
 254  function clam_log_upload() {
 255      throw new coding_exception('clam_log_upload() can not be used any more, please use file picker instead');
 256  }
 257  
 258  /**
 259   * @deprecated since 2.7 - use new file picker instead
 260   */
 261  function clam_log_infected() {
 262      throw new coding_exception('clam_log_infected() can not be used any more, please use file picker instead');
 263  }
 264  
 265  /**
 266   * @deprecated since 2.7 - use new file picker instead
 267   */
 268  function clam_change_log() {
 269      throw new coding_exception('clam_change_log() can not be used any more, please use file picker instead');
 270  }
 271  
 272  /**
 273   * @deprecated since 2.7 - infected files are now deleted in file picker
 274   */
 275  function clam_replace_infected_file() {
 276      throw new coding_exception('clam_replace_infected_file() can not be used any more, please use file picker instead');
 277  }
 278  
 279  /**
 280   * @deprecated since 2.7
 281   */
 282  function clam_handle_infected_file() {
 283      throw new coding_exception('clam_handle_infected_file() can not be used any more, please use file picker instead');
 284  }
 285  
 286  /**
 287   * @deprecated since 2.7
 288   */
 289  function clam_scan_moodle_file() {
 290      throw new coding_exception('clam_scan_moodle_file() can not be used any more, please use file picker instead');
 291  }
 292  
 293  
 294  /**
 295   * @deprecated since 2.7 PHP 5.4.x should be always compatible.
 296   */
 297  function password_compat_not_supported() {
 298      throw new coding_exception('Do not use password_compat_not_supported() - bcrypt is now always available');
 299  }
 300  
 301  /**
 302   * @deprecated since 2.6
 303   */
 304  function session_get_instance() {
 305      throw new coding_exception('session_get_instance() is removed, use \core\session\manager instead');
 306  }
 307  
 308  /**
 309   * @deprecated since 2.6
 310   */
 311  function session_is_legacy() {
 312      throw new coding_exception('session_is_legacy() is removed, do not use any more');
 313  }
 314  
 315  /**
 316   * @deprecated since 2.6
 317   */
 318  function session_kill_all() {
 319      throw new coding_exception('session_kill_all() is removed, use \core\session\manager::kill_all_sessions() instead');
 320  }
 321  
 322  /**
 323   * @deprecated since 2.6
 324   */
 325  function session_touch() {
 326      throw new coding_exception('session_touch() is removed, use \core\session\manager::touch_session() instead');
 327  }
 328  
 329  /**
 330   * @deprecated since 2.6
 331   */
 332  function session_kill() {
 333      throw new coding_exception('session_kill() is removed, use \core\session\manager::kill_session() instead');
 334  }
 335  
 336  /**
 337   * @deprecated since 2.6
 338   */
 339  function session_kill_user() {
 340      throw new coding_exception('session_kill_user() is removed, use \core\session\manager::kill_user_sessions() instead');
 341  }
 342  
 343  /**
 344   * @deprecated since 2.6
 345   */
 346  function session_set_user() {
 347      throw new coding_exception('session_set_user() is removed, use \core\session\manager::set_user() instead');
 348  }
 349  
 350  /**
 351   * @deprecated since 2.6
 352   */
 353  function session_is_loggedinas() {
 354      throw new coding_exception('session_is_loggedinas() is removed, use \core\session\manager::is_loggedinas() instead');
 355  }
 356  
 357  /**
 358   * @deprecated since 2.6
 359   */
 360  function session_get_realuser() {
 361      throw new coding_exception('session_get_realuser() is removed, use \core\session\manager::get_realuser() instead');
 362  }
 363  
 364  /**
 365   * @deprecated since 2.6
 366   */
 367  function session_loginas() {
 368      throw new coding_exception('session_loginas() is removed, use \core\session\manager::loginas() instead');
 369  }
 370  
 371  /**
 372   * @deprecated since 2.6
 373   */
 374  function js_minify() {
 375      throw new coding_exception('js_minify() is removed, use core_minify::js_files() or core_minify::js() instead.');
 376  }
 377  
 378  /**
 379   * @deprecated since 2.6
 380   */
 381  function css_minify_css() {
 382      throw new coding_exception('css_minify_css() is removed, use core_minify::css_files() or core_minify::css() instead.');
 383  }
 384  
 385  // === Deprecated before 2.6.0 ===
 386  
 387  /**
 388   * @deprecated
 389   */
 390  function check_gd_version() {
 391      throw new coding_exception('check_gd_version() is removed, GD extension is always available now');
 392  }
 393  
 394  /**
 395   * @deprecated
 396   */
 397  function update_login_count() {
 398      throw new coding_exception('update_login_count() is removed, all calls need to be removed');
 399  }
 400  
 401  /**
 402   * @deprecated
 403   */
 404  function reset_login_count() {
 405      throw new coding_exception('reset_login_count() is removed, all calls need to be removed');
 406  }
 407  
 408  /**
 409   * @deprecated
 410   */
 411  function update_log_display_entry() {
 412  
 413      throw new coding_exception('The update_log_display_entry() is removed, please use db/log.php description file instead.');
 414  }
 415  
 416  /**
 417   * @deprecated use the text formatting in a standard way instead (https://moodledev.io/docs/apis/subsystems/output#output-functions)
 418   *             this was abused mostly for embedding of attachments
 419   */
 420  function filter_text() {
 421      throw new coding_exception('filter_text() can not be used anymore, use format_text(), format_string() etc instead.');
 422  }
 423  
 424  /**
 425   * @deprecated Loginhttps is no longer supported
 426   */
 427  function httpsrequired() {
 428      throw new coding_exception('httpsrequired() can not be used any more. Loginhttps is no longer supported.');
 429  }
 430  
 431  /**
 432   * @deprecated since 3.1 - replacement legacy file API methods can be found on the moodle_url class, for example:
 433   * The moodle_url::make_legacyfile_url() method can be used to generate a legacy course file url. To generate
 434   * course module file.php url the moodle_url::make_file_url() should be used.
 435   */
 436  function get_file_url() {
 437      throw new coding_exception('get_file_url() can not be used anymore. Please use ' .
 438          'moodle_url factory methods instead.');
 439  }
 440  
 441  /**
 442   * @deprecated use get_enrolled_users($context) instead.
 443   */
 444  function get_course_participants() {
 445      throw new coding_exception('get_course_participants() can not be used any more, use get_enrolled_users() instead.');
 446  }
 447  
 448  /**
 449   * @deprecated use is_enrolled($context, $userid) instead.
 450   */
 451  function is_course_participant() {
 452      throw new coding_exception('is_course_participant() can not be used any more, use is_enrolled() instead.');
 453  }
 454  
 455  /**
 456   * @deprecated
 457   */
 458  function get_recent_enrolments() {
 459      throw new coding_exception('get_recent_enrolments() is removed as it returned inaccurate results.');
 460  }
 461  
 462  /**
 463   * @deprecated use clean_param($string, PARAM_FILE) instead.
 464   */
 465  function detect_munged_arguments() {
 466      throw new coding_exception('detect_munged_arguments() can not be used any more, please use clean_param(,PARAM_FILE) instead.');
 467  }
 468  
 469  
 470  /**
 471   * Unzip one zip file to a destination dir
 472   * Both parameters must be FULL paths
 473   * If destination isn't specified, it will be the
 474   * SAME directory where the zip file resides.
 475   *
 476   * @global object
 477   * @param string $zipfile The zip file to unzip
 478   * @param string $destination The location to unzip to
 479   * @param bool $showstatus_ignored Unused
 480   * @deprecated since 2.0 MDL-15919
 481   */
 482  function unzip_file($zipfile, $destination = '', $showstatus_ignored = true) {
 483      debugging(__FUNCTION__ . '() is deprecated. '
 484              . 'Please use the application/zip file_packer implementation instead.', DEBUG_DEVELOPER);
 485  
 486      // Extract everything from zipfile.
 487      $path_parts = pathinfo(cleardoubleslashes($zipfile));
 488      $zippath = $path_parts["dirname"];       //The path of the zip file
 489      $zipfilename = $path_parts["basename"];  //The name of the zip file
 490      $extension = $path_parts["extension"];    //The extension of the file
 491  
 492      //If no file, error
 493      if (empty($zipfilename)) {
 494          return false;
 495      }
 496  
 497      //If no extension, error
 498      if (empty($extension)) {
 499          return false;
 500      }
 501  
 502      //Clear $zipfile
 503      $zipfile = cleardoubleslashes($zipfile);
 504  
 505      //Check zipfile exists
 506      if (!file_exists($zipfile)) {
 507          return false;
 508      }
 509  
 510      //If no destination, passed let's go with the same directory
 511      if (empty($destination)) {
 512          $destination = $zippath;
 513      }
 514  
 515      //Clear $destination
 516      $destpath = rtrim(cleardoubleslashes($destination), "/");
 517  
 518      //Check destination path exists
 519      if (!is_dir($destpath)) {
 520          return false;
 521      }
 522  
 523      $packer = get_file_packer('application/zip');
 524  
 525      $result = $packer->extract_to_pathname($zipfile, $destpath);
 526  
 527      if ($result === false) {
 528          return false;
 529      }
 530  
 531      foreach ($result as $status) {
 532          if ($status !== true) {
 533              return false;
 534          }
 535      }
 536  
 537      return true;
 538  }
 539  
 540  /**
 541   * Zip an array of files/dirs to a destination zip file
 542   * Both parameters must be FULL paths to the files/dirs
 543   *
 544   * @global object
 545   * @param array $originalfiles Files to zip
 546   * @param string $destination The destination path
 547   * @return bool Outcome
 548   *
 549   * @deprecated since 2.0 MDL-15919
 550   */
 551  function zip_files($originalfiles, $destination) {
 552      debugging(__FUNCTION__ . '() is deprecated. '
 553              . 'Please use the application/zip file_packer implementation instead.', DEBUG_DEVELOPER);
 554  
 555      // Extract everything from destination.
 556      $path_parts = pathinfo(cleardoubleslashes($destination));
 557      $destpath = $path_parts["dirname"];       //The path of the zip file
 558      $destfilename = $path_parts["basename"];  //The name of the zip file
 559      $extension = $path_parts["extension"];    //The extension of the file
 560  
 561      //If no file, error
 562      if (empty($destfilename)) {
 563          return false;
 564      }
 565  
 566      //If no extension, add it
 567      if (empty($extension)) {
 568          $extension = 'zip';
 569          $destfilename = $destfilename.'.'.$extension;
 570      }
 571  
 572      //Check destination path exists
 573      if (!is_dir($destpath)) {
 574          return false;
 575      }
 576  
 577      //Check destination path is writable. TODO!!
 578  
 579      //Clean destination filename
 580      $destfilename = clean_filename($destfilename);
 581  
 582      //Now check and prepare every file
 583      $files = array();
 584      $origpath = NULL;
 585  
 586      foreach ($originalfiles as $file) {  //Iterate over each file
 587          //Check for every file
 588          $tempfile = cleardoubleslashes($file); // no doubleslashes!
 589          //Calculate the base path for all files if it isn't set
 590          if ($origpath === NULL) {
 591              $origpath = rtrim(cleardoubleslashes(dirname($tempfile)), "/");
 592          }
 593          //See if the file is readable
 594          if (!is_readable($tempfile)) {  //Is readable
 595              continue;
 596          }
 597          //See if the file/dir is in the same directory than the rest
 598          if (rtrim(cleardoubleslashes(dirname($tempfile)), "/") != $origpath) {
 599              continue;
 600          }
 601          //Add the file to the array
 602          $files[] = $tempfile;
 603      }
 604  
 605      $zipfiles = array();
 606      $start = strlen($origpath)+1;
 607      foreach($files as $file) {
 608          $zipfiles[substr($file, $start)] = $file;
 609      }
 610  
 611      $packer = get_file_packer('application/zip');
 612  
 613      return $packer->archive_to_pathname($zipfiles, $destpath . '/' . $destfilename);
 614  }
 615  
 616  /**
 617   * @deprecated use groups_get_all_groups() instead.
 618   */
 619  function mygroupid() {
 620      throw new coding_exception('mygroupid() can not be used any more, please use groups_get_all_groups() instead.');
 621  }
 622  
 623  /**
 624   * @deprecated since Moodle 2.0 MDL-14617 - please do not use this function any more.
 625   */
 626  function groupmode() {
 627      throw new coding_exception('groupmode() can not be used any more, please use groups_get_* instead.');
 628  }
 629  
 630  /**
 631   * @deprecated Since year 2006 - please do not use this function any more.
 632   */
 633  function set_current_group() {
 634      throw new coding_exception('set_current_group() can not be used anymore, please use $SESSION->currentgroup[$courseid] instead');
 635  }
 636  
 637  /**
 638   * @deprecated Since year 2006 - please do not use this function any more.
 639   */
 640  function get_current_group() {
 641      throw new coding_exception('get_current_group() can not be used any more, please use groups_get_* instead');
 642  }
 643  
 644  /**
 645   * @deprecated Since Moodle 2.8
 646   */
 647  function groups_filter_users_by_course_module_visible() {
 648      throw new coding_exception('groups_filter_users_by_course_module_visible() is removed. ' .
 649              'Replace with a call to \core_availability\info_module::filter_user_list(), ' .
 650              'which does basically the same thing but includes other restrictions such ' .
 651              'as profile restrictions.');
 652  }
 653  
 654  /**
 655   * @deprecated Since Moodle 2.8
 656   */
 657  function groups_course_module_visible() {
 658      throw new coding_exception('groups_course_module_visible() is removed, use $cm->uservisible to decide whether the current
 659          user can ' . 'access an activity.', DEBUG_DEVELOPER);
 660  }
 661  
 662  /**
 663   * @deprecated since 2.0
 664   */
 665  function error() {
 666      throw new coding_exception('notlocalisederrormessage', 'error', $link, $message, 'error() is a removed, please call
 667              throw new \moodle_exception() instead of error()');
 668  }
 669  
 670  
 671  /**
 672   * @deprecated use $PAGE->theme->name instead.
 673   */
 674  function current_theme() {
 675      throw new coding_exception('current_theme() can not be used any more, please use $PAGE->theme->name instead');
 676  }
 677  
 678  /**
 679   * @deprecated
 680   */
 681  function formerr() {
 682      throw new coding_exception('formerr() is removed. Please change your code to use $OUTPUT->error_text($string).');
 683  }
 684  
 685  /**
 686   * @deprecated use $OUTPUT->skip_link_target() in instead.
 687   */
 688  function skip_main_destination() {
 689      throw new coding_exception('skip_main_destination() can not be used any more, please use $OUTPUT->skip_link_target() instead.');
 690  }
 691  
 692  /**
 693   * @deprecated use $OUTPUT->container() instead.
 694   */
 695  function print_container() {
 696      throw new coding_exception('print_container() can not be used any more. Please use $OUTPUT->container() instead.');
 697  }
 698  
 699  /**
 700   * @deprecated use $OUTPUT->container_start() instead.
 701   */
 702  function print_container_start() {
 703      throw new coding_exception('print_container_start() can not be used any more. Please use $OUTPUT->container_start() instead.');
 704  }
 705  
 706  /**
 707   * @deprecated use $OUTPUT->container_end() instead.
 708   */
 709  function print_container_end() {
 710      throw new coding_exception('print_container_end() can not be used any more. Please use $OUTPUT->container_end() instead.');
 711  }
 712  
 713  /**
 714   * @deprecated since Moodle 2.0 MDL-19077 - use $OUTPUT->notification instead.
 715   */
 716  function notify() {
 717      throw new coding_exception('notify() is removed, please use $OUTPUT->notification() instead');
 718  }
 719  
 720  /**
 721   * @deprecated use $OUTPUT->continue_button() instead.
 722   */
 723  function print_continue() {
 724      throw new coding_exception('print_continue() can not be used any more. Please use $OUTPUT->continue_button() instead.');
 725  }
 726  
 727  /**
 728   * @deprecated use $PAGE methods instead.
 729   */
 730  function print_header() {
 731  
 732      throw new coding_exception('print_header() can not be used any more. Please use $PAGE methods instead.');
 733  }
 734  
 735  /**
 736   * @deprecated use $PAGE methods instead.
 737   */
 738  function print_header_simple() {
 739  
 740      throw new coding_exception('print_header_simple() can not be used any more. Please use $PAGE methods instead.');
 741  }
 742  
 743  /**
 744   * @deprecated use $OUTPUT->block() instead.
 745   */
 746  function print_side_block() {
 747      throw new coding_exception('print_side_block() can not be used any more, please use $OUTPUT->block() instead.');
 748  }
 749  
 750  /**
 751   * @deprecated since Moodle 3.6
 752   */
 753  function print_textarea() {
 754      throw new coding_exception(
 755          'print_textarea() has been removed. Please use $OUTPUT->print_textarea() instead.'
 756      );
 757  }
 758  
 759  /**
 760   * Returns an image of an up or down arrow, used for column sorting. To avoid unnecessary DB accesses, please
 761   * provide this function with the language strings for sortasc and sortdesc.
 762   *
 763   * @deprecated use $OUTPUT->arrow() instead.
 764   * @todo final deprecation of this function once MDL-45448 is resolved
 765   *
 766   * If no sort string is associated with the direction, an arrow with no alt text will be printed/returned.
 767   *
 768   * @global object
 769   * @param string $direction 'up' or 'down'
 770   * @param string $strsort The language string used for the alt attribute of this image
 771   * @param bool $return Whether to print directly or return the html string
 772   * @return string|void depending on $return
 773   *
 774   */
 775  function print_arrow($direction='up', $strsort=null, $return=false) {
 776      global $OUTPUT;
 777  
 778      debugging('print_arrow() is deprecated. Please use $OUTPUT->arrow() instead.', DEBUG_DEVELOPER);
 779  
 780      if (!in_array($direction, array('up', 'down', 'right', 'left', 'move'))) {
 781          return null;
 782      }
 783  
 784      $return = null;
 785  
 786      switch ($direction) {
 787          case 'up':
 788              $sortdir = 'asc';
 789              break;
 790          case 'down':
 791              $sortdir = 'desc';
 792              break;
 793          case 'move':
 794              $sortdir = 'asc';
 795              break;
 796          default:
 797              $sortdir = null;
 798              break;
 799      }
 800  
 801      // Prepare language string
 802      $strsort = '';
 803      if (empty($strsort) && !empty($sortdir)) {
 804          $strsort  = get_string('sort' . $sortdir, 'grades');
 805      }
 806  
 807      $return = ' ' . $OUTPUT->pix_icon('t/' . $direction, $strsort) . ' ';
 808  
 809      if ($return) {
 810          return $return;
 811      } else {
 812          echo $return;
 813      }
 814  }
 815  
 816  /**
 817   * @deprecated since Moodle 2.0
 818   */
 819  function choose_from_menu() {
 820      throw new coding_exception('choose_from_menu() is removed. Please change your code to use html_writer::select().');
 821  }
 822  
 823  /**
 824   * @deprecated use $OUTPUT->help_icon_scale($courseid, $scale) instead.
 825   */
 826  function print_scale_menu_helpbutton() {
 827      throw new coding_exception('print_scale_menu_helpbutton() can not be used any more. '.
 828          'Please use $OUTPUT->help_icon_scale($courseid, $scale) instead.');
 829  }
 830  
 831  /**
 832   * @deprecated use html_writer::checkbox() instead.
 833   */
 834  function print_checkbox() {
 835      throw new coding_exception('print_checkbox() can not be used any more. Please use html_writer::checkbox() instead.');
 836  }
 837  
 838  /**
 839   * @deprecated since Moodle 3.2
 840   */
 841  function update_module_button() {
 842      throw new coding_exception('update_module_button() can not be used anymore. Activity modules should ' .
 843          'not add the edit module button, the link is already available in the Administration block. Themes ' .
 844          'can choose to display the link in the buttons row consistently for all module types.');
 845  }
 846  
 847  /**
 848   * @deprecated use $OUTPUT->navbar() instead
 849   */
 850  function print_navigation () {
 851      throw new coding_exception('print_navigation() can not be used any more, please update use $OUTPUT->navbar() instead.');
 852  }
 853  
 854  /**
 855   * @deprecated Please use $PAGE->navabar methods instead.
 856   */
 857  function build_navigation() {
 858      throw new coding_exception('build_navigation() can not be used any more, please use $PAGE->navbar methods instead.');
 859  }
 860  
 861  /**
 862   * @deprecated not relevant with global navigation in Moodle 2.x+
 863   */
 864  function navmenu() {
 865      throw new coding_exception('navmenu() can not be used any more, it is no longer relevant with global navigation.');
 866  }
 867  
 868  /// CALENDAR MANAGEMENT  ////////////////////////////////////////////////////////////////
 869  
 870  
 871  /**
 872   * @deprecated please use calendar_event::create() instead.
 873   */
 874  function add_event() {
 875      throw new coding_exception('add_event() can not be used any more, please use calendar_event::create() instead.');
 876  }
 877  
 878  /**
 879   * @deprecated please calendar_event->update() instead.
 880   */
 881  function update_event() {
 882      throw new coding_exception('update_event() is removed, please use calendar_event->update() instead.');
 883  }
 884  
 885  /**
 886   * @deprecated please use calendar_event->delete() instead.
 887   */
 888  function delete_event() {
 889      throw new coding_exception('delete_event() can not be used any more, please use '.
 890          'calendar_event->delete() instead.');
 891  }
 892  
 893  /**
 894   * @deprecated please use calendar_event->toggle_visibility(false) instead.
 895   */
 896  function hide_event() {
 897      throw new coding_exception('hide_event() can not be used any more, please use '.
 898          'calendar_event->toggle_visibility(false) instead.');
 899  }
 900  
 901  /**
 902   * @deprecated please use calendar_event->toggle_visibility(true) instead.
 903   */
 904  function show_event() {
 905      throw new coding_exception('show_event() can not be used any more, please use '.
 906          'calendar_event->toggle_visibility(true) instead.');
 907  }
 908  
 909  /**
 910   * @deprecated since Moodle 2.2 use core_text::xxxx() instead.
 911   */
 912  function textlib_get_instance() {
 913      throw new coding_exception('textlib_get_instance() can not be used any more, please use '.
 914          'core_text::functioname() instead.');
 915  }
 916  
 917  /**
 918   * @deprecated since 2.4
 919   */
 920  function get_generic_section_name() {
 921      throw new coding_exception('get_generic_section_name() is deprecated. Please use appropriate functionality '
 922              .'from class core_courseformat\\base');
 923  }
 924  
 925  /**
 926   * @deprecated since 2.4
 927   */
 928  function get_all_sections() {
 929      throw new coding_exception('get_all_sections() is removed. See phpdocs for this function');
 930  }
 931  
 932  /**
 933   * @deprecated since 2.4
 934   */
 935  function add_mod_to_section() {
 936      throw new coding_exception('Function add_mod_to_section() is removed, please use course_add_cm_to_section()');
 937  }
 938  
 939  /**
 940   * @deprecated since 2.4
 941   */
 942  function get_all_mods() {
 943      throw new coding_exception('Function get_all_mods() is removed. Use get_fast_modinfo() and get_module_types_names() instead. See phpdocs for details');
 944  }
 945  
 946  /**
 947   * @deprecated since 2.4
 948   */
 949  function get_course_section() {
 950      throw new coding_exception('Function get_course_section() is removed. Please use course_create_sections_if_missing() and get_fast_modinfo() instead.');
 951  }
 952  
 953  /**
 954   * @deprecated since 2.4
 955   */
 956  function format_weeks_get_section_dates() {
 957      throw new coding_exception('Function format_weeks_get_section_dates() is removed. It is not recommended to'.
 958              ' use it outside of format_weeks plugin');
 959  }
 960  
 961  /**
 962   * @deprecated since 2.5
 963   */
 964  function get_print_section_cm_text() {
 965      throw new coding_exception('Function get_print_section_cm_text() is removed. Please use '.
 966              'cm_info::get_formatted_content() and cm_info::get_formatted_name()');
 967  }
 968  
 969  /**
 970   * @deprecated since 2.5
 971   */
 972  function print_section_add_menus() {
 973      throw new coding_exception('Function print_section_add_menus() is removed. Please use course renderer '.
 974              'function course_section_add_cm_control()');
 975  }
 976  
 977  /**
 978   * @deprecated since 2.5. Please use:
 979   * $courserenderer = $PAGE->get_renderer('core', 'course');
 980   * $actions = course_get_cm_edit_actions($mod, $indent, $section);
 981   * return ' ' . $courserenderer->course_section_cm_edit_actions($actions);
 982   */
 983  function make_editing_buttons() {
 984      throw new coding_exception('Function make_editing_buttons() is removed, please see PHPdocs in '.
 985              'lib/deprecatedlib.php on how to replace it');
 986  }
 987  
 988  /**
 989   * @deprecated since 2.5
 990   */
 991  function print_section() {
 992      throw new coding_exception(
 993          'Function print_section() is removed.' .
 994          ' Please use core_courseformat\\output\\local\\content\\section' .
 995          ' to render a course section instead.'
 996      );
 997  }
 998  
 999  /**
1000   * @deprecated since 2.5
1001   */
1002  function print_overview() {
1003      throw new coding_exception('Function print_overview() is removed. Use block course_overview to display this information');
1004  }
1005  
1006  /**
1007   * @deprecated since 2.5
1008   */
1009  function print_recent_activity() {
1010      throw new coding_exception('Function print_recent_activity() is removed. It is not recommended to'.
1011              ' use it outside of block_recent_activity');
1012  }
1013  
1014  /**
1015   * @deprecated since 2.5
1016   */
1017  function delete_course_module() {
1018      throw new coding_exception('Function delete_course_module() is removed. Please use course_delete_module() instead.');
1019  }
1020  
1021  /**
1022   * @deprecated since 2.5
1023   */
1024  function update_category_button() {
1025      throw new coding_exception('Function update_category_button() is removed. Pages to view '.
1026              'and edit courses are now separate and no longer depend on editing mode.');
1027  }
1028  
1029  /**
1030   * @deprecated since 2.5
1031   */
1032  function make_categories_list() {
1033      throw new coding_exception('Global function make_categories_list() is removed. Please use '.
1034          'core_course_category::make_categories_list() and core_course_category::get_parents()');
1035  }
1036  
1037  /**
1038   * @deprecated since 2.5
1039   */
1040  function category_delete_move() {
1041      throw new coding_exception('Function category_delete_move() is removed. Please use ' .
1042          'core_course_category::delete_move() instead.');
1043  }
1044  
1045  /**
1046   * @deprecated since 2.5
1047   */
1048  function category_delete_full() {
1049      throw new coding_exception('Function category_delete_full() is removed. Please use ' .
1050          'core_course_category::delete_full() instead.');
1051  }
1052  
1053  /**
1054   * @deprecated since 2.5
1055   */
1056  function move_category() {
1057      throw new coding_exception('Function move_category() is removed. Please use core_course_category::change_parent() instead.');
1058  }
1059  
1060  /**
1061   * @deprecated since 2.5
1062   */
1063  function course_category_hide() {
1064      throw new coding_exception('Function course_category_hide() is removed. Please use core_course_category::hide() instead.');
1065  }
1066  
1067  /**
1068   * @deprecated since 2.5
1069   */
1070  function course_category_show() {
1071      throw new coding_exception('Function course_category_show() is removed. Please use core_course_category::show() instead.');
1072  }
1073  
1074  /**
1075   * @deprecated since 2.5. Please use core_course_category::get($catid, IGNORE_MISSING) or
1076   *     core_course_category::get($catid, MUST_EXIST).
1077   */
1078  function get_course_category() {
1079      throw new coding_exception('Function get_course_category() is removed. Please use core_course_category::get(), ' .
1080          'see phpdocs for more details');
1081  }
1082  
1083  /**
1084   * @deprecated since 2.5
1085   */
1086  function create_course_category() {
1087      throw new coding_exception('Function create_course_category() is removed. Please use core_course_category::create(), ' .
1088          'see phpdocs for more details');
1089  }
1090  
1091  /**
1092   * @deprecated since 2.5. Please use core_course_category::get() and core_course_category::get_children()
1093   */
1094  function get_all_subcategories() {
1095      throw new coding_exception('Function get_all_subcategories() is removed. Please use appropriate methods() '.
1096          'of core_course_category class. See phpdocs for more details');
1097  }
1098  
1099  /**
1100   * @deprecated since 2.5. Please use core_course_category::get($parentid)->get_children().
1101   */
1102  function get_child_categories() {
1103      throw new coding_exception('Function get_child_categories() is removed. Use core_course_category::get_children() or see ' .
1104          'phpdocs for more details.');
1105  }
1106  
1107  /**
1108   * @deprecated since 2.5
1109   */
1110  function get_categories() {
1111      throw new coding_exception('Function get_categories() is removed. Please use ' .
1112              'appropriate functions from class core_course_category');
1113  }
1114  
1115  /**
1116  * @deprecated since 2.5
1117  */
1118  function print_course_search() {
1119      throw new coding_exception('Function print_course_search() is removed, please use course renderer');
1120  }
1121  
1122  /**
1123   * @deprecated since 2.5
1124   */
1125  function print_my_moodle() {
1126      throw new coding_exception('Function print_my_moodle() is removed, please use course renderer ' .
1127              'function frontpage_my_courses()');
1128  }
1129  
1130  /**
1131   * @deprecated since 2.5
1132   */
1133  function print_remote_course() {
1134      throw new coding_exception('Function print_remote_course() is removed, please use course renderer');
1135  }
1136  
1137  /**
1138   * @deprecated since 2.5
1139   */
1140  function print_remote_host() {
1141      throw new coding_exception('Function print_remote_host() is removed, please use course renderer');
1142  }
1143  
1144  /**
1145   * @deprecated since 2.5
1146   */
1147  function print_whole_category_list() {
1148      throw new coding_exception('Function print_whole_category_list() is removed, please use course renderer');
1149  }
1150  
1151  /**
1152   * @deprecated since 2.5
1153   */
1154  function print_category_info() {
1155      throw new coding_exception('Function print_category_info() is removed, please use course renderer');
1156  }
1157  
1158  /**
1159   * @deprecated since 2.5
1160   */
1161  function get_course_category_tree() {
1162      throw new coding_exception('Function get_course_category_tree() is removed, please use course ' .
1163              'renderer or core_course_category class, see function phpdocs for more info');
1164  }
1165  
1166  /**
1167   * @deprecated since 2.5
1168   */
1169  function print_courses() {
1170      throw new coding_exception('Function print_courses() is removed, please use course renderer');
1171  }
1172  
1173  /**
1174   * @deprecated since 2.5
1175   */
1176  function print_course() {
1177      throw new coding_exception('Function print_course() is removed, please use course renderer');
1178  }
1179  
1180  /**
1181   * @deprecated since 2.5
1182   */
1183  function get_category_courses_array() {
1184      throw new coding_exception('Function get_category_courses_array() is removed, please use methods of ' .
1185          'core_course_category class');
1186  }
1187  
1188  /**
1189   * @deprecated since 2.5
1190   */
1191  function get_category_courses_array_recursively() {
1192      throw new coding_exception('Function get_category_courses_array_recursively() is removed, please use ' .
1193          'methods of core_course_category class', DEBUG_DEVELOPER);
1194  }
1195  
1196  /**
1197   * @deprecated since Moodle 2.5 MDL-27814 - please do not use this function any more.
1198   */
1199  function blog_get_context_url() {
1200      throw new coding_exception('Function  blog_get_context_url() is removed, getting params from context is not reliable for blogs.');
1201  }
1202  
1203  /**
1204   * @deprecated since 2.5
1205   */
1206  function get_courses_wmanagers() {
1207      throw new coding_exception('Function get_courses_wmanagers() is removed, please use ' .
1208          'core_course_category::get_courses()');
1209  }
1210  
1211  /**
1212   * @deprecated since 2.5
1213   */
1214  function convert_tree_to_html() {
1215      throw new coding_exception('Function convert_tree_to_html() is removed. Consider using class tabtree and core_renderer::render_tabtree()');
1216  }
1217  
1218  /**
1219   * @deprecated since 2.5
1220   */
1221  function convert_tabrows_to_tree() {
1222      throw new coding_exception('Function convert_tabrows_to_tree() is removed. Consider using class tabtree');
1223  }
1224  
1225  /**
1226   * @deprecated since 2.5 - do not use, the textrotate.js will work it out automatically
1227   */
1228  function can_use_rotated_text() {
1229      debugging('can_use_rotated_text() is removed. JS feature detection is used automatically.');
1230  }
1231  
1232  /**
1233   * @deprecated since Moodle 2.2 MDL-35009 - please do not use this function any more.
1234   */
1235  function get_context_instance_by_id() {
1236      throw new coding_exception('get_context_instance_by_id() is now removed, please use context::instance_by_id($id) instead.');
1237  }
1238  
1239  /**
1240   * Returns system context or null if can not be created yet.
1241   *
1242   * @see context_system::instance()
1243   * @deprecated since 2.2
1244   * @param bool $cache use caching
1245   * @return context system context (null if context table not created yet)
1246   */
1247  function get_system_context($cache = true) {
1248      debugging('get_system_context() is deprecated, please use context_system::instance() instead.', DEBUG_DEVELOPER);
1249      return context_system::instance(0, IGNORE_MISSING, $cache);
1250  }
1251  
1252  /**
1253   * @deprecated since 2.2, use $context->get_parent_context_ids() instead
1254   */
1255  function get_parent_contexts() {
1256      throw new coding_exception('get_parent_contexts() is removed, please use $context->get_parent_context_ids() instead.');
1257  }
1258  
1259  /**
1260   * @deprecated since Moodle 2.2
1261   */
1262  function get_parent_contextid() {
1263      throw new coding_exception('get_parent_contextid() is removed, please use $context->get_parent_context() instead.');
1264  }
1265  
1266  /**
1267   * @deprecated since 2.2
1268   */
1269  function get_child_contexts() {
1270      throw new coding_exception('get_child_contexts() is removed, please use $context->get_child_contexts() instead.');
1271  }
1272  
1273  /**
1274   * @deprecated since 2.2
1275   */
1276  function create_contexts() {
1277      throw new coding_exception('create_contexts() is removed, please use context_helper::create_instances() instead.');
1278  }
1279  
1280  /**
1281   * @deprecated since 2.2
1282   */
1283  function cleanup_contexts() {
1284      throw new coding_exception('cleanup_contexts() is removed, please use context_helper::cleanup_instances() instead.');
1285  }
1286  
1287  /**
1288   * @deprecated since 2.2
1289   */
1290  function build_context_path() {
1291      throw new coding_exception('build_context_path() is removed, please use context_helper::build_all_paths() instead.');
1292  }
1293  
1294  /**
1295   * @deprecated since 2.2
1296   */
1297  function rebuild_contexts() {
1298      throw new coding_exception('rebuild_contexts() is removed, please use $context->reset_paths(true) instead.');
1299  }
1300  
1301  /**
1302   * @deprecated since Moodle 2.2
1303   */
1304  function preload_course_contexts() {
1305      throw new coding_exception('preload_course_contexts() is removed, please use context_helper::preload_course() instead.');
1306  }
1307  
1308  /**
1309   * @deprecated since Moodle 2.2
1310   */
1311  function context_moved() {
1312      throw new coding_exception('context_moved() is removed, please use context::update_moved() instead.');
1313  }
1314  
1315  /**
1316   * @deprecated since 2.2
1317   */
1318  function fetch_context_capabilities() {
1319      throw new coding_exception('fetch_context_capabilities() is removed, please use $context->get_capabilities() instead.');
1320  }
1321  
1322  /**
1323   * @deprecated since 2.2
1324   */
1325  function context_instance_preload() {
1326      throw new coding_exception('context_instance_preload() is removed, please use context_helper::preload_from_record() instead.');
1327  }
1328  
1329  /**
1330   * @deprecated since 2.2
1331   */
1332  function get_contextlevel_name() {
1333      throw new coding_exception('get_contextlevel_name() is removed, please use context_helper::get_level_name() instead.');
1334  }
1335  
1336  /**
1337   * @deprecated since 2.2
1338   */
1339  function print_context_name() {
1340      throw new coding_exception('print_context_name() is removed, please use $context->get_context_name() instead.');
1341  }
1342  
1343  /**
1344   * @deprecated since 2.2, use $context->mark_dirty() instead
1345   */
1346  function mark_context_dirty() {
1347      throw new coding_exception('mark_context_dirty() is removed, please use $context->mark_dirty() instead.');
1348  }
1349  
1350  /**
1351   * @deprecated since Moodle 2.2
1352   */
1353  function delete_context() {
1354      throw new coding_exception('delete_context() is removed, please use context_helper::delete_instance() ' .
1355              'or $context->delete_content() instead.');
1356  }
1357  
1358  /**
1359   * @deprecated since 2.2
1360   */
1361  function get_context_url() {
1362      throw new coding_exception('get_context_url() is removed, please use $context->get_url() instead.');
1363  }
1364  
1365  /**
1366   * @deprecated since 2.2
1367   */
1368  function get_course_context() {
1369      throw new coding_exception('get_course_context() is removed, please use $context->get_course_context(true) instead.');
1370  }
1371  
1372  /**
1373   * @deprecated since 2.2
1374   */
1375  function get_user_courses_bycap() {
1376      throw new coding_exception('get_user_courses_bycap() is removed, please use enrol_get_users_courses() instead.');
1377  }
1378  
1379  /**
1380   * @deprecated since Moodle 2.2
1381   */
1382  function get_role_context_caps() {
1383      throw new coding_exception('get_role_context_caps() is removed, it is really slow. Don\'t use it.');
1384  }
1385  
1386  /**
1387   * @deprecated since 2.2
1388   */
1389  function get_courseid_from_context() {
1390      throw new coding_exception('get_courseid_from_context() is removed, please use $context->get_course_context(false) instead.');
1391  }
1392  
1393  /**
1394   * @deprecated since 2.2
1395   */
1396  function context_instance_preload_sql() {
1397      throw new coding_exception('context_instance_preload_sql() is removed, please use context_helper::get_preload_record_columns_sql() instead.');
1398  }
1399  
1400  /**
1401   * @deprecated since 2.2
1402   */
1403  function get_related_contexts_string() {
1404      throw new coding_exception('get_related_contexts_string() is removed, please use $context->get_parent_context_ids(true) instead.');
1405  }
1406  
1407  /**
1408   * @deprecated since 2.6
1409   */
1410  function get_plugin_list_with_file() {
1411      throw new coding_exception('get_plugin_list_with_file() is removed, please use core_component::get_plugin_list_with_file() instead.');
1412  }
1413  
1414  /**
1415   * @deprecated since 2.6
1416   */
1417  function check_browser_operating_system() {
1418      throw new coding_exception('check_browser_operating_system is removed, please update your code to use core_useragent instead.');
1419  }
1420  
1421  /**
1422   * @deprecated since 2.6
1423   */
1424  function check_browser_version() {
1425      throw new coding_exception('check_browser_version is removed, please update your code to use core_useragent instead.');
1426  }
1427  
1428  /**
1429   * @deprecated since 2.6
1430   */
1431  function get_device_type() {
1432      throw new coding_exception('get_device_type is removed, please update your code to use core_useragent instead.');
1433  }
1434  
1435  /**
1436   * @deprecated since 2.6
1437   */
1438  function get_device_type_list() {
1439      throw new coding_exception('get_device_type_list is removed, please update your code to use core_useragent instead.');
1440  }
1441  
1442  /**
1443   * @deprecated since 2.6
1444   */
1445  function get_selected_theme_for_device_type() {
1446      throw new coding_exception('get_selected_theme_for_device_type is removed, please update your code to use core_useragent instead.');
1447  }
1448  
1449  /**
1450   * @deprecated since 2.6
1451   */
1452  function get_device_cfg_var_name() {
1453      throw new coding_exception('get_device_cfg_var_name is removed, please update your code to use core_useragent instead.');
1454  }
1455  
1456  /**
1457   * @deprecated since 2.6
1458   */
1459  function set_user_device_type() {
1460      throw new coding_exception('set_user_device_type is removed, please update your code to use core_useragent instead.');
1461  }
1462  
1463  /**
1464   * @deprecated since 2.6
1465   */
1466  function get_user_device_type() {
1467      throw new coding_exception('get_user_device_type is removed, please update your code to use core_useragent instead.');
1468  }
1469  
1470  /**
1471   * @deprecated since 2.6
1472   */
1473  function get_browser_version_classes() {
1474      throw new coding_exception('get_browser_version_classes is removed, please update your code to use core_useragent instead.');
1475  }
1476  
1477  /**
1478   * @deprecated since Moodle 2.6
1479   */
1480  function generate_email_supportuser() {
1481      throw new coding_exception('generate_email_supportuser is removed, please use core_user::get_support_user');
1482  }
1483  
1484  /**
1485   * @deprecated since Moodle 2.6
1486   */
1487  function badges_get_issued_badge_info() {
1488      throw new coding_exception('Function badges_get_issued_badge_info() is removed. Please use core_badges_assertion class and methods to generate badge assertion.');
1489  }
1490  
1491  /**
1492   * @deprecated since 2.6
1493   */
1494  function can_use_html_editor() {
1495      throw new coding_exception('can_use_html_editor is removed, please update your code to assume it returns true.');
1496  }
1497  
1498  
1499  /**
1500   * @deprecated since Moodle 2.7, use {@link user_count_login_failures()} instead.
1501   */
1502  function count_login_failures() {
1503      throw new coding_exception('count_login_failures() can not be used any more, please use user_count_login_failures().');
1504  }
1505  
1506  /**
1507   * @deprecated since 2.7 MDL-33099/MDL-44088 - please do not use this function any more.
1508   */
1509  function ajaxenabled() {
1510      throw new coding_exception('ajaxenabled() can not be used anymore. Update your code to work with JS at all times.');
1511  }
1512  
1513  /**
1514   * @deprecated Since Moodle 2.7 MDL-44070
1515   */
1516  function coursemodule_visible_for_user() {
1517      throw new coding_exception('coursemodule_visible_for_user() can not be used any more,
1518              please use \core_availability\info_module::is_user_visible()');
1519  }
1520  
1521  /**
1522   * @deprecated since Moodle 2.8 MDL-36014, MDL-35618 this functionality is removed
1523   */
1524  function enrol_cohort_get_cohorts() {
1525      throw new coding_exception('Function enrol_cohort_get_cohorts() is removed, use '.
1526          'cohort_get_available_cohorts() instead');
1527  }
1528  
1529  /**
1530   * @deprecated since Moodle 2.8 MDL-36014 please use cohort_can_view_cohort()
1531   */
1532  function enrol_cohort_can_view_cohort() {
1533      throw new coding_exception('Function enrol_cohort_can_view_cohort() is removed, use cohort_can_view_cohort() instead');
1534  }
1535  
1536  /**
1537   * @deprecated since Moodle 2.8 MDL-36014 use cohort_get_available_cohorts() instead
1538   */
1539  function cohort_get_visible_list() {
1540      throw new coding_exception('Function cohort_get_visible_list() is removed. Please use function cohort_get_available_cohorts() ".
1541          "that correctly checks capabilities.');
1542  }
1543  
1544  /**
1545   * @deprecated since Moodle 2.8 MDL-35618 this functionality is removed
1546   */
1547  function enrol_cohort_enrol_all_users() {
1548      throw new coding_exception('enrol_cohort_enrol_all_users() is removed. This functionality is moved to enrol_manual.');
1549  }
1550  
1551  /**
1552   * @deprecated since Moodle 2.8 MDL-35618 this functionality is removed
1553   */
1554  function enrol_cohort_search_cohorts() {
1555      throw new coding_exception('enrol_cohort_search_cohorts() is removed. This functionality is moved to enrol_manual.');
1556  }
1557  
1558  /* === Apis deprecated in since Moodle 2.9 === */
1559  
1560  /**
1561   * @deprecated since Moodle 2.9 MDL-49371 - please do not use this function any more.
1562   */
1563  function message_current_user_is_involved() {
1564      throw new coding_exception('message_current_user_is_involved() can not be used any more.');
1565  }
1566  
1567  /**
1568   * @deprecated since Moodle 2.9 MDL-45898 - please do not use this function any more.
1569   */
1570  function profile_display_badges() {
1571      throw new coding_exception('profile_display_badges() can not be used any more.');
1572  }
1573  
1574  /**
1575   * @deprecated since Moodle 2.9 MDL-45774 - Please do not use this function any more.
1576   */
1577  function useredit_shared_definition_preferences() {
1578      throw new coding_exception('useredit_shared_definition_preferences() can not be used any more.');
1579  }
1580  
1581  
1582  /**
1583   * @deprecated since Moodle 2.9
1584   */
1585  function calendar_normalize_tz() {
1586      throw new coding_exception('calendar_normalize_tz() can not be used any more, please use core_date::normalise_timezone() instead.');
1587  }
1588  
1589  /**
1590   * @deprecated since Moodle 2.9
1591   */
1592  function get_user_timezone_offset() {
1593      throw new coding_exception('get_user_timezone_offset() can not be used any more, please use standard PHP DateTimeZone class instead');
1594  
1595  }
1596  
1597  /**
1598   * @deprecated since Moodle 2.9
1599   */
1600  function get_timezone_offset() {
1601      throw new coding_exception('get_timezone_offset() can not be used any more, please use standard PHP DateTimeZone class instead');
1602  }
1603  
1604  /**
1605   * @deprecated since Moodle 2.9
1606   */
1607  function get_list_of_timezones() {
1608      throw new coding_exception('get_list_of_timezones() can not be used any more, please use core_date::get_list_of_timezones() instead');
1609  }
1610  
1611  /**
1612   * @deprecated since Moodle 2.9
1613   */
1614  function update_timezone_records() {
1615      throw new coding_exception('update_timezone_records() can not be used any more, please use standard PHP DateTime class instead');
1616  }
1617  
1618  /**
1619   * @deprecated since Moodle 2.9
1620   */
1621  function calculate_user_dst_table() {
1622      throw new coding_exception('calculate_user_dst_table() can not be used any more, please use standard PHP DateTime class instead');
1623  }
1624  
1625  /**
1626   * @deprecated since Moodle 2.9
1627   */
1628  function dst_changes_for_year() {
1629      throw new coding_exception('dst_changes_for_year() can not be used any more, please use standard DateTime class instead');
1630  }
1631  
1632  /**
1633   * @deprecated since Moodle 2.9
1634   */
1635  function get_timezone_record() {
1636      throw new coding_exception('get_timezone_record() can not be used any more, please use standard PHP DateTime class instead');
1637  }
1638  
1639  /* === Apis deprecated since Moodle 3.0 === */
1640  /**
1641   * @deprecated since Moodle 3.0 MDL-49360 - please do not use this function any more.
1642   */
1643  function get_referer() {
1644      throw new coding_exception('get_referer() can not be used any more. Please use get_local_referer() instead.');
1645  }
1646  
1647  /**
1648   * @deprecated since Moodle 3.0 use \core_useragent::is_web_crawler instead.
1649   */
1650  function is_web_crawler() {
1651      throw new coding_exception('is_web_crawler() can not be used any more. Please use core_useragent::is_web_crawler() instead.');
1652  }
1653  
1654  /**
1655   * @deprecated since Moodle 3.0 MDL-50287 - please do not use this function any more.
1656   */
1657  function completion_cron() {
1658      throw new coding_exception('completion_cron() can not be used any more. Functionality has been moved to scheduled tasks.');
1659  }
1660  
1661  /**
1662   * @deprecated since 3.0
1663   */
1664  function coursetag_get_tags() {
1665      throw new coding_exception('Function coursetag_get_tags() can not be used any more. ' .
1666              'Userid is no longer used for tagging courses.');
1667  }
1668  
1669  /**
1670   * @deprecated since 3.0
1671   */
1672  function coursetag_get_all_tags() {
1673      throw new coding_exception('Function coursetag_get_all_tags() can not be used any more. Userid is no ' .
1674          'longer used for tagging courses.');
1675  }
1676  
1677  /**
1678   * @deprecated since 3.0
1679   */
1680  function coursetag_get_jscript() {
1681      throw new coding_exception('Function coursetag_get_jscript() can not be used any more and is obsolete.');
1682  }
1683  
1684  /**
1685   * @deprecated since 3.0
1686   */
1687  function coursetag_get_jscript_links() {
1688      throw new coding_exception('Function coursetag_get_jscript_links() can not be used any more and is obsolete.');
1689  }
1690  
1691  /**
1692   * @deprecated since 3.0
1693   */
1694  function coursetag_get_records() {
1695      throw new coding_exception('Function coursetag_get_records() can not be used any more. ' .
1696              'Userid is no longer used for tagging courses.');
1697  }
1698  
1699  /**
1700   * @deprecated since 3.0
1701   */
1702  function coursetag_store_keywords() {
1703      throw new coding_exception('Function coursetag_store_keywords() can not be used any more. ' .
1704              'Userid is no longer used for tagging courses.');
1705  }
1706  
1707  /**
1708   * @deprecated since 3.0
1709   */
1710  function coursetag_delete_keyword() {
1711      throw new coding_exception('Function coursetag_delete_keyword() can not be used any more. ' .
1712              'Userid is no longer used for tagging courses.');
1713  }
1714  
1715  /**
1716   * @deprecated since 3.0
1717   */
1718  function coursetag_get_tagged_courses() {
1719      throw new coding_exception('Function coursetag_get_tagged_courses() can not be used any more. ' .
1720              'Userid is no longer used for tagging courses.');
1721  }
1722  
1723  /**
1724   * @deprecated since 3.0
1725   */
1726  function coursetag_delete_course_tags() {
1727      throw new coding_exception('Function coursetag_delete_course_tags() is deprecated. ' .
1728              'Use core_tag_tag::remove_all_item_tags().');
1729  }
1730  
1731  /**
1732   * @deprecated since 3.1. Use core_tag_tag::get($tagid)->update() instead
1733   */
1734  function tag_type_set() {
1735      throw new coding_exception('tag_type_set() can not be used anymore. Please use ' .
1736          'core_tag_tag::get($tagid)->update().');
1737  }
1738  
1739  /**
1740   * @deprecated since 3.1. Use core_tag_tag::get($tagid)->update() instead
1741   */
1742  function tag_description_set() {
1743      throw new coding_exception('tag_description_set() can not be used anymore. Please use ' .
1744          'core_tag_tag::get($tagid)->update().');
1745  }
1746  
1747  /**
1748   * @deprecated since 3.1. Use core_tag_tag::get_item_tags() instead
1749   */
1750  function tag_get_tags() {
1751      throw new coding_exception('tag_get_tags() can not be used anymore. Please use ' .
1752          'core_tag_tag::get_item_tags().');
1753  }
1754  
1755  /**
1756   * @deprecated since 3.1
1757   */
1758  function tag_get_tags_array() {
1759      throw new coding_exception('tag_get_tags_array() can not be used anymore. Please use ' .
1760          'core_tag_tag::get_item_tags_array().');
1761  }
1762  
1763  /**
1764   * @deprecated since 3.1. Use core_tag_tag::get_item_tags_array() or $OUTPUT->tag_list(core_tag_tag::get_item_tags())
1765   */
1766  function tag_get_tags_csv() {
1767      throw new coding_exception('tag_get_tags_csv() can not be used anymore. Please use ' .
1768          'core_tag_tag::get_item_tags_array() or $OUTPUT->tag_list(core_tag_tag::get_item_tags()).');
1769  }
1770  
1771  /**
1772   * @deprecated since 3.1. Use core_tag_tag::get_item_tags() instead
1773   */
1774  function tag_get_tags_ids() {
1775      throw new coding_exception('tag_get_tags_ids() can not be used anymore. Please consider using ' .
1776          'core_tag_tag::get_item_tags() or similar methods.');
1777  }
1778  
1779  /**
1780   * @deprecated since 3.1. Use core_tag_tag::get_by_name() or core_tag_tag::get_by_name_bulk()
1781   */
1782  function tag_get_id() {
1783      throw new coding_exception('tag_get_id() can not be used anymore. Please use ' .
1784          'core_tag_tag::get_by_name() or core_tag_tag::get_by_name_bulk()');
1785  }
1786  
1787  /**
1788   * @deprecated since 3.1. Use core_tag_tag::get($tagid)->update() instead
1789   */
1790  function tag_rename() {
1791      throw new coding_exception('tag_rename() can not be used anymore. Please use ' .
1792          'core_tag_tag::get($tagid)->update()');
1793  }
1794  
1795  /**
1796   * @deprecated since 3.1. Use core_tag_tag::remove_item_tag() instead
1797   */
1798  function tag_delete_instance() {
1799      throw new coding_exception('tag_delete_instance() can not be used anymore. Please use ' .
1800          'core_tag_tag::remove_item_tag()');
1801  }
1802  
1803  /**
1804   * @deprecated since 3.1. Use core_tag_tag::get_by_name()->get_tagged_items() instead
1805   */
1806  function tag_find_records() {
1807      throw new coding_exception('tag_find_records() can not be used anymore. Please use ' .
1808          'core_tag_tag::get_by_name()->get_tagged_items()');
1809  }
1810  
1811  /**
1812   * @deprecated since 3.1
1813   */
1814  function tag_add() {
1815      throw new coding_exception('tag_add() can not be used anymore. You can use ' .
1816          'core_tag_tag::create_if_missing(), however it should not be necessary since tags are ' .
1817          'created automatically when assigned to items');
1818  }
1819  
1820  /**
1821   * @deprecated since 3.1. Use core_tag_tag::set_item_tags() or core_tag_tag::add_item_tag() instead
1822   */
1823  function tag_assign() {
1824      throw new coding_exception('tag_assign() can not be used anymore. Please use ' .
1825          'core_tag_tag::set_item_tags() or core_tag_tag::add_item_tag() instead. Tag instance ' .
1826          'ordering should not be set manually');
1827  }
1828  
1829  /**
1830   * @deprecated since 3.1. Use core_tag_tag::get($tagid)->count_tagged_items() instead
1831   */
1832  function tag_record_count() {
1833      throw new coding_exception('tag_record_count() can not be used anymore. Please use ' .
1834          'core_tag_tag::get($tagid)->count_tagged_items().');
1835  }
1836  
1837  /**
1838   * @deprecated since 3.1. Use core_tag_tag::get($tagid)->is_item_tagged_with() instead
1839   */
1840  function tag_record_tagged_with() {
1841      throw new coding_exception('tag_record_tagged_with() can not be used anymore. Please use ' .
1842          'core_tag_tag::get($tagid)->is_item_tagged_with().');
1843  }
1844  
1845  /**
1846   * @deprecated since 3.1. Use core_tag_tag::get($tagid)->flag() instead
1847   */
1848  function tag_set_flag() {
1849      throw new coding_exception('tag_set_flag() can not be used anymore. Please use ' .
1850          'core_tag_tag::get($tagid)->flag()');
1851  }
1852  
1853  /**
1854   * @deprecated since 3.1. Use core_tag_tag::get($tagid)->reset_flag() instead
1855   */
1856  function tag_unset_flag() {
1857      throw new coding_exception('tag_unset_flag() can not be used anymore. Please use ' .
1858          'core_tag_tag::get($tagid)->reset_flag()');
1859  }
1860  
1861  /**
1862   * @deprecated since 3.1
1863   */
1864  function tag_print_cloud() {
1865      throw new coding_exception('tag_print_cloud() can not be used anymore. Please use ' .
1866          'core_tag_collection::get_tag_cloud(), templateable core_tag\output\tagcloud and ' .
1867          'template core_tag/tagcloud.');
1868  }
1869  
1870  /**
1871   * @deprecated since 3.0
1872   */
1873  function tag_autocomplete() {
1874      throw new coding_exception('tag_autocomplete() can not be used anymore. New form ' .
1875          'element "tags" does proper autocomplete.');
1876  }
1877  
1878  /**
1879   * @deprecated since 3.1
1880   */
1881  function tag_print_description_box() {
1882      throw new coding_exception('tag_print_description_box() can not be used anymore. ' .
1883          'See core_tag_renderer for similar code');
1884  }
1885  
1886  /**
1887   * @deprecated since 3.1
1888   */
1889  function tag_print_management_box() {
1890      throw new coding_exception('tag_print_management_box() can not be used anymore. ' .
1891          'See core_tag_renderer for similar code');
1892  }
1893  
1894  /**
1895   * @deprecated since 3.1
1896   */
1897  function tag_print_search_box() {
1898      throw new coding_exception('tag_print_search_box() can not be used anymore. ' .
1899          'See core_tag_renderer for similar code');
1900  }
1901  
1902  /**
1903   * @deprecated since 3.1
1904   */
1905  function tag_print_search_results() {
1906      throw new coding_exception('tag_print_search_results() can not be used anymore. ' .
1907          'In /tag/search.php the search results are printed using the core_tag/tagcloud template.');
1908  }
1909  
1910  /**
1911   * @deprecated since 3.1
1912   */
1913  function tag_print_tagged_users_table() {
1914      throw new coding_exception('tag_print_tagged_users_table() can not be used anymore. ' .
1915          'See core_user_renderer for similar code');
1916  }
1917  
1918  /**
1919   * @deprecated since 3.1
1920   */
1921  function tag_print_user_box() {
1922      throw new coding_exception('tag_print_user_box() can not be used anymore. ' .
1923          'See core_user_renderer for similar code');
1924  }
1925  
1926  /**
1927   * @deprecated since 3.1
1928   */
1929  function tag_print_user_list() {
1930      throw new coding_exception('tag_print_user_list() can not be used anymore. ' .
1931          'See core_user_renderer for similar code');
1932  }
1933  
1934  /**
1935   * @deprecated since 3.1
1936   */
1937  function tag_display_name() {
1938      throw new coding_exception('tag_display_name() can not be used anymore. Please use ' .
1939          'core_tag_tag::make_display_name().');
1940  
1941  }
1942  
1943  /**
1944   * @deprecated since 3.1
1945   */
1946  function tag_normalize() {
1947      throw new coding_exception('tag_normalize() can not be used anymore. Please use ' .
1948          'core_tag_tag::normalize().');
1949  }
1950  
1951  /**
1952   * @deprecated since 3.1
1953   */
1954  function tag_get_related_tags_csv() {
1955      throw new coding_exception('tag_get_related_tags_csv() can not be used anymore. Please ' .
1956          'consider looping through array or using $OUTPUT->tag_list(core_tag_tag::get_item_tags()).');
1957  }
1958  
1959  /**
1960   * @deprecated since 3.1
1961   */
1962  function tag_set() {
1963      throw new coding_exception('tag_set() can not be used anymore. Please use ' .
1964          'core_tag_tag::set_item_tags().');
1965  }
1966  
1967  /**
1968   * @deprecated since 3.1
1969   */
1970  function tag_set_add() {
1971      throw new coding_exception('tag_set_add() can not be used anymore. Please use ' .
1972          'core_tag_tag::add_item_tag().');
1973  }
1974  
1975  /**
1976   * @deprecated since 3.1
1977   */
1978  function tag_set_delete() {
1979      throw new coding_exception('tag_set_delete() can not be used anymore. Please use ' .
1980          'core_tag_tag::remove_item_tag().');
1981  }
1982  
1983  /**
1984   * @deprecated since 3.1
1985   */
1986  function tag_get() {
1987      throw new coding_exception('tag_get() can not be used anymore. Please use ' .
1988          'core_tag_tag::get() or core_tag_tag::get_by_name().');
1989  }
1990  
1991  /**
1992   * @deprecated since 3.1
1993   */
1994  function tag_get_related_tags() {
1995      throw new coding_exception('tag_get_related_tags() can not be used anymore. Please use ' .
1996          'core_tag_tag::get_correlated_tags(), core_tag_tag::get_related_tags() or ' .
1997          'core_tag_tag::get_manual_related_tags().');
1998  }
1999  
2000  /**
2001   * @deprecated since 3.1
2002   */
2003  function tag_delete() {
2004      throw new coding_exception('tag_delete() can not be used anymore. Please use ' .
2005          'core_tag_tag::delete_tags().');
2006  }
2007  
2008  /**
2009   * @deprecated since 3.1
2010   */
2011  function tag_delete_instances() {
2012      throw new coding_exception('tag_delete_instances() can not be used anymore. Please use ' .
2013          'core_tag_tag::delete_instances().');
2014  }
2015  
2016  /**
2017   * @deprecated since 3.1
2018   */
2019  function tag_cleanup() {
2020      throw new coding_exception('tag_cleanup() can not be used anymore. Please use ' .
2021          '\core\task\tag_cron_task::cleanup().');
2022  }
2023  
2024  /**
2025   * @deprecated since 3.1
2026   */
2027  function tag_bulk_delete_instances() {
2028      throw new coding_exception('tag_bulk_delete_instances() can not be used anymore. Please use ' .
2029          '\core\task\tag_cron_task::bulk_delete_instances().');
2030  
2031  }
2032  
2033  /**
2034   * @deprecated since 3.1
2035   */
2036  function tag_compute_correlations() {
2037      throw new coding_exception('tag_compute_correlations() can not be used anymore. Please use ' .
2038          'use \core\task\tag_cron_task::compute_correlations().');
2039  }
2040  
2041  /**
2042   * @deprecated since 3.1
2043   */
2044  function tag_process_computed_correlation() {
2045      throw new coding_exception('tag_process_computed_correlation() can not be used anymore. Please use ' .
2046          'use \core\task\tag_cron_task::process_computed_correlation().');
2047  }
2048  
2049  /**
2050   * @deprecated since 3.1
2051   */
2052  function tag_cron() {
2053      throw new coding_exception('tag_cron() can not be used anymore. Please use ' .
2054          'use \core\task\tag_cron_task::execute().');
2055  }
2056  
2057  /**
2058   * @deprecated since 3.1
2059   */
2060  function tag_find_tags() {
2061      throw new coding_exception('tag_find_tags() can not be used anymore.');
2062  }
2063  
2064  /**
2065   * @deprecated since 3.1
2066   */
2067  function tag_get_name() {
2068      throw new coding_exception('tag_get_name() can not be used anymore.');
2069  }
2070  
2071  /**
2072   * @deprecated since 3.1
2073   */
2074  function tag_get_correlated() {
2075      throw new coding_exception('tag_get_correlated() can not be used anymore. Please use ' .
2076          'use core_tag_tag::get_correlated_tags().');
2077  
2078  }
2079  
2080  /**
2081   * @deprecated since 3.1
2082   */
2083  function tag_cloud_sort() {
2084      throw new coding_exception('tag_cloud_sort() can not be used anymore. Similar method can ' .
2085          'be found in core_tag_collection::cloud_sort().');
2086  }
2087  
2088  /**
2089   * @deprecated since Moodle 3.1
2090   */
2091  function events_load_def() {
2092      throw new coding_exception('events_load_def() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2093  
2094  }
2095  
2096  /**
2097   * @deprecated since Moodle 3.1
2098   */
2099  function events_queue_handler() {
2100      throw new coding_exception('events_queue_handler() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2101  }
2102  
2103  /**
2104   * @deprecated since Moodle 3.1
2105   */
2106  function events_dispatch() {
2107      throw new coding_exception('events_dispatch() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2108  }
2109  
2110  /**
2111   * @deprecated since Moodle 3.1
2112   */
2113  function events_process_queued_handler() {
2114      throw new coding_exception(
2115          'events_process_queued_handler() has been deprecated along with all Events 1 API in favour of Events 2 API.'
2116      );
2117  }
2118  
2119  /**
2120   * @deprecated since Moodle 3.1
2121   */
2122  function events_update_definition() {
2123      throw new coding_exception(
2124          'events_update_definition has been deprecated along with all Events 1 API in favour of Events 2 API.'
2125      );
2126  }
2127  
2128  /**
2129   * @deprecated since Moodle 3.1
2130   */
2131  function events_cron() {
2132      throw new coding_exception('events_cron() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2133  }
2134  
2135  /**
2136   * @deprecated since Moodle 3.1
2137   */
2138  function events_trigger_legacy() {
2139      throw new coding_exception('events_trigger_legacy() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2140  }
2141  
2142  /**
2143   * @deprecated since Moodle 3.1
2144   */
2145  function events_is_registered() {
2146      throw new coding_exception('events_is_registered() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2147  }
2148  
2149  /**
2150   * @deprecated since Moodle 3.1
2151   */
2152  function events_pending_count() {
2153      throw new coding_exception('events_pending_count() has been deprecated along with all Events 1 API in favour of Events 2 API.');
2154  }
2155  
2156  /**
2157   * @deprecated since Moodle 3.0 - this is a part of clamav plugin now.
2158   */
2159  function clam_message_admins() {
2160      throw new coding_exception('clam_message_admins() can not be used anymore. Please use ' .
2161          'message_admins() method of \antivirus_clamav\scanner class.');
2162  }
2163  
2164  /**
2165   * @deprecated since Moodle 3.0 - this is a part of clamav plugin now.
2166   */
2167  function get_clam_error_code() {
2168      throw new coding_exception('get_clam_error_code() can not be used anymore. Please use ' .
2169          'get_clam_error_code() method of \antivirus_clamav\scanner class.');
2170  }
2171  
2172  /**
2173   * @deprecated since 3.1
2174   */
2175  function course_get_cm_rename_action() {
2176      throw new coding_exception('course_get_cm_rename_action() can not be used anymore. Please use ' .
2177          'inplace_editable https://docs.moodle.org/dev/Inplace_editable.');
2178  
2179  }
2180  
2181  /**
2182   * @deprecated since Moodle 3.1
2183   */
2184  function course_scale_used() {
2185      throw new coding_exception('course_scale_used() can not be used anymore. Plugins can ' .
2186          'implement <modname>_scale_used_anywhere, all implementations of <modname>_scale_used are now ignored');
2187  }
2188  
2189  /**
2190   * @deprecated since Moodle 3.1
2191   */
2192  function site_scale_used() {
2193      throw new coding_exception('site_scale_used() can not be used anymore. Plugins can implement ' .
2194          '<modname>_scale_used_anywhere, all implementations of <modname>_scale_used are now ignored');
2195  }
2196  
2197  /**
2198   * @deprecated since Moodle 3.1. Use external_api::external_function_info().
2199   */
2200  function external_function_info() {
2201      throw new coding_exception('external_function_info() can not be used any'.
2202          'more. Please use external_api::external_function_info() instead.');
2203  }
2204  
2205  /**
2206   * @deprecated since Moodle 3.2
2207   * @see csv_import_reader::load_csv_content()
2208   */
2209  function get_records_csv() {
2210      throw new coding_exception('get_records_csv() can not be used anymore. Please use ' .
2211          'lib/csvlib.class.php csv_import_reader() instead.');
2212  }
2213  
2214  /**
2215   * @deprecated since Moodle 3.2
2216   * @see download_as_dataformat (lib/dataformatlib.php)
2217   */
2218  function put_records_csv() {
2219      throw new coding_exception('put_records_csv() can not be used anymore. Please use ' .
2220          'lib/dataformatlib.php download_as_dataformat() instead.');
2221  }
2222  
2223  /**
2224   * @deprecated since Moodle 3.2
2225   */
2226  function css_is_colour() {
2227      throw new coding_exception('css_is_colour() can not be used anymore.');
2228  }
2229  
2230  /**
2231   * @deprecated since Moodle 3.2
2232   */
2233  function css_is_width() {
2234      throw new coding_exception('css_is_width() can not be used anymore.');
2235  }
2236  
2237  /**
2238   * @deprecated since Moodle 3.2
2239   */
2240  function css_sort_by_count() {
2241      throw new coding_exception('css_sort_by_count() can not be used anymore.');
2242  }
2243  
2244  /**
2245   * @deprecated since Moodle 3.2
2246   */
2247  function message_get_course_contexts() {
2248      throw new coding_exception('message_get_course_contexts() can not be used anymore.');
2249  }
2250  
2251  /**
2252   * @deprecated since Moodle 3.2
2253   */
2254  function message_remove_url_params() {
2255      throw new coding_exception('message_remove_url_params() can not be used anymore.');
2256  }
2257  
2258  /**
2259   * @deprecated since Moodle 3.2
2260   */
2261  function message_count_messages() {
2262      throw new coding_exception('message_count_messages() can not be used anymore.');
2263  }
2264  
2265  /**
2266   * @deprecated since Moodle 3.2
2267   */
2268  function message_count_blocked_users() {
2269      throw new coding_exception('message_count_blocked_users() can not be used anymore. Please use ' .
2270          '\core_message\api::count_blocked_users() instead.');
2271  }
2272  
2273  /**
2274   * @deprecated since Moodle 3.2
2275   */
2276  function message_contact_link() {
2277      throw new coding_exception('message_contact_link() can not be used anymore.');
2278  }
2279  
2280  /**
2281   * @deprecated since Moodle 3.2
2282   */
2283  function message_get_recent_notifications() {
2284      throw new coding_exception('message_get_recent_notifications() can not be used anymore.');
2285  }
2286  
2287  /**
2288   * @deprecated since Moodle 3.2
2289   */
2290  function message_history_link() {
2291      throw new coding_exception('message_history_link() can not be used anymore.');
2292  }
2293  
2294  /**
2295   * @deprecated since Moodle 3.2
2296   */
2297  function message_search() {
2298      throw new coding_exception('message_search() can not be used anymore.');
2299  }
2300  
2301  /**
2302   * @deprecated since Moodle 3.2
2303   */
2304  function message_shorten_message() {
2305      throw new coding_exception('message_shorten_message() can not be used anymore.');
2306  }
2307  
2308  /**
2309   * @deprecated since Moodle 3.2
2310   */
2311  function message_get_fragment() {
2312      throw new coding_exception('message_get_fragment() can not be used anymore.');
2313  }
2314  
2315  /**
2316   * @deprecated since Moodle 3.2
2317   */
2318  function message_get_history() {
2319      throw new coding_exception('message_get_history() can not be used anymore.');
2320  }
2321  
2322  /**
2323   * @deprecated since Moodle 3.2
2324   */
2325  function message_get_contact_add_remove_link() {
2326      throw new coding_exception('message_get_contact_add_remove_link() can not be used anymore.');
2327  }
2328  
2329  /**
2330   * @deprecated since Moodle 3.2
2331   */
2332  function message_get_contact_block_link() {
2333      throw new coding_exception('message_get_contact_block_link() can not be used anymore.');
2334  }
2335  
2336  /**
2337   * @deprecated since Moodle 3.2
2338   */
2339  function message_mark_messages_read() {
2340      throw new coding_exception('message_mark_messages_read() can not be used anymore. Please use ' .
2341          '\core_message\api::mark_all_messages_as_read() instead.');
2342  }
2343  
2344  /**
2345   * @deprecated since Moodle 3.2
2346   */
2347  function message_can_post_message() {
2348      throw new coding_exception('message_can_post_message() can not be used anymore. Please use ' .
2349          '\core_message\api::can_send_message() instead.');
2350  }
2351  
2352  /**
2353   * @deprecated since Moodle 3.2
2354   */
2355  function message_is_user_non_contact_blocked() {
2356      throw new coding_exception('message_is_user_non_contact_blocked() can not be used anymore. Please use ' .
2357          '\core_message\api::is_user_non_contact_blocked() instead.');
2358  }
2359  
2360  /**
2361   * @deprecated since Moodle 3.2
2362   */
2363  function message_is_user_blocked() {
2364      throw new coding_exception('message_is_user_blocked() can not be used anymore. Please use ' .
2365          '\core_message\api::is_user_blocked() instead.');
2366  }
2367  
2368  /**
2369   * @deprecated since Moodle 3.2
2370   */
2371  function print_log() {
2372      throw new coding_exception('print_log() can not be used anymore. Please use the ' .
2373          'report_log framework instead.');
2374  }
2375  
2376  /**
2377   * @deprecated since Moodle 3.2
2378   */
2379  function print_mnet_log() {
2380      throw new coding_exception('print_mnet_log() can not be used anymore. Please use the ' .
2381          'report_log framework instead.');
2382  }
2383  
2384  /**
2385   * @deprecated since Moodle 3.2
2386   */
2387  function print_log_csv() {
2388      throw new coding_exception('print_log_csv() can not be used anymore. Please use the ' .
2389          'report_log framework instead.');
2390  }
2391  
2392  /**
2393   * @deprecated since Moodle 3.2
2394   */
2395  function print_log_xls() {
2396      throw new coding_exception('print_log_xls() can not be used anymore. Please use the ' .
2397          'report_log framework instead.');
2398  }
2399  
2400  /**
2401   * @deprecated since Moodle 3.2
2402   */
2403  function print_log_ods() {
2404      throw new coding_exception('print_log_ods() can not be used anymore. Please use the ' .
2405          'report_log framework instead.');
2406  }
2407  
2408  /**
2409   * @deprecated since Moodle 3.2
2410   */
2411  function build_logs_array() {
2412      throw new coding_exception('build_logs_array() can not be used anymore. Please use the ' .
2413          'report_log framework instead.');
2414  }
2415  
2416  /**
2417   * @deprecated since Moodle 3.2
2418   */
2419  function get_logs_usercourse() {
2420      throw new coding_exception('get_logs_usercourse() can not be used anymore. Please use the ' .
2421          'report_log framework instead.');
2422  }
2423  
2424  /**
2425   * @deprecated since Moodle 3.2
2426   */
2427  function get_logs_userday() {
2428      throw new coding_exception('get_logs_userday() can not be used anymore. Please use the ' .
2429          'report_log framework instead.');
2430  }
2431  
2432  /**
2433   * @deprecated since Moodle 3.2
2434   */
2435  function get_logs() {
2436      throw new coding_exception('get_logs() can not be used anymore. Please use the ' .
2437          'report_log framework instead.');
2438  }
2439  
2440  /**
2441   * @deprecated since Moodle 3.2
2442   */
2443  function prevent_form_autofill_password() {
2444      throw new coding_exception('prevent_form_autofill_password() can not be used anymore.');
2445  }
2446  
2447  /**
2448   * @deprecated since Moodle 3.3 MDL-57370
2449   */
2450  function message_get_recent_conversations($userorid, $limitfrom = 0, $limitto = 100) {
2451      throw new coding_exception('message_get_recent_conversations() can not be used any more. ' .
2452          'Please use \core_message\api::get_conversations() instead.', DEBUG_DEVELOPER);
2453  }
2454  
2455  /**
2456   * @deprecated since Moodle 3.2
2457   */
2458  function calendar_preferences_button() {
2459      throw new coding_exception('calendar_preferences_button() can not be used anymore. The calendar ' .
2460          'preferences are now linked to the user preferences page.');
2461  }
2462  
2463  /**
2464   * @deprecated since 3.3
2465   */
2466  function calendar_wday_name() {
2467      throw new coding_exception('Function calendar_wday_name() is removed and no longer used in core.');
2468  }
2469  
2470  /**
2471   * @deprecated since 3.3
2472   */
2473  function calendar_get_block_upcoming() {
2474      throw new coding_exception('Function calendar_get_block_upcoming() is removed,' .
2475          'Please see block_calendar_upcoming::get_content() for the correct API usage.');
2476  }
2477  
2478  /**
2479   * @deprecated since 3.3
2480   */
2481  function calendar_print_month_selector() {
2482      throw new coding_exception('Function calendar_print_month_selector() is removed and can no longer used in core.');
2483  }
2484  
2485  /**
2486   * @deprecated since 3.3
2487   */
2488  function calendar_cron() {
2489      throw new coding_exception('Function calendar_cron() is removed. Please use the core\task\calendar_cron_task instead.');
2490  }
2491  
2492  /**
2493   * @deprecated since Moodle 3.4 and removed immediately. MDL-49398.
2494   */
2495  function load_course_context() {
2496      throw new coding_exception('load_course_context() is removed. Do not use private functions or data structures.');
2497  }
2498  
2499  /**
2500   * @deprecated since Moodle 3.4 and removed immediately. MDL-49398.
2501   */
2502  function load_role_access_by_context() {
2503      throw new coding_exception('load_role_access_by_context() is removed. Do not use private functions or data structures.');
2504  }
2505  
2506  /**
2507   * @deprecated since Moodle 3.4 and removed immediately. MDL-49398.
2508   */
2509  function dedupe_user_access() {
2510      throw new coding_exception('dedupe_user_access() is removed. Do not use private functions or data structures.');
2511  }
2512  
2513  /**
2514   * @deprecated since Moodle 3.4. MDL-49398.
2515   */
2516  function get_user_access_sitewide() {
2517      throw new coding_exception('get_user_access_sitewide() is removed. Do not use private functions or data structures.');
2518  }
2519  
2520  /**
2521   * @deprecated since Moodle 3.4. MDL-59333
2522   */
2523  function calendar_get_mini() {
2524      throw new coding_exception('calendar_get_mini() has been removed. Please update your code to use calendar_get_view.');
2525  }
2526  
2527  /**
2528   * @deprecated since Moodle 3.4. MDL-59333
2529   */
2530  function calendar_get_upcoming() {
2531      throw new coding_exception('calendar_get_upcoming() has been removed. ' .
2532              'Please see block_calendar_upcoming::get_content() for the correct API usage.');
2533  }
2534  
2535  /**
2536   * @deprecated since Moodle 3.4. MDL-50666
2537   */
2538  function allow_override() {
2539      throw new coding_exception('allow_override() has been removed. Please update your code to use core_role_set_override_allowed.');
2540  }
2541  
2542  /**
2543   * @deprecated since Moodle 3.4. MDL-50666
2544   */
2545  function allow_assign() {
2546      throw new coding_exception('allow_assign() has been removed. Please update your code to use core_role_set_assign_allowed.');
2547  }
2548  
2549  /**
2550   * @deprecated since Moodle 3.4. MDL-50666
2551   */
2552  function allow_switch() {
2553      throw new coding_exception('allow_switch() has been removed. Please update your code to use core_role_set_switch_allowed.');
2554  }
2555  
2556  /**
2557   * @deprecated since Moodle 3.5. MDL-61132
2558   */
2559  function question_add_tops() {
2560      throw new coding_exception(
2561          'question_add_tops() has been removed. You may want to pass $top = true to get_categories_for_contexts().'
2562      );
2563  }
2564  
2565  /**
2566   * @deprecated since Moodle 3.5. MDL-61132
2567   */
2568  function question_is_only_toplevel_category_in_context() {
2569      throw new coding_exception('question_is_only_toplevel_category_in_context() has been removed. '
2570              . 'Please update your code to use question_is_only_child_of_top_category_in_context() instead.');
2571  }
2572  
2573  /**
2574   * @deprecated since Moodle 3.5
2575   */
2576  function message_move_userfrom_unread2read() {
2577      throw new coding_exception('message_move_userfrom_unread2read() has been removed.');
2578  }
2579  
2580  /**
2581   * @deprecated since Moodle 3.5
2582   */
2583  function message_get_blocked_users() {
2584      throw new coding_exception(
2585          'message_get_blocked_users() has been removed, please use \core_message\api::get_blocked_users() instead.'
2586      );
2587  }
2588  
2589  /**
2590   * @deprecated since Moodle 3.5
2591   */
2592  function message_get_contacts() {
2593      throw new coding_exception('message_get_contacts() has been removed.');
2594  }
2595  
2596  /**
2597   * @deprecated since Moodle 3.5
2598   */
2599  function message_mark_message_read() {
2600      throw new coding_exception('message_mark_message_read() has been removed, please use \core_message\api::mark_message_as_read()
2601          or \core_message\api::mark_notification_as_read().');
2602  }
2603  
2604  /**
2605   * @deprecated since Moodle 3.5
2606   */
2607  function message_can_delete_message() {
2608      throw new coding_exception(
2609          'message_can_delete_message() has been removed, please use \core_message\api::can_delete_message() instead.'
2610      );
2611  }
2612  
2613  /**
2614   * @deprecated since Moodle 3.5
2615   */
2616  function message_delete_message() {
2617      throw new coding_exception(
2618          'message_delete_message() has been removed, please use \core_message\api::delete_message() instead.'
2619      );
2620  }
2621  
2622  /**
2623   * @deprecated since 3.6
2624   */
2625  function calendar_get_all_allowed_types() {
2626      throw new coding_exception(
2627          'calendar_get_all_allowed_types() has been removed. Please use calendar_get_allowed_types() instead.'
2628      );
2629  
2630  }
2631  
2632  /**
2633   * @deprecated since Moodle 3.6.
2634   */
2635  function groups_get_all_groups_for_courses() {
2636      throw new coding_exception(
2637          'groups_get_all_groups_for_courses() has been removed and can not be used anymore.'
2638      );
2639  }
2640  
2641  /**
2642   * @deprecated since Moodle 3.6. Please use the Events 2 API.
2643   */
2644  function events_get_cached() {
2645      throw new coding_exception(
2646          'Events API using $handlers array has been removed in favour of Events 2 API, please use it instead.'
2647      );
2648  }
2649  
2650  /**
2651   * @deprecated since Moodle 3.6. Please use the Events 2 API.
2652   */
2653  function events_uninstall() {
2654      throw new coding_exception(
2655          'Events API using $handlers array has been removed in favour of Events 2 API, please use it instead.'
2656      );
2657  }
2658  
2659  /**
2660   * @deprecated since Moodle 3.6. Please use the Events 2 API.
2661   */
2662  function events_cleanup() {
2663      throw new coding_exception(
2664          'Events API using $handlers array has been removed in favour of Events 2 API, please use it instead.'
2665      );
2666  }
2667  
2668  /**
2669   * @deprecated since Moodle 3.6. Please use the Events 2 API.
2670   */
2671  function events_dequeue() {
2672      throw new coding_exception(
2673          'Events API using $handlers array has been removed in favour of Events 2 API, please use it instead.'
2674      );
2675  }
2676  
2677  /**
2678   * @deprecated since Moodle 3.6. Please use the Events 2 API.
2679   */
2680  function events_get_handlers() {
2681      throw new coding_exception(
2682          'Events API using $handlers array has been removed in favour of Events 2 API, please use it instead.'
2683      );
2684  }
2685  
2686  /**
2687   * @deprecated since Moodle 3.6. Please use the get_roles_used_in_context().
2688   */
2689  function get_roles_on_exact_context() {
2690      throw new coding_exception(
2691          'get_roles_on_exact_context() has been removed, please use get_roles_used_in_context() instead.'
2692      );
2693  }
2694  
2695  /**
2696   * @deprecated since Moodle 3.6. Please use the get_roles_used_in_context().
2697   */
2698  function get_roles_with_assignment_on_context() {
2699      throw new coding_exception(
2700          'get_roles_with_assignment_on_context() has been removed, please use get_roles_used_in_context() instead.'
2701      );
2702  }
2703  
2704  /**
2705   * @deprecated since Moodle 3.6
2706   */
2707  function message_add_contact() {
2708      throw new coding_exception(
2709          'message_add_contact() has been removed. Please use \core_message\api::create_contact_request() instead. ' .
2710          'If you wish to block or unblock a user please use \core_message\api::is_blocked() and ' .
2711          '\core_message\api::block_user() or \core_message\api::unblock_user() respectively.'
2712      );
2713  }
2714  
2715  /**
2716   * @deprecated since Moodle 3.6
2717   */
2718  function message_remove_contact() {
2719      throw new coding_exception(
2720          'message_remove_contact() has been removed. Please use \core_message\api::remove_contact() instead.'
2721      );
2722  }
2723  
2724  /**
2725   * @deprecated since Moodle 3.6
2726   */
2727  function message_unblock_contact() {
2728      throw new coding_exception(
2729          'message_unblock_contact() has been removed. Please use \core_message\api::unblock_user() instead.'
2730      );
2731  }
2732  
2733  /**
2734   * @deprecated since Moodle 3.6
2735   */
2736  function message_block_contact() {
2737      throw new coding_exception(
2738          'message_block_contact() has been removed. Please use \core_message\api::is_blocked() and ' .
2739          '\core_message\api::block_user() instead.'
2740      );
2741  }
2742  
2743  /**
2744   * @deprecated since Moodle 3.6
2745   */
2746  function message_get_contact() {
2747      throw new coding_exception(
2748          'message_get_contact() has been removed. Please use \core_message\api::get_contact() instead.'
2749      );
2750  }
2751  
2752  /**
2753   * @deprecated since Moodle 3.7
2754   */
2755  function get_courses_page() {
2756      throw new coding_exception(
2757          'Function get_courses_page() has been removed. Please use core_course_category::get_courses() ' .
2758          'or core_course_category::search_courses()'
2759      );
2760  }
2761  
2762  /**
2763   * @deprecated since Moodle 3.8
2764   */
2765  function report_insights_context_insights(\context $context) {
2766      throw new coding_exception(
2767          'Function report_insights_context_insights() ' .
2768          'has been removed. Please use \core_analytics\manager::cached_models_with_insights instead'
2769      );
2770  }
2771  
2772  /**
2773   * @deprecated since 3.9
2774   */
2775  function get_module_metadata() {
2776      throw new coding_exception(
2777          'get_module_metadata() has been removed. Please use \core_course\local\service\content_item_service instead.');
2778  }
2779  
2780  /**
2781   * @deprecated since Moodle 3.9 MDL-63580. Please use the \core\task\manager::run_from_cli($task).
2782   */
2783  function cron_run_single_task() {
2784      throw new coding_exception(
2785          'cron_run_single_task() has been removed. Please use \\core\task\manager::run_from_cli() instead.'
2786      );
2787  }
2788  
2789  /**
2790   * Executes cron functions for a specific type of plugin.
2791   *
2792   * @param string $plugintype Plugin type (e.g. 'report')
2793   * @param string $description If specified, will display 'Starting (whatever)'
2794   *   and 'Finished (whatever)' lines, otherwise does not display
2795   *
2796   * @deprecated since Moodle 3.9 MDL-52846. Please use new task API.
2797   * @todo MDL-61165 This will be deleted in Moodle 4.1.
2798   */
2799  function cron_execute_plugin_type($plugintype, $description = null) {
2800      global $DB;
2801  
2802      // Get list from plugin => function for all plugins.
2803      $plugins = get_plugin_list_with_function($plugintype, 'cron');
2804  
2805      // Modify list for backward compatibility (different files/names).
2806      $plugins = cron_bc_hack_plugin_functions($plugintype, $plugins);
2807  
2808      // Return if no plugins with cron function to process.
2809      if (!$plugins) {
2810          return;
2811      }
2812  
2813      if ($description) {
2814          mtrace('Starting '.$description);
2815      }
2816  
2817      foreach ($plugins as $component => $cronfunction) {
2818          $dir = core_component::get_component_directory($component);
2819  
2820          // Get cron period if specified in version.php, otherwise assume every cron.
2821          $cronperiod = 0;
2822          if (file_exists("$dir/version.php")) {
2823              $plugin = new stdClass();
2824              include("$dir/version.php");
2825              if (isset($plugin->cron)) {
2826                  $cronperiod = $plugin->cron;
2827              }
2828          }
2829  
2830          // Using last cron and cron period, don't run if it already ran recently.
2831          $lastcron = get_config($component, 'lastcron');
2832          if ($cronperiod && $lastcron) {
2833              if ($lastcron + $cronperiod > time()) {
2834                  // Do not execute cron yet.
2835                  continue;
2836              }
2837          }
2838  
2839          mtrace('Processing cron function for ' . $component . '...');
2840          debugging("Use of legacy cron is deprecated ($cronfunction). Please use scheduled tasks.", DEBUG_DEVELOPER);
2841          cron_trace_time_and_memory();
2842          $pre_dbqueries = $DB->perf_get_queries();
2843          $pre_time = microtime(true);
2844  
2845          $cronfunction();
2846  
2847          mtrace("done. (" . ($DB->perf_get_queries() - $pre_dbqueries) . " dbqueries, " .
2848                  round(microtime(true) - $pre_time, 2) . " seconds)");
2849  
2850          set_config('lastcron', time(), $component);
2851          core_php_time_limit::raise();
2852      }
2853  
2854      if ($description) {
2855          mtrace('Finished ' . $description);
2856      }
2857  }
2858  
2859  /**
2860   * Used to add in old-style cron functions within plugins that have not been converted to the
2861   * new standard API. (The standard API is frankenstyle_name_cron() in lib.php; some types used
2862   * cron.php and some used a different name.)
2863   *
2864   * @param string $plugintype Plugin type e.g. 'report'
2865   * @param array $plugins Array from plugin name (e.g. 'report_frog') to function name (e.g.
2866   *   'report_frog_cron') for plugin cron functions that were already found using the new API
2867   * @return array Revised version of $plugins that adds in any extra plugin functions found by
2868   *   looking in the older location
2869   *
2870   * @deprecated since Moodle 3.9 MDL-52846. Please use new task API.
2871   * @todo MDL-61165 This will be deleted in Moodle 4.1.
2872   */
2873  function cron_bc_hack_plugin_functions($plugintype, $plugins) {
2874      global $CFG; // Mandatory in case it is referenced by include()d PHP script.
2875  
2876      if ($plugintype === 'report') {
2877          // Admin reports only - not course report because course report was
2878          // never implemented before, so doesn't need BC.
2879          foreach (core_component::get_plugin_list($plugintype) as $pluginname => $dir) {
2880              $component = $plugintype . '_' . $pluginname;
2881              if (isset($plugins[$component])) {
2882                  // We already have detected the function using the new API.
2883                  continue;
2884              }
2885              if (!file_exists("$dir/cron.php")) {
2886                  // No old style cron file present.
2887                  continue;
2888              }
2889              include_once("$dir/cron.php");
2890              $cronfunction = $component . '_cron';
2891              if (function_exists($cronfunction)) {
2892                  $plugins[$component] = $cronfunction;
2893              } else {
2894                  debugging("Invalid legacy cron.php detected in $component, " .
2895                          "please use lib.php instead");
2896              }
2897          }
2898      } else if (strpos($plugintype, 'grade') === 0) {
2899          // Detect old style cron function names.
2900          // Plugin gradeexport_frog used to use grade_export_frog_cron() instead of
2901          // new standard API gradeexport_frog_cron(). Also applies to gradeimport, gradereport.
2902          foreach (core_component::get_plugin_list($plugintype) as $pluginname => $dir) {
2903              $component = $plugintype.'_'.$pluginname;
2904              if (isset($plugins[$component])) {
2905                  // We already have detected the function using the new API.
2906                  continue;
2907              }
2908              if (!file_exists("$dir/lib.php")) {
2909                  continue;
2910              }
2911              include_once("$dir/lib.php");
2912              $cronfunction = str_replace('grade', 'grade_', $plugintype) . '_' .
2913                      $pluginname . '_cron';
2914              if (function_exists($cronfunction)) {
2915                  $plugins[$component] = $cronfunction;
2916              }
2917          }
2918      }
2919  
2920      return $plugins;
2921  }
2922  
2923  /**
2924   * Returns the SQL used by the participants table.
2925   *
2926   * @deprecated since Moodle 3.9 MDL-68612 - See \core_user\table\participants_search for an improved way to fetch participants.
2927   * @param int $courseid The course id
2928   * @param int $groupid The groupid, 0 means all groups and USERSWITHOUTGROUP no group
2929   * @param int $accesssince The time since last access, 0 means any time
2930   * @param int $roleid The role id, 0 means all roles and -1 no roles
2931   * @param int $enrolid The enrolment id, 0 means all enrolment methods will be returned.
2932   * @param int $statusid The user enrolment status, -1 means all enrolments regardless of the status will be returned, if allowed.
2933   * @param string|array $search The search that was performed, empty means perform no search
2934   * @param string $additionalwhere Any additional SQL to add to where
2935   * @param array $additionalparams The additional params
2936   * @return array
2937   */
2938  function user_get_participants_sql($courseid, $groupid = 0, $accesssince = 0, $roleid = 0, $enrolid = 0, $statusid = -1,
2939                                     $search = '', $additionalwhere = '', $additionalparams = array()) {
2940      global $DB, $USER, $CFG;
2941  
2942      $deprecatedtext = __FUNCTION__ . '() is deprecated. ' .
2943                   'Please use \core\table\participants_search::class with table filtersets instead.';
2944      debugging($deprecatedtext, DEBUG_DEVELOPER);
2945  
2946      // Get the context.
2947      $context = \context_course::instance($courseid, MUST_EXIST);
2948  
2949      $isfrontpage = ($courseid == SITEID);
2950  
2951      // Default filter settings. We only show active by default, especially if the user has no capability to review enrolments.
2952      $onlyactive = true;
2953      $onlysuspended = false;
2954      if (has_capability('moodle/course:enrolreview', $context) && (has_capability('moodle/course:viewsuspendedusers', $context))) {
2955          switch ($statusid) {
2956              case ENROL_USER_ACTIVE:
2957                  // Nothing to do here.
2958                  break;
2959              case ENROL_USER_SUSPENDED:
2960                  $onlyactive = false;
2961                  $onlysuspended = true;
2962                  break;
2963              default:
2964                  // If the user has capability to review user enrolments, but statusid is set to -1, set $onlyactive to false.
2965                  $onlyactive = false;
2966                  break;
2967          }
2968      }
2969  
2970      list($esql, $params) = get_enrolled_sql($context, null, $groupid, $onlyactive, $onlysuspended, $enrolid);
2971  
2972      $joins = array('FROM {user} u');
2973      $wheres = array();
2974  
2975      // TODO Does not support custom user profile fields (MDL-70456).
2976      $userfields = \core_user\fields::get_identity_fields($context, false);
2977      $userfieldsapi = \core_user\fields::for_userpic()->including(...$userfields);
2978      $userfieldssql = $userfieldsapi->get_sql('u', false, '', '', false)->selects;
2979  
2980      if ($isfrontpage) {
2981          $select = "SELECT $userfieldssql, u.lastaccess";
2982          $joins[] = "JOIN ($esql) e ON e.id = u.id"; // Everybody on the frontpage usually.
2983          if ($accesssince) {
2984              $wheres[] = user_get_user_lastaccess_sql($accesssince);
2985          }
2986      } else {
2987          $select = "SELECT $userfieldssql, COALESCE(ul.timeaccess, 0) AS lastaccess";
2988          $joins[] = "JOIN ($esql) e ON e.id = u.id"; // Course enrolled users only.
2989          // Not everybody has accessed the course yet.
2990          $joins[] = 'LEFT JOIN {user_lastaccess} ul ON (ul.userid = u.id AND ul.courseid = :courseid)';
2991          $params['courseid'] = $courseid;
2992          if ($accesssince) {
2993              $wheres[] = user_get_course_lastaccess_sql($accesssince);
2994          }
2995      }
2996  
2997      // Performance hacks - we preload user contexts together with accounts.
2998      $ccselect = ', ' . context_helper::get_preload_record_columns_sql('ctx');
2999      $ccjoin = 'LEFT JOIN {context} ctx ON (ctx.instanceid = u.id AND ctx.contextlevel = :contextlevel)';
3000      $params['contextlevel'] = CONTEXT_USER;
3001      $select .= $ccselect;
3002      $joins[] = $ccjoin;
3003  
3004      // Limit list to users with some role only.
3005      if ($roleid) {
3006          // We want to query both the current context and parent contexts.
3007          list($relatedctxsql, $relatedctxparams) = $DB->get_in_or_equal($context->get_parent_context_ids(true),
3008              SQL_PARAMS_NAMED, 'relatedctx');
3009  
3010          // Get users without any role.
3011          if ($roleid == -1) {
3012              $wheres[] = "u.id NOT IN (SELECT userid FROM {role_assignments} WHERE contextid $relatedctxsql)";
3013              $params = array_merge($params, $relatedctxparams);
3014          } else {
3015              $wheres[] = "u.id IN (SELECT userid FROM {role_assignments} WHERE roleid = :roleid AND contextid $relatedctxsql)";
3016              $params = array_merge($params, array('roleid' => $roleid), $relatedctxparams);
3017          }
3018      }
3019  
3020      if (!empty($search)) {
3021          if (!is_array($search)) {
3022              $search = [$search];
3023          }
3024          foreach ($search as $index => $keyword) {
3025              $searchkey1 = 'search' . $index . '1';
3026              $searchkey2 = 'search' . $index . '2';
3027              $searchkey3 = 'search' . $index . '3';
3028              $searchkey4 = 'search' . $index . '4';
3029              $searchkey5 = 'search' . $index . '5';
3030              $searchkey6 = 'search' . $index . '6';
3031              $searchkey7 = 'search' . $index . '7';
3032  
3033              $conditions = array();
3034              // Search by fullname.
3035              $fullname = $DB->sql_fullname('u.firstname', 'u.lastname');
3036              $conditions[] = $DB->sql_like($fullname, ':' . $searchkey1, false, false);
3037  
3038              // Search by email.
3039              $email = $DB->sql_like('email', ':' . $searchkey2, false, false);
3040              if (!in_array('email', $userfields)) {
3041                  $maildisplay = 'maildisplay' . $index;
3042                  $userid1 = 'userid' . $index . '1';
3043                  // Prevent users who hide their email address from being found by others
3044                  // who aren't allowed to see hidden email addresses.
3045                  $email = "(". $email ." AND (" .
3046                          "u.maildisplay <> :$maildisplay " .
3047                          "OR u.id = :$userid1". // User can always find himself.
3048                          "))";
3049                  $params[$maildisplay] = core_user::MAILDISPLAY_HIDE;
3050                  $params[$userid1] = $USER->id;
3051              }
3052              $conditions[] = $email;
3053  
3054              // Search by idnumber.
3055              $idnumber = $DB->sql_like('idnumber', ':' . $searchkey3, false, false);
3056              if (!in_array('idnumber', $userfields)) {
3057                  $userid2 = 'userid' . $index . '2';
3058                  // Users who aren't allowed to see idnumbers should at most find themselves
3059                  // when searching for an idnumber.
3060                  $idnumber = "(". $idnumber . " AND u.id = :$userid2)";
3061                  $params[$userid2] = $USER->id;
3062              }
3063              $conditions[] = $idnumber;
3064  
3065              // TODO Does not support custom user profile fields (MDL-70456).
3066              $extrasearchfields = \core_user\fields::get_identity_fields($context, false);
3067              if (!empty($extrasearchfields)) {
3068                  // Search all user identify fields.
3069                  foreach ($extrasearchfields as $extrasearchfield) {
3070                      if (in_array($extrasearchfield, ['email', 'idnumber', 'country'])) {
3071                          // Already covered above. Search by country not supported.
3072                          continue;
3073                      }
3074                      $param = $searchkey3 . $extrasearchfield;
3075                      $condition = $DB->sql_like($extrasearchfield, ':' . $param, false, false);
3076                      $params[$param] = "%$keyword%";
3077                      if (!in_array($extrasearchfield, $userfields)) {
3078                          // User cannot see this field, but allow match if their own account.
3079                          $userid3 = 'userid' . $index . '3' . $extrasearchfield;
3080                          $condition = "(". $condition . " AND u.id = :$userid3)";
3081                          $params[$userid3] = $USER->id;
3082                      }
3083                      $conditions[] = $condition;
3084                  }
3085              }
3086  
3087              // Search by middlename.
3088              $middlename = $DB->sql_like('middlename', ':' . $searchkey4, false, false);
3089              $conditions[] = $middlename;
3090  
3091              // Search by alternatename.
3092              $alternatename = $DB->sql_like('alternatename', ':' . $searchkey5, false, false);
3093              $conditions[] = $alternatename;
3094  
3095              // Search by firstnamephonetic.
3096              $firstnamephonetic = $DB->sql_like('firstnamephonetic', ':' . $searchkey6, false, false);
3097              $conditions[] = $firstnamephonetic;
3098  
3099              // Search by lastnamephonetic.
3100              $lastnamephonetic = $DB->sql_like('lastnamephonetic', ':' . $searchkey7, false, false);
3101              $conditions[] = $lastnamephonetic;
3102  
3103              $wheres[] = "(". implode(" OR ", $conditions) .") ";
3104              $params[$searchkey1] = "%$keyword%";
3105              $params[$searchkey2] = "%$keyword%";
3106              $params[$searchkey3] = "%$keyword%";
3107              $params[$searchkey4] = "%$keyword%";
3108              $params[$searchkey5] = "%$keyword%";
3109              $params[$searchkey6] = "%$keyword%";
3110              $params[$searchkey7] = "%$keyword%";
3111          }
3112      }
3113  
3114      if (!empty($additionalwhere)) {
3115          $wheres[] = $additionalwhere;
3116          $params = array_merge($params, $additionalparams);
3117      }
3118  
3119      $from = implode("\n", $joins);
3120      if ($wheres) {
3121          $where = 'WHERE ' . implode(' AND ', $wheres);
3122      } else {
3123          $where = '';
3124      }
3125  
3126      return array($select, $from, $where, $params);
3127  }
3128  
3129  /**
3130   * Returns the total number of participants for a given course.
3131   *
3132   * @deprecated since Moodle 3.9 MDL-68612 - See \core_user\table\participants_search for an improved way to fetch participants.
3133   * @param int $courseid The course id
3134   * @param int $groupid The groupid, 0 means all groups and USERSWITHOUTGROUP no group
3135   * @param int $accesssince The time since last access, 0 means any time
3136   * @param int $roleid The role id, 0 means all roles
3137   * @param int $enrolid The applied filter for the user enrolment ID.
3138   * @param int $status The applied filter for the user's enrolment status.
3139   * @param string|array $search The search that was performed, empty means perform no search
3140   * @param string $additionalwhere Any additional SQL to add to where
3141   * @param array $additionalparams The additional params
3142   * @return int
3143   */
3144  function user_get_total_participants($courseid, $groupid = 0, $accesssince = 0, $roleid = 0, $enrolid = 0, $statusid = -1,
3145                                       $search = '', $additionalwhere = '', $additionalparams = array()) {
3146      global $DB;
3147  
3148      $deprecatedtext = __FUNCTION__ . '() is deprecated. ' .
3149                        'Please use \core\table\participants_search::class with table filtersets instead.';
3150      debugging($deprecatedtext, DEBUG_DEVELOPER);
3151  
3152      list($select, $from, $where, $params) = user_get_participants_sql($courseid, $groupid, $accesssince, $roleid, $enrolid,
3153          $statusid, $search, $additionalwhere, $additionalparams);
3154  
3155      return $DB->count_records_sql("SELECT COUNT(u.id) $from $where", $params);
3156  }
3157  
3158  /**
3159   * Returns the participants for a given course.
3160   *
3161   * @deprecated since Moodle 3.9 MDL-68612 - See \core_user\table\participants_search for an improved way to fetch participants.
3162   * @param int $courseid The course id
3163   * @param int $groupid The groupid, 0 means all groups and USERSWITHOUTGROUP no group
3164   * @param int $accesssince The time since last access
3165   * @param int $roleid The role id
3166   * @param int $enrolid The applied filter for the user enrolment ID.
3167   * @param int $status The applied filter for the user's enrolment status.
3168   * @param string $search The search that was performed
3169   * @param string $additionalwhere Any additional SQL to add to where
3170   * @param array $additionalparams The additional params
3171   * @param string $sort The SQL sort
3172   * @param int $limitfrom return a subset of records, starting at this point (optional).
3173   * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set).
3174   * @return moodle_recordset
3175   */
3176  function user_get_participants($courseid, $groupid, $accesssince, $roleid, $enrolid, $statusid, $search,
3177                                 $additionalwhere = '', $additionalparams = array(), $sort = '', $limitfrom = 0, $limitnum = 0) {
3178      global $DB;
3179  
3180      $deprecatedtext = __FUNCTION__ . '() is deprecated. ' .
3181                        'Please use \core\table\participants_search::class with table filtersets instead.';
3182      debugging($deprecatedtext, DEBUG_DEVELOPER);
3183  
3184      list($select, $from, $where, $params) = user_get_participants_sql($courseid, $groupid, $accesssince, $roleid, $enrolid,
3185          $statusid, $search, $additionalwhere, $additionalparams);
3186  
3187      return $DB->get_recordset_sql("$select $from $where $sort", $params, $limitfrom, $limitnum);
3188  }
3189  
3190  /**
3191   * Returns the list of full course categories to be used in html_writer::select()
3192   *
3193   * Calls {@see core_course_category::make_categories_list()} to build the list.
3194   *
3195   * @deprecated since Moodle 3.10
3196   * @todo This will be finally removed for Moodle 4.2 as part of MDL-69124.
3197   * @return array array mapping course category id to the display name
3198   */
3199  function make_categories_options() {
3200      $deprecatedtext = __FUNCTION__ . '() is deprecated. Please use \core_course_category::make_categories_list() instead.';
3201      debugging($deprecatedtext, DEBUG_DEVELOPER);
3202  
3203      return core_course_category::make_categories_list('', 0, ' / ');
3204  }
3205  
3206  /**
3207   * Checks if current user is shown any extra fields when listing users.
3208   *
3209   * Does not include any custom profile fields.
3210   *
3211   * @param object $context Context
3212   * @param array $already Array of fields that we're going to show anyway
3213   *   so don't bother listing them
3214   * @return array Array of field names from user table, not including anything
3215   *   listed in $already
3216   * @deprecated since Moodle 3.11 MDL-45242
3217   * @see \core_user\fields
3218   */
3219  function get_extra_user_fields($context, $already = array()) {
3220      debugging('get_extra_user_fields() is deprecated. Please use the \core_user\fields API instead.', DEBUG_DEVELOPER);
3221  
3222      $fields = \core_user\fields::for_identity($context, false)->excluding(...$already);
3223      return $fields->get_required_fields();
3224  }
3225  
3226  /**
3227   * If the current user is to be shown extra user fields when listing or
3228   * selecting users, returns a string suitable for including in an SQL select
3229   * clause to retrieve those fields.
3230   *
3231   * Does not include any custom profile fields.
3232   *
3233   * @param context $context Context
3234   * @param string $alias Alias of user table, e.g. 'u' (default none)
3235   * @param string $prefix Prefix for field names using AS, e.g. 'u_' (default none)
3236   * @param array $already Array of fields that we're going to include anyway so don't list them (default none)
3237   * @return string Partial SQL select clause, beginning with comma, for example ',u.idnumber,u.department' unless it is blank
3238   * @deprecated since Moodle 3.11 MDL-45242
3239   * @see \core_user\fields
3240   */
3241  function get_extra_user_fields_sql($context, $alias='', $prefix='', $already = array()) {
3242      debugging('get_extra_user_fields_sql() is deprecated. Please use the \core_user\fields API instead.', DEBUG_DEVELOPER);
3243  
3244      $fields = \core_user\fields::for_identity($context, false)->excluding(...$already);
3245      // Note: There will never be any joins or join params because we turned off profile fields.
3246      $selects = $fields->get_sql($alias, false, $prefix)->selects;
3247  
3248      return $selects;
3249  }
3250  
3251  /**
3252   * Returns the display name of a field in the user table. Works for most fields that are commonly displayed to users.
3253   *
3254   * Also works for custom fields.
3255   *
3256   * @param string $field Field name, e.g. 'phone1'
3257   * @return string Text description taken from language file, e.g. 'Phone number'
3258   * @deprecated since Moodle 3.11 MDL-45242
3259   * @see \core_user\fields
3260   */
3261  function get_user_field_name($field) {
3262      debugging('get_user_field_name() is deprecated. Please use \core_user\fields::get_display_name() instead', DEBUG_DEVELOPER);
3263  
3264      return \core_user\fields::get_display_name($field);
3265  }
3266  
3267  /**
3268   * A centralised location for the all name fields. Returns an array / sql string snippet.
3269   *
3270   * @param bool $returnsql True for an sql select field snippet.
3271   * @param string $tableprefix table query prefix to use in front of each field.
3272   * @param string $prefix prefix added to the name fields e.g. authorfirstname.
3273   * @param string $fieldprefix sql field prefix e.g. id AS userid.
3274   * @param bool $order moves firstname and lastname to the top of the array / start of the string.
3275   * @return array|string All name fields.
3276   * @deprecated since Moodle 3.11 MDL-45242
3277   * @see \core_user\fields
3278   */
3279  function get_all_user_name_fields($returnsql = false, $tableprefix = null, $prefix = null, $fieldprefix = null, $order = false) {
3280      debugging('get_all_user_name_fields() is deprecated. Please use the \core_user\fields API instead', DEBUG_DEVELOPER);
3281  
3282      // This array is provided in this order because when called by fullname() (above) if firstname is before
3283      // firstnamephonetic str_replace() will change the wrong placeholder.
3284      $alternatenames = [];
3285      foreach (\core_user\fields::get_name_fields() as $field) {
3286          $alternatenames[$field] = $field;
3287      }
3288  
3289      // Let's add a prefix to the array of user name fields if provided.
3290      if ($prefix) {
3291          foreach ($alternatenames as $key => $altname) {
3292              $alternatenames[$key] = $prefix . $altname;
3293          }
3294      }
3295  
3296      // If we want the end result to have firstname and lastname at the front / top of the result.
3297      if ($order) {
3298          // Move the last two elements (firstname, lastname) off the array and put them at the top.
3299          for ($i = 0; $i < 2; $i++) {
3300              // Get the last element.
3301              $lastelement = end($alternatenames);
3302              // Remove it from the array.
3303              unset($alternatenames[$lastelement]);
3304              // Put the element back on the top of the array.
3305              $alternatenames = array_merge(array($lastelement => $lastelement), $alternatenames);
3306          }
3307      }
3308  
3309      // Create an sql field snippet if requested.
3310      if ($returnsql) {
3311          if ($tableprefix) {
3312              if ($fieldprefix) {
3313                  foreach ($alternatenames as $key => $altname) {
3314                      $alternatenames[$key] = $tableprefix . '.' . $altname . ' AS ' . $fieldprefix . $altname;
3315                  }
3316              } else {
3317                  foreach ($alternatenames as $key => $altname) {
3318                      $alternatenames[$key] = $tableprefix . '.' . $altname;
3319                  }
3320              }
3321          }
3322          $alternatenames = implode(',', $alternatenames);
3323      }
3324      return $alternatenames;
3325  }
3326  
3327  /**
3328   * Update a subscription from the form data in one of the rows in the existing subscriptions table.
3329   *
3330   * @param int $subscriptionid The ID of the subscription we are acting upon.
3331   * @param int $pollinterval The poll interval to use.
3332   * @param int $action The action to be performed. One of update or remove.
3333   * @throws dml_exception if invalid subscriptionid is provided
3334   * @return string A log of the import progress, including errors
3335   * @deprecated since Moodle 4.0 MDL-71953
3336   */
3337  function calendar_process_subscription_row($subscriptionid, $pollinterval, $action) {
3338      debugging('calendar_process_subscription_row() is deprecated.', DEBUG_DEVELOPER);
3339      // Fetch the subscription from the database making sure it exists.
3340      $sub = calendar_get_subscription($subscriptionid);
3341  
3342      // Update or remove the subscription, based on action.
3343      switch ($action) {
3344          case CALENDAR_SUBSCRIPTION_UPDATE:
3345              // Skip updating file subscriptions.
3346              if (empty($sub->url)) {
3347                  break;
3348              }
3349              $sub->pollinterval = $pollinterval;
3350              calendar_update_subscription($sub);
3351  
3352              // Update the events.
3353              return "<p>" . get_string('subscriptionupdated', 'calendar', $sub->name) . "</p>" .
3354                  calendar_update_subscription_events($subscriptionid);
3355          case CALENDAR_SUBSCRIPTION_REMOVE:
3356              calendar_delete_subscription($subscriptionid);
3357              return get_string('subscriptionremoved', 'calendar', $sub->name);
3358              break;
3359          default:
3360              break;
3361      }
3362      return '';
3363  }
3364  
3365  /**
3366   * Import events from an iCalendar object into a course calendar.
3367   *
3368   * @param iCalendar $ical The iCalendar object.
3369   * @param int $unused Deprecated
3370   * @param int $subscriptionid The subscription ID.
3371   * @return string A log of the import progress, including errors.
3372   */
3373  function calendar_import_icalendar_events($ical, $unused = null, $subscriptionid = null) {
3374      debugging('calendar_import_icalendar_events() is deprecated. Please use calendar_import_events_from_ical() instead.',
3375          DEBUG_DEVELOPER);
3376      global $DB;
3377  
3378      $return = '';
3379      $eventcount = 0;
3380      $updatecount = 0;
3381      $skippedcount = 0;
3382  
3383      // Large calendars take a while...
3384      if (!CLI_SCRIPT) {
3385          \core_php_time_limit::raise(300);
3386      }
3387  
3388      // Grab the timezone from the iCalendar file to be used later.
3389      if (isset($ical->properties['X-WR-TIMEZONE'][0]->value)) {
3390          $timezone = $ical->properties['X-WR-TIMEZONE'][0]->value;
3391      } else {
3392          $timezone = 'UTC';
3393      }
3394  
3395      $icaluuids = [];
3396      foreach ($ical->components['VEVENT'] as $event) {
3397          $icaluuids[] = $event->properties['UID'][0]->value;
3398          $res = calendar_add_icalendar_event($event, null, $subscriptionid, $timezone);
3399          switch ($res) {
3400              case CALENDAR_IMPORT_EVENT_UPDATED:
3401                  $updatecount++;
3402                  break;
3403              case CALENDAR_IMPORT_EVENT_INSERTED:
3404                  $eventcount++;
3405                  break;
3406              case CALENDAR_IMPORT_EVENT_SKIPPED:
3407                  $skippedcount++;
3408                  break;
3409              case 0:
3410                  $return .= '<p>' . get_string('erroraddingevent', 'calendar') . ': ';
3411                  if (empty($event->properties['SUMMARY'])) {
3412                      $return .= '(' . get_string('notitle', 'calendar') . ')';
3413                  } else {
3414                      $return .= $event->properties['SUMMARY'][0]->value;
3415                  }
3416                  $return .= "</p>\n";
3417                  break;
3418          }
3419      }
3420  
3421      $return .= html_writer::start_tag('ul');
3422      $existing = $DB->get_field('event_subscriptions', 'lastupdated', ['id' => $subscriptionid]);
3423      if (!empty($existing)) {
3424          $eventsuuids = $DB->get_records_menu('event', ['subscriptionid' => $subscriptionid], '', 'id, uuid');
3425  
3426          $icaleventscount = count($icaluuids);
3427          $tobedeleted = [];
3428          if (count($eventsuuids) > $icaleventscount) {
3429              foreach ($eventsuuids as $eventid => $eventuuid) {
3430                  if (!in_array($eventuuid, $icaluuids)) {
3431                      $tobedeleted[] = $eventid;
3432                  }
3433              }
3434              if (!empty($tobedeleted)) {
3435                  $DB->delete_records_list('event', 'id', $tobedeleted);
3436                  $return .= html_writer::tag('li', get_string('eventsdeleted', 'calendar', count($tobedeleted)));
3437              }
3438          }
3439      }
3440  
3441      $return .= html_writer::tag('li', get_string('eventsimported', 'calendar', $eventcount));
3442      $return .= html_writer::tag('li', get_string('eventsskipped', 'calendar', $skippedcount));
3443      $return .= html_writer::tag('li', get_string('eventsupdated', 'calendar', $updatecount));
3444      $return .= html_writer::end_tag('ul');
3445      return $return;
3446  }
3447  
3448  /**
3449   * Print grading plugin selection tab-based navigation.
3450   *
3451   * @deprecated since Moodle 4.0. Tabs navigation has been replaced with tertiary navigation.
3452   * @param string  $active_type type of plugin on current page - import, export, report or edit
3453   * @param string  $active_plugin active plugin type - grader, user, cvs, ...
3454   * @param array   $plugin_info Array of plugins
3455   * @param boolean $return return as string
3456   *
3457   * @return nothing or string if $return true
3458   */
3459  function grade_print_tabs($active_type, $active_plugin, $plugin_info, $return=false) {
3460      global $CFG, $COURSE;
3461  
3462      debugging('grade_print_tabs() has been deprecated. Tabs navigation has been replaced with tertiary navigation.',
3463          DEBUG_DEVELOPER);
3464  
3465      if (!isset($currenttab)) { //TODO: this is weird
3466          $currenttab = '';
3467      }
3468  
3469      $tabs = array();
3470      $top_row  = array();
3471      $bottom_row = array();
3472      $inactive = array($active_plugin);
3473      $activated = array($active_type);
3474  
3475      $count = 0;
3476      $active = '';
3477  
3478      foreach ($plugin_info as $plugin_type => $plugins) {
3479          if ($plugin_type == 'strings') {
3480              continue;
3481          }
3482  
3483          // If $plugins is actually the definition of a child-less parent link:
3484          if (!empty($plugins->id)) {
3485              $string = $plugins->string;
3486              if (!empty($plugin_info[$active_type]->parent)) {
3487                  $string = $plugin_info[$active_type]->parent->string;
3488              }
3489  
3490              $top_row[] = new tabobject($plugin_type, $plugins->link, $string);
3491              continue;
3492          }
3493  
3494          $first_plugin = reset($plugins);
3495          $url = $first_plugin->link;
3496  
3497          if ($plugin_type == 'report') {
3498              $url = $CFG->wwwroot.'/grade/report/index.php?id='.$COURSE->id;
3499          }
3500  
3501          $top_row[] = new tabobject($plugin_type, $url, $plugin_info['strings'][$plugin_type]);
3502  
3503          if ($active_type == $plugin_type) {
3504              foreach ($plugins as $plugin) {
3505                  $bottom_row[] = new tabobject($plugin->id, $plugin->link, $plugin->string);
3506                  if ($plugin->id == $active_plugin) {
3507                      $inactive = array($plugin->id);
3508                  }
3509              }
3510          }
3511      }
3512  
3513      // Do not display rows that contain only one item, they are not helpful.
3514      if (count($top_row) > 1) {
3515          $tabs[] = $top_row;
3516      }
3517      if (count($bottom_row) > 1) {
3518          $tabs[] = $bottom_row;
3519      }
3520      if (empty($tabs)) {
3521          return;
3522      }
3523  
3524      $rv = html_writer::div(print_tabs($tabs, $active_plugin, $inactive, $activated, true), 'grade-navigation');
3525  
3526      if ($return) {
3527          return $rv;
3528      } else {
3529          echo $rv;
3530      }
3531  }
3532  
3533  /**
3534   * Print grading plugin selection popup form.
3535   *
3536   * @deprecated since Moodle 4.0. Dropdown box navigation has been replaced with tertiary navigation.
3537   * @param array   $plugin_info An array of plugins containing information for the selector
3538   * @param boolean $return return as string
3539   *
3540   * @return nothing or string if $return true
3541   */
3542  function print_grade_plugin_selector($plugin_info, $active_type, $active_plugin, $return=false) {
3543      global $CFG, $OUTPUT, $PAGE;
3544  
3545      debugging('print_grade_plugin_selector() has been deprecated. Dropdown box navigation has been replaced ' .
3546          'with tertiary navigation.', DEBUG_DEVELOPER);
3547  
3548      $menu = array();
3549      $count = 0;
3550      $active = '';
3551  
3552      foreach ($plugin_info as $plugin_type => $plugins) {
3553          if ($plugin_type == 'strings') {
3554              continue;
3555          }
3556  
3557          $first_plugin = reset($plugins);
3558  
3559          $sectionname = $plugin_info['strings'][$plugin_type];
3560          $section = array();
3561  
3562          foreach ($plugins as $plugin) {
3563              $link = $plugin->link->out(false);
3564              $section[$link] = $plugin->string;
3565              $count++;
3566              if ($plugin_type === $active_type and $plugin->id === $active_plugin) {
3567                  $active = $link;
3568              }
3569          }
3570  
3571          if ($section) {
3572              $menu[] = array($sectionname=>$section);
3573          }
3574      }
3575  
3576      // finally print/return the popup form
3577      if ($count > 1) {
3578          $select = new url_select($menu, $active, null, 'choosepluginreport');
3579          $select->set_label(get_string('gradereport', 'grades'), array('class' => 'accesshide'));
3580          if ($return) {
3581              return $OUTPUT->render($select);
3582          } else {
3583              echo $OUTPUT->render($select);
3584          }
3585      } else {
3586          // only one option - no plugin selector needed
3587          return '';
3588      }
3589  
3590      /**
3591       * Purge the cache of a course section.
3592       *
3593       * $sectioninfo must have following attributes:
3594       *   - course: course id
3595       *   - section: section number
3596       *
3597       * @param object $sectioninfo section info
3598       * @return void
3599       * @deprecated since Moodle 4.0. Please use {@link course_modinfo::purge_course_section_cache_by_id()}
3600       *             or {@link course_modinfo::purge_course_section_cache_by_number()} instead.
3601       */
3602      function course_purge_section_cache(object $sectioninfo): void {
3603          debugging(__FUNCTION__ . '() is deprecated. ' .
3604              'Please use course_modinfo::purge_course_section_cache_by_id() ' .
3605              'or course_modinfo::purge_course_section_cache_by_number() instead.',
3606              DEBUG_DEVELOPER);
3607          $sectionid = $sectioninfo->section;
3608          $courseid = $sectioninfo->course;
3609          course_modinfo::purge_course_section_cache_by_id($courseid, $sectionid);
3610      }
3611  
3612      /**
3613       * Purge the cache of a course module.
3614       *
3615       * $cm must have following attributes:
3616       *   - id: cmid
3617       *   - course: course id
3618       *
3619       * @param cm_info|stdClass $cm course module
3620       * @return void
3621       * @deprecated since Moodle 4.0. Please use {@link course_modinfo::purge_course_module_cache()} instead.
3622       */
3623      function course_purge_module_cache($cm): void {
3624          debugging(__FUNCTION__ . '() is deprecated. ' . 'Please use course_modinfo::purge_course_module_cache() instead.',
3625              DEBUG_DEVELOPER);
3626          $cmid = $cm->id;
3627          $courseid = $cm->course;
3628          course_modinfo::purge_course_module_cache($courseid, $cmid);
3629      }
3630  }
3631  
3632  /**
3633   * For a given course, returns an array of course activity objects
3634   * Each item in the array contains he following properties:
3635   *
3636   * @param int $courseid course id
3637   * @param bool $usecache get activities from cache if modinfo exists when $usecache is true
3638   * @return array list of activities
3639   * @deprecated since Moodle 4.0. Please use {@link course_modinfo::get_array_of_activities()} instead.
3640   */
3641  function get_array_of_activities(int $courseid, bool $usecache = false): array {
3642      debugging(__FUNCTION__ . '() is deprecated. ' . 'Please use course_modinfo::get_array_of_activities() instead.',
3643          DEBUG_DEVELOPER);
3644      return course_modinfo::get_array_of_activities(get_course($courseid), $usecache);
3645  }
3646  
3647  /**
3648   * Abort execution by throwing of a general exception,
3649   * default exception handler displays the error message in most cases.
3650   *
3651   * @deprecated since Moodle 4.1
3652   * @todo MDL-74484 Final deprecation in Moodle 4.5.
3653   * @param string $errorcode The name of the language string containing the error message.
3654   *      Normally this should be in the error.php lang file.
3655   * @param string $module The language file to get the error message from.
3656   * @param string $link The url where the user will be prompted to continue.
3657   *      If no url is provided the user will be directed to the site index page.
3658   * @param object $a Extra words and phrases that might be required in the error string
3659   * @param string $debuginfo optional debugging information
3660   * @return void, always throws exception!
3661   */
3662  function print_error($errorcode, $module = 'error', $link = '', $a = null, $debuginfo = null) {
3663      debugging("The function print_error() is deprecated. " .
3664              "Please throw a new moodle_exception instance instead.", DEBUG_DEVELOPER);
3665      throw new \moodle_exception($errorcode, $module, $link, $a, $debuginfo);
3666  }