[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
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 = '&'; 560 } 561 562 if ($options) { 563 foreach ($options as $name=>$value) { 564 $ffurl = $ffurl.$separator.$name.'='.$value; 565 $separator = '&'; 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=' ', $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=' ', $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&sesskey='. sesskey() . 3081 '&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&sesskey='. sesskey() . 3085 '&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&sesskey='. 3093 sesskey() . '&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> </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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |