upgrade.txt 50.4 KB
Newer Older
1
This files describes API changes in core libraries and APIs,
2
3
information provided here is intended especially for developers.

4
5
=== 3.1 ===

6
7
* Webservice function core_course_search_courses accepts a new parameter 'limittoenrolled' to filter the results
  only to courses the user is enrolled in, and are visible to them.
8
9
* External functions that are not calling external_api::validate_context are buggy and will now generate
  exceptions. Previously they were only generating warnings in the webserver error log.
10
  See https://docs.moodle.org/dev/External_functions_API#Security
11
* The moodle/blog:associatecourse and moodle/blog:associatemodule capabilities has been removed.
12
13
14
15
16
17
18
19
20
21
22
23
24
* The following functions has been finally deprecated and can not be used any more:
    - profile_display_badges()
    - useredit_shared_definition_preferences()
    - calendar_normalize_tz()
    - get_user_timezone_offset()
    - get_timezone_offset()
    - get_list_of_timezones()
    - calculate_user_dst_table()
    - dst_changes_for_year()
    - get_timezone_record()
    - test_get_list_of_timezones()
    - test_get_timezone_offset()
    - test_get_user_timezone_offset()
25
26
27
* The google api library has been updated to version 1.1.7. There was some important changes
  on the SSL handling. Now the SSL version will be determined by the underlying library.
  For more information see https://github.com/google/google-api-php-client/pull/644
28
29
30
* The get_role_users() function will now add the $sort fields that are not part
  of the requested fields to the query result and will throw a debugging message
  with the added fields when that happens.
31
32
33
34
35
* The core_user::fill_properties_cache() static method has been introduced to be a reference
  and allow standard user fields data validation. Right now only type validation is supported
  checking it against the parameter (PARAM_*) type of the target user field. MDL-52781 is
  going to add support to null/not null and choices validation, replacing the existing code to
  validate the user fields in different places in a common way.
36
37
38
39
40
* Webservice function core_course_search_courses now returns results when the search string
  is less than 2 chars long.
* Webservice function core_course_search_courses accepts a new parameter 'requiredcapabilities' to filter the results
  by the capabilities of the current user.
* New mform element 'course' handles thousands of courses with good performance and usability.
41
42
43
44
* The redirect() function will now redirect immediately if output has not
  already started. Messages will be displayed on the subsequent page using
  session notifications. The type of message output can be configured using the
  fourth parameter to redirect().
45
46
47
48
49
50
51
* The specification of extra classes in the $OUTPUT->notification()
  function, and \core\output\notification renderable have been deprecated
  and will be removed in a future version.
  Notifications should use the levels found in \core\output\notification.
* The constants for NOTIFY_PROBLEM, NOTIFY_REDIRECT, and NOTIFY_MESSAGE in
  \core\output\notification have been deprecated in favour of NOTIFY_ERROR,
  NOTIFY_WARNING, and NOTIFY_INFO respectively.
52
53
54
55
56
57
58
59
60
61
62
63
* The following functions, previously used (exclusively) by upgrade steps are not available
  anymore because of the upgrade cleanup performed for this version. See MDL-51580 for more info:
    - upgrade_mysql_fix_unsigned_and_lob_columns()
    - upgrade_course_completion_remove_duplicates()
    - upgrade_save_orphaned_questions()
    - upgrade_rename_old_backup_files_using_shortname()
    - upgrade_mssql_nvarcharmax()
    - upgrade_mssql_varbinarymax()
    - upgrade_fix_missing_root_folders()
    - upgrade_course_modules_sequences()
    - upgrade_grade_item_fix_sortorder()
    - upgrade_availability_item()
64
65
66
67
* A new parameter $ajaxformdata was added to the constructor for moodleform. When building a
  moodleform in a webservice or ajax script (for example using the new fragments API) we
  cannot allow the moodleform to parse it's own data from _GET and _POST - we must pass it as
  an array.
68
69
70
71
* Plugins can extend the navigation for user by declaring the following callback:
  <frankenstyle>_extend_navigation_user(navigation_node $parentnode, stdClass $user,
                                        context_user $context, stdClass $course,
                                        context_course $coursecontext)
