[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/lib/ -> deprecatedlib.php (source)

   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   * Add an entry to the legacy log table.
  37   *
  38   * @deprecated since 2.7 use new events instead
  39   *
  40   * @param    int     $courseid  The course id
  41   * @param    string  $module  The module name  e.g. forum, journal, resource, course, user etc
  42   * @param    string  $action  'view', 'update', 'add' or 'delete', possibly followed by another word to clarify.
  43   * @param    string  $url     The file and parameters used to see the results of the action
  44   * @param    string  $info    Additional description information
  45   * @param    int     $cm      The course_module->id if there is one
  46   * @param    int|stdClass $user If log regards $user other than $USER
  47   * @return void
  48   */
  49  function add_to_log($courseid, $module, $action, $url='', $info='', $cm=0, $user=0) {
  50      debugging('add_to_log() has been deprecated, please rewrite your code to the new events API', DEBUG_DEVELOPER);
  51  
  52      // This is a nasty hack that allows us to put all the legacy stuff into legacy storage,
  53      // this way we may move all the legacy settings there too.
  54      $manager = get_log_manager();
  55      if (method_exists($manager, 'legacy_add_to_log')) {
  56          $manager->legacy_add_to_log($courseid, $module, $action, $url, $info, $cm, $user);
  57      }
  58  }
  59  
  60  /**
  61   * Function to call all event handlers when triggering an event
  62   *
  63   * @deprecated since 2.6
  64   *
  65   * @param string $eventname name of the event
  66   * @param mixed $eventdata event data object
  67   * @return int number of failed events
  68   */
  69  function events_trigger($eventname, $eventdata) {
  70      debugging('events_trigger() is deprecated, please use new events instead', DEBUG_DEVELOPER);
  71      return events_trigger_legacy($eventname, $eventdata);
  72  }
  73  
  74  /**
  75   * List all core subsystems and their location
  76   *
  77   * This is a whitelist of components that are part of the core and their
  78   * language strings are defined in /lang/en/<<subsystem>>.php. If a given
  79   * plugin is not listed here and it does not have proper plugintype prefix,
  80   * then it is considered as course activity module.
  81   *
  82   * The location is optionally dirroot relative path. NULL means there is no special
  83   * directory for this subsystem. If the location is set, the subsystem's
  84   * renderer.php is expected to be there.
  85   *
  86   * @deprecated since 2.6, use core_component::get_core_subsystems()
  87   *
  88   * @param bool $fullpaths false means relative paths from dirroot, use true for performance reasons
  89   * @return array of (string)name => (string|null)location
  90   */
  91  function get_core_subsystems($fullpaths = false) {
  92      global $CFG;
  93  
  94      // NOTE: do not add any other debugging here, keep forever.
  95  
  96      $subsystems = core_component::get_core_subsystems();
  97  
  98      if ($fullpaths) {
  99          return $subsystems;
 100      }
 101  
 102      debugging('Short paths are deprecated when using get_core_subsystems(), please fix the code to use fullpaths instead.', DEBUG_DEVELOPER);
 103  
 104      $dlength = strlen($CFG->dirroot);
 105  
 106      foreach ($subsystems as $k => $v) {
 107          if ($v === null) {
 108              continue;
 109          }
 110          $subsystems[$k] = substr($v, $dlength+1);
 111      }
 112  
 113      return $subsystems;
 114  }
 115  
 116  /**
 117   * Lists all plugin types.
 118   *
 119   * @deprecated since 2.6, use core_component::get_plugin_types()
 120   *
 121   * @param bool $fullpaths false means relative paths from dirroot
 122   * @return array Array of strings - name=>location
 123   */
 124  function get_plugin_types($fullpaths = true) {
 125      global $CFG;
 126  
 127      // NOTE: do not add any other debugging here, keep forever.
 128  
 129      $types = core_component::get_plugin_types();
 130  
 131      if ($fullpaths) {
 132          return $types;
 133      }
 134  
 135      debugging('Short paths are deprecated when using get_plugin_types(), please fix the code to use fullpaths instead.', DEBUG_DEVELOPER);
 136  
 137      $dlength = strlen($CFG->dirroot);
 138  
 139      foreach ($types as $k => $v) {
 140          if ($k === 'theme') {
 141              $types[$k] = 'theme';
 142              continue;
 143          }
 144          $types[$k] = substr($v, $dlength+1);
 145      }
 146  
 147      return $types;
 148  }
 149  
 150  /**
 151   * Use when listing real plugins of one type.
 152   *
 153   * @deprecated since 2.6, use core_component::get_plugin_list()
 154   *
 155   * @param string $plugintype type of plugin
 156   * @return array name=>fulllocation pairs of plugins of given type
 157   */
 158  function get_plugin_list($plugintype) {
 159  
 160      // NOTE: do not add any other debugging here, keep forever.
 161  
 162      if ($plugintype === '') {
 163          $plugintype = 'mod';
 164      }
 165  
 166      return core_component::get_plugin_list($plugintype);
 167  }
 168  
 169  /**
 170   * Get a list of all the plugins of a given type that define a certain class
 171   * in a certain file. The plugin component names and class names are returned.
 172   *
 173   * @deprecated since 2.6, use core_component::get_plugin_list_with_class()
 174   *
 175   * @param string $plugintype the type of plugin, e.g. 'mod' or 'report'.
 176   * @param string $class the part of the name of the class after the
 177   *      frankenstyle prefix. e.g 'thing' if you are looking for classes with
 178   *      names like report_courselist_thing. If you are looking for classes with
 179   *      the same name as the plugin name (e.g. qtype_multichoice) then pass ''.
 180   * @param string $file the name of file within the plugin that defines the class.
 181   * @return array with frankenstyle plugin names as keys (e.g. 'report_courselist', 'mod_forum')
 182   *      and the class names as values (e.g. 'report_courselist_thing', 'qtype_multichoice').
 183   */
 184  function get_plugin_list_with_class($plugintype, $class, $file) {
 185  
 186      // NOTE: do not add any other debugging here, keep forever.
 187  
 188      return core_component::get_plugin_list_with_class($plugintype, $class, $file);
 189  }
 190  
 191  /**
 192   * Returns the exact absolute path to plugin directory.
 193   *
 194   * @deprecated since 2.6, use core_component::get_plugin_directory()
 195   *
 196   * @param string $plugintype type of plugin
 197   * @param string $name name of the plugin
 198   * @return string full path to plugin directory; NULL if not found
 199   */
 200  function get_plugin_directory($plugintype, $name) {
 201  
 202      // NOTE: do not add any other debugging here, keep forever.
 203  
 204      if ($plugintype === '') {
 205          $plugintype = 'mod';
 206      }
 207  
 208      return core_component::get_plugin_directory($plugintype, $name);
 209  }
 210  
 211  /**
 212   * Normalize the component name using the "frankenstyle" names.
 213   *
 214   * @deprecated since 2.6, use core_component::normalize_component()
 215   *
 216   * @param string $component
 217   * @return array as (string)$type => (string)$plugin
 218   */
 219  function normalize_component($component) {
 220  
 221      // NOTE: do not add any other debugging here, keep forever.
 222  
 223      return core_component::normalize_component($component);
 224  }
 225  
 226  /**
 227   * Return exact absolute path to a plugin directory.
 228   *
 229   * @deprecated since 2.6, use core_component::normalize_component()
 230   *
 231   * @param string $component name such as 'moodle', 'mod_forum'
 232   * @return string full path to component directory; NULL if not found
 233   */
 234  function get_component_directory($component) {
 235  
 236      // NOTE: do not add any other debugging here, keep forever.
 237  
 238      return core_component::get_component_directory($component);
 239  }
 240  
 241  /**
 242   * Get the context instance as an object. This function will create the
 243   * context instance if it does not exist yet.
 244   *
 245   * @deprecated since 2.2, use context_course::instance() or other relevant class instead
 246   * @todo This will be deleted in Moodle 2.8, refer MDL-34472
 247   * @param integer $contextlevel The context level, for example CONTEXT_COURSE, or CONTEXT_MODULE.
 248   * @param integer $instance The instance id. For $level = CONTEXT_COURSE, this would be $course->id,
 249   *      for $level = CONTEXT_MODULE, this would be $cm->id. And so on. Defaults to 0
 250   * @param int $strictness IGNORE_MISSING means compatible mode, false returned if record not found, debug message if more found;
 251   *      MUST_EXIST means throw exception if no record or multiple records found
 252   * @return context The context object.
 253   */
 254  function get_context_instance($contextlevel, $instance = 0, $strictness = IGNORE_MISSING) {
 255  
 256      debugging('get_context_instance() is deprecated, please use context_xxxx::instance() instead.', DEBUG_DEVELOPER);
 257  
 258      $instances = (array)$instance;
 259      $contexts = array();
 260  
 261      $classname = context_helper::get_class_for_level($contextlevel);
 262  
 263      // we do not load multiple contexts any more, PAGE should be responsible for any preloading
 264      foreach ($instances as $inst) {
 265          $contexts[$inst] = $classname::instance($inst, $strictness);
 266      }
 267  
 268      if (is_array($instance)) {
 269          return $contexts;
 270      } else {
 271          return $contexts[$instance];
 272      }
 273  }
 274  /* === End of long term deprecated api list === */
 275  
 276  /**
 277   * Adds a file upload to the log table so that clam can resolve the filename to the user later if necessary
 278   *
 279   * @deprecated since 2.7 - use new file picker instead
 280   *
 281   */
 282  function clam_log_upload($newfilepath, $course=null, $nourl=false) {
 283      throw new coding_exception('clam_log_upload() can not be used any more, please use file picker instead');
 284  }
 285  
 286  /**
 287   * This function logs to error_log and to the log table that an infected file has been found and what's happened to it.
 288   *
 289   * @deprecated since 2.7 - use new file picker instead
 290   *
 291   */
 292  function clam_log_infected($oldfilepath='', $newfilepath='', $userid=0) {
 293      throw new coding_exception('clam_log_infected() can not be used any more, please use file picker instead');
 294  }
 295  
 296  /**
 297   * Some of the modules allow moving attachments (glossary), in which case we need to hunt down an original log and change the path.
 298   *
 299   * @deprecated since 2.7 - use new file picker instead
 300   *
 301   */
 302  function clam_change_log($oldpath, $newpath, $update=true) {
 303      throw new coding_exception('clam_change_log() can not be used any more, please use file picker instead');
 304  }
 305  
 306  /**
 307   * Replaces the given file with a string.
 308   *
 309   * @deprecated since 2.7 - infected files are now deleted in file picker
 310   *
 311   */
 312  function clam_replace_infected_file($file) {
 313      throw new coding_exception('clam_replace_infected_file() can not be used any more, please use file picker instead');
 314  }
 315  
 316  /**
 317   * Deals with an infected file - either moves it to a quarantinedir
 318   * (specified in CFG->quarantinedir) or deletes it.
 319   *
 320   * If moving it fails, it deletes it.
 321   *
 322   * @deprecated since 2.7
 323   */
 324  function clam_handle_infected_file($file, $userid=0, $basiconly=false) {
 325      throw new coding_exception('clam_handle_infected_file() can not be used any more, please use file picker instead');
 326  }
 327  
 328  /**
 329   * If $CFG->runclamonupload is set, we scan a given file. (called from {@link preprocess_files()})
 330   *
 331   * @deprecated since 2.7
 332   */
 333  function clam_scan_moodle_file(&$file, $course) {
 334      throw new coding_exception('clam_scan_moodle_file() can not be used any more, please use file picker instead');
 335  }
 336  
 337  
 338  /**
 339   * Checks whether the password compatibility library will work with the current
 340   * version of PHP. This cannot be done using PHP version numbers since the fix
 341   * has been backported to earlier versions in some distributions.
 342   *
 343   * See https://github.com/ircmaxell/password_compat/issues/10 for more details.
 344   *
 345   * @deprecated since 2.7 PHP 5.4.x should be always compatible.
 346   *
 347   */
 348  function password_compat_not_supported() {
 349      throw new coding_exception('Do not use password_compat_not_supported() - bcrypt is now always available');
 350  }
 351  
 352  /**
 353   * Factory method that was returning moodle_session object.
 354   *
 355   * @deprecated since 2.6
 356   */
 357  function session_get_instance() {
 358      throw new coding_exception('session_get_instance() is removed, use \core\session\manager instead');
 359  }
 360  
 361  /**
 362   * Returns true if legacy session used.
 363   *
 364   * @deprecated since 2.6
 365   */
 366  function session_is_legacy() {
 367      throw new coding_exception('session_is_legacy() is removed, do not use any more');
 368  }
 369  
 370  /**
 371   * Terminates all sessions, auth hooks are not executed.
 372   *
 373   * @deprecated since 2.6
 374   */
 375  function session_kill_all() {
 376      throw new coding_exception('session_kill_all() is removed, use \core\session\manager::kill_all_sessions() instead');
 377  }
 378  
 379  /**
 380   * Mark session as accessed, prevents timeouts.
 381   *
 382   * @deprecated since 2.6
 383   */
 384  function session_touch($sid) {
 385      throw new coding_exception('session_touch() is removed, use \core\session\manager::touch_session() instead');
 386  }
 387  
 388  /**
 389   * Terminates one sessions, auth hooks are not executed.
 390   *
 391   * @deprecated since 2.6
 392   */
 393  function session_kill($sid) {
 394      throw new coding_exception('session_kill() is removed, use \core\session\manager::kill_session() instead');
 395  }
 396  
 397  /**
 398   * Terminates all sessions of one user, auth hooks are not executed.
 399   *
 400   * @deprecated since 2.6
 401   */
 402  function session_kill_user($userid) {
 403      throw new coding_exception('session_kill_user() is removed, use \core\session\manager::kill_user_sessions() instead');
 404  }
 405  
 406  /**
 407   * Setup $USER object - called during login, loginas, etc.
 408   *
 409   * Call sync_user_enrolments() manually after log-in, or log-in-as.
 410   *
 411   * @deprecated since 2.6
 412   */
 413  function session_set_user($user) {
 414      throw new coding_exception('session_set_user() is removed, use \core\session\manager::set_user() instead');
 415  }
 416  
 417  /**
 418   * Is current $USER logged-in-as somebody else?
 419   * @deprecated since 2.6
 420   */
 421  function session_is_loggedinas() {
 422      throw new coding_exception('session_is_loggedinas() is removed, use \core\session\manager::is_loggedinas() instead');
 423  }
 424  
 425  /**
 426   * Returns the $USER object ignoring current login-as session
 427   * @deprecated since 2.6
 428   */
 429  function session_get_realuser() {
 430      throw new coding_exception('session_get_realuser() is removed, use \core\session\manager::get_realuser() instead');
 431  }
 432  
 433  /**
 434   * Login as another user - no security checks here.
 435   * @deprecated since 2.6
 436   */
 437  function session_loginas($userid, $context) {
 438      throw new coding_exception('session_loginas() is removed, use \core\session\manager::loginas() instead');
 439  }
 440  
 441  /**
 442   * Minify JavaScript files.
 443   *
 444   * @deprecated since 2.6
 445   */
 446  function js_minify($files) {
 447      throw new coding_exception('js_minify() is removed, use core_minify::js_files() or core_minify::js() instead.');
 448  }
 449  
 450  /**
 451   * Minify CSS files.
 452   *
 453   * @deprecated since 2.6
 454   */
 455  function css_minify_css($files) {
 456      throw new coding_exception('css_minify_css() is removed, use core_minify::css_files() or core_minify::css() instead.');
 457  }
 458  
 459  // === Deprecated before 2.6.0 ===
 460  
 461  /**
 462   * Hack to find out the GD version by parsing phpinfo output
 463   *
 464   * @deprecated
 465   */
 466  function check_gd_version() {
 467      throw new coding_exception('check_gd_version() is removed, GD extension is always available now');
 468  }
 469  
 470  /**
 471   * Not used any more, the account lockout handling is now
 472   * part of authenticate_user_login().
 473   * @deprecated
 474   */
 475  function update_login_count() {
 476      throw new coding_exception('update_login_count() is removed, all calls need to be removed');
 477  }
 478  
 479  /**
 480   * Not used any more, replaced by proper account lockout.
 481   * @deprecated
 482   */
 483  function reset_login_count() {
 484      throw new coding_exception('reset_login_count() is removed, all calls need to be removed');
 485  }
 486  
 487  /**
 488   * @deprecated
 489   */
 490  function update_log_display_entry($module, $action, $mtable, $field) {
 491  
 492      throw new coding_exception('The update_log_display_entry() is removed, please use db/log.php description file instead.');
 493  }
 494  
 495  /**
 496   * @deprecated use the text formatting in a standard way instead (http://docs.moodle.org/dev/Output_functions)
 497   *             this was abused mostly for embedding of attachments
 498   */
 499  function filter_text($text, $courseid = NULL) {
 500      throw new coding_exception('filter_text() can not be used anymore, use format_text(), format_string() etc instead.');
 501  }
 502  
 503  /**
 504   * @deprecated use $PAGE->https_required() instead
 505   */
 506  function httpsrequired() {
 507      throw new coding_exception('httpsrequired() can not be used any more use $PAGE->https_required() instead.');
 508  }
 509  
 510  /**
 511   * Given a physical path to a file, returns the URL through which it can be reached in Moodle.
 512   *
 513   * @deprecated since 3.1 - replacement legacy file API methods can be found on the moodle_url class, for example:
 514   * The moodle_url::make_legacyfile_url() method can be used to generate a legacy course file url. To generate
 515   * course module file.php url the moodle_url::make_file_url() should be used.
 516   *
 517   * @param string $path Physical path to a file
 518   * @param array $options associative array of GET variables to append to the URL
 519   * @param string $type (questionfile|rssfile|httpscoursefile|coursefile)
 520   * @return string URL to file
 521   */
 522  function get_file_url($path, $options=null, $type='coursefile') {
 523      debugging('Function get_file_url() is deprecated, please use moodle_url factory methods instead.', DEBUG_DEVELOPER);
 524      global $CFG;
 525  
 526      $path = str_replace('//', '/', $path);
 527      $path = trim($path, '/'); // no leading and trailing slashes
 528  
 529      // type of file
 530      switch ($type) {
 531         case 'questionfile':
 532              $url = $CFG->wwwroot."/question/exportfile.php";
 533              break;
 534         case 'rssfile':
 535              $url = $CFG->wwwroot."/rss/file.php";
 536              break;
 537          case 'httpscoursefile':
 538              $url = $CFG->httpswwwroot."/file.php";
 539              break;
 540           case 'coursefile':
 541          default:
 542              $url = $CFG->wwwroot."/file.php";
 543      }
 544  
 545      if ($CFG->slasharguments) {
 546          $parts = explode('/', $path);
 547          foreach ($parts as $key => $part) {
 548          /// anchor dash character should not be encoded
 549              $subparts = explode('#', $part);
 550              $subparts = array_map('rawurlencode', $subparts);
 551              $parts[$key] = implode('#', $subparts);
 552          }
 553          $path  = implode('/', $parts);
 554          $ffurl = $url.'/'.$path;
 555          $separator = '?';
 556      } else {
 557          $path = rawurlencode('/'.$path);
 558          $ffurl = $url.'?file='.$path;
 559          $separator = '&amp;';
 560      }
 561  
 562      if ($options) {
 563          foreach ($options as $name=>$value) {
 564              $ffurl = $ffurl.$separator.$name.'='.$value;
 565              $separator = '&amp;';
 566          }
 567      }
 568  
 569      return $ffurl;
 570  }
 571  
 572  /**
 573   * @deprecated use get_enrolled_users($context) instead.
 574   */
 575  function get_course_participants($courseid) {
 576      throw new coding_exception('get_course_participants() can not be used any more, use get_enrolled_users() instead.');
 577  }
 578  
 579  /**
 580   * @deprecated use is_enrolled($context, $userid) instead.
 581   */
 582  function is_course_participant($userid, $courseid) {
 583      throw new coding_exception('is_course_participant() can not be used any more, use is_enrolled() instead.');
 584  }
 585  
 586  /**
 587   * @deprecated
 588   */
 589  function get_recent_enrolments($courseid, $timestart) {
 590      throw new coding_exception('get_recent_enrolments() is removed as it returned inaccurate results.');
 591  }
 592  
 593  /**
 594   * @deprecated use clean_param($string, PARAM_FILE) instead.
 595   */
 596  function detect_munged_arguments($string, $allowdots=1) {
 597      throw new coding_exception('detect_munged_arguments() can not be used any more, please use clean_param(,PARAM_FILE) instead.');
 598  }
 599  
 600  
 601  /**
 602   * Unzip one zip file to a destination dir
 603   * Both parameters must be FULL paths
 604   * If destination isn't specified, it will be the
 605   * SAME directory where the zip file resides.
 606   *
 607   * @global object
 608   * @param string $zipfile The zip file to unzip
 609   * @param string $destination The location to unzip to
 610   * @param bool $showstatus_ignored Unused
 611   * @deprecated since 2.0 MDL-15919
 612   */
 613  function unzip_file($zipfile, $destination = '', $showstatus_ignored = true) {
 614      debugging(__FUNCTION__ . '() is deprecated. '
 615              . 'Please use the application/zip file_packer implementation instead.', DEBUG_DEVELOPER);
 616  
 617      // Extract everything from zipfile.
 618      $path_parts = pathinfo(cleardoubleslashes($zipfile));
 619      $zippath = $path_parts["dirname"];       //The path of the zip file
 620      $zipfilename = $path_parts["basename"];  //The name of the zip file
 621      $extension = $path_parts["extension"];    //The extension of the file
 622  
 623      //If no file, error
 624      if (empty($zipfilename)) {
 625          return false;
 626      }
 627  
 628      //If no extension, error
 629      if (empty($extension)) {
 630          return false;
 631      }
 632  
 633      //Clear $zipfile
 634      $zipfile = cleardoubleslashes($zipfile);
 635  
 636      //Check zipfile exists
 637      if (!file_exists($zipfile)) {
 638          return false;
 639      }
 640  
 641      //If no destination, passed let's go with the same directory
 642      if (empty($destination)) {
 643          $destination = $zippath;
 644      }
 645  
 646      //Clear $destination
 647      $destpath = rtrim(cleardoubleslashes($destination), "/");
 648  
 649      //Check destination path exists
 650      if (!is_dir($destpath)) {
 651          return false;
 652      }
 653  
 654      $packer = get_file_packer('application/zip');
 655  
 656      $result = $packer->extract_to_pathname($zipfile, $destpath);
 657  
 658      if ($result === false) {
 659          return false;
 660      }
 661  
 662      foreach ($result as $status) {
 663          if ($status !== true) {
 664              return false;
 665          }
 666      }
 667  
 668      return true;
 669  }
 670  
 671  /**
 672   * Zip an array of files/dirs to a destination zip file
 673   * Both parameters must be FULL paths to the files/dirs
 674   *
 675   * @global object
 676   * @param array $originalfiles Files to zip
 677   * @param string $destination The destination path
 678   * @return bool Outcome
 679   *
 680   * @deprecated since 2.0 MDL-15919
 681   */
 682  function zip_files($originalfiles, $destination) {
 683      debugging(__FUNCTION__ . '() is deprecated. '
 684              . 'Please use the application/zip file_packer implementation instead.', DEBUG_DEVELOPER);
 685  
 686      // Extract everything from destination.
 687      $path_parts = pathinfo(cleardoubleslashes($destination));
 688      $destpath = $path_parts["dirname"];       //The path of the zip file
 689      $destfilename = $path_parts["basename"];  //The name of the zip file
 690      $extension = $path_parts["extension"];    //The extension of the file
 691  
 692      //If no file, error
 693      if (empty($destfilename)) {
 694          return false;
 695      }
 696  
 697      //If no extension, add it
 698      if (empty($extension)) {
 699          $extension = 'zip';
 700          $destfilename = $destfilename.'.'.$extension;
 701      }
 702  
 703      //Check destination path exists
 704      if (!is_dir($destpath)) {
 705          return false;
 706      }
 707  
 708      //Check destination path is writable. TODO!!
 709  
 710      //Clean destination filename
 711      $destfilename = clean_filename($destfilename);
 712  
 713      //Now check and prepare every file
 714      $files = array();
 715      $origpath = NULL;
 716  
 717      foreach ($originalfiles as $file) {  //Iterate over each file
 718          //Check for every file
 719          $tempfile = cleardoubleslashes($file); // no doubleslashes!
 720          //Calculate the base path for all files if it isn't set
 721          if ($origpath === NULL) {
 722              $origpath = rtrim(cleardoubleslashes(dirname($tempfile)), "/");
 723          }
 724          //See if the file is readable
 725          if (!is_readable($tempfile)) {  //Is readable
 726              continue;
 727          }
 728          //See if the file/dir is in the same directory than the rest
 729          if (rtrim(cleardoubleslashes(dirname($tempfile)), "/") != $origpath) {
 730              continue;
 731          }
 732          //Add the file to the array
 733          $files[] = $tempfile;
 734      }
 735  
 736      $zipfiles = array();
 737      $start = strlen($origpath)+1;
 738      foreach($files as $file) {
 739          $zipfiles[substr($file, $start)] = $file;
 740      }
 741  
 742      $packer = get_file_packer('application/zip');
 743  
 744      return $packer->archive_to_pathname($zipfiles, $destpath . '/' . $destfilename);
 745  }
 746  
 747  /**
 748   * @deprecated use groups_get_all_groups() instead.
 749   */
 750  function mygroupid($courseid) {
 751      throw new coding_exception('mygroupid() can not be used any more, please use groups_get_all_groups() instead.');
 752  }
 753  
 754  
 755  /**
 756   * Returns the current group mode for a given course or activity module
 757   *
 758   * Could be false, SEPARATEGROUPS or VISIBLEGROUPS    (<-- Martin)
 759   *
 760   * @deprecated since Moodle 2.0 MDL-14617 - please do not use this function any more.
 761   * @todo MDL-50273 This will be deleted in Moodle 3.2.
 762   *
 763   * @param object $course Course Object
 764   * @param object $cm Course Manager Object
 765   * @return mixed $course->groupmode
 766   */
 767  function groupmode($course, $cm=null) {
 768  
 769      debugging('groupmode() is deprecated, please use groups_get_* instead', DEBUG_DEVELOPER);
 770      if (isset($cm->groupmode) && empty($course->groupmodeforce)) {
 771          return $cm->groupmode;
 772      }
 773      return $course->groupmode;
 774  }
 775  
 776  /**
 777   * Sets the current group in the session variable
 778   * When $SESSION->currentgroup[$courseid] is set to 0 it means, show all groups.
 779   * Sets currentgroup[$courseid] in the session variable appropriately.
 780   * Does not do any permission checking.
 781   *
 782   * @deprecated Since year 2006 - please do not use this function any more.
 783   * @todo MDL-50273 This will be deleted in Moodle 3.2.
 784   *
 785   * @global object
 786   * @global object
 787   * @param int $courseid The course being examined - relates to id field in
 788   * 'course' table.
 789   * @param int $groupid The group being examined.
 790   * @return int Current group id which was set by this function
 791   */
 792  function set_current_group($courseid, $groupid) {
 793      global $SESSION;
 794  
 795      debugging('set_current_group() is deprecated, please use $SESSION->currentgroup[$courseid] instead', DEBUG_DEVELOPER);
 796      return $SESSION->currentgroup[$courseid] = $groupid;
 797  }
 798  
 799  /**
 800   * Gets the current group - either from the session variable or from the database.
 801   *
 802   * @deprecated Since year 2006 - please do not use this function any more.
 803   * @todo MDL-50273 This will be deleted in Moodle 3.2.
 804   *
 805   * @global object
 806   * @param int $courseid The course being examined - relates to id field in
 807   * 'course' table.
 808   * @param bool $full If true, the return value is a full record object.
 809   * If false, just the id of the record.
 810   * @return int|bool
 811   */
 812  function get_current_group($courseid, $full = false) {
 813      global $SESSION;
 814  
 815      debugging('get_current_group() is deprecated, please use groups_get_* instead', DEBUG_DEVELOPER);
 816      if (isset($SESSION->currentgroup[$courseid])) {
 817          if ($full) {
 818              return groups_get_group($SESSION->currentgroup[$courseid]);
 819          } else {
 820              return $SESSION->currentgroup[$courseid];
 821          }
 822      }
 823  
 824      $mygroupid = mygroupid($courseid);
 825      if (is_array($mygroupid)) {
 826          $mygroupid = array_shift($mygroupid);
 827          set_current_group($courseid, $mygroupid);
 828          if ($full) {
 829              return groups_get_group($mygroupid);
 830          } else {
 831              return $mygroupid;
 832          }
 833      }
 834  
 835      if ($full) {
 836          return false;
 837      } else {
 838          return 0;
 839      }
 840  }
 841  
 842  /**
 843   * @deprecated Since Moodle 2.8
 844   */
 845  function groups_filter_users_by_course_module_visible($cm, $users) {
 846      throw new coding_exception('groups_filter_users_by_course_module_visible() is removed. ' .
 847              'Replace with a call to \core_availability\info_module::filter_user_list(), ' .
 848              'which does basically the same thing but includes other restrictions such ' .
 849              'as profile restrictions.');
 850  }
 851  
 852  /**
 853   * @deprecated Since Moodle 2.8
 854   */
 855  function groups_course_module_visible($cm, $userid=null) {
 856      throw new coding_exception('groups_course_module_visible() is removed, use $cm->uservisible to decide whether the current
 857          user can ' . 'access an activity.', DEBUG_DEVELOPER);
 858  }
 859  
 860  /**
 861   * @deprecated since 2.0
 862   */
 863  function error($message, $link='') {
 864      throw new coding_exception('notlocalisederrormessage', 'error', $link, $message, 'error() is a removed, please call
 865              print_error() instead of error()');
 866  }
 867  
 868  
 869  /**
 870   * @deprecated use $PAGE->theme->name instead.
 871   */
 872  function current_theme() {
 873      throw new coding_exception('current_theme() can not be used any more, please use $PAGE->theme->name instead');
 874  }
 875  
 876  /**
 877   * @deprecated
 878   */
 879  function formerr($error) {
 880      throw new coding_exception('formerr() is removed. Please change your code to use $OUTPUT->error_text($string).');
 881  }
 882  
 883  /**
 884   * @deprecated use $OUTPUT->skip_link_target() in instead.
 885   */
 886  function skip_main_destination() {
 887      throw new coding_exception('skip_main_destination() can not be used any more, please use $OUTPUT->skip_link_target() instead.');
 888  }
 889  
 890  /**
 891   * @deprecated use $OUTPUT->container() instead.
 892   */
 893  function print_container($message, $clearfix=false, $classes='', $idbase='', $return=false) {
 894      throw new coding_exception('print_container() can not be used any more. Please use $OUTPUT->container() instead.');
 895  }
 896  
 897  /**
 898   * @deprecated use $OUTPUT->container_start() instead.
 899   */
 900  function print_container_start($clearfix=false, $classes='', $idbase='', $return=false) {
 901      throw new coding_exception('print_container_start() can not be used any more. Please use $OUTPUT->container_start() instead.');
 902  }
 903  
 904  /**
 905   * @deprecated use $OUTPUT->container_end() instead.
 906   */
 907  function print_container_end($return=false) {
 908      throw new coding_exception('print_container_end() can not be used any more. Please use $OUTPUT->container_end() instead.');
 909  }
 910  
 911  /**
 912   * Print a bold message in an optional color.
 913   *
 914   * @deprecated since Moodle 2.0 MDL-19077 - use $OUTPUT->notification instead.
 915   * @todo MDL-50469 This will be deleted in Moodle 3.3.
 916   * @param string $message The message to print out
 917   * @param string $classes Optional style to display message text in
 918   * @param string $align Alignment option
 919   * @param bool $return whether to return an output string or echo now
 920   * @return string|bool Depending on $result
 921   */
 922  function notify($message, $classes = 'error', $align = 'center', $return = false) {
 923      global $OUTPUT;
 924  
 925      debugging('notify() is deprecated, please use $OUTPUT->notification() instead', DEBUG_DEVELOPER);
 926  
 927      if ($classes == 'green') {
 928          debugging('Use of deprecated class name "green" in notify. Please change to "success".', DEBUG_DEVELOPER);
 929          $classes = 'success'; // Backward compatible with old color system.
 930      }
 931  
 932      $output = $OUTPUT->notification($message, $classes);
 933      if ($return) {
 934          return $output;
 935      } else {
 936          echo $output;
 937      }
 938  }
 939  
 940  /**
 941   * @deprecated use $OUTPUT->continue_button() instead.
 942   */
 943  function print_continue($link, $return = false) {
 944      throw new coding_exception('print_continue() can not be used any more. Please use $OUTPUT->continue_button() instead.');
 945  }
 946  
 947  /**
 948   * @deprecated use $PAGE methods instead.
 949   */
 950  function print_header($title='', $heading='', $navigation='', $focus='',
 951                        $meta='', $cache=true, $button='&nbsp;', $menu=null,
 952                        $usexml=false, $bodytags='', $return=false) {
 953  
 954      throw new coding_exception('print_header() can not be used any more. Please use $PAGE methods instead.');
 955  }
 956  
 957  /**
 958   * @deprecated use $PAGE methods instead.
 959   */
 960  function print_header_simple($title='', $heading='', $navigation='', $focus='', $meta='',
 961                         $cache=true, $button='&nbsp;', $menu='', $usexml=false, $bodytags='', $return=false) {
 962  
 963      throw new coding_exception('print_header_simple() can not be used any more. Please use $PAGE methods instead.');
 964  }
 965  
 966  /**
 967   * @deprecated use $OUTPUT->block() instead.
 968   */
 969  function print_side_block($heading='', $content='', $list=NULL, $icons=NULL, $footer='', $attributes = array(), $title='') {
 970      throw new coding_exception('print_side_block() can not be used any more, please use $OUTPUT->block() instead.');
 971  }
 972  
 973  /**
 974   * Prints a basic textarea field.
 975   *
 976   * @deprecated since Moodle 2.0
 977   *
 978   * When using this function, you should
 979   *
 980   * @global object
 981   * @param bool $unused No longer used.
 982   * @param int $rows Number of rows to display  (minimum of 10 when $height is non-null)
 983   * @param int $cols Number of columns to display (minimum of 65 when $width is non-null)
 984   * @param null $width (Deprecated) Width of the element; if a value is passed, the minimum value for $cols will be 65. Value is otherwise ignored.
 985   * @param null $height (Deprecated) Height of the element; if a value is passe, the minimum value for $rows will be 10. Value is otherwise ignored.
 986   * @param string $name Name to use for the textarea element.
 987   * @param string $value Initial content to display in the textarea.
 988   * @param int $obsolete deprecated
 989   * @param bool $return If false, will output string. If true, will return string value.
 990   * @param string $id CSS ID to add to the textarea element.
 991   * @return string|void depending on the value of $return
 992   */
 993  function print_textarea($unused, $rows, $cols, $width, $height, $name, $value='', $obsolete=0, $return=false, $id='') {
 994      /// $width and height are legacy fields and no longer used as pixels like they used to be.
 995      /// However, you can set them to zero to override the mincols and minrows values below.
 996  
 997      // Disabling because there is not yet a viable $OUTPUT option for cases when mforms can't be used
 998      // debugging('print_textarea() has been deprecated. You should be using mforms and the editor element.');
 999  
1000      global $CFG;
1001  
1002      $mincols = 65;
1003      $minrows = 10;
1004      $str = '';
1005  
1006      if ($id === '') {
1007          $id = 'edit-'.$name;
1008      }
1009  
1010      if ($height && ($rows < $minrows)) {
1011          $rows = $minrows;
1012      }
1013      if ($width && ($cols < $mincols)) {
1014          $cols = $mincols;
1015      }
1016  
1017      editors_head_setup();
1018      $editor = editors_get_preferred_editor(FORMAT_HTML);
1019      $editor->set_text($value);
1020      $editor->use_editor($id, array('legacy'=>true));
1021  
1022      $str .= "\n".'<textarea class="form-textarea" id="'. $id .'" name="'. $name .'" rows="'. $rows .'" cols="'. $cols .'" spellcheck="true">'."\n";
1023      $str .= htmlspecialchars($value); // needed for editing of cleaned text!
1024      $str .= '</textarea>'."\n";
1025  
1026      if ($return) {
1027          return $str;
1028      }
1029      echo $str;
1030  }
1031  
1032  /**
1033   * Returns an image of an up or down arrow, used for column sorting. To avoid unnecessary DB accesses, please
1034   * provide this function with the language strings for sortasc and sortdesc.
1035   *
1036   * @deprecated use $OUTPUT->arrow() instead.
1037   * @todo final deprecation of this function once MDL-45448 is resolved
1038   *
1039   * If no sort string is associated with the direction, an arrow with no alt text will be printed/returned.
1040   *
1041   * @global object
1042   * @param string $direction 'up' or 'down'
1043   * @param string $strsort The language string used for the alt attribute of this image
1044   * @param bool $return Whether to print directly or return the html string
1045   * @return string|void depending on $return
1046   *
1047   */
1048  function print_arrow($direction='up', $strsort=null, $return=false) {
1049      global $OUTPUT;
1050  
1051      debugging('print_arrow() is deprecated. Please use $OUTPUT->arrow() instead.', DEBUG_DEVELOPER);
1052  
1053      if (!in_array($direction, array('up', 'down', 'right', 'left', 'move'))) {
1054          return null;
1055      }
1056  
1057      $return = null;
1058  
1059      switch ($direction) {
1060          case 'up':
1061              $sortdir = 'asc';
1062              break;
1063          case 'down':
1064              $sortdir = 'desc';
1065              break;
1066          case 'move':
1067              $sortdir = 'asc';
1068              break;
1069          default:
1070              $sortdir = null;
1071              break;
1072      }
1073  
1074      // Prepare language string
1075      $strsort = '';
1076      if (empty($strsort) && !empty($sortdir)) {
1077          $strsort  = get_string('sort' . $sortdir, 'grades');
1078      }
1079  
1080      $return = ' <img src="'.$OUTPUT->pix_url('t/' . $direction) . '" alt="'.$strsort.'" /> ';
1081  
1082      if ($return) {
1083          return $return;
1084      } else {
1085          echo $return;
1086      }
1087  }
1088  
1089  /**
1090   * @deprecated since Moodle 2.0
1091   */
1092  function choose_from_menu ($options, $name, $selected='', $nothing='choose', $script='',
1093                             $nothingvalue='0', $return=false, $disabled=false, $tabindex=0,
1094                             $id='', $listbox=false, $multiple=false, $class='') {
1095      throw new coding_exception('choose_from_menu() is removed. Please change your code to use html_writer::select().');
1096  
1097  }
1098  
1099  /**
1100   * @deprecated use $OUTPUT->help_icon_scale($courseid, $scale) instead.
1101   */
1102  function print_scale_menu_helpbutton($courseid, $scale, $return=false) {
1103      throw new coding_exception('print_scale_menu_helpbutton() can not be used any more. '.
1104          'Please use $OUTPUT->help_icon_scale($courseid, $scale) instead.');
1105  }
1106  
1107  /**
1108   * @deprecated use html_writer::checkbox() instead.
1109   */
1110  function print_checkbox($name, $value, $checked = true, $label = '', $alt = '', $script='', $return=false) {
1111      throw new coding_exception('print_checkbox() can not be used any more. Please use html_writer::checkbox() instead.');
1112  }
1113  
1114  /**
1115   * Prints the 'update this xxx' button that appears on module pages.
1116   *
1117   * @deprecated since Moodle 2.0
1118   *
1119   * @param string $cmid the course_module id.
1120   * @param string $ignored not used any more. (Used to be courseid.)
1121   * @param string $string the module name - get_string('modulename', 'xxx')
1122   * @return string the HTML for the button, if this user has permission to edit it, else an empty string.
1123   */
1124  function update_module_button($cmid, $ignored, $string) {
1125      global $CFG, $OUTPUT;
1126  
1127      // debugging('update_module_button() has been deprecated. Please change your code to use $OUTPUT->update_module_button().');
1128  
1129      //NOTE: DO NOT call new output method because it needs the module name we do not have here!
1130  
1131      if (has_capability('moodle/course:manageactivities', context_module::instance($cmid))) {
1132          $string = get_string('updatethis', '', $string);
1133  
1134          $url = new moodle_url("$CFG->wwwroot/course/mod.php", array('update' => $cmid, 'return' => true, 'sesskey' => sesskey()));
1135          return $OUTPUT->single_button($url, $string);
1136      } else {
1137          return '';
1138      }
1139  }
1140  
1141  /**
1142   * @deprecated use $OUTPUT->navbar() instead
1143   */
1144  function print_navigation ($navigation, $separator=0, $return=false) {
1145      throw new coding_exception('print_navigation() can not be used any more, please update use $OUTPUT->navbar() instead.');
1146  }
1147  
1148  /**
1149   * @deprecated Please use $PAGE->navabar methods instead.
1150   */
1151  function build_navigation($extranavlinks, $cm = null) {
1152      throw new coding_exception('build_navigation() can not be used any more, please use $PAGE->navbar methods instead.');
1153  }
1154  
1155  /**
1156   * @deprecated not relevant with global navigation in Moodle 2.x+
1157   */
1158  function navmenu($course, $cm=NULL, $targetwindow='self') {
1159      throw new coding_exception('navmenu() can not be used any more, it is no longer relevant with global navigation.');
1160  }
1161  
1162  /// CALENDAR MANAGEMENT  ////////////////////////////////////////////////////////////////
1163  
1164  
1165  /**
1166   * @deprecated please use calendar_event::create() instead.
1167   */
1168  function add_event($event) {
1169      throw new coding_exception('add_event() can not be used any more, please use calendar_event::create() instead.');
1170  }
1171  
1172  /**
1173   * @deprecated please calendar_event->update() instead.
1174   */
1175  function update_event($event) {
1176      throw new coding_exception('update_event() is removed, please use calendar_event->update() instead.');
1177  }
1178  
1179  /**
1180   * @deprecated please use calendar_event->delete() instead.
1181   */
1182  function delete_event($id) {
1183      throw new coding_exception('delete_event() can not be used any more, please use '.
1184          'calendar_event->delete() instead.');
1185  }
1186  
1187  /**
1188   * @deprecated please use calendar_event->toggle_visibility(false) instead.
1189   */
1190  function hide_event($event) {
1191      throw new coding_exception('hide_event() can not be used any more, please use '.
1192          'calendar_event->toggle_visibility(false) instead.');
1193  }
1194  
1195  /**
1196   * @deprecated please use calendar_event->toggle_visibility(true) instead.
1197   */
1198  function show_event($event) {
1199      throw new coding_exception('show_event() can not be used any more, please use '.
1200          'calendar_event->toggle_visibility(true) instead.');
1201  }
1202  
1203  /**
1204   * @deprecated since Moodle 2.2 use core_text::xxxx() instead.
1205   * @see core_text
1206   */
1207  function textlib_get_instance() {
1208      throw new coding_exception('textlib_get_instance() can not be used any more, please use '.
1209          'core_text::functioname() instead.');
1210  }
1211  
1212  /**
1213   * @deprecated since 2.4
1214   * @see get_section_name()
1215   * @see format_base::get_section_name()
1216  
1217   */
1218  function get_generic_section_name($format, stdClass $section) {
1219      throw new coding_exception('get_generic_section_name() is deprecated. Please use appropriate functionality from class format_base');
1220  }
1221  
1222  /**
1223   * Returns an array of sections for the requested course id
1224   *
1225   * It is usually not recommended to display the list of sections used
1226   * in course because the course format may have it's own way to do it.
1227   *
1228   * If you need to just display the name of the section please call:
1229   * get_section_name($course, $section)
1230   * {@link get_section_name()}
1231   * from 2.4 $section may also be just the field course_sections.section
1232   *
1233   * If you need the list of all sections it is more efficient to get this data by calling
1234   * $modinfo = get_fast_modinfo($courseorid);
1235   * $sections = $modinfo->get_section_info_all()
1236   * {@link get_fast_modinfo()}
1237   * {@link course_modinfo::get_section_info_all()}
1238   *
1239   * Information about one section (instance of section_info):
1240   * get_fast_modinfo($courseorid)->get_sections_info($section)
1241   * {@link course_modinfo::get_section_info()}
1242   *
1243   * @deprecated since 2.4
1244   */
1245  function get_all_sections($courseid) {
1246  
1247      throw new coding_exception('get_all_sections() is removed. See phpdocs for this function');
1248  }
1249  
1250  /**
1251   * This function is deprecated, please use {@link course_add_cm_to_section()}
1252   * Note that course_add_cm_to_section() also updates field course_modules.section and
1253   * calls rebuild_course_cache()
1254   *
1255   * @deprecated since 2.4
1256   */
1257  function add_mod_to_section($mod, $beforemod = null) {
1258      throw new coding_exception('Function add_mod_to_section() is removed, please use course_add_cm_to_section()');
1259  }
1260  
1261  /**
1262   * Returns a number of useful structures for course displays
1263   *
1264   * Function get_all_mods() is deprecated in 2.4
1265   * Instead of:
1266   * <code>
1267   * get_all_mods($courseid, $mods, $modnames, $modnamesplural, $modnamesused);
1268   * </code>
1269   * please use:
1270   * <code>
1271   * $mods = get_fast_modinfo($courseorid)->get_cms();
1272   * $modnames = get_module_types_names();
1273   * $modnamesplural = get_module_types_names(true);
1274   * $modnamesused = get_fast_modinfo($courseorid)->get_used_module_names();
1275   * </code>
1276   *
1277   * @deprecated since 2.4
1278   */
1279  function get_all_mods($courseid, &$mods, &$modnames, &$modnamesplural, &$modnamesused) {
1280      throw new coding_exception('Function get_all_mods() is removed. Use get_fast_modinfo() and get_module_types_names() instead. See phpdocs for details');
1281  }
1282  
1283  /**
1284   * Returns course section - creates new if does not exist yet
1285   *
1286   * This function is deprecated. To create a course section call:
1287   * course_create_sections_if_missing($courseorid, $sections);
1288   * to get the section call:
1289   * get_fast_modinfo($courseorid)->get_section_info($sectionnum);
1290   *
1291   * @see course_create_sections_if_missing()
1292   * @see get_fast_modinfo()
1293   * @deprecated since 2.4
1294   */
1295  function get_course_section($section, $courseid) {
1296      throw new coding_exception('Function get_course_section() is removed. Please use course_create_sections_if_missing() and get_fast_modinfo() instead.');
1297  }
1298  
1299  /**
1300   * @deprecated since 2.4
1301   * @see format_weeks::get_section_dates()
1302   */
1303  function format_weeks_get_section_dates($section, $course) {
1304      throw new coding_exception('Function format_weeks_get_section_dates() is removed. It is not recommended to'.
1305              ' use it outside of format_weeks plugin');
1306  }
1307  
1308  /**
1309   * Deprecated. Instead of:
1310   * list($content, $name) = get_print_section_cm_text($cm, $course);
1311   * use:
1312   * $content = $cm->get_formatted_content(array('overflowdiv' => true, 'noclean' => true));
1313   * $name = $cm->get_formatted_name();
1314   *
1315   * @deprecated since 2.5
1316   * @see cm_info::get_formatted_content()
1317   * @see cm_info::get_formatted_name()
1318   */
1319  function get_print_section_cm_text(cm_info $cm, $course) {
1320      throw new coding_exception('Function get_print_section_cm_text() is removed. Please use '.
1321              'cm_info::get_formatted_content() and cm_info::get_formatted_name()');
1322  }
1323  
1324  /**
1325   * Deprecated. Please use:
1326   * $courserenderer = $PAGE->get_renderer('core', 'course');
1327   * $output = $courserenderer->course_section_add_cm_control($course, $section, $sectionreturn,
1328   *    array('inblock' => $vertical));
1329   * echo $output;
1330   *
1331   * @deprecated since 2.5
1332   * @see core_course_renderer::course_section_add_cm_control()
1333   */
1334  function print_section_add_menus($course, $section, $modnames = null, $vertical=false, $return=false, $sectionreturn=null) {
1335      throw new coding_exception('Function print_section_add_menus() is removed. Please use course renderer '.
1336              'function course_section_add_cm_control()');
1337  }
1338  
1339  /**
1340   * Deprecated. Please use:
1341   * $courserenderer = $PAGE->get_renderer('core', 'course');
1342   * $actions = course_get_cm_edit_actions($mod, $indent, $section);
1343   * return ' ' . $courserenderer->course_section_cm_edit_actions($actions);
1344   *
1345   * @deprecated since 2.5
1346   * @see course_get_cm_edit_actions()
1347   * @see core_course_renderer->course_section_cm_edit_actions()
1348   */
1349  function make_editing_buttons(stdClass $mod, $absolute_ignored = true, $moveselect = true, $indent=-1, $section=null) {
1350      throw new coding_exception('Function make_editing_buttons() is removed, please see PHPdocs in '.
1351              'lib/deprecatedlib.php on how to replace it');
1352  }
1353  
1354  /**
1355   * Deprecated. Please use:
1356   * $courserenderer = $PAGE->get_renderer('core', 'course');
1357   * echo $courserenderer->course_section_cm_list($course, $section, $sectionreturn,
1358   *     array('hidecompletion' => $hidecompletion));
1359   *
1360   * @deprecated since 2.5
1361   * @see core_course_renderer::course_section_cm_list()
1362   */
1363  function print_section($course, $section, $mods, $modnamesused, $absolute=false, $width="100%", $hidecompletion=false, $sectionreturn=null) {
1364      throw new coding_exception('Function print_section() is removed. Please use course renderer function '.
1365              'course_section_cm_list() instead.');
1366  }
1367  
1368  /**
1369   * @deprecated since 2.5
1370   */
1371  function print_overview($courses, array $remote_courses=array()) {
1372      throw new coding_exception('Function print_overview() is removed. Use block course_overview to display this information');
1373  }
1374  
1375  /**
1376   * @deprecated since 2.5
1377   */
1378  function print_recent_activity($course) {
1379      throw new coding_exception('Function print_recent_activity() is removed. It is not recommended to'.
1380              ' use it outside of block_recent_activity');
1381  }
1382  
1383  /**
1384   * @deprecated since 2.5
1385   */
1386  function delete_course_module($id) {
1387      throw new coding_exception('Function delete_course_module() is removed. Please use course_delete_module() instead.');
1388  }
1389  
1390  /**
1391   * @deprecated since 2.5
1392   */
1393  function update_category_button($categoryid = 0) {
1394      throw new coding_exception('Function update_category_button() is removed. Pages to view '.
1395              'and edit courses are now separate and no longer depend on editing mode.');
1396  }
1397  
1398  /**
1399   * This function is deprecated! For list of categories use
1400   * coursecat::make_all_categories($requiredcapability, $excludeid, $separator)
1401   * For parents of one particular category use
1402   * coursecat::get($id)->get_parents()
1403   *
1404   * @deprecated since 2.5
1405   */
1406  function make_categories_list(&$list, &$parents, $requiredcapability = '',
1407          $excludeid = 0, $category = NULL, $path = "") {
1408      throw new coding_exception('Global function make_categories_list() is removed. Please use '.
1409              'coursecat::make_categories_list() and coursecat::get_parents()');
1410  }
1411  
1412  /**
1413   * @deprecated since 2.5
1414   */
1415  function category_delete_move($category, $newparentid, $showfeedback=true) {
1416      throw new coding_exception('Function category_delete_move() is removed. Please use coursecat::delete_move() instead.');
1417  }
1418  
1419  /**
1420   * @deprecated since 2.5
1421   */
1422  function category_delete_full($category, $showfeedback=true) {
1423      throw new coding_exception('Function category_delete_full() is removed. Please use coursecat::delete_full() instead.');
1424  }
1425  
1426  /**
1427   * This function is deprecated. Please use
1428   * $coursecat = coursecat::get($category->id);
1429   * if ($coursecat->can_change_parent($newparentcat->id)) {
1430   *     $coursecat->change_parent($newparentcat->id);
1431   * }
1432   *
1433   * Alternatively you can use
1434   * $coursecat->update(array('parent' => $newparentcat->id));
1435   *
1436   * @see coursecat::change_parent()
1437   * @see coursecat::update()
1438   * @deprecated since 2.5
1439   */
1440  function move_category($category, $newparentcat) {
1441      throw new coding_exception('Function move_category() is removed. Please use coursecat::change_parent() instead.');
1442  }
1443  
1444  /**
1445   * This function is deprecated. Please use
1446   * coursecat::get($category->id)->hide();
1447   *
1448   * @see coursecat::hide()
1449   * @deprecated since 2.5
1450   */
1451  function course_category_hide($category) {
1452      throw new coding_exception('Function course_category_hide() is removed. Please use coursecat::hide() instead.');
1453  }
1454  
1455  /**
1456   * This function is deprecated. Please use
1457   * coursecat::get($category->id)->show();
1458   *
1459   * @see coursecat::show()
1460   * @deprecated since 2.5
1461   */
1462  function course_category_show($category) {
1463      throw new coding_exception('Function course_category_show() is removed. Please use coursecat::show() instead.');
1464  }
1465  
1466  /**
1467   * This function is deprecated.
1468   * To get the category with the specified it please use:
1469   * coursecat::get($catid, IGNORE_MISSING);
1470   * or
1471   * coursecat::get($catid, MUST_EXIST);
1472   *
1473   * To get the first available category please use
1474   * coursecat::get_default();
1475   *
1476   * @deprecated since 2.5
1477   */
1478  function get_course_category($catid=0) {
1479      throw new coding_exception('Function get_course_category() is removed. Please use coursecat::get(), see phpdocs for more details');
1480  }
1481  
1482  /**
1483   * This function is deprecated. It is replaced with the method create() in class coursecat.
1484   * {@link coursecat::create()} also verifies the data, fixes sortorder and logs the action
1485   *
1486   * @deprecated since 2.5
1487   */
1488  function create_course_category($category) {
1489      throw new coding_exception('Function create_course_category() is removed. Please use coursecat::create(), see phpdocs for more details');
1490  }
1491  
1492  /**
1493   * This function is deprecated.
1494   *
1495   * To get visible children categories of the given category use:
1496   * coursecat::get($categoryid)->get_children();
1497   * This function will return the array or coursecat objects, on each of them
1498   * you can call get_children() again
1499   *
1500   * @see coursecat::get()
1501   * @see coursecat::get_children()
1502   *
1503   * @deprecated since 2.5
1504   */
1505  function get_all_subcategories($catid) {
1506      throw new coding_exception('Function get_all_subcategories() is removed. Please use appropriate methods() of coursecat
1507              class. See phpdocs for more details');
1508  }
1509  
1510  /**
1511   * This function is deprecated. Please use functions in class coursecat:
1512   * - coursecat::get($parentid)->has_children()
1513   * tells if the category has children (visible or not to the current user)
1514   *
1515   * - coursecat::get($parentid)->get_children()
1516   * returns an array of coursecat objects, each of them represents a children category visible
1517   * to the current user (i.e. visible=1 or user has capability to view hidden categories)
1518   *
1519   * - coursecat::get($parentid)->get_children_count()
1520   * returns number of children categories visible to the current user
1521   *
1522   * - coursecat::count_all()
1523   * returns total count of all categories in the system (both visible and not)
1524   *
1525   * - coursecat::get_default()
1526   * returns the first category (usually to be used if count_all() == 1)
1527   *
1528   * @deprecated since 2.5
1529   */
1530  function get_child_categories($parentid) {
1531      throw new coding_exception('Function get_child_categories() is removed. Use coursecat::get_children() or see phpdocs for
1532              more details.');
1533  }
1534  
1535  /**
1536   *
1537   * @deprecated since 2.5
1538   *
1539   * This function is deprecated. Use appropriate functions from class coursecat.
1540   * Examples:
1541   *
1542   * coursecat::get($categoryid)->get_children()
1543   * - returns all children of the specified category as instances of class
1544   * coursecat, which means on each of them method get_children() can be called again.
1545   * Only categories visible to the current user are returned.
1546   *
1547   * coursecat::get(0)->get_children()
1548   * - returns all top-level categories visible to the current user.
1549   *
1550   * Sort fields can be specified, see phpdocs to {@link coursecat::get_children()}
1551   *
1552   * coursecat::make_categories_list()
1553   * - returns an array of all categories id/names in the system.
1554   * Also only returns categories visible to current user and can additionally be
1555   * filetered by capability, see phpdocs to {@link coursecat::make_categories_list()}
1556   *
1557   * make_categories_options()
1558   * - Returns full course categories tree to be used in html_writer::select()
1559   *
1560   * Also see functions {@link coursecat::get_children_count()}, {@link coursecat::count_all()},
1561   * {@link coursecat::get_default()}
1562   */
1563  function get_categories($parent='none', $sort=NULL, $shallow=true) {
1564      throw new coding_exception('Function get_categories() is removed. Please use coursecat::get_children() or see phpdocs for other alternatives');
1565  }
1566  
1567  /**
1568  * This function is deprecated, please use course renderer:
1569  * $renderer = $PAGE->get_renderer('core', 'course');
1570  * echo $renderer->course_search_form($value, $format);
1571  *
1572  * @deprecated since 2.5
1573  */
1574  function print_course_search($value="", $return=false, $format="plain") {
1575      throw new coding_exception('Function print_course_search() is removed, please use course renderer');
1576  }
1577  
1578  /**
1579   * This function is deprecated, please use:
1580   * $renderer = $PAGE->get_renderer('core', 'course');
1581   * echo $renderer->frontpage_my_courses()
1582   *
1583   * @deprecated since 2.5
1584   */
1585  function print_my_moodle() {
1586      throw new coding_exception('Function print_my_moodle() is removed, please use course renderer function frontpage_my_courses()');
1587  }
1588  
1589  /**
1590   * This function is deprecated, it is replaced with protected function
1591   * {@link core_course_renderer::frontpage_remote_course()}
1592   * It is only used from function {@link core_course_renderer::frontpage_my_courses()}
1593   *
1594   * @deprecated since 2.5
1595   */
1596  function print_remote_course($course, $width="100%") {
1597      throw new coding_exception('Function print_remote_course() is removed, please use course renderer');
1598  }
1599  
1600  /**
1601   * This function is deprecated, it is replaced with protected function
1602   * {@link core_course_renderer::frontpage_remote_host()}
1603   * It is only used from function {@link core_course_renderer::frontpage_my_courses()}
1604   *
1605   * @deprecated since 2.5
1606   */
1607  function print_remote_host($host, $width="100%") {
1608      throw new coding_exception('Function print_remote_host() is removed, please use course renderer');
1609  }
1610  
1611  /**
1612   * @deprecated since 2.5
1613   *
1614   * See http://docs.moodle.org/dev/Courses_lists_upgrade_to_2.5
1615   */
1616  function print_whole_category_list($category=NULL, $displaylist=NULL, $parentslist=NULL, $depth=-1, $showcourses = true, $categorycourses=NULL) {
1617      throw new coding_exception('Function print_whole_category_list() is removed, please use course renderer');
1618  }
1619  
1620  /**
1621   * @deprecated since 2.5
1622   */
1623  function print_category_info($category, $depth = 0, $showcourses = false, array $courses = null) {
1624      throw new coding_exception('Function print_category_info() is removed, please use course renderer');
1625  }
1626  
1627  /**
1628   * @deprecated since 2.5
1629   *
1630   * This function is not used any more in moodle core and course renderer does not have render function for it.
1631   * Combo list on the front page is displayed as:
1632   * $renderer = $PAGE->get_renderer('core', 'course');
1633   * echo $renderer->frontpage_combo_list()
1634   *
1635   * The new class {@link coursecat} stores the information about course category tree
1636   * To get children categories use:
1637   * coursecat::get($id)->get_children()
1638   * To get list of courses use:
1639   * coursecat::get($id)->get_courses()
1640   *
1641   * See http://docs.moodle.org/dev/Courses_lists_upgrade_to_2.5
1642   */
1643  function get_course_category_tree($id = 0, $depth = 0) {
1644      throw new coding_exception('Function get_course_category_tree() is removed, please use course renderer or coursecat class,
1645              see function phpdocs for more info');
1646  }
1647  
1648  /**
1649   * @deprecated since 2.5
1650   *
1651   * To print a generic list of courses use:
1652   * $renderer = $PAGE->get_renderer('core', 'course');
1653   * echo $renderer->courses_list($courses);
1654   *
1655   * To print list of all courses:
1656   * $renderer = $PAGE->get_renderer('core', 'course');
1657   * echo $renderer->frontpage_available_courses();
1658   *
1659   * To print list of courses inside category:
1660   * $renderer = $PAGE->get_renderer('core', 'course');
1661   * echo $renderer->course_category($category); // this will also print subcategories
1662   */
1663  function print_courses($category) {
1664      throw new coding_exception('Function print_courses() is removed, please use course renderer');
1665  }
1666  
1667  /**
1668   * @deprecated since 2.5
1669   *
1670   * Please use course renderer to display a course information box.
1671   * $renderer = $PAGE->get_renderer('core', 'course');
1672   * echo $renderer->courses_list($courses); // will print list of courses
1673   * echo $renderer->course_info_box($course); // will print one course wrapped in div.generalbox
1674   */
1675  function print_course($course, $highlightterms = '') {
1676      throw new coding_exception('Function print_course() is removed, please use course renderer');
1677  }
1678  
1679  /**
1680   * @deprecated since 2.5
1681   *
1682   * This function is not used any more in moodle core and course renderer does not have render function for it.
1683   * Combo list on the front page is displayed as:
1684   * $renderer = $PAGE->get_renderer('core', 'course');
1685   * echo $renderer->frontpage_combo_list()
1686   *
1687   * The new class {@link coursecat} stores the information about course category tree
1688   * To get children categories use:
1689   * coursecat::get($id)->get_children()
1690   * To get list of courses use:
1691   * coursecat::get($id)->get_courses()
1692   */
1693  function get_category_courses_array($categoryid = 0) {
1694      throw new coding_exception('Function get_category_courses_array() is removed, please use methods of coursecat class');
1695  }
1696  
1697  /**
1698   * @deprecated since 2.5
1699   */
1700  function get_category_courses_array_recursively(array &$flattened, $category) {
1701      throw new coding_exception('Function get_category_courses_array_recursively() is removed, please use methods of coursecat class', DEBUG_DEVELOPER);
1702  }
1703  
1704  /**
1705   * @deprecated since Moodle 2.5 MDL-27814 - please do not use this function any more.
1706   */
1707  function blog_get_context_url($context=null) {
1708      throw new coding_exception('Function  blog_get_context_url() is removed, getting params from context is not reliable for blogs.');
1709  }
1710  
1711  /**
1712   * @deprecated since 2.5
1713   *
1714   * To get list of all courses with course contacts ('managers') use
1715   * coursecat::get(0)->get_courses(array('recursive' => true, 'coursecontacts' => true));
1716   *
1717   * To get list of courses inside particular category use
1718   * coursecat::get($id)->get_courses(array('coursecontacts' => true));
1719   *
1720   * Additionally you can specify sort order, offset and maximum number of courses,
1721   * see {@link coursecat::get_courses()}
1722   */
1723  function get_courses_wmanagers($categoryid=0, $sort="c.sortorder ASC", $fields=array()) {
1724      throw new coding_exception('Function get_courses_wmanagers() is removed, please use coursecat::get_courses()');
1725  }
1726  
1727  /**
1728   * @deprecated since 2.5
1729   */
1730  function convert_tree_to_html($tree, $row=0) {
1731      throw new coding_exception('Function convert_tree_to_html() is removed. Consider using class tabtree and core_renderer::render_tabtree()');
1732  }
1733  
1734  /**
1735   * @deprecated since 2.5
1736   */
1737  function convert_tabrows_to_tree($tabrows, $selected, $inactive, $activated) {
1738      throw new coding_exception('Function convert_tabrows_to_tree() is removed. Consider using class tabtree');
1739  }
1740  
1741  /**
1742   * @deprecated since 2.5 - do not use, the textrotate.js will work it out automatically
1743   */
1744  function can_use_rotated_text() {
1745      debugging('can_use_rotated_text() is removed. JS feature detection is used automatically.');
1746  }
1747  
1748  /**
1749   * @deprecated since Moodle 2.2 MDL-35009 - please do not use this function any more.
1750   * @see context::instance_by_id($id)
1751   */
1752  function get_context_instance_by_id($id, $strictness = IGNORE_MISSING) {
1753      throw new coding_exception('get_context_instance_by_id() is now removed, please use context::instance_by_id($id) instead.');
1754  }
1755  
1756  /**
1757   * Returns system context or null if can not be created yet.
1758   *
1759   * @see context_system::instance()
1760   * @deprecated since 2.2
1761   * @param bool $cache use caching
1762   * @return context system context (null if context table not created yet)
1763   */
1764  function get_system_context($cache = true) {
1765      debugging('get_system_context() is deprecated, please use context_system::instance() instead.', DEBUG_DEVELOPER);
1766      return context_system::instance(0, IGNORE_MISSING, $cache);
1767  }
1768  
1769  /**
1770   * @see context::get_parent_context_ids()
1771   * @deprecated since 2.2, use $context->get_parent_context_ids() instead
1772   */
1773  function get_parent_contexts(context $context, $includeself = false) {
1774      throw new coding_exception('get_parent_contexts() is removed, please use $context->get_parent_context_ids() instead.');
1775  }
1776  
1777  /**
1778   * @deprecated since Moodle 2.2
1779   * @see context::get_parent_context()
1780   */
1781  function get_parent_contextid(context $context) {
1782      throw new coding_exception('get_parent_contextid() is removed, please use $context->get_parent_context() instead.');
1783  }
1784  
1785  /**
1786   * @see context::get_child_contexts()
1787   * @deprecated since 2.2
1788   */
1789  function get_child_contexts(context $context) {
1790      throw new coding_exception('get_child_contexts() is removed, please use $context->get_child_contexts() instead.');
1791  }
1792  
1793  /**
1794   * @see context_helper::create_instances()
1795   * @deprecated since 2.2
1796   */
1797  function create_contexts($contextlevel = null, $buildpaths = true) {
1798      throw new coding_exception('create_contexts() is removed, please use context_helper::create_instances() instead.');
1799  }
1800  
1801  /**
1802   * @see context_helper::cleanup_instances()
1803   * @deprecated since 2.2
1804   */
1805  function cleanup_contexts() {
1806      throw new coding_exception('cleanup_contexts() is removed, please use context_helper::cleanup_instances() instead.');
1807  }
1808  
1809  /**
1810   * Populate context.path and context.depth where missing.
1811   *
1812   * @deprecated since 2.2
1813   */
1814  function build_context_path($force = false) {
1815      throw new coding_exception('build_context_path() is removed, please use context_helper::build_all_paths() instead.');
1816  }
1817  
1818  /**
1819   * @deprecated since 2.2
1820   */
1821  function rebuild_contexts(array $fixcontexts) {
1822      throw new coding_exception('rebuild_contexts() is removed, please use $context->reset_paths(true) instead.');
1823  }
1824  
1825  /**
1826   * @deprecated since Moodle 2.2
1827   * @see context_helper::preload_course()
1828   */
1829  function preload_course_contexts($courseid) {
1830      throw new coding_exception('preload_course_contexts() is removed, please use context_helper::preload_course() instead.');
1831  }
1832  
1833  /**
1834   * @deprecated since Moodle 2.2
1835   * @see context::update_moved()
1836   */
1837  function context_moved(context $context, context $newparent) {
1838      throw new coding_exception('context_moved() is removed, please use context::update_moved() instead.');
1839  }
1840  
1841  /**
1842   * @see context::get_capabilities()
1843   * @deprecated since 2.2
1844   */
1845  function fetch_context_capabilities(context $context) {
1846      throw new coding_exception('fetch_context_capabilities() is removed, please use $context->get_capabilities() instead.');
1847  }
1848  
1849  /**
1850   * @deprecated since 2.2
1851   * @see context_helper::preload_from_record()
1852   */
1853  function context_instance_preload(stdClass $rec) {
1854      throw new coding_exception('context_instance_preload() is removed, please use context_helper::preload_from_record() instead.');
1855  }
1856  
1857  /**
1858   * Returns context level name
1859   *
1860   * @deprecated since 2.2
1861   * @see context_helper::get_level_name()
1862   */
1863  function get_contextlevel_name($contextlevel) {
1864      throw new coding_exception('get_contextlevel_name() is removed, please use context_helper::get_level_name() instead.');
1865  }
1866  
1867  /**
1868   * @deprecated since 2.2
1869   * @see context::get_context_name()
1870   */
1871  function print_context_name(context $context, $withprefix = true, $short = false) {
1872      throw new coding_exception('print_context_name() is removed, please use $context->get_context_name() instead.');
1873  }
1874  
1875  /**
1876   * @deprecated since 2.2, use $context->mark_dirty() instead
1877   * @see context::mark_dirty()
1878   */
1879  function mark_context_dirty($path) {
1880      throw new coding_exception('mark_context_dirty() is removed, please use $context->mark_dirty() instead.');
1881  }
1882  
1883  /**
1884   * @deprecated since Moodle 2.2
1885   * @see context_helper::delete_instance() or context::delete_content()
1886   */
1887  function delete_context($contextlevel, $instanceid, $deleterecord = true) {
1888      if ($deleterecord) {
1889          throw new coding_exception('delete_context() is removed, please use context_helper::delete_instance() instead.');
1890      } else {
1891          throw new coding_exception('delete_context() is removed, please use $context->delete_content() instead.');
1892      }
1893  }
1894  
1895  /**
1896   * @deprecated since 2.2
1897   * @see context::get_url()
1898   */
1899  function get_context_url(context $context) {
1900      throw new coding_exception('get_context_url() is removed, please use $context->get_url() instead.');
1901  }
1902  
1903  /**
1904   * @deprecated since 2.2
1905   * @see context::get_course_context()
1906   */
1907  function get_course_context(context $context) {
1908      throw new coding_exception('get_course_context() is removed, please use $context->get_course_context(true) instead.');
1909  }
1910  
1911  /**
1912   * @deprecated since 2.2
1913   * @see enrol_get_users_courses()
1914   */
1915  function get_user_courses_bycap($userid, $cap, $accessdata_ignored, $doanything_ignored, $sort = 'c.sortorder ASC', $fields = null, $limit_ignored = 0) {
1916  
1917      throw new coding_exception('get_user_courses_bycap() is removed, please use enrol_get_users_courses() instead.');
1918  }
1919  
1920  /**
1921   * @deprecated since Moodle 2.2
1922   */
1923  function get_role_context_caps($roleid, context $context) {
1924      throw new coding_exception('get_role_context_caps() is removed, it is really slow. Don\'t use it.');
1925  }
1926  
1927  /**
1928   * @see context::get_course_context()
1929   * @deprecated since 2.2
1930   */
1931  function get_courseid_from_context(context $context) {
1932      throw new coding_exception('get_courseid_from_context() is removed, please use $context->get_course_context(false) instead.');
1933  }
1934  
1935  /**
1936   * If you are using this methid, you should have something like this:
1937   *
1938   *    list($ctxselect, $ctxjoin) = context_instance_preload_sql('c.id', CONTEXT_COURSE, 'ctx');
1939   *
1940   * To prevent the use of this deprecated function, replace the line above with something similar to this:
1941   *
1942   *    $ctxselect = ', ' . context_helper::get_preload_record_columns_sql('ctx');
1943   *                                                                        ^
1944   *    $ctxjoin = "LEFT JOIN {context} ctx ON (ctx.instanceid = c.id AND ctx.contextlevel = :contextlevel)";
1945   *                                    ^       ^                ^        ^
1946   *    $params = array('contextlevel' => CONTEXT_COURSE);
1947   *                                      ^
1948   * @see context_helper:;get_preload_record_columns_sql()
1949   * @deprecated since 2.2
1950   */
1951  function context_instance_preload_sql($joinon, $contextlevel, $tablealias) {
1952      throw new coding_exception('context_instance_preload_sql() is removed, please use context_helper::get_preload_record_columns_sql() instead.');
1953  }
1954  
1955  /**
1956   * @deprecated since 2.2
1957   * @see context::get_parent_context_ids()
1958   */
1959  function get_related_contexts_string(context $context) {
1960      throw new coding_exception('get_related_contexts_string() is removed, please use $context->get_parent_context_ids(true) instead.');
1961  }
1962  
1963  /**
1964   * @deprecated since 2.6
1965   * @see core_component::get_plugin_list_with_file()
1966   */
1967  function get_plugin_list_with_file($plugintype, $file, $include = false) {
1968      throw new coding_exception('get_plugin_list_with_file() is removed, please use core_component::get_plugin_list_with_file() instead.');
1969  }
1970  
1971  /**
1972   * @deprecated since 2.6
1973   */
1974  function check_browser_operating_system($brand) {
1975      throw new coding_exception('check_browser_operating_system is removed, please update your code to use core_useragent instead.');
1976  }
1977  
1978  /**
1979   * @deprecated since 2.6
1980   */
1981  function check_browser_version($brand, $version = null) {
1982      throw new coding_exception('check_browser_version is removed, please update your code to use core_useragent instead.');
1983  }
1984  
1985  /**
1986   * @deprecated since 2.6
1987   */
1988  function get_device_type() {
1989      throw new coding_exception('get_device_type is removed, please update your code to use core_useragent instead.');
1990  }
1991  
1992  /**
1993   * @deprecated since 2.6
1994   */
1995  function get_device_type_list($incusertypes = true) {
1996      throw new coding_exception('get_device_type_list is removed, please update your code to use core_useragent instead.');
1997  }
1998  
1999  /**
2000   * @deprecated since 2.6
2001   */
2002  function get_selected_theme_for_device_type($devicetype = null) {
2003      throw new coding_exception('get_selected_theme_for_device_type is removed, please update your code to use core_useragent instead.');
2004  }
2005  
2006  /**
2007   * @deprecated since 2.6
2008   */
2009  function get_device_cfg_var_name($devicetype = null) {
2010      throw new coding_exception('get_device_cfg_var_name is removed, please update your code to use core_useragent instead.');
2011  }
2012  
2013  /**
2014   * @deprecated since 2.6
2015   */
2016  function set_user_device_type($newdevice) {
2017      throw new coding_exception('set_user_device_type is removed, please update your code to use core_useragent instead.');
2018  }
2019  
2020  /**
2021   * @deprecated since 2.6
2022   */
2023  function get_user_device_type() {
2024      throw new coding_exception('get_user_device_type is removed, please update your code to use core_useragent instead.');
2025  }
2026  
2027  /**
2028   * @deprecated since 2.6
2029   */
2030  function get_browser_version_classes() {
2031      throw new coding_exception('get_browser_version_classes is removed, please update your code to use core_useragent instead.');
2032  }
2033  
2034  /**
2035   * @deprecated since Moodle 2.6
2036   * @see core_user::get_support_user()
2037   */
2038  function generate_email_supportuser() {
2039      throw new coding_exception('generate_email_supportuser is removed, please use core_user::get_support_user');
2040  }
2041  
2042  /**
2043   * @deprecated since Moodle 2.6
2044   */
2045  function badges_get_issued_badge_info($hash) {
2046      throw new coding_exception('Function badges_get_issued_badge_info() is removed. Please use core_badges_assertion class and methods to generate badge assertion.');
2047  }
2048  
2049  /**
2050   * @deprecated since 2.6
2051   */
2052  function can_use_html_editor() {
2053      throw new coding_exception('can_use_html_editor is removed, please update your code to assume it returns true.');
2054  }
2055  
2056  
2057  /**
2058   * @deprecated since Moodle 2.7, use {@link user_count_login_failures()} instead.
2059   */
2060  function count_login_failures($mode, $username, $lastlogin) {
2061      throw new coding_exception('count_login_failures() can not be used any more, please use user_count_login_failures().');
2062  }
2063  
2064  /**
2065   * @deprecated since 2.7 MDL-33099/MDL-44088 - please do not use this function any more.
2066   */
2067  function ajaxenabled(array $browsers = null) {
2068      throw new coding_exception('ajaxenabled() can not be used anymore. Update your code to work with JS at all times.');
2069  }
2070  
2071  /**
2072   * @deprecated Since Moodle 2.7 MDL-44070
2073   */
2074  function coursemodule_visible_for_user($cm, $userid=0) {
2075      throw new coding_exception('coursemodule_visible_for_user() can not be used any more,
2076              please use \core_availability\info_module::is_user_visible()');
2077  }
2078  
2079  /**
2080   * @deprecated since Moodle 2.8 MDL-36014, MDL-35618 this functionality is removed
2081   */
2082  function enrol_cohort_get_cohorts(course_enrolment_manager $manager) {
2083      throw new coding_exception('Function enrol_cohort_get_cohorts() is removed, use enrol_cohort_search_cohorts() or '.
2084          'cohort_get_available_cohorts() instead');
2085  }
2086  
2087  /**
2088   * This function is deprecated, use {@link cohort_can_view_cohort()} instead since it also
2089   * takes into account current context
2090   *
2091   * @deprecated since Moodle 2.8 MDL-36014 please use cohort_can_view_cohort()
2092   */
2093  function enrol_cohort_can_view_cohort($cohortid) {
2094      throw new coding_exception('Function enrol_cohort_can_view_cohort() is removed, use cohort_can_view_cohort() instead');
2095  }
2096  
2097  /**
2098   * It is advisable to use {@link cohort_get_available_cohorts()} instead.
2099   *
2100   * @deprecated since Moodle 2.8 MDL-36014 use cohort_get_available_cohorts() instead
2101   */
2102  function cohort_get_visible_list($course, $onlyenrolled=true) {
2103      throw new coding_exception('Function cohort_get_visible_list() is removed. Please use function cohort_get_available_cohorts() ".
2104          "that correctly checks capabilities.');
2105  }
2106  
2107  /**
2108   * @deprecated since Moodle 2.8 MDL-35618 this functionality is removed
2109   */
2110  function enrol_cohort_enrol_all_users(course_enrolment_manager $manager, $cohortid, $roleid) {
2111      throw new coding_exception('enrol_cohort_enrol_all_users() is removed. This functionality is moved to enrol_manual.');
2112  }
2113  
2114  /**
2115   * @deprecated since Moodle 2.8 MDL-35618 this functionality is removed
2116   */
2117  function enrol_cohort_search_cohorts(course_enrolment_manager $manager, $offset = 0, $limit = 25, $search = '') {
2118      throw new coding_exception('enrol_cohort_search_cohorts() is removed. This functionality is moved to enrol_manual.');
2119  }
2120  
2121  /* === Apis deprecated in since Moodle 2.9 === */
2122  
2123  /**
2124   * Is $USER one of the supplied users?
2125   *
2126   * $user2 will be null if viewing a user's recent conversations
2127   *
2128   * @deprecated since Moodle 2.9 MDL-49371 - please do not use this function any more.
2129   */
2130  function message_current_user_is_involved($user1, $user2) {
2131      throw new coding_exception('message_current_user_is_involved() can not be used any more.');
2132  }
2133  
2134  /**
2135   * Print badges on user profile page.
2136   *
2137   * @deprecated since Moodle 2.9 MDL-45898 - please do not use this function any more.
2138   */
2139  function profile_display_badges($userid, $courseid = 0) {
2140      throw new coding_exception('profile_display_badges() can not be used any more.');
2141  }
2142  
2143  /**
2144   * Adds user preferences elements to user edit form.
2145   *
2146   * @deprecated since Moodle 2.9 MDL-45774 - Please do not use this function any more.
2147   */
2148  function useredit_shared_definition_preferences($user, &$mform, $editoroptions = null, $filemanageroptions = null) {
2149      throw new coding_exception('useredit_shared_definition_preferences() can not be used any more.');
2150  }
2151  
2152  
2153  /**
2154   * Convert region timezone to php supported timezone
2155   *
2156   * @deprecated since Moodle 2.9
2157   */
2158  function calendar_normalize_tz($tz) {
2159      throw new coding_exception('calendar_normalize_tz() can not be used any more, please use core_date::normalise_timezone() instead.');
2160  }
2161  
2162  /**
2163   * Returns a float which represents the user's timezone difference from GMT in hours
2164   * Checks various settings and picks the most dominant of those which have a value
2165   * @deprecated since Moodle 2.9
2166   */
2167  function get_user_timezone_offset($tz = 99) {
2168      throw new coding_exception('get_user_timezone_offset() can not be used any more, please use standard PHP DateTimeZone class instead');
2169  
2170  }
2171  
2172  /**
2173   * Returns an int which represents the systems's timezone difference from GMT in seconds
2174   * @deprecated since Moodle 2.9
2175   */
2176  function get_timezone_offset($tz) {
2177      throw new coding_exception('get_timezone_offset() can not be used any more, please use standard PHP DateTimeZone class instead');
2178  }
2179  
2180  /**
2181   * Returns a list of timezones in the current language.
2182   * @deprecated since Moodle 2.9
2183   */
2184  function get_list_of_timezones() {
2185      throw new coding_exception('get_list_of_timezones() can not be used any more, please use core_date::get_list_of_timezones() instead');
2186  }
2187  
2188  /**
2189   * Previous internal API, it was not supposed to be used anywhere.
2190   * @deprecated since Moodle 2.9
2191   */
2192  function update_timezone_records($timezones) {
2193      throw new coding_exception('update_timezone_records() can not be used any more, please use standard PHP DateTime class instead');
2194  }
2195  
2196  /**
2197   * Previous internal API, it was not supposed to be used anywhere.
2198   * @deprecated since Moodle 2.9
2199   */
2200  function calculate_user_dst_table($fromyear = null, $toyear = null, $strtimezone = null) {
2201      throw new coding_exception('calculate_user_dst_table() can not be used any more, please use standard PHP DateTime class instead');
2202  }
2203  
2204  /**
2205   * Previous internal API, it was not supposed to be used anywhere.
2206   * @deprecated since Moodle 2.9
2207   */
2208  function dst_changes_for_year($year, $timezone) {
2209      throw new coding_exception('dst_changes_for_year() can not be used any more, please use standard DateTime class instead');
2210  }
2211  
2212  /**
2213   * Previous internal API, it was not supposed to be used anywhere.
2214   * @deprecated since Moodle 2.9
2215   */
2216  function get_timezone_record($timezonename) {
2217      throw new coding_exception('get_timezone_record() can not be used any more, please use standard PHP DateTime class instead');
2218  }
2219  
2220  /* === Apis deprecated since Moodle 3.0 === */
2221  /**
2222   * Returns the URL of the HTTP_REFERER, less the querystring portion if required.
2223   *
2224   * @deprecated since Moodle 3.0 MDL-49360 - please do not use this function any more.
2225   * @todo MDL-50265 Remove this function in Moodle 3.4.
2226   * @param boolean $stripquery if true, also removes the query part of the url.
2227   * @return string The resulting referer or empty string.
2228   */
2229  function get_referer($stripquery = true) {
2230      debugging('get_referer() is deprecated. Please use get_local_referer() instead.', DEBUG_DEVELOPER);
2231      if (isset($_SERVER['HTTP_REFERER'])) {
2232          if ($stripquery) {
2233              return strip_querystring($_SERVER['HTTP_REFERER']);
2234          } else {
2235              return $_SERVER['HTTP_REFERER'];
2236          }
2237      } else {
2238          return '';
2239      }
2240  }
2241  
2242  /**
2243   * Checks if current user is a web crawler.
2244   *
2245   * This list can not be made complete, this is not a security
2246   * restriction, we make the list only to help these sites
2247   * especially when automatic guest login is disabled.
2248   *
2249   * If admin needs security they should enable forcelogin
2250   * and disable guest access!!
2251   *
2252   * @return bool
2253   * @deprecated since Moodle 3.0 use \core_useragent::is_web_crawler instead.
2254   */
2255  function is_web_crawler() {
2256      debugging('is_web_crawler() has been deprecated, please use core_useragent::is_web_crawler() instead.', DEBUG_DEVELOPER);
2257      return core_useragent::is_web_crawler();
2258  }
2259  
2260  /**
2261   * Update user's course completion statuses
2262   *
2263   * First update all criteria completions, then aggregate all criteria completions
2264   * and update overall course completions.
2265   *
2266   * @deprecated since Moodle 3.0 MDL-50287 - please do not use this function any more.
2267   * @todo Remove this function in Moodle 3.2 MDL-51226.
2268   */
2269  function completion_cron() {
2270      global $CFG;
2271      require_once($CFG->dirroot.'/completion/cron.php');
2272  
2273      debugging('completion_cron() is deprecated. Functionality has been moved to scheduled tasks.', DEBUG_DEVELOPER);
2274      completion_cron_mark_started();
2275  
2276      completion_cron_criteria();
2277  
2278      completion_cron_completions();
2279  }
2280  
2281  /**
2282   * Returns an ordered array of tags associated with visible courses
2283   * (boosted replacement of get_all_tags() allowing association with user and tagtype).
2284   *
2285   * @deprecated since 3.0
2286   * @package  core_tag
2287   * @category tag
2288   * @param    int      $courseid A course id. Passing 0 will return all distinct tags for all visible courses
2289   * @param    int      $userid   (optional) the user id, a default of 0 will return all users tags for the course
2290   * @param    string   $tagtype  (optional) The type of tag, empty string returns all types. Currently (Moodle 2.2) there are two
2291   *                              types of tags which are used within Moodle, they are 'official' and 'default'.
2292   * @param    int      $numtags  (optional) number of tags to display, default of 80 is set in the block, 0 returns all
2293   * @param    string   $unused   (optional) was selected sorting, moved to tag_print_cloud()
2294   * @return   array
2295   */
2296  function coursetag_get_tags($courseid, $userid=0, $tagtype='', $numtags=0, $unused = '') {
2297      debugging('Function coursetag_get_tags() is deprecated. Userid is no longer used for tagging courses.', DEBUG_DEVELOPER);
2298  
2299      global $CFG, $DB;
2300  
2301      // get visible course ids
2302      $courselist = array();
2303      if ($courseid === 0) {
2304          if ($courses = $DB->get_records_select('course', 'visible=1 AND category>0', null, '', 'id')) {
2305              foreach ($courses as $key => $value) {
2306                  $courselist[] = $key;
2307              }
2308          }
2309      }
2310  
2311      // get tags from the db ordered by highest count first
2312      $params = array();
2313      $sql = "SELECT id as tkey, name, id, isstandard, rawname, f.timemodified, flag, count
2314                FROM {tag} t,
2315                   (SELECT tagid, MAX(timemodified) as timemodified, COUNT(id) as count
2316                      FROM {tag_instance}
2317                     WHERE itemtype = 'course' ";
2318  
2319      if ($courseid > 0) {
2320          $sql .= "    AND itemid = :courseid ";
2321          $params['courseid'] = $courseid;
2322      } else {
2323          if (!empty($courselist)) {
2324              list($usql, $uparams) = $DB->get_in_or_equal($courselist, SQL_PARAMS_NAMED);
2325              $sql .= "AND itemid $usql ";
2326              $params = $params + $uparams;
2327          }
2328      }
2329  
2330      if ($userid > 0) {
2331          $sql .= "    AND tiuserid = :userid ";
2332          $params['userid'] = $userid;
2333      }
2334  
2335      $sql .= "   GROUP BY tagid) f
2336               WHERE t.id = f.tagid ";
2337      if ($tagtype != '') {
2338          $sql .= "AND isstandard = :isstandard ";
2339          $params['isstandard'] = ($tagtype === 'official') ? 1 : 0;
2340      }
2341      $sql .= "ORDER BY count DESC, name ASC";
2342  
2343      // limit the number of tags for output
2344      if ($numtags == 0) {
2345          $tags = $DB->get_records_sql($sql, $params);
2346      } else {
2347          $tags = $DB->get_records_sql($sql, $params, 0, $numtags);
2348      }
2349  
2350      // prepare the return
2351      $return = array();
2352      if ($tags) {
2353          // avoid print_tag_cloud()'s ksort upsetting ordering by setting the key here
2354          foreach ($tags as $value) {
2355              $return[] = $value;
2356          }
2357      }
2358  
2359      return $return;
2360  
2361  }
2362  
2363  /**
2364   * Returns an ordered array of tags
2365   * (replaces popular_tags_count() allowing sorting).
2366   *
2367   * @deprecated since 3.0
2368   * @package  core_tag
2369   * @category tag
2370   * @param    string $unused (optional) was selected sorting - moved to tag_print_cloud()
2371   * @param    int    $numtags (optional) number of tags to display, default of 20 is set in the block, 0 returns all
2372   * @return   array
2373   */
2374  function coursetag_get_all_tags($unused='', $numtags=0) {
2375      debugging('Function coursetag_get_all_tag() is deprecated. Userid is no longer used for tagging courses.', DEBUG_DEVELOPER);
2376  
2377      global $CFG, $DB;
2378  
2379      // note that this selects all tags except for courses that are not visible
2380      $sql = "SELECT id, name, isstandard, rawname, f.timemodified, flag, count
2381          FROM {tag} t,
2382          (SELECT tagid, MAX(timemodified) as timemodified, COUNT(id) as count
2383              FROM {tag_instance} WHERE tagid NOT IN
2384                  (SELECT tagid FROM {tag_instance} ti, {course} c
2385                  WHERE c.visible = 0
2386                  AND ti.itemtype = 'course'
2387                  AND ti.itemid = c.id)
2388          GROUP BY tagid) f
2389          WHERE t.id = f.tagid
2390          ORDER BY count DESC, name ASC";
2391      if ($numtags == 0) {
2392          $tags = $DB->get_records_sql($sql);
2393      } else {
2394          $tags = $DB->get_records_sql($sql, null, 0, $numtags);
2395      }
2396  
2397      $return = array();
2398      if ($tags) {
2399          foreach ($tags as $value) {
2400              $return[] = $value;
2401          }
2402      }
2403  
2404      return $return;
2405  }
2406  
2407  /**
2408   * Returns javascript for use in tags block and supporting pages
2409   *
2410   * @deprecated since 3.0
2411   * @package  core_tag
2412   * @category tag
2413   * @return   null
2414   */
2415  function coursetag_get_jscript() {
2416      debugging('Function coursetag_get_jscript() is deprecated and obsolete.', DEBUG_DEVELOPER);
2417      return '';
2418  }
2419  
2420  /**
2421   * Returns javascript to create the links in the tag block footer.
2422   *
2423   * @deprecated since 3.0
2424   * @package  core_tag
2425   * @category tag
2426   * @param    string   $elementid       the element to attach the footer to
2427   * @param    array    $coursetagslinks links arrays each consisting of 'title', 'onclick' and 'text' elements
2428   * @return   string   always returns a blank string
2429   */
2430  function coursetag_get_jscript_links($elementid, $coursetagslinks) {
2431      debugging('Function coursetag_get_jscript_links() is deprecated and obsolete.', DEBUG_DEVELOPER);
2432      return '';
2433  }
2434  
2435  /**
2436   * Returns all tags created by a user for a course
2437   *
2438   * @deprecated since 3.0
2439   * @package  core_tag
2440   * @category tag
2441   * @param    int      $courseid tags are returned for the course that has this courseid
2442   * @param    int      $userid   return tags which were created by this user
2443   */
2444  function coursetag_get_records($courseid, $userid) {
2445      debugging('Function coursetag_get_records() is deprecated. Userid is no longer used for tagging courses.', DEBUG_DEVELOPER);
2446  
2447      global $CFG, $DB;
2448  
2449      $sql = "SELECT t.id, name, rawname
2450                FROM {tag} t, {tag_instance} ti
2451               WHERE t.id = ti.tagid
2452                   AND ti.tiuserid = :userid
2453                   AND ti.itemid = :courseid
2454            ORDER BY name ASC";
2455  
2456      return $DB->get_records_sql($sql, array('userid'=>$userid, 'courseid'=>$courseid));
2457  }
2458  
2459  /**
2460   * Stores a tag for a course for a user
2461   *
2462   * @deprecated since 3.0
2463   * @package  core_tag
2464   * @category tag
2465   * @param    array  $tags     simple array of keywords to be stored
2466   * @param    int    $courseid the id of the course we wish to store a tag for
2467   * @param    int    $userid   the id of the user we wish to store a tag for
2468   * @param    string $tagtype  official or default only
2469   * @param    string $myurl    (optional) for logging creation of course tags
2470   */
2471  function coursetag_store_keywords($tags, $courseid, $userid=0, $tagtype='official', $myurl='') {
2472      debugging('Function coursetag_store_keywords() is deprecated. Userid is no longer used for tagging courses.', DEBUG_DEVELOPER);
2473  
2474      global $CFG;
2475  
2476      if (is_array($tags) and !empty($tags)) {
2477          if ($tagtype === 'official') {
2478              $tagcoll = core_tag_area::get_collection('core', 'course');
2479              // We don't normally need to create tags, they are created automatically when added to items. but we do here because we want them to be official.
2480              core_tag_tag::create_if_missing($tagcoll, $tags, true);
2481          }
2482          foreach ($tags as $tag) {
2483              $tag = trim($tag);
2484              if (strlen($tag) > 0) {
2485                  core_tag_tag::add_item_tag('core', 'course', $courseid, context_course::instance($courseid), $tag, $userid);
2486              }
2487          }
2488      }
2489  
2490  }
2491  
2492  /**
2493   * Deletes a personal tag for a user for a course.
2494   *
2495   * @deprecated since 3.0
2496   * @package  core_tag
2497   * @category tag
2498   * @param    int      $tagid    the tag we wish to delete
2499   * @param    int      $userid   the user that the tag is associated with
2500   * @param    int      $courseid the course that the tag is associated with
2501   */
2502  function coursetag_delete_keyword($tagid, $userid, $courseid) {
2503      debugging('Function coursetag_delete_keyword() is deprecated. Userid is no longer used for tagging courses.', DEBUG_DEVELOPER);
2504  
2505      $tag = core_tag_tag::get($tagid);
2506      core_tag_tag::remove_item_tag('core', 'course', $courseid, $tag->rawname, $userid);
2507  }
2508  
2509  /**
2510   * Get courses tagged with a tag
2511   *
2512   * @deprecated since 3.0
2513   * @package  core_tag
2514   * @category tag
2515   * @param int $tagid
2516   * @return array of course objects
2517   */
2518  function coursetag_get_tagged_courses($tagid) {
2519      debugging('Function coursetag_get_tagged_courses() is deprecated. Userid is no longer used for tagging courses.', DEBUG_DEVELOPER);
2520  
2521      global $DB;
2522  
2523      $courses = array();
2524  
2525      $ctxselect = context_helper::get_preload_record_columns_sql('ctx');
2526  
2527      $sql = "SELECT c.*, $ctxselect
2528              FROM {course} c
2529              JOIN {tag_instance} t ON t.itemid = c.id
2530              JOIN {context} ctx ON ctx.instanceid = c.id
2531              WHERE t.tagid = :tagid AND
2532              t.itemtype = 'course' AND
2533              ctx.contextlevel = :contextlevel
2534              ORDER BY c.sortorder ASC";
2535      $params = array('tagid' => $tagid, 'contextlevel' => CONTEXT_COURSE);
2536      $rs = $DB->get_recordset_sql($sql, $params);
2537      foreach ($rs as $course) {
2538          context_helper::preload_from_record($course);
2539          if ($course->visible == 1 || has_capability('moodle/course:viewhiddencourses', context_course::instance($course->id))) {
2540              $courses[$course->id] = $course;
2541          }
2542      }
2543      return $courses;
2544  }
2545  
2546  /**
2547   * Course tagging function used only during the deletion of a course (called by lib/moodlelib.php) to clean up associated tags
2548   *
2549   * @package core_tag
2550   * @deprecated since 3.0
2551   * @param   int      $courseid     the course we wish to delete tag instances from
2552   * @param   bool     $showfeedback if we should output a notification of the delete to the end user
2553   */
2554  function coursetag_delete_course_tags($courseid, $showfeedback=false) {
2555      debugging('Function coursetag_delete_course_tags() is deprecated. Use core_tag_tag::remove_all_item_tags().', DEBUG_DEVELOPER);
2556  
2557      global $OUTPUT;
2558      core_tag_tag::remove_all_item_tags('core', 'course', $courseid);
2559  
2560      if ($showfeedback) {
2561          echo $OUTPUT->notification(get_string('deletedcoursetags', 'tag'), 'notifysuccess');
2562      }
2563  }
2564  
2565  /**
2566   * Set the type of a tag.  At this time (version 2.2) the possible values are 'default' or 'official'.  Official tags will be
2567   * displayed separately "at tagging time" (while selecting the tags to apply to a record).
2568   *
2569   * @package  core_tag
2570   * @deprecated since 3.1
2571   * @param    string   $tagid tagid to modify
2572   * @param    string   $type either 'default' or 'official'
2573   * @return   bool     true on success, false otherwise
2574   */
2575  function tag_type_set($tagid, $type) {
2576      debugging('Function tag_type_set() is deprecated and can be replaced with use core_tag_tag::get($tagid)->update().', DEBUG_DEVELOPER);
2577      if ($tag = core_tag_tag::get($tagid, '*')) {
2578          return $tag->update(array('isstandard' => ($type === 'official') ? 1 : 0));
2579      }
2580      return false;
2581  }
2582  
2583  /**
2584   * Set the description of a tag
2585   *
2586   * @package  core_tag
2587   * @deprecated since 3.1
2588   * @param    int      $tagid the id of the tag
2589   * @param    string   $description the tag's description string to be set
2590   * @param    int      $descriptionformat the moodle text format of the description
2591   *                    {@link http://docs.moodle.org/dev/Text_formats_2.0#Database_structure}
2592   * @return   bool     true on success, false otherwise
2593   */
2594  function tag_description_set($tagid, $description, $descriptionformat) {
2595      debugging('Function tag_type_set() is deprecated and can be replaced with core_tag_tag::get($tagid)->update().', DEBUG_DEVELOPER);
2596      if ($tag = core_tag_tag::get($tagid, '*')) {
2597          return $tag->update(array('description' => $description, 'descriptionformat' => $descriptionformat));
2598      }
2599      return false;
2600  }
2601  
2602  /**
2603   * Get the array of db record of tags associated to a record (instances).
2604   *
2605   * @package core_tag
2606   * @deprecated since 3.1
2607   * @param string $record_type the record type for which we want to get the tags
2608   * @param int $record_id the record id for which we want to get the tags
2609   * @param string $type the tag type (either 'default' or 'official'). By default, all tags are returned.
2610   * @param int $userid (optional) only required for course tagging
2611   * @return array the array of tags
2612   */
2613  function tag_get_tags($record_type, $record_id, $type=null, $userid=0) {
2614      debugging('Method tag_get_tags() is deprecated and replaced with core_tag_tag::get_item_tags(). ' .
2615          'Component is now required when retrieving tag instances.', DEBUG_DEVELOPER);
2616      $standardonly = ($type === 'official' ? core_tag_tag::STANDARD_ONLY :
2617          (!empty($type) ? core_tag_tag::NOT_STANDARD_ONLY : core_tag_tag::BOTH_STANDARD_AND_NOT));
2618      $tags = core_tag_tag::get_item_tags(null, $record_type, $record_id, $standardonly, $userid);
2619      $rv = array();
2620      foreach ($tags as $id => $t) {
2621          $rv[$id] = $t->to_object();
2622      }
2623      return $rv;
2624  }
2625  
2626  /**
2627   * Get the array of tags display names, indexed by id.
2628   *
2629   * @package  core_tag
2630   * @deprecated since 3.1
2631   * @param    string $record_type the record type for which we want to get the tags
2632   * @param    int    $record_id   the record id for which we want to get the tags
2633   * @param    string $type        the tag type (either 'default' or 'official'). By default, all tags are returned.
2634   * @return   array  the array of tags (with the value returned by core_tag_tag::make_display_name), indexed by id
2635   */
2636  function tag_get_tags_array($record_type, $record_id, $type=null) {
2637      debugging('Method tag_get_tags_array() is deprecated and replaced with core_tag_tag::get_item_tags_array(). ' .
2638          'Component is now required when retrieving tag instances.', DEBUG_DEVELOPER);
2639      $standardonly = ($type === 'official' ? core_tag_tag::STANDARD_ONLY :
2640          (!empty($type) ? core_tag_tag::NOT_STANDARD_ONLY : core_tag_tag::BOTH_STANDARD_AND_NOT));
2641      return core_tag_tag::get_item_tags_array('', $record_type, $record_id, $standardonly);
2642  }
2643  
2644  /**
2645   * Get a comma-separated string of tags associated to a record.
2646   *
2647   * Use {@link tag_get_tags()} to get the same information in an array.
2648   *
2649   * @package  core_tag
2650   * @deprecated since 3.1
2651   * @param    string   $record_type the record type for which we want to get the tags
2652   * @param    int      $record_id   the record id for which we want to get the tags
2653   * @param    int      $html        either TAG_RETURN_HTML or TAG_RETURN_TEXT, depending on the type of output desired
2654   * @param    string   $type        either 'official' or 'default', if null, all tags are returned
2655   * @return   string   the comma-separated list of tags.
2656   */
2657  function tag_get_tags_csv($record_type, $record_id, $html=null, $type=null) {
2658      global $CFG, $OUTPUT;
2659      debugging('Method tag_get_tags_csv() is deprecated. Instead you should use either ' .
2660              'core_tag_tag::get_item_tags_array() or $OUTPUT->tag_list(core_tag_tag::get_item_tags()). ' .
2661          'Component is now required when retrieving tag instances.', DEBUG_DEVELOPER);
2662      $standardonly = ($type === 'official' ? core_tag_tag::STANDARD_ONLY :
2663          (!empty($type) ? core_tag_tag::NOT_STANDARD_ONLY : core_tag_tag::BOTH_STANDARD_AND_NOT));
2664      if ($html != TAG_RETURN_TEXT) {
2665          return $OUTPUT->tag_list(core_tag_tag::get_item_tags('', $record_type, $record_id, $standardonly), '');
2666      } else {
2667          return join(', ', core_tag_tag::get_item_tags_array('', $record_type, $record_id, $standardonly, 0, false));
2668      }
2669  }
2670  
2671  /**
2672   * Get an array of tag ids associated to a record.
2673   *
2674   * @package  core_tag
2675   * @deprecated since 3.1
2676   * @param    string    $record_type the record type for which we want to get the tags
2677   * @param    int       $record_id the record id for which we want to get the tags
2678   * @return   array     tag ids, indexed and sorted by 'ordering'
2679   */
2680  function tag_get_tags_ids($record_type, $record_id) {
2681      debugging('Method tag_get_tags_ids() is deprecated. Please consider using core_tag_tag::get_item_tags() or similar methods.', DEBUG_DEVELOPER);
2682      $tag_ids = array();
2683      $tagobjects = core_tag_tag::get_item_tags(null, $record_type, $record_id);
2684      foreach ($tagobjects as $tagobject) {
2685          $tag = $tagobject->to_object();
2686          if ( array_key_exists($tag->ordering, $tag_ids) ) {
2687              $tag->ordering++;
2688          }
2689          $tag_ids[$tag->ordering] = $tag->id;
2690      }
2691      ksort($tag_ids);
2692      return $tag_ids;
2693  }
2694  
2695  /**
2696   * Returns the database ID of a set of tags.
2697   *
2698   * @deprecated since 3.1
2699   * @param    mixed $tags one tag, or array of tags, to look for.
2700   * @param    bool  $return_value specify the type of the returned value. Either TAG_RETURN_OBJECT, or TAG_RETURN_ARRAY (default).
2701   *                               If TAG_RETURN_ARRAY is specified, an array will be returned even if only one tag was passed in $tags.
2702   * @return   mixed tag-indexed array of ids (or objects, if second parameter is TAG_RETURN_OBJECT), or only an int, if only one tag
2703   *                 is given *and* the second parameter is null. No value for a key means the tag wasn't found.
2704   */
2705  function tag_get_id($tags, $return_value = null) {
2706      global $CFG, $DB;
2707      debugging('Method tag_get_id() is deprecated and can be replaced with core_tag_tag::get_by_name() or core_tag_tag::get_by_name_bulk(). ' .
2708          'You need to specify tag collection when retrieving tag by name', DEBUG_DEVELOPER);
2709  
2710      if (!is_array($tags)) {
2711          if(is_null($return_value) || $return_value == TAG_RETURN_OBJECT) {
2712              if ($tagobject = core_tag_tag::get_by_name(core_tag_collection::get_default(), $tags)) {
2713                  return $tagobject->id;
2714              } else {
2715                  return 0;
2716              }
2717          }
2718          $tags = array($tags);
2719      }
2720  
2721      $records = core_tag_tag::get_by_name_bulk(core_tag_collection::get_default(), $tags,
2722          $return_value == TAG_RETURN_OBJECT ? '*' : 'id, name');
2723      foreach ($records as $name => $record) {
2724          if ($return_value != TAG_RETURN_OBJECT) {
2725              $records[$name] = $record->id ? $record->id : null;
2726          } else {
2727              $records[$name] = $record->to_object();
2728          }
2729      }
2730      return $records;
2731  }
2732  
2733  /**
2734   * Change the "value" of a tag, and update the associated 'name'.
2735   *
2736   * @package  core_tag
2737   * @deprecated since 3.1
2738   * @param    int      $tagid  the id of the tag to modify
2739   * @param    string   $newrawname the new rawname
2740   * @return   bool     true on success, false otherwise
2741   */
2742  function tag_rename($tagid, $newrawname) {
2743      debugging('Function tag_rename() is deprecated and may be replaced with core_tag_tag::get($tagid)->update().', DEBUG_DEVELOPER);
2744      if ($tag = core_tag_tag::get($tagid, '*')) {
2745          return $tag->update(array('rawname' => $newrawname));
2746      }
2747      return false;
2748  }
2749  
2750  /**
2751   * Delete one instance of a tag.  If the last instance was deleted, it will also delete the tag, unless its type is 'official'.
2752   *
2753   * @package  core_tag
2754   * @deprecated since 3.1
2755   * @param    string $record_type the type of the record for which to remove the instance
2756   * @param    int    $record_id   the id of the record for which to remove the instance
2757   * @param    int    $tagid       the tagid that needs to be removed
2758   * @param    int    $userid      (optional) the userid
2759   * @return   bool   true on success, false otherwise
2760   */
2761  function tag_delete_instance($record_type, $record_id, $tagid, $userid = null) {
2762      debugging('Function tag_delete_instance() is deprecated and replaced with core_tag_tag::remove_item_tag() instead. ' .
2763          'Component is required for retrieving instances', DEBUG_DEVELOPER);
2764      $tag = core_tag_tag::get($tagid);
2765      core_tag_tag::remove_item_tag('', $record_type, $record_id, $tag->rawname, $userid);
2766  }
2767  
2768  /**
2769   * Find all records tagged with a tag of a given type ('post', 'user', etc.)
2770   *
2771   * @package  core_tag
2772   * @deprecated since 3.1
2773   * @category tag
2774   * @param    string   $tag       tag to look for
2775   * @param    string   $type      type to restrict search to.  If null, every matching record will be returned
2776   * @param    int      $limitfrom (optional, required if $limitnum is set) return a subset of records, starting at this point.
2777   * @param    int      $limitnum  (optional, required if $limitfrom is set) return a subset comprising this many records.
2778   * @return   array of matching objects, indexed by record id, from the table containing the type requested
2779   */
2780  function tag_find_records($tag, $type, $limitfrom='', $limitnum='') {
2781      debugging('Function tag_find_records() is deprecated and replaced with core_tag_tag::get_by_name()->get_tagged_items(). '.
2782          'You need to specify tag collection when retrieving tag by name', DEBUG_DEVELOPER);
2783  
2784      if (!$tag || !$type) {
2785          return array();
2786      }
2787  
2788      $tagobject = core_tag_tag::get_by_name(core_tag_area::get_collection('', $type), $tag);
2789      return $tagobject->get_tagged_items('', $type, $limitfrom, $limitnum);
2790  }
2791  
2792  /**
2793   * Adds one or more tag in the database.  This function should not be called directly : you should
2794   * use tag_set.
2795   *
2796   * @package core_tag
2797   * @deprecated since 3.1
2798   * @param   mixed    $tags     one tag, or an array of tags, to be created
2799   * @param   string   $type     type of tag to be created ("default" is the default value and "official" is the only other supported
2800   *                             value at this time). An official tag is kept even if there are no records tagged with it.
2801   * @return array     $tags ids indexed by their lowercase normalized names. Any boolean false in the array indicates an error while
2802   *                             adding the tag.
2803   */
2804  function tag_add($tags, $type="default") {
2805      debugging('Function tag_add() is deprecated. You can use core_tag_tag::create_if_missing(), however it should not be necessary ' .
2806          'since tags are created automatically when assigned to items', DEBUG_DEVELOPER);
2807      if (!is_array($tags)) {
2808          $tags = array($tags);
2809      }
2810      $objects = core_tag_tag::create_if_missing(core_tag_collection::get_default(), $tags,
2811              $type === 'official');
2812  
2813      // New function returns the tags in different format, for BC we keep the format that this function used to have.
2814      $rv = array();
2815      foreach ($objects as $name => $tagobject) {
2816          if (isset($tagobject->id)) {
2817              $rv[$tagobject->name] = $tagobject->id;
2818          } else {
2819              $rv[$name] = false;
2820          }
2821      }
2822      return $rv;
2823  }
2824  
2825  /**
2826   * Assigns a tag to a record; if the record already exists, the time and ordering will be updated.
2827   *
2828   * @package core_tag
2829   * @deprecated since 3.1
2830   * @param string $record_type the type of the record that will be tagged
2831   * @param int $record_id the id of the record that will be tagged
2832   * @param string $tagid the tag id to set on the record.
2833   * @param int $ordering the order of the instance for this record
2834   * @param int $userid (optional) only required for course tagging
2835   * @param string|null $component the component that was tagged
2836   * @param int|null $contextid the context id of where this tag was assigned
2837   * @return bool true on success, false otherwise
2838   */
2839  function tag_assign($record_type, $record_id, $tagid, $ordering, $userid = 0, $component = null, $contextid = null) {
2840      global $DB;
2841      $message = 'Function tag_assign() is deprecated. Use core_tag_tag::set_item_tags() or core_tag_tag::add_item_tag() instead. ' .
2842          'Tag instance ordering should not be set manually';
2843      if ($component === null || $contextid === null) {
2844          $message .= '. You should specify the component and contextid of the item being tagged in your call to tag_assign.';
2845      }
2846      debugging($message, DEBUG_DEVELOPER);
2847  
2848      if ($contextid) {
2849          $context = context::instance_by_id($contextid);
2850      } else {
2851          $context = context_system::instance();
2852      }
2853  
2854      // Get the tag.
2855      $tag = $DB->get_record('tag', array('id' => $tagid), 'name, rawname', MUST_EXIST);
2856  
2857      $taginstanceid = core_tag_tag::add_item_tag($component, $record_type, $record_id, $context, $tag->rawname, $userid);
2858  
2859      // Alter the "ordering" of tag_instance. This should never be done manually and only remains here for the backward compatibility.
2860      $taginstance = new stdClass();
2861      $taginstance->id = $taginstanceid;
2862      $taginstance->ordering     = $ordering;
2863      $taginstance->timemodified = time();
2864  
2865      $DB->update_record('tag_instance', $taginstance);
2866  
2867      return true;
2868  }
2869  
2870  /**
2871   * Count how many records are tagged with a specific tag.
2872   *
2873   * @package core_tag
2874   * @deprecated since 3.1
2875   * @param   string   $record_type record to look for ('post', 'user', etc.)
2876   * @param   int      $tagid       is a single tag id
2877   * @return  int      number of mathing tags.
2878   */
2879  function tag_record_count($record_type, $tagid) {
2880      debugging('Method tag_record_count() is deprecated and replaced with core_tag_tag::get($tagid)->count_tagged_items(). '.
2881          'Component is now required when retrieving tag instances.', DEBUG_DEVELOPER);
2882      return core_tag_tag::get($tagid)->count_tagged_items('', $record_type);
2883  }
2884  
2885  /**
2886   * Determine if a record is tagged with a specific tag
2887   *
2888   * @package core_tag
2889   * @deprecated since 3.1
2890   * @param   string   $record_type the record type to look for
2891   * @param   int      $record_id   the record id to look for
2892   * @param   string   $tag         a tag name
2893   * @return  bool/int true if it is tagged, 0 (false) otherwise
2894   */
2895  function tag_record_tagged_with($record_type, $record_id, $tag) {
2896      debugging('Method tag_record_tagged_with() is deprecated and replaced with core_tag_tag::get($tagid)->is_item_tagged_with(). '.
2897          'Component is now required when retrieving tag instances.', DEBUG_DEVELOPER);
2898      return core_tag_tag::is_item_tagged_with('', $record_type, $record_id, $tag);
2899  }
2900  
2901  /**
2902   * Flag a tag as inappropriate.
2903   *
2904   * @deprecated since 3.1
2905   * @param int|array $tagids a single tagid, or an array of tagids
2906   */
2907  function tag_set_flag($tagids) {
2908      debugging('Function tag_set_flag() is deprecated and replaced with core_tag_tag::get($tagid)->flag().', DEBUG_DEVELOPER);
2909      $tagids = (array) $tagids;
2910      foreach ($tagids as $tagid) {
2911          if ($tag = core_tag_tag::get($tagid, '*')) {
2912              $tag->flag();
2913          }
2914      }
2915  }
2916  
2917  /**
2918   * Remove the inappropriate flag on a tag.
2919   *
2920   * @deprecated since 3.1
2921   * @param int|array $tagids a single tagid, or an array of tagids
2922   */
2923  function tag_unset_flag($tagids) {
2924      debugging('Function tag_unset_flag() is deprecated and replaced with core_tag_tag::get($tagid)->reset_flag().', DEBUG_DEVELOPER);
2925      $tagids = (array) $tagids;
2926      foreach ($tagids as $tagid) {
2927          if ($tag = core_tag_tag::get($tagid, '*')) {
2928              $tag->reset_flag();
2929          }
2930      }
2931  }
2932  
2933  /**
2934   * Prints or returns a HTML tag cloud with varying classes styles depending on the popularity and type of each tag.
2935   *
2936   * @deprecated since 3.1
2937   *
2938   * @param    array     $tagset Array of tags to display
2939   * @param    int       $nr_of_tags Limit for the number of tags to return/display, used if $tagset is null
2940   * @param    bool      $return     if true the function will return the generated tag cloud instead of displaying it.
2941   * @param    string    $sort (optional) selected sorting, default is alpha sort (name) also timemodified or popularity
2942   * @return string|null a HTML string or null if this function does the output
2943   */
2944  function tag_print_cloud($tagset=null, $nr_of_tags=150, $return=false, $sort='') {
2945      global $OUTPUT;
2946  
2947      debugging('Function tag_print_cloud() is deprecated and replaced with function core_tag_collection::get_tag_cloud(), '
2948              . 'templateable core_tag\output\tagcloud and template core_tag/tagcloud.', DEBUG_DEVELOPER);
2949  
2950      // Set up sort global - used to pass sort type into core_tag_collection::cloud_sort through usort() avoiding multiple sort functions.
2951      if ($sort == 'popularity') {
2952          $sort = 'count';
2953      } else if ($sort == 'date') {
2954          $sort = 'timemodified';
2955      } else {
2956          $sort = 'name';
2957      }
2958  
2959      if (is_null($tagset)) {
2960          // No tag set received, so fetch tags from database.
2961          // Always add query by tagcollid even when it's not known to make use of the table index.
2962          $tagcloud = core_tag_collection::get_tag_cloud(0, false, $nr_of_tags, $sort);
2963      } else {
2964          $tagsincloud = $tagset;
2965  
2966          $etags = array();
2967          foreach ($tagsincloud as $tag) {
2968              $etags[] = $tag;
2969          }
2970  
2971          core_tag_collection::$cloudsortfield = $sort;
2972          usort($tagsincloud, "core_tag_collection::cloud_sort");
2973  
2974          $tagcloud = new \core_tag\output\tagcloud($tagsincloud);
2975      }
2976  
2977      $output = $OUTPUT->render_from_template('core_tag/tagcloud', $tagcloud->export_for_template($OUTPUT));
2978      if ($return) {
2979          return $output;
2980      } else {
2981          echo $output;
2982      }
2983  }
2984  
2985  /**
2986   * Function that returns tags that start with some text, for use by the autocomplete feature
2987   *
2988   * @package core_tag
2989   * @deprecated since 3.0
2990   * @access  private
2991   * @param   string   $text string that the tag names will be matched against
2992   * @return  mixed    an array of objects, or false if no records were found or an error occured.
2993   */
2994  function tag_autocomplete($text) {
2995      debugging('Function tag_autocomplete() is deprecated without replacement. ' .
2996              'New form element "tags" does proper autocomplete.', DEBUG_DEVELOPER);
2997      global $DB;
2998      return $DB->get_records_sql("SELECT tg.id, tg.name, tg.rawname
2999                                     FROM {tag} tg
3000                                    WHERE tg.name LIKE ?", array(core_text::strtolower($text)."%"));
3001  }
3002  
3003  /**
3004   * Prints a box with the description of a tag and its related tags
3005   *
3006   * @package core_tag
3007   * @deprecated since 3.1
3008   * @param   stdClass    $tag_object
3009   * @param   bool        $return     if true the function will return the generated tag cloud instead of displaying it.
3010   * @return  string/null a HTML box showing a description of the tag object and it's relationsips or null if output is done directly
3011   *                      in the function.
3012   */
3013  function tag_print_description_box($tag_object, $return=false) {
3014      global $USER, $CFG, $OUTPUT;
3015      require_once($CFG->libdir.'/filelib.php');
3016  
3017      debugging('Function tag_print_description_box() is deprecated without replacement. ' .
3018              'See core_tag_renderer for similar code.', DEBUG_DEVELOPER);
3019  
3020      $relatedtags = array();
3021      if ($tag = core_tag_tag::get($tag_object->id)) {
3022          $relatedtags = $tag->get_related_tags();
3023      }
3024  
3025      $content = !empty($tag_object->description);
3026      $output = '';
3027  
3028      if ($content) {
3029          $output .= $OUTPUT->box_start('generalbox tag-description');
3030      }
3031  
3032      if (!empty($tag_object->description)) {
3033          $options = new stdClass();
3034          $options->para = false;
3035          $options->overflowdiv = true;
3036          $tag_object->description = file_rewrite_pluginfile_urls($tag_object->description, 'pluginfile.php', context_system::instance()->id, 'tag', 'description', $tag_object->id);
3037          $output .= format_text($tag_object->description, $tag_object->descriptionformat, $options);
3038      }
3039  
3040      if ($content) {
3041          $output .= $OUTPUT->box_end();
3042      }
3043  
3044      if ($relatedtags) {
3045          $output .= $OUTPUT->tag_list($relatedtags, get_string('relatedtags', 'tag'), 'tag-relatedtags');
3046      }
3047  
3048      if ($return) {
3049          return $output;
3050      } else {
3051          echo $output;
3052      }
3053  }
3054  
3055  /**
3056   * Prints a box that contains the management links of a tag
3057   *
3058   * @deprecated since 3.1
3059   * @param  core_tag_tag|stdClass    $tag_object
3060   * @param  bool        $return     if true the function will return the generated tag cloud instead of displaying it.
3061   * @return string|null a HTML string or null if this function does the output
3062   */
3063  function tag_print_management_box($tag_object, $return=false) {
3064      global $USER, $CFG, $OUTPUT;
3065  
3066      debugging('Function tag_print_description_box() is deprecated without replacement. ' .
3067              'See core_tag_renderer for similar code.', DEBUG_DEVELOPER);
3068  
3069      $tagname  = core_tag_tag::make_display_name($tag_object);
3070      $output = '';
3071  
3072      if (!isguestuser()) {
3073          $output .= $OUTPUT->box_start('box','tag-management-box');
3074          $systemcontext   = context_system::instance();
3075          $links = array();
3076  
3077          // Add a link for users to add/remove this from their interests
3078          if (core_tag_tag::is_enabled('core', 'user') && core_tag_area::get_collection('core', 'user') == $tag_object->tagcollid) {
3079              if (core_tag_tag::is_item_tagged_with('core', 'user', $USER->id, $tag_object->name)) {
3080                  $links[] = '<a href="'. $CFG->wwwroot .'/tag/user.php?action=removeinterest&amp;sesskey='. sesskey() .
3081                          '&amp;tag='. rawurlencode($tag_object->name) .'">'.
3082                          get_string('removetagfrommyinterests', 'tag', $tagname) .'</a>';
3083              } else {
3084                  $links[] = '<a href="'. $CFG->wwwroot .'/tag/user.php?action=addinterest&amp;sesskey='. sesskey() .
3085                          '&amp;tag='. rawurlencode($tag_object->name) .'">'.
3086                          get_string('addtagtomyinterests', 'tag', $tagname) .'</a>';
3087              }
3088          }
3089  
3090          // Flag as inappropriate link.  Only people with moodle/tag:flag capability.
3091          if (has_capability('moodle/tag:flag', $systemcontext)) {
3092              $links[] = '<a href="'. $CFG->wwwroot .'/tag/user.php?action=flaginappropriate&amp;sesskey='.
3093                      sesskey() . '&amp;id='. $tag_object->id . '">'. get_string('flagasinappropriate',
3094                              'tag', rawurlencode($tagname)) .'</a>';
3095          }
3096  
3097          // Edit tag: Only people with moodle/tag:edit capability who either have it as an interest or can manage tags
3098          if (has_capability('moodle/tag:edit', $systemcontext) ||
3099              has_capability('moodle/tag:manage', $systemcontext)) {
3100              $links[] = '<a href="' . $CFG->wwwroot . '/tag/edit.php?id=' . $tag_object->id . '">' .
3101                      get_string('edittag', 'tag') . '</a>';
3102          }
3103  
3104          $output .= implode(' | ', $links);
3105          $output .= $OUTPUT->box_end();
3106      }
3107  
3108      if ($return) {
3109          return $output;
3110      } else {
3111          echo $output;
3112      }
3113  }
3114  
3115  /**
3116   * Prints the tag search box
3117   *
3118   * @deprecated since 3.1
3119   * @param  bool        $return if true return html string
3120   * @return string|null a HTML string or null if this function does the output
3121   */
3122  function tag_print_search_box($return=false) {
3123      global $CFG, $OUTPUT;
3124  
3125      debugging('Function tag_print_search_box() is deprecated without replacement. ' .
3126              'See core_tag_renderer for similar code.', DEBUG_DEVELOPER);
3127  
3128      $query = optional_param('query', '', PARAM_RAW);
3129  
3130      $output = $OUTPUT->box_start('','tag-search-box');
3131      $output .= '<form action="'.$CFG->wwwroot.'/tag/search.php" style="display:inline">';
3132      $output .= '<div>';
3133      $output .= '<label class="accesshide" for="searchform_search">'.get_string('searchtags', 'tag').'</label>';
3134      $output .= '<input id="searchform_search" name="query" type="text" size="40" value="'.s($query).'" />';
3135      $output .= '<button id="searchform_button" type="submit">'. get_string('search', 'tag') .'</button><br />';
3136      $output .= '</div>';
3137      $output .= '</form>';
3138      $output .= $OUTPUT->box_end();
3139  
3140      if ($return) {
3141          return $output;
3142      }
3143      else {
3144          echo $output;
3145      }
3146  }
3147  
3148  /**
3149   * Prints the tag search results
3150   *
3151   * @deprecated since 3.1
3152   * @param string       $query text that tag names will be matched against
3153   * @param int          $page current page
3154   * @param int          $perpage nr of users displayed per page
3155   * @param bool         $return if true return html string
3156   * @return string|null a HTML string or null if this function does the output
3157   */
3158  function tag_print_search_results($query,  $page, $perpage, $return=false) {
3159      global $CFG, $USER, $OUTPUT;
3160  
3161      debugging('Function tag_print_search_results() is deprecated without replacement. ' .
3162              'In /tag/search.php the search results are printed using the core_tag/tagcloud template.', DEBUG_DEVELOPER);
3163  
3164      $query = clean_param($query, PARAM_TAG);
3165  
3166      $count = count(tag_find_tags($query, false));
3167      $tags = array();
3168  
3169      if ( $found_tags = tag_find_tags($query, true,  $page * $perpage, $perpage) ) {
3170          $tags = array_values($found_tags);
3171      }
3172  
3173      $baseurl = $CFG->wwwroot.'/tag/search.php?query='. rawurlencode($query);
3174      $output = '';
3175  
3176      // link "Add $query to my interests"
3177      $addtaglink = '';
3178      if (core_tag_tag::is_enabled('core', 'user') && !core_tag_tag::is_item_tagged_with('core', 'user', $USER->id, $query)) {
3179          $addtaglink = html_writer::link(new moodle_url('/tag/user.php', array('action' => 'addinterest', 'sesskey' => sesskey(),
3180              'tag' => $query)), get_string('addtagtomyinterests', 'tag', s($query)));
3181      }
3182  
3183      if ( !empty($tags) ) { // there are results to display!!
3184          $output .= $OUTPUT->heading(get_string('searchresultsfor', 'tag', htmlspecialchars($query)) ." : {$count}", 3, 'main');
3185  
3186          //print a link "Add $query to my interests"
3187          if (!empty($addtaglink)) {
3188              $output .= $OUTPUT->box($addtaglink, 'box', 'tag-management-box');
3189          }
3190  
3191          $nr_of_lis_per_ul = 6;
3192          $nr_of_uls = ceil( sizeof($tags) / $nr_of_lis_per_ul );
3193  
3194          $output .= '<ul id="tag-search-results">';
3195          for($i = 0; $i < $nr_of_uls; $i++) {
3196              foreach (array_slice($tags, $i * $nr_of_lis_per_ul, $nr_of_lis_per_ul) as $tag) {
3197                  $output .= '<li>';
3198                  $tag_link = html_writer::link(core_tag_tag::make_url($tag->tagcollid, $tag->rawname),
3199                      core_tag_tag::make_display_name($tag));
3200                  $output .= $tag_link;
3201                  $output .= '</li>';
3202              }
3203          }
3204          $output .= '</ul>';
3205          $output .= '<div>&nbsp;</div>'; // <-- small layout hack in order to look good in Firefox
3206  
3207          $output .= $OUTPUT->paging_bar($count, $page, $perpage, $baseurl);
3208      }
3209      else { //no results were found!!
3210          $output .= $OUTPUT->heading(get_string('noresultsfor', 'tag', htmlspecialchars($query)), 3, 'main');
3211  
3212          //print a link "Add $query to my interests"
3213          if (!empty($addtaglink)) {
3214              $output .= $OUTPUT->box($addtaglink, 'box', 'tag-management-box');
3215          }
3216      }
3217  
3218      if ($return) {
3219          return $output;
3220      }
3221      else {
3222          echo $output;
3223      }
3224  }
3225  
3226  /**
3227   * Prints a table of the users tagged with the tag passed as argument
3228   *
3229   * @deprecated since 3.1
3230   * @param  stdClass    $tagobject the tag we wish to return data for
3231   * @param  int         $limitfrom (optional, required if $limitnum is set) prints users starting at this point.
3232   * @param  int         $limitnum (optional, required if $limitfrom is set) prints this many users.
3233   * @param  bool        $return if true return html string
3234   * @return string|null a HTML string or null if this function does the output
3235   */
3236  function tag_print_tagged_users_table($tagobject, $limitfrom='', $limitnum='', $return=false) {
3237  
3238      debugging('Function tag_print_tagged_users_table() is deprecated without replacement. ' .
3239              'See core_user_renderer for similar code.', DEBUG_DEVELOPER);
3240  
3241      //List of users with this tag
3242      $tagobject = core_tag_tag::get($tagobject->id);
3243      $userlist = $tagobject->get_tagged_items('core', 'user', $limitfrom, $limitnum);
3244  
3245      $output = tag_print_user_list($userlist, true);
3246  
3247      if ($return) {
3248          return $output;
3249      }
3250      else {
3251          echo $output;
3252      }
3253  }
3254  
3255  /**
3256   * Prints an individual user box
3257   *
3258   * @deprecated since 3.1
3259   * @param user_object  $user  (contains the following fields: id, firstname, lastname and picture)
3260   * @param bool         $return if true return html string
3261   * @return string|null a HTML string or null if this function does the output
3262   */
3263  function tag_print_user_box($user, $return=false) {
3264      global $CFG, $OUTPUT;
3265  
3266      debugging('Function tag_print_user_box() is deprecated without replacement. ' .
3267              'See core_user_renderer for similar code.', DEBUG_DEVELOPER);
3268  
3269      $usercontext = context_user::instance($user->id);
3270      $profilelink = '';
3271  
3272      if ($usercontext and (has_capability('moodle/user:viewdetails', $usercontext) || has_coursecontact_role($user->id))) {
3273          $profilelink = $CFG->wwwroot .'/user/view.php?id='. $user->id;
3274      }
3275  
3276      $output = $OUTPUT->box_start('user-box', 'user'. $user->id);
3277      $fullname = fullname($user);
3278      $alt = '';
3279  
3280      if (!empty($profilelink)) {
3281          $output .= '<a href="'. $profilelink .'">';
3282          $alt = $fullname;
3283      }
3284  
3285      $output .= $OUTPUT->user_picture($user, array('size'=>100));
3286      $output .= '<br />';
3287  
3288      if (!empty($profilelink)) {
3289          $output .= '</a>';
3290      }
3291  
3292      //truncate name if it's too big
3293      if (core_text::strlen($fullname) > 26) {
3294          $fullname = core_text::substr($fullname, 0, 26) .'...';
3295      }
3296  
3297      $output .= '<strong>'. $fullname .'</strong>';
3298      $output .= $OUTPUT->box_end();
3299  
3300      if ($return) {
3301          return $output;
3302      }
3303      else {
3304          echo $output;
3305      }
3306  }
3307  
3308  /**
3309   * Prints a list of users
3310   *
3311   * @deprecated since 3.1
3312   * @param  array       $userlist an array of user objects
3313   * @param  bool        $return if true return html string, otherwise output the result
3314   * @return string|null a HTML string or null if this function does the output
3315   */
3316  function tag_print_user_list($userlist, $return=false) {
3317  
3318      debugging('Function tag_print_user_list() is deprecated without replacement. ' .
3319              'See core_user_renderer for similar code.', DEBUG_DEVELOPER);
3320  
3321      $output = '<div><ul class="inline-list">';
3322  
3323      foreach ($userlist as $user){
3324          $output .= '<li>'. tag_print_user_box($user, true) ."</li>\n";
3325      }
3326      $output .= "</ul></div>\n";
3327  
3328      if ($return) {
3329          return $output;
3330      }
3331      else {
3332          echo $output;
3333      }
3334  }
3335  
3336  /**
3337   * Function that returns the name that should be displayed for a specific tag
3338   *
3339   * @package  core_tag
3340   * @category tag
3341   * @deprecated since 3.1
3342   * @param    stdClass|core_tag_tag   $tagobject a line out of tag table, as returned by the adobd functions
3343   * @param    int      $html TAG_RETURN_HTML (default) will return htmlspecialchars encoded string, TAG_RETURN_TEXT will not encode.
3344   * @return   string
3345   */
3346  function tag_display_name($tagobject, $html=TAG_RETURN_HTML) {
3347      debugging('Function tag_display_name() is deprecated. Use core_tag_tag::make_display_name().', DEBUG_DEVELOPER);
3348      if (!isset($tagobject->name)) {
3349          return '';
3350      }
3351      return core_tag_tag::make_display_name($tagobject, $html != TAG_RETURN_TEXT);
3352  }
3353  
3354  /**
3355   * Function that normalizes a list of tag names.
3356   *
3357   * @package core_tag
3358   * @deprecated since 3.1
3359   * @param   array/string $rawtags array of tags, or a single tag.
3360   * @param   int          $case    case to use for returned value (default: lower case). Either TAG_CASE_LOWER (default) or TAG_CASE_ORIGINAL
3361   * @return  array        lowercased normalized tags, indexed by the normalized tag, in the same order as the original array.
3362   *                       (Eg: 'Banana' => 'banana').
3363   */
3364  function tag_normalize($rawtags, $case = TAG_CASE_LOWER) {
3365      debugging('Function tag_normalize() is deprecated. Use core_tag_tag::normalize().', DEBUG_DEVELOPER);
3366  
3367      if ( !is_array($rawtags) ) {
3368          $rawtags = array($rawtags);
3369      }
3370  
3371      return core_tag_tag::normalize($rawtags, $case == TAG_CASE_LOWER);
3372  }
3373  
3374  /**
3375   * Get a comma-separated list of tags related to another tag.
3376   *
3377   * @package  core_tag
3378   * @deprecated since 3.1
3379   * @param    array    $related_tags the array returned by tag_get_related_tags
3380   * @param    int      $html    either TAG_RETURN_HTML (default) or TAG_RETURN_TEXT : return html links, or just text.
3381   * @return   string   comma-separated list
3382   */
3383  function tag_get_related_tags_csv($related_tags, $html=TAG_RETURN_HTML) {
3384      global $OUTPUT;
3385      debugging('Method tag_get_related_tags_csv() is deprecated. Consider '
3386              . 'looping through array or using $OUTPUT->tag_list(core_tag_tag::get_item_tags())',
3387          DEBUG_DEVELOPER);
3388      if ($html != TAG_RETURN_TEXT) {
3389          return $OUTPUT->tag_list($related_tags, '');
3390      }
3391  
3392      $tagsnames = array();
3393      foreach ($related_tags as $tag) {
3394          $tagsnames[] = core_tag_tag::make_display_name($tag, false);
3395      }
3396      return implode(', ', $tagsnames);
3397  }
3398  
3399  /**
3400   * Used to require that the return value from a function is an array.
3401   * Only used in the deprecated function {@link tag_get_id()}
3402   * @deprecated since 3.1
3403   */
3404  define('TAG_RETURN_ARRAY', 0);
3405  /**
3406   * Used to require that the return value from a function is an object.
3407   * Only used in the deprecated function {@link tag_get_id()}
3408   * @deprecated since 3.1
3409   */
3410  define('TAG_RETURN_OBJECT', 1);
3411  /**
3412   * Use to specify that HTML free text is expected to be returned from a function.
3413   * Only used in deprecated functions {@link tag_get_tags_csv()}, {@link tag_display_name()},
3414   * {@link tag_get_related_tags_csv()}
3415   * @deprecated since 3.1
3416   */
3417  define('TAG_RETURN_TEXT', 2);
3418  /**
3419   * Use to specify that encoded HTML is expected to be returned from a function.
3420   * Only used in deprecated functions {@link tag_get_tags_csv()}, {@link tag_display_name()},
3421   * {@link tag_get_related_tags_csv()}
3422   * @deprecated since 3.1
3423   */
3424  define('TAG_RETURN_HTML', 3);
3425  
3426  /**
3427   * Used to specify that we wish a lowercased string to be returned
3428   * Only used in deprecated function {@link tag_normalize()}
3429   * @deprecated since 3.1
3430   */
3431  define('TAG_CASE_LOWER', 0);
3432  /**
3433   * Used to specify that we do not wish the case of the returned string to change
3434   * Only used in deprecated function {@link tag_normalize()}
3435   * @deprecated since 3.1
3436   */
3437  define('TAG_CASE_ORIGINAL', 1);
3438  
3439  /**
3440   * Used to specify that we want all related tags returned, no matter how they are related.
3441   * Only used in deprecated function {@link tag_get_related_tags()}
3442   * @deprecated since 3.1
3443   */
3444  define('TAG_RELATED_ALL', 0);
3445  /**
3446   * Used to specify that we only want back tags that were manually related.
3447   * Only used in deprecated function {@link tag_get_related_tags()}
3448   * @deprecated since 3.1
3449   */
3450  define('TAG_RELATED_MANUAL', 1);
3451  /**
3452   * Used to specify that we only want back tags where the relationship was automatically correlated.
3453   * Only used in deprecated function {@link tag_get_related_tags()}
3454   * @deprecated since 3.1
3455   */
3456  define('TAG_RELATED_CORRELATED', 2);
3457  
3458  /**
3459   * Set the tags assigned to a record.  This overwrites the current tags.
3460   *
3461   * This function is meant to be fed the string coming up from the user interface, which contains all tags assigned to a record.
3462   *
3463   * Due to API change $component and $contextid are now required. Instead of
3464   * calling  this function you can use {@link core_tag_tag::set_item_tags()} or
3465   * {@link core_tag_tag::set_related_tags()}
3466   *
3467   * @package core_tag
3468   * @deprecated since 3.1
3469   * @param string $itemtype the type of record to tag ('post' for blogs, 'user' for users, 'tag' for tags, etc.)
3470   * @param int $itemid the id of the record to tag
3471   * @param array $tags the array of tags to set on the record. If given an empty array, all tags will be removed.
3472   * @param string|null $component the component that was tagged
3473   * @param int|null $contextid the context id of where this tag was assigned
3474   * @return bool|null
3475   */
3476  function tag_set($itemtype, $itemid, $tags, $component = null, $contextid = null) {
3477      debugging('Function tag_set() is deprecated. Use ' .
3478          ' core_tag_tag::set_item_tags() instead', DEBUG_DEVELOPER);
3479  
3480      if ($itemtype === 'tag') {
3481          return core_tag_tag::get($itemid, '*', MUST_EXIST)->set_related_tags($tags);
3482      } else {
3483          $context = $contextid ? context::instance_by_id($contextid) : context_system::instance();
3484          return core_tag_tag::set_item_tags($component, $itemtype, $itemid, $context, $tags);
3485      }
3486  }
3487  
3488  /**
3489   * Adds a tag to a record, without overwriting the current tags.
3490   *
3491   * This function remains here for backward compatiblity. It is recommended to use
3492   * {@link core_tag_tag::add_item_tag()} or {@link core_tag_tag::add_related_tags()} instead
3493   *
3494   * @package core_tag
3495   * @deprecated since 3.1
3496   * @param string $itemtype the type of record to tag ('post' for blogs, 'user' for users, etc.)
3497   * @param int $itemid the id of the record to tag
3498   * @param string $tag the tag to add
3499   * @param string|null $component the component that was tagged
3500   * @param int|null $contextid the context id of where this tag was assigned
3501   * @return bool|null
3502   */
3503  function tag_set_add($itemtype, $itemid, $tag, $component = null, $contextid = null) {
3504      debugging('Function tag_set_add() is deprecated. Use ' .
3505          ' core_tag_tag::add_item_tag() instead', DEBUG_DEVELOPER);
3506  
3507      if ($itemtype === 'tag') {
3508          return core_tag_tag::get($itemid, '*', MUST_EXIST)->add_related_tags(array($tag));
3509      } else {
3510          $context = $contextid ? context::instance_by_id($contextid) : context_system::instance();
3511          return core_tag_tag::add_item_tag($component, $itemtype, $itemid, $context, $tag);
3512      }
3513  }
3514  
3515  /**
3516   * Removes a tag from a record, without overwriting other current tags.
3517   *
3518   * This function remains here for backward compatiblity. It is recommended to use
3519   * {@link core_tag_tag::remove_item_tag()} instead
3520   *
3521   * @package core_tag
3522   * @deprecated since 3.1
3523   * @param string $itemtype the type of record to tag ('post' for blogs, 'user' for users, etc.)
3524   * @param int $itemid the id of the record to tag
3525   * @param string $tag the tag to delete
3526   * @param string|null $component the component that was tagged
3527   * @param int|null $contextid the context id of where this tag was assigned
3528   * @return bool|null
3529   */
3530  function tag_set_delete($itemtype, $itemid, $tag, $component = null, $contextid = null) {
3531      debugging('Function tag_set_delete() is deprecated. Use ' .
3532          ' core_tag_tag::remove_item_tag() instead', DEBUG_DEVELOPER);
3533      return core_tag_tag::remove_item_tag($component, $itemtype, $itemid, $tag);
3534  }
3535  
3536  /**
3537   * Simple function to just return a single tag object when you know the name or something
3538   *
3539   * See also {@link core_tag_tag::get()} and {@link core_tag_tag::get_by_name()}
3540   *
3541   * @package  core_tag
3542   * @deprecated since 3.1
3543   * @param    string $field        which field do we use to identify the tag: id, name or rawname
3544   * @param    string $value        the required value of the aforementioned field
3545   * @param    string $returnfields which fields do we want returned. This is a comma seperated string containing any combination of
3546   *                                'id', 'name', 'rawname' or '*' to include all fields.
3547   * @return   mixed  tag object
3548   */
3549  function tag_get($field, $value, $returnfields='id, name, rawname, tagcollid') {
3550      global $DB;
3551      debugging('Function tag_get() is deprecated. Use ' .
3552          ' core_tag_tag::get() or core_tag_tag::get_by_name()',
3553          DEBUG_DEVELOPER);
3554      if ($field === 'id') {
3555          $tag = core_tag_tag::get((int)$value, $returnfields);
3556      } else if ($field === 'name') {
3557          $tag = core_tag_tag::get_by_name(0, $value, $returnfields);
3558      } else {
3559          $params = array($field => $value);
3560          return $DB->get_record('tag', $params, $returnfields);
3561      }
3562      if ($tag) {
3563          return $tag->to_object();
3564      }
3565      return null;
3566  }
3567  
3568  /**
3569   * Returns tags related to a tag
3570   *
3571   * Related tags of a tag come from two sources:
3572   *   - manually added related tags, which are tag_instance entries for that tag
3573   *   - correlated tags, which are calculated
3574   *
3575   * @package  core_tag
3576   * @deprecated since 3.1
3577   * @param    string   $tagid          is a single **normalized** tag name or the id of a tag
3578   * @param    int      $type           the function will return either manually (TAG_RELATED_MANUAL) related tags or correlated
3579   *                                    (TAG_RELATED_CORRELATED) tags. Default is TAG_RELATED_ALL, which returns everything.
3580   * @param    int      $limitnum       (optional) return a subset comprising this many records, the default is 10
3581   * @return   array    an array of tag objects
3582   */
3583  function tag_get_related_tags($tagid, $type=TAG_RELATED_ALL, $limitnum=10) {
3584      debugging('Method tag_get_related_tags() is deprecated, '
3585          . 'use core_tag_tag::get_correlated_tags(), core_tag_tag::get_related_tags() or '
3586          . 'core_tag_tag::get_manual_related_tags()', DEBUG_DEVELOPER);
3587      $result = array();
3588      if ($tag = core_tag_tag::get($tagid)) {
3589          if ($type == TAG_RELATED_CORRELATED) {
3590              $tags = $tag->get_correlated_tags();
3591          } else if ($type == TAG_RELATED_MANUAL) {
3592              $tags = $tag->get_manual_related_tags();
3593          } else {
3594              $tags = $tag->get_related_tags();
3595          }
3596          $tags = array_slice($tags, 0, $limitnum);
3597          foreach ($tags as $id => $tag) {
3598              $result[$id] = $tag->to_object();
3599          }
3600      }
3601      return $result;
3602  }
3603  
3604  /**
3605   * Delete one or more tag, and all their instances if there are any left.
3606   *
3607   * @package  core_tag
3608   * @deprecated since 3.1
3609   * @param    mixed    $tagids one tagid (int), or one array of tagids to delete
3610   * @return   bool     true on success, false otherwise
3611   */
3612  function tag_delete($tagids) {
3613      debugging('Method tag_delete() is deprecated, use core_tag_tag::delete_tags()',
3614          DEBUG_DEVELOPER);
3615      return core_tag_tag::delete_tags($tagids);
3616  }
3617  
3618  /**
3619   * Deletes all the tag instances given a component and an optional contextid.
3620   *
3621   * @deprecated since 3.1
3622   * @param string $component
3623   * @param int $contextid if null, then we delete all tag instances for the $component
3624   */
3625  function tag_delete_instances($component, $contextid = null) {
3626      debugging('Method tag_delete() is deprecated, use core_tag_tag::delete_instances()',
3627          DEBUG_DEVELOPER);
3628      core_tag_tag::delete_instances($component, null, $contextid);
3629  }
3630  
3631  /**
3632   * Clean up the tag tables, making sure all tagged object still exists.
3633   *
3634   * This should normally not be necessary, but in case related tags are not deleted when the tagged record is removed, this should be
3635   * done once in a while, perhaps on an occasional cron run.  On a site with lots of tags, this could become an expensive function to
3636   * call: don't run at peak time.
3637   *
3638   * @package core_tag
3639   * @deprecated since 3.1
3640   */
3641  function tag_cleanup() {
3642      debugging('Method tag_cleanup() is deprecated, use \core\task\tag_cron_task::cleanup()',
3643          DEBUG_DEVELOPER);
3644  
3645      $task = new \core\task\tag_cron_task();
3646      return $task->cleanup();
3647  }
3648  
3649  /**
3650   * This function will delete numerous tag instances efficiently.
3651   * This removes tag instances only. It doesn't check to see if it is the last use of a tag.
3652   *
3653   * @deprecated since 3.1
3654   * @param array $instances An array of tag instance objects with the addition of the tagname and tagrawname
3655   *        (used for recording a delete event).
3656   */
3657  function tag_bulk_delete_instances($instances) {
3658      debugging('Method tag_bulk_delete_instances() is deprecated, '
3659          . 'use \core\task\tag_cron_task::bulk_delete_instances()',
3660          DEBUG_DEVELOPER);
3661  
3662      $task = new \core\task\tag_cron_task();
3663      return $task->bulk_delete_instances($instances);
3664  }
3665  
3666  /**
3667   * Calculates and stores the correlated tags of all tags. The correlations are stored in the 'tag_correlation' table.
3668   *
3669   * Two tags are correlated if they appear together a lot. Ex.: Users tagged with "computers" will probably also be tagged with "algorithms".
3670   *
3671   * The rationale for the 'tag_correlation' table is performance. It works as a cache for a potentially heavy load query done at the
3672   * 'tag_instance' table. So, the 'tag_correlation' table stores redundant information derived from the 'tag_instance' table.
3673   *
3674   * @package core_tag
3675   * @deprecated since 3.1
3676   * @param   int      $mincorrelation Only tags with more than $mincorrelation correlations will be identified.
3677   */
3678  function tag_compute_correlations($mincorrelation = 2) {
3679      debugging('Method tag_compute_correlations() is deprecated, '
3680          . 'use \core\task\tag_cron_task::compute_correlations()',
3681          DEBUG_DEVELOPER);
3682  
3683      $task = new \core\task\tag_cron_task();
3684      return $task->compute_correlations($mincorrelation);
3685  }
3686  
3687  /**
3688   * This function processes a tag correlation and makes changes in the database as required.
3689   *
3690   * The tag correlation object needs have both a tagid property and a correlatedtags property that is an array.
3691   *
3692   * @package core_tag
3693   * @deprecated since 3.1
3694   * @param   stdClass $tagcorrelation
3695   * @return  int/bool The id of the tag correlation that was just processed or false.
3696   */
3697  function tag_process_computed_correlation(stdClass $tagcorrelation) {
3698      debugging('Method tag_process_computed_correlation() is deprecated, '
3699          . 'use \core\task\tag_cron_task::process_computed_correlation()',
3700          DEBUG_DEVELOPER);
3701  
3702      $task = new \core\task\tag_cron_task();
3703      return $task->process_computed_correlation($tagcorrelation);
3704  }
3705  
3706  /**
3707   * Tasks that should be performed at cron time
3708   *
3709   * @package core_tag
3710   * @deprecated since 3.1
3711   */
3712  function tag_cron() {
3713      debugging('Method tag_cron() is deprecated, use \core\task\tag_cron_task::execute()',
3714          DEBUG_DEVELOPER);
3715  
3716      $task = new \core\task\tag_cron_task();
3717      $task->execute();
3718  }
3719  
3720  /**
3721   * Search for tags with names that match some text
3722   *
3723   * @package core_tag
3724   * @deprecated since 3.1
3725   * @param   string        $text      escaped string that the tag names will be matched against
3726   * @param   bool          $ordered   If true, tags are ordered by their popularity. If false, no ordering.
3727   * @param   int/string    $limitfrom (optional, required if $limitnum is set) return a subset of records, starting at this point.
3728   * @param   int/string    $limitnum  (optional, required if $limitfrom is set) return a subset comprising this many records.
3729   * @param   int           $tagcollid
3730   * @return  array/boolean an array of objects, or false if no records were found or an error occured.
3731   */
3732  function tag_find_tags($text, $ordered=true, $limitfrom='', $limitnum='', $tagcollid = null) {
3733      debugging('Method tag_find_tags() is deprecated without replacement', DEBUG_DEVELOPER);
3734      global $DB;
3735  
3736      $text = core_text::strtolower(clean_param($text, PARAM_TAG));
3737  
3738      list($sql, $params) = $DB->get_in_or_equal($tagcollid ? array($tagcollid) :
3739          array_keys(core_tag_collection::get_collections(true)));
3740      array_unshift($params, "%{$text}%");
3741  
3742      if ($ordered) {
3743          $query = "SELECT tg.id, tg.name, tg.rawname, tg.tagcollid, COUNT(ti.id) AS count
3744                      FROM {tag} tg LEFT JOIN {tag_instance} ti ON tg.id = ti.tagid
3745                     WHERE tg.name LIKE ? AND tg.tagcollid $sql
3746                  GROUP BY tg.id, tg.name, tg.rawname
3747                  ORDER BY count DESC";
3748      } else {
3749          $query = "SELECT tg.id, tg.name, tg.rawname, tg.tagcollid
3750                      FROM {tag} tg
3751                     WHERE tg.name LIKE ? AND tg.tagcollid $sql";
3752      }
3753      return $DB->get_records_sql($query, $params, $limitfrom , $limitnum);
3754  }
3755  
3756  /**
3757   * Get the name of a tag
3758   *
3759   * @package core_tag
3760   * @deprecated since 3.1
3761   * @param   mixed    $tagids the id of the tag, or an array of ids
3762   * @return  mixed    string name of one tag, or id-indexed array of strings
3763   */
3764  function tag_get_name($tagids) {
3765      debugging('Method tag_get_name() is deprecated without replacement', DEBUG_DEVELOPER);
3766      global $DB;
3767  
3768      if (!is_array($tagids)) {
3769          if ($tag = $DB->get_record('tag', array('id'=>$tagids))) {
3770              return $tag->name;
3771          }
3772          return false;
3773      }
3774  
3775      $tag_names = array();
3776      foreach($DB->get_records_list('tag', 'id', $tagids) as $tag) {
3777          $tag_names[$tag->id] = $tag->name;
3778      }
3779  
3780      return $tag_names;
3781  }
3782  
3783  /**
3784   * Returns the correlated tags of a tag, retrieved from the tag_correlation table. Make sure cron runs, otherwise the table will be
3785   * empty and this function won't return anything.
3786   *
3787   * Correlated tags are calculated in cron based on existing tag instances.
3788   *
3789   * @package core_tag
3790   * @deprecated since 3.1
3791   * @param   int      $tagid   is a single tag id
3792   * @param   int      $notused  this argument is no longer used
3793   * @return  array    an array of tag objects or an empty if no correlated tags are found
3794   */
3795  function tag_get_correlated($tagid, $notused = null) {
3796      debugging('Method tag_get_correlated() is deprecated, '
3797          . 'use core_tag_tag::get_correlated_tags()', DEBUG_DEVELOPER);
3798      $result = array();
3799      if ($tag = core_tag_tag::get($tagid)) {
3800          $tags = $tag->get_correlated_tags(true);
3801          // Convert to objects for backward-compatibility.
3802          foreach ($tags as $id => $tag) {
3803              $result[$id] = $tag->to_object();
3804          }
3805      }
3806      return $result;
3807  }
3808  
3809  /**
3810   * This function is used by print_tag_cloud, to usort() the tags in the cloud. See php.net/usort for the parameters documentation.
3811   * This was originally in blocks/blog_tags/block_blog_tags.php, named blog_tags_sort().
3812   *
3813   * @package core_tag
3814   * @deprecated since 3.1
3815   * @param   string $a Tag name to compare against $b
3816   * @param   string $b Tag name to compare against $a
3817   * @return  int    The result of the comparison/validation 1, 0 or -1
3818   */
3819  function tag_cloud_sort($a, $b) {
3820      debugging('Method tag_cloud_sort() is deprecated, similar method can be found in core_tag_collection::cloud_sort()', DEBUG_DEVELOPER);
3821      global $CFG;
3822  
3823      if (empty($CFG->tagsort)) {
3824          $tagsort = 'name'; // by default, sort by name
3825      } else {
3826          $tagsort = $CFG->tagsort;
3827      }
3828  
3829      if (is_numeric($a->$tagsort)) {
3830          return ($a->$tagsort == $b->$tagsort) ? 0 : ($a->$tagsort > $b->$tagsort) ? 1 : -1;
3831      } elseif (is_string($a->$tagsort)) {
3832          return strcmp($a->$tagsort, $b->$tagsort);
3833      } else {
3834          return 0;
3835      }
3836  }
3837  
3838  /**
3839   * Loads the events definitions for the component (from file). If no
3840   * events are defined for the component, we simply return an empty array.
3841   *
3842   * @access protected To be used from eventslib only
3843   * @deprecated since Moodle 3.1
3844   * @param string $component examples: 'moodle', 'mod_forum', 'block_quiz_results'
3845   * @return array Array of capabilities or empty array if not exists
3846   */
3847  function events_load_def($component) {
3848      global $CFG;
3849      if ($component === 'unittest') {
3850          $defpath = $CFG->dirroot.'/lib/tests/fixtures/events.php';
3851      } else {
3852          $defpath = core_component::get_component_directory($component).'/db/events.php';
3853      }
3854  
3855      $handlers = array();
3856  
3857      if (file_exists($defpath)) {
3858          require($defpath);
3859      }
3860  
3861      // make sure the definitions are valid and complete; tell devs what is wrong
3862      foreach ($handlers as $eventname => $handler) {
3863          if ($eventname === 'reset') {
3864              debugging("'reset' can not be used as event name.");
3865              unset($handlers['reset']);
3866              continue;
3867          }
3868          if (!is_array($handler)) {
3869              debugging("Handler of '$eventname' must be specified as array'");
3870              unset($handlers[$eventname]);
3871              continue;
3872          }
3873          if (!isset($handler['handlerfile'])) {
3874              debugging("Handler of '$eventname' must include 'handlerfile' key'");
3875              unset($handlers[$eventname]);
3876              continue;
3877          }
3878          if (!isset($handler['handlerfunction'])) {
3879              debugging("Handler of '$eventname' must include 'handlerfunction' key'");
3880              unset($handlers[$eventname]);
3881              continue;
3882          }
3883          if (!isset($handler['schedule'])) {
3884              $handler['schedule'] = 'instant';
3885          }
3886          if ($handler['schedule'] !== 'instant' and $handler['schedule'] !== 'cron') {
3887              debugging("Handler of '$eventname' must include valid 'schedule' type (instant or cron)'");
3888              unset($handlers[$eventname]);
3889              continue;
3890          }
3891          if (!isset($handler['internal'])) {
3892              $handler['internal'] = 1;
3893          }
3894          $handlers[$eventname] = $handler;
3895      }
3896  
3897      return $handlers;
3898  }
3899  
3900  /**
3901   * Puts a handler on queue
3902   *
3903   * @access protected To be used from eventslib only
3904   * @deprecated since Moodle 3.1
3905   * @param stdClass $handler event handler object from db
3906   * @param stdClass $event event data object
3907   * @param string $errormessage The error message indicating the problem
3908   * @return int id number of new queue handler
3909   */
3910  function events_queue_handler($handler, $event, $errormessage) {
3911      global $DB;
3912  
3913      if ($qhandler = $DB->get_record('events_queue_handlers', array('queuedeventid'=>$event->id, 'handlerid'=>$handler->id))) {
3914          debugging("Please check code: Event id $event->id is already queued in handler id $qhandler->id");
3915          return $qhandler->id;
3916      }
3917  
3918      // make a new queue handler
3919      $qhandler = new stdClass();
3920      $qhandler->queuedeventid  = $event->id;
3921      $qhandler->handlerid      = $handler->id;
3922      $qhandler->errormessage   = $errormessage;
3923      $qhandler->timemodified   = time();
3924      if ($handler->schedule === 'instant' and $handler->status == 1) {
3925          $qhandler->status     = 1; //already one failed attempt to dispatch this event
3926      } else {
3927          $qhandler->status     = 0;
3928      }
3929  
3930      return $DB->insert_record('events_queue_handlers', $qhandler);
3931  }
3932  
3933  /**
3934   * trigger a single event with a specified handler
3935   *
3936   * @access protected To be used from eventslib only
3937   * @deprecated since Moodle 3.1
3938   * @param stdClass $handler This shoudl be a row from the events_handlers table.
3939   * @param stdClass $eventdata An object containing information about the event
3940   * @param string $errormessage error message indicating problem
3941   * @return bool|null True means event processed, false means retry event later; may throw exception, NULL means internal error
3942   */
3943  function events_dispatch($handler, $eventdata, &$errormessage) {
3944      global $CFG;
3945  
3946      debugging('Events API using $handlers array has been deprecated in favour of Events 2 API, please use it instead.', DEBUG_DEVELOPER);
3947  
3948      $function = unserialize($handler->handlerfunction);
3949  
3950      if (is_callable($function)) {
3951          // oki, no need for includes
3952  
3953      } else if (file_exists($CFG->dirroot.$handler->handlerfile)) {
3954          include_once($CFG->dirroot.$handler->handlerfile);
3955  
3956      } else {
3957          $errormessage = "Handler file of component $handler->component: $handler->handlerfile can not be found!";
3958          return null;
3959      }
3960  
3961      // checks for handler validity
3962      if (is_callable($function)) {
3963          $result = call_user_func($function, $eventdata);
3964          if ($result === false) {
3965              $errormessage = "Handler function of component $handler->component: $handler->handlerfunction requested resending of event!";
3966              return false;
3967          }
3968          return true;
3969  
3970      } else {
3971          $errormessage = "Handler function of component $handler->component: $handler->handlerfunction not callable function or class method!";
3972          return null;
3973      }
3974  }
3975  
3976  /**
3977   * given a queued handler, call the respective event handler to process the event
3978   *
3979   * @access protected To be used from eventslib only
3980   * @deprecated since Moodle 3.1
3981   * @param stdClass $qhandler events_queued_handler row from db
3982   * @return boolean true means event processed, false means retry later, NULL means fatal failure
3983   */
3984  function events_process_queued_handler($qhandler) {
3985      global $DB;
3986  
3987      // get handler
3988      if (!$handler = $DB->get_record('events_handlers', array('id'=>$qhandler->handlerid))) {
3989          debugging("Error processing queue handler $qhandler->id, missing handler id: $qhandler->handlerid");
3990          //irrecoverable error, remove broken queue handler
3991          events_dequeue($qhandler);
3992          return NULL;
3993      }
3994  
3995      // get event object
3996      if (!$event = $DB->get_record('events_queue', array('id'=>$qhandler->queuedeventid))) {
3997          // can't proceed with no event object - might happen when two crons running at the same time
3998          debugging("Error processing queue handler $qhandler->id, missing event id: $qhandler->queuedeventid");
3999          //irrecoverable error, remove broken queue handler
4000          events_dequeue($qhandler);
4001          return NULL;
4002      }
4003  
4004      // call the function specified by the handler
4005      try {
4006          $errormessage = 'Unknown error';
4007          if (events_dispatch($handler, unserialize(base64_decode($event->eventdata)), $errormessage)) {
4008              //everything ok
4009              events_dequeue($qhandler);
4010              return true;
4011          }
4012      } catch (Exception $e) {
4013          // the problem here is that we do not want one broken handler to stop all others,
4014          // cron handlers are very tricky because the needed data might have been deleted before the cron execution
4015          $errormessage = "Handler function of component $handler->component: $handler->handlerfunction threw exception :" .
4016                  $e->getMessage() . "\n" . format_backtrace($e->getTrace(), true);
4017          if (!empty($e->debuginfo)) {
4018              $errormessage .= $e->debuginfo;
4019          }
4020      }
4021  
4022      //dispatching failed
4023      $qh = new stdClass();
4024      $qh->id           = $qhandler->id;
4025      $qh->errormessage = $errormessage;
4026      $qh->timemodified = time();
4027      $qh->status       = $qhandler->status + 1;
4028      $DB->update_record('events_queue_handlers', $qh);
4029  
4030      debugging($errormessage);
4031  
4032      return false;
4033  }
4034  
4035  /**
4036   * Updates all of the event definitions within the database.
4037   *
4038   * Unfortunately this isn't as simple as removing them all and then readding
4039   * the updated event definitions. Chances are queued items are referencing the
4040   * existing definitions.
4041   *
4042   * Note that the absence of the db/events.php event definition file
4043   * will cause any queued events for the component to be removed from
4044   * the database.
4045   *
4046   * @category event
4047   * @deprecated since Moodle 3.1
4048   * @param string $component examples: 'moodle', 'mod_forum', 'block_quiz_results'
4049   * @return boolean always returns true
4050   */
4051  function events_update_definition($component='moodle') {
4052      global $DB;
4053  
4054      // load event definition from events.php
4055      $filehandlers = events_load_def($component);
4056  
4057      if ($filehandlers) {
4058          debugging('Events API using $handlers array has been deprecated in favour of Events 2 API, please use it instead.', DEBUG_DEVELOPER);
4059      }
4060  
4061      // load event definitions from db tables
4062      // if we detect an event being already stored, we discard from this array later
4063      // the remaining needs to be removed
4064      $cachedhandlers = events_get_cached($component);
4065  
4066      foreach ($filehandlers as $eventname => $filehandler) {
4067          if (!empty($cachedhandlers[$eventname])) {
4068              if ($cachedhandlers[$eventname]['handlerfile'] === $filehandler['handlerfile'] &&
4069                  $cachedhandlers[$eventname]['handlerfunction'] === serialize($filehandler['handlerfunction']) &&
4070                  $cachedhandlers[$eventname]['schedule'] === $filehandler['schedule'] &&
4071                  $cachedhandlers[$eventname]['internal'] == $filehandler['internal']) {
4072                  // exact same event handler already present in db, ignore this entry
4073  
4074                  unset($cachedhandlers[$eventname]);
4075                  continue;
4076  
4077              } else {
4078                  // same event name matches, this event has been updated, update the datebase
4079                  $handler = new stdClass();
4080                  $handler->id              = $cachedhandlers[$eventname]['id'];
4081                  $handler->handlerfile     = $filehandler['handlerfile'];
4082                  $handler->handlerfunction = serialize($filehandler['handlerfunction']); // static class methods stored as array
4083                  $handler->schedule        = $filehandler['schedule'];
4084                  $handler->internal        = $filehandler['internal'];
4085  
4086                  $DB->update_record('events_handlers', $handler);
4087  
4088                  unset($cachedhandlers[$eventname]);
4089                  continue;
4090              }
4091  
4092          } else {
4093              // if we are here, this event handler is not present in db (new)
4094              // add it
4095              $handler = new stdClass();
4096              $handler->eventname       = $eventname;
4097              $handler->component       = $component;
4098              $handler->handlerfile     = $filehandler['handlerfile'];
4099              $handler->handlerfunction = serialize($filehandler['handlerfunction']); // static class methods stored as array
4100              $handler->schedule        = $filehandler['schedule'];
4101              $handler->status          = 0;
4102              $handler->internal        = $filehandler['internal'];
4103  
4104              $DB->insert_record('events_handlers', $handler);
4105          }
4106      }
4107  
4108      // clean up the left overs, the entries in cached events array at this points are deprecated event handlers
4109      // and should be removed, delete from db
4110      events_cleanup($component, $cachedhandlers);
4111  
4112      events_get_handlers('reset');
4113  
4114      return true;
4115  }
4116  
4117  /**
4118   * Events cron will try to empty the events queue by processing all the queued events handlers
4119   *
4120   * @access public Part of the public API
4121   * @deprecated since Moodle 3.1
4122   * @category event
4123   * @param string $eventname empty means all
4124   * @return int number of dispatched events
4125   */
4126  function events_cron($eventname='') {
4127      global $DB;
4128  
4129      $failed = array();
4130      $processed = 0;
4131  
4132      if ($eventname) {
4133          $sql = "SELECT qh.*
4134                    FROM {events_queue_handlers} qh, {events_handlers} h
4135                   WHERE qh.handlerid = h.id AND h.eventname=?
4136                ORDER BY qh.id";
4137          $params = array($eventname);
4138      } else {
4139          $sql = "SELECT *
4140                    FROM {events_queue_handlers}
4141                ORDER BY id";
4142          $params = array();
4143      }
4144  
4145      $rs = $DB->get_recordset_sql($sql, $params);
4146      if ($rs->valid()) {
4147          debugging('Events API using $handlers array has been deprecated in favour of Events 2 API, please use it instead.', DEBUG_DEVELOPER);
4148      }
4149  
4150      foreach ($rs as $qhandler) {
4151          if (isset($failed[$qhandler->handlerid])) {
4152              // do not try to dispatch any later events when one already asked for retry or ended with exception
4153              continue;
4154          }
4155          $status = events_process_queued_handler($qhandler);
4156          if ($status === false) {
4157              // handler is asking for retry, do not send other events to this handler now
4158              $failed[$qhandler->handlerid] = $qhandler->handlerid;
4159          } else if ($status === NULL) {
4160              // means completely broken handler, event data was purged
4161              $failed[$qhandler->handlerid] = $qhandler->handlerid;
4162          } else {
4163              $processed++;
4164          }
4165      }
4166      $rs->close();
4167  
4168      // remove events that do not have any handlers waiting
4169      $sql = "SELECT eq.id
4170                FROM {events_queue} eq
4171                LEFT JOIN {events_queue_handlers} qh ON qh.queuedeventid = eq.id
4172               WHERE qh.id IS NULL";
4173      $rs = $DB->get_recordset_sql($sql);
4174      foreach ($rs as $event) {
4175          //debugging('Purging stale event '.$event->id);
4176          $DB->delete_records('events_queue', array('id'=>$event->id));
4177      }
4178      $rs->close();
4179  
4180      return $processed;
4181  }
4182  
4183  /**
4184   * Do not call directly, this is intended to be used from new event base only.
4185   *
4186   * @private
4187   * @deprecated since Moodle 3.1
4188   * @param string $eventname name of the event
4189   * @param mixed $eventdata event data object
4190   * @return int number of failed events
4191   */
4192  function events_trigger_legacy($eventname, $eventdata) {
4193      global $CFG, $USER, $DB;
4194  
4195      $failedcount = 0; // number of failed events.
4196  
4197      // pull out all registered event handlers
4198      if ($handlers = events_get_handlers($eventname)) {
4199          foreach ($handlers as $handler) {
4200              $errormessage = '';
4201  
4202              if ($handler->schedule === 'instant') {
4203                  if ($handler->status) {
4204                      //check if previous pending events processed
4205                      if (!$DB->record_exists('events_queue_handlers', array('handlerid'=>$handler->id))) {
4206                          // ok, queue is empty, lets reset the status back to 0 == ok
4207                          $handler->status = 0;
4208                          $DB->set_field('events_handlers', 'status', 0, array('id'=>$handler->id));
4209                          // reset static handler cache
4210                          events_get_handlers('reset');
4211                      }
4212                  }
4213  
4214                  // dispatch the event only if instant schedule and status ok
4215                  if ($handler->status or (!$handler->internal and $DB->is_transaction_started())) {
4216                      // increment the error status counter
4217                      $handler->status++;
4218                      $DB->set_field('events_handlers', 'status', $handler->status, array('id'=>$handler->id));
4219                      // reset static handler cache
4220                      events_get_handlers('reset');
4221  
4222                  } else {
4223                      $errormessage = 'Unknown error';
4224                      $result = events_dispatch($handler, $eventdata, $errormessage);
4225                      if ($result === true) {
4226                          // everything is fine - event dispatched
4227                          continue;
4228                      } else if ($result === false) {
4229                          // retry later - set error count to 1 == send next instant into cron queue
4230                          $DB->set_field('events_handlers', 'status', 1, array('id'=>$handler->id));
4231                          // reset static handler cache
4232                          events_get_handlers('reset');
4233                      } else {
4234                          // internal problem - ignore the event completely
4235                          $failedcount ++;
4236                          continue;
4237                      }
4238                  }
4239  
4240                  // update the failed counter
4241                  $failedcount ++;
4242  
4243              } else if ($handler->schedule === 'cron') {
4244                  //ok - use queueing of events only
4245  
4246              } else {
4247                  // unknown schedule - ignore event completely
4248                  debugging("Unknown handler schedule type: $handler->schedule");
4249                  $failedcount ++;
4250                  continue;
4251              }
4252  
4253              // if even type is not instant, or dispatch asked for retry, queue it
4254              $event = new stdClass();
4255              $event->userid      = $USER->id;
4256              $event->eventdata   = base64_encode(serialize($eventdata));
4257              $event->timecreated = time();
4258              if (debugging()) {
4259                  $dump = '';
4260                  $callers = debug_backtrace();
4261                  foreach ($callers as $caller) {
4262                      if (!isset($caller['line'])) {
4263                          $caller['line'] = '?';
4264                      }
4265                      if (!isset($caller['file'])) {
4266                          $caller['file'] = '?';
4267                      }
4268                      $dump .= 'line ' . $caller['line'] . ' of ' . substr($caller['file'], strlen($CFG->dirroot) + 1);
4269                      if (isset($caller['function'])) {
4270                          $dump .= ': call to ';
4271                          if (isset($caller['class'])) {
4272                              $dump .= $caller['class'] . $caller['type'];
4273                          }
4274                          $dump .= $caller['function'] . '()';
4275                      }
4276                      $dump .= "\n";
4277                  }
4278                  $event->stackdump = $dump;
4279              } else {
4280                  $event->stackdump = '';
4281              }
4282              $event->id = $DB->insert_record('events_queue', $event);
4283              events_queue_handler($handler, $event, $errormessage);
4284          }
4285      } else {
4286          // No handler found for this event name - this is ok!
4287      }
4288  
4289      return $failedcount;
4290  }
4291  
4292  /**
4293   * checks if an event is registered for this component
4294   *
4295   * @access public Part of the public API
4296   * @deprecated since Moodle 3.1
4297   * @param string $eventname name of the event
4298   * @param string $component component name, can be mod/data or moodle
4299   * @return bool
4300   */
4301  function events_is_registered($eventname, $component) {
4302      global $DB;
4303  
4304      debugging('events_is_registered() has been deprecated along with all Events 1 API in favour of Events 2 API,' .
4305          ' please use it instead.', DEBUG_DEVELOPER);
4306  
4307      return $DB->record_exists('events_handlers', array('component'=>$component, 'eventname'=>$eventname));
4308  }
4309  
4310  /**
4311   * checks if an event is queued for processing - either cron handlers attached or failed instant handlers
4312   *
4313   * @access public Part of the public API
4314   * @deprecated since Moodle 3.1
4315   * @param string $eventname name of the event
4316   * @return int number of queued events
4317   */
4318  function events_pending_count($eventname) {
4319      global $DB;
4320  
4321      debugging('events_pending_count() has been deprecated along with all Events 1 API in favour of Events 2 API,' .
4322          ' please use it instead.', DEBUG_DEVELOPER);
4323  
4324      $sql = "SELECT COUNT('x')
4325                FROM {events_queue_handlers} qh
4326                JOIN {events_handlers} h ON h.id = qh.handlerid
4327               WHERE h.eventname = ?";
4328  
4329      return $DB->count_records_sql($sql, array($eventname));
4330  }
4331  
4332  /**
4333   * Emails admins about a clam outcome
4334   *
4335   * @deprecated since Moodle 3.0 - this is a part of clamav plugin now.
4336   * @param string $notice The body of the email to be sent.
4337   * @return void
4338   */
4339  function clam_message_admins($notice) {
4340      debugging('clam_message_admins() is deprecated, please use message_admins() method of \antivirus_clamav\scanner class.', DEBUG_DEVELOPER);
4341  
4342      $antivirus = \core\antivirus\manager::get_antivirus('clamav');
4343      $antivirus->message_admins($notice);
4344  }
4345  
4346  /**
4347   * Returns the string equivalent of a numeric clam error code
4348   *
4349   * @deprecated since Moodle 3.0 - this is a part of clamav plugin now.
4350   * @param int $returncode The numeric error code in question.
4351   * @return string The definition of the error code
4352   */
4353  function get_clam_error_code($returncode) {
4354      debugging('get_clam_error_code() is deprecated, please use get_clam_error_code() method of \antivirus_clamav\scanner class.', DEBUG_DEVELOPER);
4355  
4356      $antivirus = \core\antivirus\manager::get_antivirus('clamav');
4357      return $antivirus->get_clam_error_code($returncode);
4358  }
4359  
4360  /**
4361   * Returns the rename action.
4362   *
4363   * @deprecated since 3.1
4364   * @param cm_info $mod The module to produce editing buttons for
4365   * @param int $sr The section to link back to (used for creating the links)
4366   * @return The markup for the rename action, or an empty string if not available.
4367   */
4368  function course_get_cm_rename_action(cm_info $mod, $sr = null) {
4369      global $COURSE, $OUTPUT;
4370  
4371      static $str;
4372      static $baseurl;
4373  
4374      debugging('Function course_get_cm_rename_action() is deprecated. Please use inplace_editable ' .
4375          'https://docs.moodle.org/dev/Inplace_editable', DEBUG_DEVELOPER);
4376  
4377      $modcontext = context_module::instance($mod->id);
4378      $hasmanageactivities = has_capability('moodle/course:manageactivities', $modcontext);
4379  
4380      if (!isset($str)) {
4381          $str = get_strings(array('edittitle'));
4382      }
4383  
4384      if (!isset($baseurl)) {
4385          $baseurl = new moodle_url('/course/mod.php', array('sesskey' => sesskey()));
4386      }
4387  
4388      if ($sr !== null) {
4389          $baseurl->param('sr', $sr);
4390      }
4391  
4392      // AJAX edit title.
4393      if ($mod->has_view() && $hasmanageactivities && course_ajax_enabled($COURSE) &&
4394          (($mod->course == $COURSE->id) || ($mod->course == SITEID))) {
4395          // we will not display link if we are on some other-course page (where we should not see this module anyway)
4396          return html_writer::span(
4397              html_writer::link(
4398                  new moodle_url($baseurl, array('update' => $mod->id)),
4399                  $OUTPUT->pix_icon('t/editstring', '', 'moodle', array('class' => 'iconsmall visibleifjs', 'title' => '')),
4400                  array(
4401                      'class' => 'editing_title',
4402                      'data-action' => 'edittitle',
4403                      'title' => $str->edittitle,
4404                  )
4405              )
4406          );
4407      }
4408      return '';
4409  }
4410  
4411  /*
4412   * This function returns the number of activities using the given scale in the given course.
4413   *
4414   * @deprecated since Moodle 3.1
4415   * @param int $courseid The course ID to check.
4416   * @param int $scaleid The scale ID to check
4417   * @return int
4418   */
4419  function course_scale_used($courseid, $scaleid) {
4420      global $CFG, $DB;
4421  
4422      debugging('course_scale_used() is deprecated and never used, plugins can implement <modname>_scale_used_anywhere, '.
4423          'all implementations of <modname>_scale_used are now ignored', DEBUG_DEVELOPER);
4424  
4425      $return = 0;
4426  
4427      if (!empty($scaleid)) {
4428          if ($cms = get_course_mods($courseid)) {
4429              foreach ($cms as $cm) {
4430                  // Check cm->name/lib.php exists.
4431                  if (file_exists($CFG->dirroot.'/mod/'.$cm->modname.'/lib.php')) {
4432                      include_once($CFG->dirroot.'/mod/'.$cm->modname.'/lib.php');
4433                      $functionname = $cm->modname.'_scale_used';
4434                      if (function_exists($functionname)) {
4435                          if ($functionname($cm->instance, $scaleid)) {
4436                              $return++;
4437                          }
4438                      }
4439                  }
4440              }
4441          }
4442  
4443          // Check if any course grade item makes use of the scale.
4444          $return += $DB->count_records('grade_items', array('courseid' => $courseid, 'scaleid' => $scaleid));
4445  
4446          // Check if any outcome in the course makes use of the scale.
4447          $return += $DB->count_records_sql("SELECT COUNT('x')
4448                                               FROM {grade_outcomes_courses} goc,
4449                                                    {grade_outcomes} go
4450                                              WHERE go.id = goc.outcomeid
4451                                                    AND go.scaleid = ? AND goc.courseid = ?",
4452              array($scaleid, $courseid));
4453      }
4454      return $return;
4455  }
4456  
4457  /**
4458   * This function returns the number of activities using scaleid in the entire site
4459   *
4460   * @deprecated since Moodle 3.1
4461   * @param int $scaleid
4462   * @param array $courses
4463   * @return int
4464   */
4465  function site_scale_used($scaleid, &$courses) {
4466      $return = 0;
4467  
4468      debugging('site_scale_used() is deprecated and never used, plugins can implement <modname>_scale_used_anywhere, '.
4469          'all implementations of <modname>_scale_used are now ignored', DEBUG_DEVELOPER);
4470  
4471      if (!is_array($courses) || count($courses) == 0) {
4472          $courses = get_courses("all", false, "c.id, c.shortname");
4473      }
4474  
4475      if (!empty($scaleid)) {
4476          if (is_array($courses) && count($courses) > 0) {
4477              foreach ($courses as $course) {
4478                  $return += course_scale_used($course->id, $scaleid);
4479              }
4480          }
4481      }
4482      return $return;
4483  }
4484  
4485  /**
4486   * Returns detailed function information
4487   *
4488   * @deprecated since Moodle 3.1
4489   * @param string|object $function name of external function or record from external_function
4490   * @param int $strictness IGNORE_MISSING means compatible mode, false returned if record not found, debug message if more found;
4491   *                        MUST_EXIST means throw exception if no record or multiple records found
4492   * @return stdClass description or false if not found or exception thrown
4493   * @since Moodle 2.0
4494   */
4495  function external_function_info($function, $strictness=MUST_EXIST) {
4496      debugging('external_function_info() is deprecated. Please use external_api::external_function_info() instead.',
4497                DEBUG_DEVELOPER);
4498      return external_api::external_function_info($function, $strictness);
4499  }
4500  
4501  /**
4502   * Retrieves an array of records from a CSV file and places
4503   * them into a given table structure
4504   * This function is deprecated. Please use csv_import_reader() instead.
4505   *
4506   * @deprecated since Moodle 3.2 MDL-55126
4507   * @todo MDL-55195 for final deprecation in Moodle 3.6
4508   * @see csv_import_reader::load_csv_content()
4509   * @global stdClass $CFG
4510   * @global moodle_database $DB
4511   * @param string $file The path to a CSV file
4512   * @param string $table The table to retrieve columns from
4513   * @return bool|array Returns an array of CSV records or false
4514   */
4515  function get_records_csv($file, $table) {
4516      global $CFG, $DB;
4517  
4518      debugging('get_records_csv() is deprecated. Please use lib/csvlib.class.php csv_import_reader() instead.');
4519  
4520      if (!$metacolumns = $DB->get_columns($table)) {
4521          return false;
4522      }
4523  
4524      if(!($handle = @fopen($file, 'r'))) {
4525          print_error('get_records_csv failed to open '.$file);
4526      }
4527  
4528      $fieldnames = fgetcsv($handle, 4096);
4529      if(empty($fieldnames)) {
4530          fclose($handle);
4531          return false;
4532      }
4533  
4534      $columns = array();
4535  
4536      foreach($metacolumns as $metacolumn) {
4537          $ord = array_search($metacolumn->name, $fieldnames);
4538          if(is_int($ord)) {
4539              $columns[$metacolumn->name] = $ord;
4540          }
4541      }
4542  
4543      $rows = array();
4544  
4545      while (($data = fgetcsv($handle, 4096)) !== false) {
4546          $item = new stdClass;
4547          foreach($columns as $name => $ord) {
4548              $item->$name = $data[$ord];
4549          }
4550          $rows[] = $item;
4551      }
4552  
4553      fclose($handle);
4554      return $rows;
4555  }
4556  
4557  /**
4558   * Create a file with CSV contents
4559   * This function is deprecated. Please use download_as_dataformat() instead.
4560   *
4561   * @deprecated since Moodle 3.2 MDL-55126
4562   * @todo MDL-55195 for final deprecation in Moodle 3.6
4563   * @see download_as_dataformat (lib/dataformatlib.php)
4564   * @global stdClass $CFG
4565   * @global moodle_database $DB
4566   * @param string $file The file to put the CSV content into
4567   * @param array $records An array of records to write to a CSV file
4568   * @param string $table The table to get columns from
4569   * @return bool success
4570   */
4571  function put_records_csv($file, $records, $table = NULL) {
4572      global $CFG, $DB;
4573  
4574      debugging('put_records_csv() is deprecated. Please use lib/dataformatlib.php download_as_dataformat()');
4575  
4576      if (empty($records)) {
4577          return true;
4578      }
4579  
4580      $metacolumns = NULL;
4581      if ($table !== NULL && !$metacolumns = $DB->get_columns($table)) {
4582          return false;
4583      }
4584  
4585      echo "x";
4586  
4587      if(!($fp = @fopen($CFG->tempdir.'/'.$file, 'w'))) {
4588          print_error('put_records_csv failed to open '.$file);
4589      }
4590  
4591      $proto = reset($records);
4592      if(is_object($proto)) {
4593          $fields_records = array_keys(get_object_vars($proto));
4594      }
4595      else if(is_array($proto)) {
4596          $fields_records = array_keys($proto);
4597      }
4598      else {
4599          return false;
4600      }
4601      echo "x";
4602  
4603      if(!empty($metacolumns)) {
4604          $fields_table = array_map(create_function('$a', 'return $a->name;'), $metacolumns);
4605          $fields = array_intersect($fields_records, $fields_table);
4606      }
4607      else {
4608          $fields = $fields_records;
4609      }
4610  
4611      fwrite($fp, implode(',', $fields));
4612      fwrite($fp, "\r\n");
4613  
4614      foreach($records as $record) {
4615          $array  = (array)$record;
4616          $values = array();
4617          foreach($fields as $field) {
4618              if(strpos($array[$field], ',')) {
4619                  $values[] = '"'.str_replace('"', '\"', $array[$field]).'"';
4620              }
4621              else {
4622                  $values[] = $array[$field];
4623              }
4624          }
4625          fwrite($fp, implode(',', $values)."\r\n");
4626      }
4627  
4628      fclose($fp);
4629      @chmod($CFG->tempdir.'/'.$file, $CFG->filepermissions);
4630      return true;
4631  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1