72
* The function notify() now throws a debugging message - see MDL-50269.
73
74
75
* Ajax calls going through lib/ajax/* now validate the return values before sending
  the response. If the validation does not pass an exception is raised. This behaviour
  is consistent with web services.
76
77
* Several changes in Moodle core, standard plugins and third party libraries to
  ensure compatibility with PHP7. All plugins are recommended to perform testing
78
79
  against PHP7 as well. Refer to https://docs.moodle.org/dev/Moodle_and_PHP7 for more
  information. The following changes may affect you:
80
81
82
83
84
85
86
87
88
  * Class moodleform, moodleform_mod and some module classes have been changed to use
    __construct() for the constructor. Calling parent constructors by the class
    name will display debugging message. Incorrect: parent::moodleform(),
    correct: parent::__construct()
  * All form elements have also changed the constructor syntax. No changes are
    needed for using form elements, however if plugin defines new form element it
    needs to use correct syntax. For example, incorrect: parent::HTML_QuickForm_input(),
    HTML_QuickForm_input::HTML_QuickForm_input(), $this->HTML_QuickForm_input().
    Correct: HTML_QuickForm_input::__construct() or parent::__construct().
89
90
91
92
93
94
95
  * profile_field_base::profile_field_base() is deprecated, use parent::__construct()
    in custom profile fields constructors. Similar deprecations in exsiting
    profile_field_* classes.
  * user_filter_type::user_filter_type() is deprecated, use parent::__construct() in
    custom user filters. Similar deprecations in existing user_filter_* classes.
  * table_default_export_format_parent::table_default_export_format_parent() is
    deprecated, use parent::__construct() in extending classes.
96
97
98
* groups_delete_group_members() $showfeedback parameter has been removed and is no longer
  respected. Users of this function should output their own feedback if required.
* Number of changes to Tags API, see tag/upgrade.txt for more details
99
100
101
* The previous events API handlers are being deprecated in favour of events 2 API, debugging messages are being displayed if
  there are 3rd party plugins using it. Switch to events 2 API please, see https://docs.moodle.org/dev/Event_2#Event_dispatching_and_observers
  Note than you will need to bump the plugin version so moodle is aware that you removed the plugin's event handlers.
102
103
* mforms validation functions are not available in the global JS namespace anymore, event listeners
  are assigned to fields and buttons through a self-contained JS function.
104
105
* Added $CFG->urlrewriteclass option to config.php allowing clean / semantic urls to
  be implemented in a plugin, eg local_cleanurls.
106
107
108
109
* $CFG->pathtoclam global setting has been moved to clamav antivirus plugin setting of the same name.
* clam_message_admins() and get_clam_error_code() have been deprecated, its functionality
  is now a part of \antivirus_clamav\scanner class methods.
* \repository::antivir_scan_file() has been deprecated, \core\antivirus\manager::scan_file() that
110
  applies antivirus plugins is replacing its functionality.
111
* Added core_text::str_max_bytes() which safely truncates multi-byte strings to a maximum number of bytes.
112
* Zend Framework has been removed completely.
113
* Any plugin can report when a scale is being used with the callback function [pluginname]_scale_used_anywhere(int $scaleid).
114
* Changes in file_rewrite_pluginfile_urls: Passing a new option reverse = true in the $options var will make the function to convert
115
  actual URLs in $text to encoded URLs in the @@PLUGINFILE@@ form.
116
* behat_util::is_server_running() is removed, please use behat_util::check_server_status() instead.
117
118
* Behat\Mink\Selector\SelectorsHandler::xpathLiteral() method is deprecated use behat_context_helper::escape instead
  when building Xpath, or pass the unescaped value when using the named selector.',
119

120
121
=== 3.0 ===

122
* Minify updated to 2.2.1
123
* htmlpurifier upgraded to 4.7.0
124
* Less.php upgraded to 1.7.0.9
125
* The horde library has been updated to version 5.2.7.
126
* Google libraries (lib/google) updated to 1.1.5
127
* Html2Text library has been updated to the latest version of the library.
128
129
* External functions x_is_allowed_from_ajax() methods have been deprecated. Define 'ajax' => true in db/services.php instead.
* External functions can be called without a session if they define 'loginrequired' => true in db/services.php.
130
131
132
* All plugins are required to declare their frankenstyle component name via
  the $plugin->component property in their version.php file. See
  https://docs.moodle.org/dev/version.php for details (MDL-48494).
133
* PHPUnit is upgraded to 4.7. Some tests using deprecated assertions etc may need changes to work correctly.
134
* Users of the text editor API to manually create a text editor should call set_text before calling use_editor.
135
* Javascript - SimpleYUI and the Y instance used for modules have been merged. Y is now always the same instance of Y.
136
* get_referer() has been deprecated, please use the get_local_referer function instead.
137
* \core\progress\null is renamed to \core\progress\none for improved PHP7 compatibility as null is a reserved word (see MDL-50453).
138
139
* \webservice_xmlrpc_client now respects proxy server settings. If your XMLRPC server is available on your local network and not via your proxy server, you may need to add it to the list of proxy
  server exceptions in $CFG->proxybypass. See MDL-39353 for details.
140
141
142
143
144
145
146
147
148
* Group and groupings idnumbers can now be passed to and/or are returned from the following web services functions:
  ** core_group_external::create_groups
  ** core_group_external::get_groups
  ** core_group_external::get_course_groups
  ** core_group_external::create_groupings
  ** core_group_external::update_groupings
  ** core_group_external::get_groupings
  ** core_group_external::get_course_groupings
  ** core_group_external::get_course_user_groups
149
150
151
152
153
* Following functions are removed from core. See MDL-50049 for details.
    password_compat_not_supported()
    session_get_instance()
    session_is_legacy()
    session_kill_all()
154
155
    session_touch()
    session_kill()
156
157
158
159
160
161
162
163
164
    session_kill_user()
    session_set_user()
    session_is_loggedinas()
    session_get_realuser()
    session_loginas()
    js_minify()
    css_minify_css()
    update_login_count()
    reset_login_count()
165
    check_gd_version()
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
    update_log_display_entry()
    get_recent_enrolments()
    groups_filter_users_by_course_module_visible()
    groups_course_module_visible()
    error()
    formerr()
    editorhelpbutton()
    editorshortcutshelpbutton()
    choose_from_menu()
    update_event()
    get_generic_section_name()
    get_all_sections()
    add_mod_to_section()
    get_all_mods()
    get_course_section()
    format_weeks_get_section_dates()
    get_print_section_cm_text()
    print_section_add_menus()
    make_editing_buttons()
    print_section()
    print_overview()
    print_recent_activity()
    delete_course_module()
    update_category_button()
    make_categories_list()
    category_delete_move()
    category_delete_full()
    move_category()
    course_category_hide()
    course_category_show()
    get_course_category()
    create_course_category()
    get_all_subcategories()
    get_child_categories()
    get_categories()
    print_course_search()
    print_my_moodle()
    print_remote_course()
    print_remote_host()
    print_whole_category_list()
    print_category_info()
207
    get_course_category_tree()
208
209
210
211
    print_courses()
    print_course()
    get_category_courses_array()
    get_category_courses_array_recursively()
212
    blog_get_context_url()
213
214
215
216
217
218
219
    get_courses_wmanagers()
    convert_tree_to_html()
    convert_tabrows_to_tree()
    can_use_rotated_text()
    get_parent_contexts()
    get_parent_contextid()
    get_child_contexts()
220
    create_contexts()
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
    cleanup_contexts()
    build_context_path()
    rebuild_contexts()
    preload_course_contexts()
    context_moved()
    fetch_context_capabilities()
    context_instance_preload()
    get_contextlevel_name()
    print_context_name()
    mark_context_dirty()
    delete_context()
    get_context_url()
    get_course_context()
    get_user_courses_bycap()
    get_role_context_caps()
    get_courseid_from_context()
    context_instance_preload_sql()
    get_related_contexts_string()
    get_plugin_list_with_file()
    check_browser_operating_system()
    check_browser_version()
    get_device_type()
    get_device_type_list()
    get_selected_theme_for_device_type()
    get_device_cfg_var_name()
246
    set_user_device_type()
247
248
249
250
251
252
253
254
255
256
    get_user_device_type()
    get_browser_version_classes()
    generate_email_supportuser()
    badges_get_issued_badge_info()
    can_use_html_editor()
    enrol_cohort_get_cohorts()
    enrol_cohort_can_view_cohort()
    cohort_get_visible_list()
    enrol_cohort_enrol_all_users()
    enrol_cohort_search_cohorts()
257
* The never unused webdav_locks table was dropped.
258
259
* The actionmenu hideMenu() function now expects an EventFacade object to be passed to it,
  i.e. a call to M.core.actionmenu.instance.hideMenu() should be change to M.core.actionmenu.instance.hideMenu(e)
260
* In the html_editors (tinyMCE, Atto), the manage files button can be hidden by changing the 'enable_filemanagement' option to false.
261
* external_api::validate_context now is public, it can be called from other classes.
262
263
* rss_error() now supports returning of correct HTTP status of error and will return '404 Not Found'
  unless other status is specified.
264
265
* Plugins can extend the navigation for categories settings by declaring the following callback:
  <frankenstyle>_extend_navigation_category_settings(navigation_node, context_coursecat)
266
267
* The clilib.php provides two new functions cli_write() and cli_writeln() that should be used for outputting texts from the command
  line interface scripts.
268
269
* External function core_course_external::get_course_contents returned parameter "name" has been changed to PARAM_RAW,
  this is because the new external_format_string function may return raw data if the global moodlewssettingraw parameter is used.
270
* Function is_web_crawler() has been deprecated, please use core_useragent::is_web_crawler() instead.
271

272
273
274
275
276
=== 2.9.1 ===

* New methods grade_grade::get_grade_max() and get_grade_min() must be used rather than directly the public properties rawgrademax and rawgrademin.
* New method grade_item::is_aggregate_item() indicates when a grade_item is an aggreggated type grade.

277
278
=== 2.9 ===

279
* The default home page for users has been changed to the dashboard (formely my home). See MDL-45774.
280
* Support for rendering templates from php or javascript has been added. See MDL-49152.
281
* Support for loading AMD javascript modules has been added. See MDL-49046.
282
* Webservice core_course_delete_courses now return warning messages on any failures and does not try to rollback the entire deletion.
283
* \core\event\course_viewed 'other' argument renamed from coursesectionid to coursesectionnumber as it contains the section number.
284
* New API core_filetypes::add_type (etc.) allows custom filetypes to be added and modified.
285
286
287
* PHPUnit: PHPMailer Sink is now started for all tests and is setup within the phpunit wrapper for advanced tests.
  Catching debugging messages when sending mail will no longer work. Use $sink = $this->redirectEmails(); and then check
  the message in the sink instead.
288
* The file pluginlib.php was deprecated since 2.6 and has now been removed, do not include or require it.
289
* \core_component::fetch_subsystems() now returns a valid path for completion component instead of null.
290
* Deprecated JS global methods have been removed (show_item, destroy_item, hide_item, addonload, getElementsByTagName, findChildNodes).
291
292
293
* For 3rd party plugin specific environment.xml files, it's now possible to specify version independent checks by using the
  <PLUGIN name="component_name"> tag instead of the version dependent <MOODLE version="x.y"> one. If the PLUGIN tag is used any
  Moodle specific tags will be ignored.
294
* html_table: new API for adding captions to tables (new field, $table->caption) and subsequently hiding said captions from sighted users using accesshide (enabled using $table->captionhide).
295
296
* The authorization procedure in the mdeploy.php script has been improved. The script
  now relies on the main config.php when deploying an available update.
297
* sql_internal_reader and sql_select_reader interfaces have been deprecated in favour of sql_internal_table_reader
298
  and sql_reader which use iterators to be more memory efficient.
299
300
* $CFG->enabletgzbackups setting has been removed as now backups are stored internally using .tar.gz format by default, you can
  set $CFG->usezipbackups to store them in zip format. This does not affect the restore process, which continues accepting both.
301
302
* Added support for custom string manager implementations via $CFG->customstringmanager
  directive in the config.php. See MDL-49361 for details.
303
* Add new make_request_directory() for creation of per-request files.
304
305
306
307
* Added generate_image_thumbnail_from_string. This should be used instead of generate_image_thumbnail when the source is a string.
  This prevents the need to write files to disk unnecessarily.
* Added generate_image_thumbnail to stored_file class. This should be used when generating thumbnails for stored files.
  This prevents the need to write files to disk unnecessarily.
308
* Removed pear/HTTP/WebDav. See MDL-49534 for details.
309
* Use standard PHP date time classes and methods - see new core_date class for timezone normalisation methods.
310
311
* Moved lib/google/Google/ to lib/google/src/Google. This is to address autoloader issues with Google's provided autoloader
  for the library. See MDL-49519 for details.
312
313
* The outdated lib/google/Google_Client.php and related files have been completely removed. To use
  the new client, read lib/google/readme_moodle.txt, please.
314
* profile_display_badges() has been deprecated. See MDL-48935 for details.
315
316
* Added a new method add_report_nodes() to pagelib.php. If you are looking to add links to the user profile page under the heading "Reports"
  then please use this function to ensure that the breadcrumb and navigation block are created properly for all user profile pages.
317
318
* process_new_icon() now does not always return a PNG file. When possible, it will try to keep the format of the original file.
  Set the new argument $preferpng to true to force PNG. See MDL-46763 and MDL-50041 for details.
319

320
321
=== 2.8 ===

322
323
324
325
326
327
* Gradebook grade category option "aggregatesubcats" has been removed completely.
  This means that the database column is removed, the admin settings are removed and
  the properties from the grade_category object have been removed. If any courses were
  found to be using this setting, a warning to check the grades will be shown in the
  course grader report after upgrading the site. The same warning will be shown on
  courses restored from backup that had this setting enabled (see MDL-47503).
328
* lib/excelllib.class.php has been updated. The class MoodleExcelWorkbook will now only produce excel 2007 files.
329
330
331
* renderers: We now remove the suffix _renderable when looking for a render method for a renderable.
  If you have a renderable class named like "blah_renderable" and have a method on a renderer named "render_blah_renderable"
  you will need to change the name of your render method to "render_blah" instead, as renderable at the end is no longer accepted.
332
333
334
335
336
* New functions get_course_and_cm_from_cmid($cmorid, $modulename) and
  get_course_and_cm_from_instance($instanceorid, $modulename) can be used to
  more efficiently load these basic data objects at the start of a script.
* New function cm_info::create($cm) can be used when you need a cm_info
  object, but have a $cm which might only be a standard database record.
337
* $CFG->enablegroupmembersonly no longer exists.
338
339
340
* Scheduled tasks have gained support for syntax to introduce variability when a
  task will run across installs. When a when hour or minute are defined as 'R'
  they will be installed with a random hour/minute value.
341
342
343
* Several classes grade_edit_tree_column_xxx were removed since grades setup page
  has been significantly changed. These classes should not be used outside of
  gradebook or developers can copy them into their plugins from 2.7 branch.
344
345
346
* Google APIs Client Library (lib/google/) has been upgraded to 1.0.5-beta and
  API has changed dramatically without backward compatibility. Any code accessing
  it must be amended. It does not apply to lib/googleapi.php. See MDL-47297
347
348
* Added an extra parameter to the function get_formatted_help_string() (default null) which is used to specify
  additional string parameters.
349
* User settings node and course node in navigation now support callbacks from admin tools.
350
* grade_get_grades() optional parameteres $itemtype, $itemmodule, $iteminstance are now required.
351

352
353
DEPRECATIONS:
* completion_info->get_incomplete_criteria() is deprecated and will be removed in Moodle 3.0.
354
* grade_category::aggregate_values() is deprecated and will be removed in Moodle 3.0.
355
356
357
358
359
360
361
362
363
364
365
* groups_filter_users_by_course_module_visible() is deprecated; replace with
  core_availability\info::filter_user_list. Will be removed in Moodle 3.0.
* groups_course_module_visible() is deprecated; replace with $cm->uservisible.
* cm_info property $cm->groupmembersonly is deprecated and always returns 0.
  Use core_availability\info::filter_user_list if trying to determine which
  other users can see an activity.
* cm_info method $cm->is_user_access_restricted_by_group() is deprecated and
  always returns false. Use $cm->uservisible to determine whether the user can
  access the activity.
* Constant FEATURE_GROUPMEMBERSONLY (used in module _supports functions) is
  deprecated.
366
367
* cohort_get_visible_list() is deprecated. There is a better function cohort_get_available_cohorts()
  that respects user capabilities to view cohorts.
368
369
370
* enrol_cohort_get_cohorts() and enrol_cohort_search_cohorts() are deprecated since
  functionality is removed. Please use cohort_get_available_cohorts()
* enrol_cohort_enrol_all_users() is deprecated; enrol_manual is now responsible for this action
371
* enrol_cohort_can_view_cohort() is deprecated; replace with cohort_can_view_cohort()
372

373
=== 2.6.4 / 2.7.1 ===
374

375
376
377
378
379
380
381
382
* setnew_password_and_mail() and update_internal_user_password() will trigger
  \core\event\user_password_updated. Previously they used to generate
  \core\event\user_updated event.
* update_internal_user_password() accepts optional boolean $fasthash for fast
  hashing.
* user_update_user() and user_create_user() api's accept optional param
  $triggerevent to avoid respective events to be triggred from the api's.

383
384
=== 2.7 ===

385
* PHPUnit cannot be installed via PEAR any more, please use composer package manager instead.
386
387
* $core_renderer->block_move_target() changed to support more verbose move-block-here descriptions.

388
389
390
Events and Logging:
* Significant changes in Logging API. For upgrading existing events_trigger() and
  add_to_log() see http://docs.moodle.org/dev/Migrating_logging_calls_in_plugins
391
  For accessing logs from plugins see http://docs.moodle.org/dev/Migrating_log_access_in_reports
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
* The validation of the following events is now stricter (see MDL-45445):
    - \core\event\blog_entry_created
    - \core\event\blog_entry_deleted
    - \core\event\blog_entry_updated
    - \core\event\cohort_member_added
    - \core\event\cohort_member_removed
    - \core\event\course_category_deleted
    - \core\event\course_completed
    - \core\event\course_content_deleted
    - \core\event\course_created
    - \core\event\course_deleted
    - \core\event\course_restored
    - \core\event\course_section_updated (see MDL-45229)
    - \core\event\email_failed
    - \core\event\group_member_added
    - \core\event\group_member_removed
    - \core\event\note_created
    - \core\event\note_deleted
    - \core\event\note_updated
    - \core\event\role_assigned
    - \core\event\role_deleted
    - \core\event\role_unassigned
    - \core\event\user_graded
    - \core\event\user_loggedinas
    - \core\event\user_profile_viewed
    - \core\event\webservice_token_created
418

419
DEPRECATIONS:
420
* $module uses in mod/xxx/version.php files is now deprecated. Please use $plugin instead. It will be removed in Moodle 2.10.
421
* Update init methods in all event classes - "level" property was renamed to "edulevel", the level property is now deprecated.
422
* Abstract class \core\event\course_module_instances_list_viewed is deprecated now, use \core\event\instances_list_viewed instead.
423
* Abstract class core\event\content_viewed has been deprecated. Please extend base event or other relevant abstract class.
424
425
426
427
428
* mod_book\event\instances_list_viewed has been deprecated. Please use mod_book\event\course_module_instance_list_viewed instead.
* mod_chat\event\instances_list_viewed has been deprecated. Please use mod_chat\event\course_module_instance_list_viewed instead.
* mod_choice\event\instances_list_viewed has been deprecated. Please use mod_choice\event\course_module_instance_list_viewed instead.
* mod_feedback\event\instances_list_viewed has been deprecated. Please use mod_feedback\event\course_module_instance_list_viewed instead.
* mod_page\event\instances_list_viewed has been deprecated. Please use mod_page\event\course_module_instance_list_viewed instead.
429
* The constants FRONTPAGECOURSELIST, FRONTPAGETOPICONLY & FRONTPAGECOURSELIMIT have been removed.
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
* Conditional availability API has moved and changed. The condition_info class is
  replaced by \core_availability\info_module, and condition_info_section by
  \core_availability\info_section. (Code that uses the old classes will generally
  still work.)
* coursemodule_visible_for_user() has been deprecated but still works - replaced
  by a new static function \core_availability\info_module::is_user_visible()
* cm_info::is_user_access_restricted_by_conditional_access has been deprecated
  but still works (it has never done what its name suggests, and is
  unnecessary).
* cm_info and section_info property showavailability has been deprecated, but
  still works (with the caveat that this information is now per-user).
* cm_info and section_info properties availablefrom and availableuntil have been
  deprecated and always return zero (underlying data doesn't have these values).
* section_info property groupingid has been deprecated and always returns zero,
  same deal.
445
446
* Various cm_info methods have been deprecated in favour of their read-only properties (get_url(), get_content(), get_extra_classes(),
  get_on_click(), get_custom_data(), get_after_link, get_after_edit_icons)
447
* The ajaxenabled function has been deprecated and always returns true. All code should be fully functional in Javascript.
448
* count_login_failures() has been deprecated, use user_count_login_failures() instead. Refer MDL-42891 for details.
449

450
451
452
453
454
455
Conditional availability (activities and sections):
* New conditional availability API in /availability, including new availability
  condition plugins in /availability/condition. The new API is very similar with
  regard to checking availability, but any code that modifies availability settings
  for an activity or section is likely to need substantial changes.

456
457
458
459
460
YUI:
  * The lightbox attribute for moodle-core-notification-dialogue has been
    deprecated and replaced by the modal attribute. This was actually
    changed in Moodle 2.2, but has only been marked as deprecated now. It
    will be removed in Moodle 2.9.
461
462
  * When destroying any type of dialogue based on moodle-core-notification, the relevant content is also removed from
    the DOM. Previously it was left orphaned.
463

464
465
466
JavaSript:
    * The findChildNodes global function has been deprecated. Y.all should
      be used instead.
467
468
469
    * The callback argument to confirm_action and M.util.show_confirm_dialog has been deprecated. If you need to write a
      confirmation which includes a callback, please use moodle-core-notification-confirmation and attach callbacks to the
      events provided.
470

471
* New locking api and admin settings to configure the system locking type.
472
473
474
* New "Time spent waiting for the database" performance metric displayed along with the
  other MDL_PERF vars; the change affects both the error logs and the vars displayed in
  the page footer.
475
476
* Changes in the tag API. The component and contextid are now saved when assigning tags to an item. Please see
  tag/upgrade.txt for more information.
477

478
=== 2.6 ===
479

480
* Use new methods from core_component class instead of get_core_subsystems(), get_plugin_types(),
481
482
483
484
  get_plugin_list(), get_plugin_list_with_class(), get_plugin_directory(), normalize_component(),
  get_component_directory() and get_plugin_list_with_file(). The names of the new methods are
  exactly the same, the only differences are that core_component::get_plugin_types() now always returns
  full paths and core_component::get_plugin_list() does not accept empty parameter any more.
485
* Use core_text::* instead of textlib:: and also core_collator::* instead of collatorlib::*.
486
* Use new function moodleform::mock_submit() to simulate form submission in unit tests (backported).
487
* New $CFG->localcachedir setting useful for cluster nodes. Admins have to update X-Sendfile aliases if used.
488
489
* MS SQL Server drivers are now using NVARCHAR(MAX) instead of NTEXT and VARBINARY(MAX) instead of IMAGE,
  this change should be fully transparent and it should help significantly with add-on compatibility.
490
491
* The string manager classes were renamed. Note that they should not be modified or used directly,
  always use get_string_manager() to get instance of the string manager.
492
* The ability to use an 'insecure' rc4encrypt/rc4decrypt key has been removed.
493
494
* Use $CFG->debugdeveloper instead of debugging('', DEBUG_DEVELOPER).
* Use set_debugging(DEBUG_xxx) when changing debugging level for current request.
495
* Function moveto_module() does not modify $mod argument and instead now returns the new module visibility value.
496
497
* Use behat_selectors::get_allowed_text_selectors() and behat_selectors::get_allowed_selectors() instead of
  behat_command::$allowedtextselectors and behat_command::$allowedselectors
498
* Subplugins are supported in admin tools and local plugins.
499
500
501
* file_packer/zip_packer API has been modified so that key functions support a new file_progress interface
  to report progress during long operations. Related to this, zip_archive now supports an estimated_count()
  function that returns an approximate number of entries in the zip faster than the count() function.
502
* Class cm_info no longer extends stdClass. All properties are read-only and calculated on first request only.
503
* Class course_modinfo no longer extends stdClass. All properties are read-only.
504
505
506
507
508
* Database fields modinfo and sectioncache in table course are removed. Application cache core/coursemodinfo
  is used instead. Course cache is still reset, rebuilt and retrieved using function rebuild_course_cache() and
  get_fast_modinfo(). Purging all caches and every core upgrade purges course modinfo cache as well.
  If function get_fast_modinfo() is called for multiple courses make sure to include field cacherev in course
  object.
509
510
511
* Internal (noreply and support) user support has been added for sending/receiving message.
  Use core_user::get_noreply_user() and core_user::get_support_user() to get noreply and support user's respectively.
  Real users can be used as noreply/support users by setting $CFG->noreplyuserid and $CFG->supportuserid
512
* New function readfile_allow_large() in filelib.php for use when very large files may need sending to user.
513
* Use core_plugin_manager::reset_caches() when changing visibility of plugins.
514
515
* Implement new method get_enabled_plugins() method in subplugin info classes.
* Each plugin should include version information in version.php.
516
* Module and block tables do not contain version column any more, use get_config('xx_yy', 'version') instead.
517
* $USER->password field is intentionally unset so that session data does not contain password hashes.
518
* Use core_shutdown_manager::register_function() instead of register_shutdown_function().
519
520
521
522
523
* New file packer for .tar.gz files; obtain by calling get_file_packer('application/x-gzip'). Intended initially
  for use in backup/restore only, as there are limitations on supported filenames. Also new packer for
  backups which supports both compression formats; get_file_packer('application/vnd.moodle.backup').
* New optional parameter to stored_file::get_content_file_handle to open file handle with 'gzopen' instead
  of 'fopen' to read gzip-compressed files if required.
524
* update_internal_user_password() and setnew_password_and_mail() now trigger user_updated event.
525
* Add thirdpartylibs.xml file to plugins that bundle any 3rd party libraries.
526
527
528
* New class introduced to help auto generate zIndex values for modal dialogues. Class "moodle-has-zindex"
  should set on any element which uses a non-default zindex and needs to ensure it doesn't show above a
  dialogue.
529
530
* $CFG->filelifetime is now used consistently for most file serving operations, the default was lowered
  to 6 hours from 24 hours because etags and x-sendfile support should make file serving less expensive.
531
532
* Date format locale charset for windows server will come from calendar type and for gregorian it will use
  lang file.
533
534
535
* The library to interact with Box.net (class boxclient) is only compatible with their APIv1 which
  reaches its end of life on the 14th of Dec. You should migrate your scripts to make usage of the
  new class boxnet_client(). Note that the method names and return values have changed.
536
537
* Settings pages are now possible for Calendar type plugins. Calendar type plugins that require a settings page to
  work properly will need to set their requires version to a number that is equal to or grater than the 2.6.1 release version.
538
539
540
* The admin/tool/generator tool was overhauled to use testing data generators and the previous interface to create
  test data was removed (it was not working correctly anyway). If you were using this tool you will probably need to
  update your code.
541
542
543
544
545
546

DEPRECATIONS:
Various previously deprecated functions have now been altered to throw DEBUG_DEVELOPER debugging notices
and will be removed in a future release (target: 2.8), a summary follows:

Accesslib:
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
    * get_context_instance()                ->  context_xxxx::instance()
    * get_context_instance_by_id()          ->  context::instance_by_id($id)
    * get_system_context()                  ->  context_system::instance()
    * context_moved()                       ->  context::update_moved()
    * preload_course_contexts()             ->  context_helper::preload_course()
    * context_instance_preload()            ->  context_helper::preload_from_record()
    * context_instance_preload_sql()        ->  context_helper::get_preload_record_columns_sql()
    * get_contextlevel_name()               ->  context_helper::get_level_name()
    * create_contexts()                     ->  context_helper::create_instances()
    * cleanup_contexts()                    ->  context_helper::cleanup_instances()
    * build_context_path()                  ->  context_helper::build_all_paths()
    * print_context_name()                  ->  $context->get_context_name()
    * mark_context_dirty()                  ->  $context->mark_dirty()
    * delete_context()                      ->  $context->delete_content() or context_helper::delete_instance()
    * get_context_url()                     ->  $context->get_url()
    * get_course_context()                  ->  $context->get_course_context()
    * get_parent_contexts()                 ->  $context->get_parent_context_ids()
    * get_parent_contextid()                ->  $context->get_parent_context()
    * get_child_contexts()                  ->  $context->get_child_contexts()
    * rebuild_contexts()                    ->  $context->reset_paths()
    * get_user_courses_bycap()              ->  enrol_get_users_courses()
    * get_courseid_from_context()           ->  $context->get_course_context(false)
    * get_role_context_caps()               ->  (no replacement)
    * load_temp_role()                      ->  (no replacement)
    * remove_temp_roles()                   ->  (no replacement)
    * get_related_contexts_string()         ->  $context->get_parent_context_ids(true)
    * get_recent_enrolments()               ->  (no replacement)
574
575

Enrollment:
576
577
    * get_course_participants()             -> get_enrolled_users()
    * is_course_participant()               -> is_enrolled()
578
579

Output:
580
581
582
583
584
585
586
587
588
589
590
591
    * current_theme()                       -> $PAGE->theme->name
    * skip_main_destination()               -> $OUTPUT->skip_link_target()
    * print_container()                     -> $OUTPUT->container()
    * print_container_start()               -> $OUTPUT->container_start()
    * print_container_end()                 -> $OUTPUT->container_end()
    * print_continue()                      -> $OUTPUT->continue_button()
    * print_header()                        -> $PAGE methods
    * print_header_simple()                 -> $PAGE methods
    * print_side_block()                    -> $OUTPUT->block()
    * print_arrow()                         -> $OUTPUT->arrow()
    * print_scale_menu_helpbutton()         -> $OUTPUT->help_icon_scale($courseid, $scale)
    * print_checkbox()                      -> html_writer::checkbox()
592
593

Navigation:
594
595
596
    * print_navigation()                    -> $OUTPUT->navbar()
    * build_navigation()                    -> $PAGE->navbar methods
    * navmenu()                             -> (no replacement)
597
598
    * settings_navigation::
          get_course_modules()              -> (no replacement)
599

600
601
602
Files and repositories:
    * stored_file::replace_content_with()   -> stored_file::replace_file_with()
    * stored_file::set_filesize()           -> stored_file::replace_file_with()
603
604
605
606
607
608
609
    * stored_file::get_referencelifetime()  -> (no replacement)
    * repository::sync_external_file()      -> see repository::sync_reference()
    * repository::get_file_by_reference()   -> repository::sync_reference()
    * repository::
          get_reference_file_lifetime()     -> (no replacement)
    * repository::sync_individual_file()    -> (no replacement)
    * repository::reset_caches()            -> (no replacement)
610

611
Calendar:
612
613
614
615
616
    * add_event()                           -> calendar_event::create()
    * update_event()                        -> calendar_event->update()
    * delete_event()                        -> calendar_event->delete()
    * hide_event()                          -> calendar_event->toggle_visibility(false)
    * show_event()                          -> calendar_event->toggle_visibility(true)
617
618

Misc:
619
620
621
622
623
624
    * filter_text()                         -> format_text(), format_string()...
    * httpsrequired()                       -> $PAGE->https_required()
    * detect_munged_arguments()             -> clean_param([...], PARAM_FILE)
    * mygroupid()                           -> groups_get_all_groups()
    * js_minify()                           -> core_minify::js_files()
    * css_minify_css()                      -> core_minify::css_files()
625
    * course_modinfo::build_section_cache() -> (no replacement)
626
    * generate_email_supportuser()          -> core_user::get_support_user()
627

628
629
630
631
632
633
634
635
636
637
638
639
Sessions:
    * session_get_instance()->xxx()         -> \core\session\manager::xxx()
    * session_kill_all()                    -> \core\session\manager::kill_all_sessions()
    * session_touch()                       -> \core\session\manager::touch_session()
    * session_kill()                        -> \core\session\manager::kill_session()
    * session_kill_user()                   -> \core\session\manager::kill_user_sessions()
    * session_gc()                          -> \core\session\manager::gc()
    * session_set_user()                    -> \core\session\manager::set_user()
    * session_is_loggedinas()               -> \core\session\manager::is_loggedinas()
    * session_get_realuser()                -> \core\session\manager::get_realuser()
    * session_loginas()                     -> \core\session\manager::loginas()

640
641
642
643
644
645
646
647
648
649
User-agent related functions:
    * check_browser_operating_system()      -> core_useragent::check_browser_operating_system()
    * check_browser_version()               -> core_useragent::check_browser_version()
    * get_device_type()                     -> core_useragent::get_device_type()
    * get_device_type_list()                -> core_useragent::get_device_type_list()
    * get_selected_theme_for_device_type()  -> core_useragent::get_device_type_theme()
    * get_device_cfg_var_name()             -> core_useragent::get_device_type_cfg_var_name()
    * set_user_device_type()                -> core_useragent::set_user_device_type()
    * get_user_device_type()                -> core_useragent::get_user_device_type()
    * get_browser_version_classes()         -> core_useragent::get_browser_version_classes()
650

651
652
YUI:
    * moodle-core-notification has been deprecated with a recommendation of
653
      using its subclasses instead. This is to allow for reduced page
654
655
656
657
658
659
660
      transport costs. Current subclasses include:
      * dialogue
      * alert
      * confirm
      * exception
      * ajaxexception

661
662
663
664
Event triggering and event handlers:
    * All existing events and event handlers should be replaced by new
      event classes and matching new event observers.
    * See http://docs.moodle.org/dev/Event_2 for more information.
665
666
667
668
669
670
    * The following events will be entirely removed, though they can still
      be captured using handlers, but they should not be used any more.
      * groups_members_removed          -> \core\event\group_member_removed
      * groups_groupings_groups_removed -> (no replacement)
      * groups_groups_deleted           -> \core\event\group_deleted
      * groups_groupings_deleted        -> \core\event\grouping_deleted
671
    * edit_module_post_actions() does not trigger events any more.
672

673
674
675
676
677
=== 2.5.1 ===

* New get_course() function for use when obtaining the course record from database. Will
  reuse existing $COURSE or $SITE globals if possible to improve performance.

678
679
=== 2.5 ===

680
681
682
* The database drivers (moodle_database and subclasses) aren't using anymore the ::columns property
  for caching database metadata. MUC (databasemeta) is used instead. Any custom DB driver should
  apply for that change.
683
684
* The cron output has been changed to include time and memory usage (see cron_trace_time_and_memory()),
  so any custom utility relying on the old output may require modification.
685
686
687
688
* Function get_max_file_sizes now returns an option for (for example) "Course limit (500MB)" or
  "Site limit (200MB)" when appropriate with the option set to 0. This function no longer returns
  an option for 0 bytes. Existing code that was replacing the 0 option in the return
  from this function with a more sensible message, can now use the return from this function directly.
689
* Functions responsible for output in course/lib.php are deprecated, the code is moved to
690
691
  appropriate renderers: print_section(), print_section_add_menus(), get_print_section_cm_text(),
  make_editing_buttons()
692
693
  See functions' phpdocs in lib/deprecatedlib.php
* Function get_print_section_cm_text() is deprecated, replaced with methods in cm_info
694
695
* zip_packer may create empty zip archives, there is a new option to ignore
  problematic files when creating archive
696
697
698
699
700
* The function delete_course_module was deprecated and has been replaced with
  course_delete_module. The reason for this was because the function delete_course_module
  only partially deletes data, so wherever it was called extra code was needed to
  perform the whole deletion process. The function course_delete_module now takes care
  of the whole process.
701
702
703
* curl::setopt() does not accept constant values any more. As it never worked properly,
  we decided to make the type check stricter. Now, the keys of the array pass must be a string
  corresponding to the curl constant name.
704
705
706
* Function get_users_listing now return list of users except guest and deleted users. Previously
  deleted users were excluded by get_users_listing. As guest user is not expected while browsing users,
  and not included in get_user function, it will not be returned by get_users_listing.
707
708
* The add_* functions in course/dnduploadlib.php have been deprecated. Plugins should be using the
  MODNAME_dndupload_register callback instead.
709
710
711
* The signature of the add() method of classes implementing the parentable_part_of_admin_tree
  interface (such as admin_category) has been extended. The new parameter allows the caller
  to prepend the new node before an existing sibling in the admin tree.
712
713
714
* condition_info:get_condition_user_fields($formatoptions) now accepts the optional
  param $formatoptions, that will determine if the field names are processed by
  format_string() with the passed options.
715
* remove all references to $CFG->gdversion, GD PHP extension is now required
716
717
* Formslib will now throw a developer warning if a PARAM_ type hasn't been set for elements which
  need it. Please set PARAM_RAW explicitly if you do not want any cleaning.
718
* Functions responsible for managing and accessing course categories are moved to class coursecat
719
720
  in lib/coursecatlib.php, functions responsible for rendering courses and categories lists are
  moved to course/renderer.php. The following global functions are deprecated: make_categories_list(),
721
  category_delete_move(), category_delete_full(), move_category(), course_category_hide(),
722
  course_category_show(), get_course_category(), create_course_category(), get_all_subcategories(),
723
724
725
726
727
  get_child_categories(), get_categories(), print_my_moodle(), print_remote_course(),
  print_remote_host(), print_whole_category_list(), print_category_info(), get_course_category_tree(),
  print_courses(), print_course(), get_category_courses_array(), get_category_courses_array_recursively(),
  get_courses_wmanagers()
  See http://docs.moodle.org/dev/Courses_lists_upgrade_to_2.5
728
* $core_renderer->block_move_target() changed to support more verbose move-block-here descriptions.
729
730
731
* Additional (optional) param $onlyactive has been added to get_enrolled_users, count_enrolled_users
  functions to get information for only active (excluding suspended enrolments) users. Included two
  helper functions extract_suspended_users, get_suspended_userids to extract suspended user information.
732
* The core_plugin_manager class now provides two new helper methods for getting information
733
  about known plugins: get_plugins_of_type() and get_subplugins_of_plugin().
734
* The get_uninstall_url() method of all subclasses of \core\plugininfo\base class is now expected
735
736
737
738
739
740
  to always return moodle_url. Subclasses can use the new method is_uninstall_allowed()
  to control the availability of the 'Uninstall' link at the Plugins overview page (previously
  they would do it by get_uninstall_url() returning null). By default, URL to a new general plugin
  uninstall tool is returned. Unless the plugin type needs extra steps that can't be handled by
  plugininfo_xxx::uninstall() method or xmldb_xxx_uninstall() function, this default URL should
  satisfy all plugin types.
741

742
Database (DML) layer:
743
744
* $DB->sql_empty() is deprecated, you have to use sql parameters with empty values instead,
  please note hardcoding of empty strings in SQL queries breaks execution in Oracle database.
745
746
* Indexes must not be defined on the same columns as keys, this is now reported as fatal problem.
  Please note that internally we create indexes instead of foreign keys.
747

748
749
750
751
752
YUI changes:
* M.util.help_icon has been deprecated. Code should be updated to use moodle-core-popuphelp
  instead. To do so, remove any existing JS calls to M.util.help_icon from your PHP and ensure
  that your help link is placed in a span which has the class 'helplink'.

753
754
755
756
=== 2.4 ===

* Pagelib: Numerous deprecated functions were removed as classes page_base, page_course
  and page_generic_activity.
757
* use $CFG->googlemapkey3 instead of removed $CFG->googlemapkey and migrate to Google Maps API V3
758
* Function settings_navigation::add_course_editing_links() is completely removed
759
760
761
762
* function global_navigation::format_display_course_content() is removed completely (the
  functionality is moved to course format class)
* in the function global_navigation::load_generic_course_sections() the argument $courseformat is
  removed
763
764
765
766
* New component and itemid columns in groups_members table - this allows plugin to create protected
  group memberships using 'xx_yy_allow_group_member_remove' callback and there is also a new restore
  callback 'xx_yy_restore_group_member()'.
* New general role assignment restore plugin callback 'xx_yy_restore_role_assignment()'.
767
768
* functions get_generic_section_name(), get_all_sections(), add_mod_to_section(), get_all_mods()
  are deprecated. See their phpdocs in lib/deprecatedlib.php on how to replace them
769

770
771
YUI changes:
* moodle-enrol-notification has been renamed to moodle-core-notification
772
* YUI2 code must now use 2in3, see http://yuilibrary.com/yui/docs/yui/yui-yui2.html
773
774
* M.util.init_select_autosubmit() and M.util.init_url_select() have been deprecated. Code using this should be updated
  to use moodle-core-formautosubmit
775

776
777
778
779
780
Unit testing changes:
* output debugging() is not sent to standard output any more,
  use $this->assertDebuggingCalled(), $this->assertDebuggingNotCalled(),
  $this->getDebuggingMessages() or $this->assertResetDebugging() instead.

781
782
783
784
785
=== 2.3 ===

Database layer changes:
* objects are not allowed in paramters of DML functions, use explicit casting to strings if necessary

786
787
788
Note:
* DDL and DML methods which were deprecated in 2.0 have now been removed, they will no longer produce
debug messages and will produce fatal errors
789

790
API changes:
791

792
* send_stored_file() has changed its interface
793
* deleted several resourcelib_embed_* functions from resourcelib.php
794

795
796
797
798
799
800
801
802
=== 2.2 ===

removed unused libraries:
* odbc, base32, CodeSniffer, overlib, apd profiling, kses, Smarty, PEAR Console, swfobject, cssshover.htc, md5.js

API changes:
* new admin/tool plugin type
* new context API - old API is still available
803
* deleted users do not have context any more
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
* removed global search


=== 2.1 ===

API changes:
* basic suport for restore from 1.9
* new mobile devices API
* new questions API


=== 2.0 ===

API changes:
* new DML API - http://docs.moodle.org/dev/DML_functions
* new DDL API - http://docs.moodle.org/dev/DDL_functions
* new file API - http://docs.moodle.org/dev/File_API
* new $PAGE and $OUTPUT API
* new navigation API
* new theme API - http://docs.moodle.org/dev/Theme_changes_in_2.0
* new javascript API - http://docs.moodle.org/dev/JavaScript_usage_guide
* new portfolio API
* new local plugin type
* new translation support - http://lang.moodle.org
* new web service API
* new cohorts API
* new messaging API
* new rating API
* new comment API
* new sessions API
* new enrolment API
* new backup/restore API
* new blocks API
* new filters API
* improved plugin support (aka Frankenstyle)
* new registration and hub API
* new course completion API
* new plagiarism API
* changed blog API
* new text editor API
844
* new my moodle and profiles API