| Review |
Upgrade |
Description |
| Module Info / Install |
 |
 |
Module .info files must now specify all loadable code files explicitly |
 |
 |
Update functions in .install files must include a Doxygen style comment |
 |
 |
Add Doxygen @file tag to all install files |
 |
 |
Module .info files can now optionally specify the version number of the module it depends on |
 |
 |
.module file available during install |
 |
 |
Update hooks now return strings or throw exceptions, and update_sql() is no more |
 |
 |
Info file should specify core = 7.x (This is not listed on the chronological page.) |
 |
 |
New update dependency system, affecting the order in which module updates are run |
 |
 |
Module .info files can have configure line |
 |
 |
Database schema (un)installed automatically |
 |
 |
Schema descriptions are no longer translated |
 |
 |
Schema descriptions are now plain text instead of HTML |
| System |
 |
 |
Use absolute path (constructed from DRUPAL_ROOT) when including a file |
 |
 |
Module .info files must now specify all loadable code files explicitly |
| N/A |
N/A |
drupal_set_session() replaces $_SESSION [NEEDS UPDATE] |
 |
 |
Default parameter when getting variables |
 |
 |
Use defined constant REQUEST_TIME instead of time() |
 |
 |
Rebuild functions have changed names |
 |
 |
New hooks: hook_modules_installed, hook_modules_enabled, hook_modules_disabled, and hook_modules_uninstalled |
 |
 |
drupal_uninstall_module() is now drupal_uninstall_modules() |
 |
 |
Use module_implements not module_list when calling hook implementations |
 |
 |
Parameters for drupal_http_request() have changed |
 |
 |
Moved statistics settings from admin/reports/settings to admin/settings/statistics admin/config/system/statistics and added a new 'administer statistics' permission |
 |
 |
Renamed module_rebuild_cache() to system_rebuild_module_data(), renamed system_theme_data() to system_rebuild_theme_data(), and added system_get_info() |
 |
 |
Standardized API for static variables and resetting them |
 |
 |
The function drupal_set_html_head() has been renamed to drupal_add_html_head() |
 |
 |
drupal_eval() renamed to php_eval |
 |
 |
Changes to HTTP header functions [UPDATED] |
 |
 |
Renamed drupal_set_content() and drupal_get_content() |
 |
 |
Alternative cache implementations changed |
 |
 |
Added drupal_set_time_limit() |
 |
 |
New tar archive library added |
 |
 |
API for modules providing search has changed |
 |
 |
User 1 is now called site maintenance account |
 |
 |
drupal_alter() now takes at most 3 parameters by reference |
 |
 |
drupal_set_header() and drupal_get_header() renamed to drupal_add_http_header() and drupal_get_http_header() |
 |
 |
New hook_hook_info() added |
 |
 |
Functions called very often that need a drupal_static() variable can use an optimized way of calling that function |
 |
 |
All e-mails are considered to originate as HTML |
 |
 |
hook_update_index() only runs when searching enabled for a given module |
 |
 |
drupal_urlencode() replaced by drupal_encode_path() |
 |
 |
WATCHDOG_EMERG was renamed to WATCHDOG_EMERGENCY |
 |
 |
system_retrieve_file() API cleanup |
 |
 |
New hook_module_implements_alter |
| Unclear |
Unclear |
Changes to how Drupal sends email |
| Permissions and Access |
 |
 |
hook_perm() renamed to hook_permission() |
 |
 |
Permissions have titles (required) and descriptions (optional) |
| Unclear |
 |
"administer nodes" permission split into "administer nodes", "access content overview", and "bypass node access" |
 |
 |
Moved statistics settings from admin/reports/settings to admin/settings/statistics admin/config/system/statistics and added a new 'administer statistics' permission |
 |
 |
Permissions are no longer sorted alphabetically |
 |
 |
New permission tables |
 |
 |
Node access hooks now have drupal_alter() functions |
 |
 |
"use PHP for settings" permission should be used for all PHP settings rights (replaces "use PHP for block visibility") |
| N/A |
N/A |
Hide empty menu categories with access callback (REVERTED) |
| Unclear |
 |
hook_node_access_records() now applies to unpublished nodes; 'view own unpublished content' permission added |
 |
 |
hook_access() removed in favor of hook_node_access() |
 |
 |
Added API functions for creating, loading, updating, and deleting user roles and permissions |
 |
 |
New 'restrict access' parameter in hook_permission() for labeling unsafe permissions |
| Database |
 |
 |
A completely new database API has been added |
 |
 |
Schema descriptions are no longer translated |
 |
 |
db_rewrite_sql() replaced with hook_query_alter() |
 |
 |
Schema descriptions are now plain text instead of HTML |
 |
 |
Do not use SELECT COUNT(*) to check for existence of rows in a table |
 |
 |
Foreign keys added to core database table schema |
| N/A |
N/A |
Schema API now supports date and time types natively (REVERTED) |
 |
 |
Database schema (un)installed automatically |
 |
 |
The $ret parameter has been removed from all Schema operations |
 |
 |
Block tables renamed |
 |
 |
Block deltas are now specified as strings |
 |
 |
New pattern for cross-database, performant, case-insensitive comparisons |
 |
 |
Remove moderate column from node_schema() |
 |
 |
db_result() has been removed; use ->fetchField() instead (This is not listed on the chronological page.) |
 |
 |
Rename db_column_exists() to db_field_exists() (This is not listed on the chronological page.) |
 |
 |
db_is_active() has been removed |
| Unclear |
Unclear |
Database prefixes are now per-connection |
| Unclear |
Unclear |
Node, filter and comment modules tables renamed to singular |
| Unclear |
Unclear |
The datetime field type has been removed in favour of database engine specific types |
| Unclear |
Unclear |
Database driver prefix handling has changed |
| Menu |
| N/A |
N/A |
The hook_menu() and hook_theme() "file" and "file path" keys have been removed (REVERTED) |
| Unclear |
 |
Menu "page callbacks" and blocks should return an array and hook_page_alter() (Render arrays discussion) [UPDATED] |
 |
 |
_comment_load() is now comment_load() |
 |
 |
Changed hook_menu_link_alter() (removed the $menu parameter) |
 |
 |
Added a new top-level 'international' admin menu item |
| N/A |
N/A |
Hide empty menu categories with access callback (REVERTED) |
 |
 |
Many paths to admin screens have changed |
 |
 |
CRUD hooks for menu links: hook_menu_link_insert(), hook_menu_link_update(), hook_menu_link_delete() |
 |
 |
Custom menu API |
 |
 |
Changed Clean URLs and Search settings page path |
 |
 |
Function menu_tree_data() now expects an array of links instead of a query results |
 |
 |
menu_default_node_menu replaced with per-content type settings |
| Unclear |
Unclear |
MENU_CALLBACK meaning has changed for breadcrumbs, and some other menu API changes |
| Blocks |
 |
 |
Block module now optional |
 |
 |
hook_nodeapi, hook_node_type, hook_user, and hook_block removed and replaced with families of related functions |
 |
 |
Added hook_block_info_alter() |
 |
 |
Block tables renamed |
 |
 |
Block deltas are now specified as strings |
 |
 |
"Boxes" have been renamed to "custom blocks" |
| Unclear |
Unclear |
New 'properties' element of block information |
| Comments |
 |
 |
_comment_load() is now comment_load() |
 |
 |
Comment status values in the database have flipped so they match node status |
 |
 |
comment_save() now supports programmatic saving |
 |
 |
comment_validate() has been removed |
 |
 |
comment_node_url() has been removed |
 |
 |
Added comment_load_multiple() and hook_comment_load() |
 |
 |
New hook_comment_presave() for comments |
 |
 |
Comment.timestamp split into 'created' and 'changed' |
 |
 |
hook_comment removed and replaced with family of related functions (This is not listed on the chronological page.) |
 |
 |
Comment rendering overhaul |
| Unclear |
Unclear |
'comment_form' form ID changed to 'comment_node_TYPE_form' |
| Unclear |
Unclear |
'post comments without approval' permission name changed |
| Input Sanitization and Input Formats |
 |
 |
Parameters to check_markup() have changed |
 |
 |
drupal_set_title() uses check_plain() by default |
 |
 |
hook_filter() and hook_filter_tips() replaced by hook_filter_info() |
 |
 |
New #type 'text_format' for text format-enabled form elements |
 |
 |
Moved filter module administrative URLs from admin/settings/filters/* to admin/settings/filter/* |
 |
 |
Default text formats have been revamped |
 |
 |
Text formats access is now controlled by permissions, and filter_access() parameters have changed |
 |
 |
The parameters to filter_formats() have changed |
| Unclear |
Unclear |
Filter table updates |
| Unclear |
Unclear |
Text formats (input formats) must be defined |
| Unclear |
Unclear |
Text format (input format) identifier is now a machine name |
| Taxonomy |
 |
 |
taxonomy_get_tree() |
 |
 |
Taxonomy db table names have changed to begin with 'taxonomy_' |
 |
 |
taxonomy_term_load() and taxonomy_term_load_multiple() |
 |
 |
Taxonomy CRUD functions renamed and refactored |
 |
 |
New taxonomy hooks for term and vocabulary |
 |
 |
Added taxonomy_vocabulary_load_multiple() |
 |
 |
Removed taxonomy module support for multiple tids and depth in term paths |
 |
 |
Related terms functionality was removed from taxonomy.module |
 |
 |
All taxonomy functions relating to nodes have been removed or refactored |
 |
 |
taxonomy_form_all() removed |
 |
 |
taxonomy_term_view() and taxonomy-term.tpl.php for term display |
 |
 |
Taxonomy synonyms have been removed |
| Javascript |
 |
 |
Changed Drupal.behaviors to objects having the methods 'attach' and 'detach' |
 |
 |
Ability to reset JavaScript and CSS |
 |
 |
Changed parameters for drupal_add_js() and drupal_add_css() |
 |
 |
Replace 'core', 'module' and 'theme' with 'file' in drupal_add_js() |
 |
 |
New hook_js_alter to alter JavaScript |
 |
 |
JavaScript should be compatible with other libraries than jQuery |
 |
 |
External JavaScript can now be referenced through drupal_add_js() |
 |
 |
Settings passed locally to JavaScript Behaviors |
 |
 |
jQuery 1.3.x |
 |
 |
Attached JavaScript and CSS for forms |
 |
 |
Ability to add multiple JavaScript/CSS files at once |
 |
 |
jQuery UI (1.7) was added into core |
 |
 |
JavaScript variable Drupal.jsEnabled has been removed |
 |
 |
jQuery Once method for applying JavaScript behaviors once |
 |
 |
Rename drupal_to_js() and drupal_json() to drupal_json_encode() and drupal_json_output() |
 |
 |
Drupal.parseJSON has been removed and replaced with jQuery.parseJSON. |
| Unclear |
Unclear |
Javascript and CSS loading changes |
| CSS |
 |
 |
Changed parameters for drupal_add_js() and drupal_add_css() |
 |
 |
Attached JavaScript and CSS for forms |
 |
 |
Inline cascading stylesheets from drupal_add_css() |
 |
 |
Ability to add multiple JavaScript/CSS files at once |
 |
 |
drupal_add_css() now supports external CSS files |
 |
 |
Weighting of stylesheets |
 |
 |
Convert class attributes to array in favor of a string |
 |
 |
form_clean_id() has been renamed to drupal_clean_css_identifier() |
| Unclear |
Unclear |
Javascript and CSS loading changes |
| Theming |
 |
 |
Rebuild functions have changed names |
 |
 |
Instead of theme('page', ...), think of drupal_set_page_content() |
 |
 |
hook_footer() was removed, $closure became $page_bottom, $page_top added |
| Unclear |
 |
Element #type property no longer treated as a theme function in drupal_render() |
| Unclear |
 |
Use drupal_render_children() to render an element's children |
| Unclear |
 |
theme_links() has a new parameter $heading for accessibility |
 |
 |
theme() now takes only two arguments |
 |
 |
hook_theme() requires "variables" or "render element" instead of "arguments" to better integrate with drupal_render() [UPDATED] |
 |
 |
New method for altering the theme used to display a page (global $custom_theme variable removed) |
 |
 |
theme('placeholder') replaced by drupal_placeholder() |
 |
 |
A theme hook name followed by a double underscore ('__') is a default 'pattern' |
 |
 |
Preprocess functions need to now specify "theme_hook_suggestion(s)" instead of "template_file(s)" |
 |
 |
Use #theme='links__MODULE' or #theme='links__MODULE_EXTRA_CONTEXT' when adding links to a render array |
 |
 |
theme_pager() no longer takes limit parameter |
 |
 |
theme_username() parameters changed |
| Unclear |
Unclear |
theme('box') no longer exists |
| Form API |
 |
 |
#theme recommended for specifying theme function |
 |
 |
Easier check for node form during hook_form_alter() |
 |
 |
Some #process functions have been renamed |
 |
 |
Use '#markup' not '#value' for markup |
 |
 |
drupal_execute() renamed to drupal_form_submit() |
 |
 |
drupal_get_form() returns a render array instead of a string [UPDATED] |
 |
 |
AHAH/AJAX Processing has changed; #ajax, new 'callback' member of the array, and the callback must be rewritten |
 |
 |
The signature of the callback from drupal_get_form() changed to add $form |
 |
 |
Use #type='link' for adding a single link to a render array, particularly for tables that include operation links like 'edit', 'delete', etc. |
 |
 |
Added entity_prepare_view() and hook_entity_prepare_view() |
 |
 |
Attached JavaScript and CSS for forms |
 |
 |
hook_elements() renamed to hook_element_info() |
 |
 |
Removal of FAPI $form['#redirect'] and $_REQUEST['destination'] |
 |
 |
Form submit buttons consistently grouped in actions array |
| Unclear |
Unclear |
HTML rendering of form elements has different CSS classes |
| Unclear |
Unclear |
Form element value callbacks now always have $form_state argument |
| Unclear |
Unclear |
Forms are no longer automatically rebuilt when $form_state['storage'] is set |
| Unclear |
Unclear |
form_clean_id() has been renamed to drupal_html_id() |
| Unclear |
Unclear |
hook_form_alter and hook_form_FORM_ID_alter run together for each module |
| Unclear |
Unclear |
hook_form_BASE_FORM_ID_alter() is invoked for shared form constructors |
| Unclear |
Unclear |
$element['#post'] is gone |
| Unclear |
Unclear |
$form_state['clicked_button'] is deprecated, use $form_state['triggering_element'] instead |
| File API |
| Unclear |
 |
File operations that don't affect the database have been renamed |
| Unclear |
 |
User pictures are now managed files |
 |
 |
file_load_multiple() |
 |
 |
file_scan_directory()'s optional parameters are now an array |
 |
 |
file_scan_directory() now uses a preg regular expression for the nomask parameter |
 |
 |
Removed file_set_status() |
| Unclear |
 |
file_validate_extensions() enforces check for uid=1 |
 |
 |
Removed FILE_STATUS_TEMPORARY |
 |
 |
file_scan_directory() and drupal_system_listing() use preg regular expressions |
| Unclear |
 |
file_scan_directory() now uses same property names as file_load() |
 |
 |
file_check_directory() will now recursively create directories |
 |
 |
file_check_directory() renamed to file_prepare_directory() |
 |
 |
New hook: hook_file_url_alter() |
| Unclear |
Unclear |
Rename file to file_managed |
| Unclear |
Unclear |
file_directory_path() has been removed |
| User API |
 |
 |
New user_cancel API |
 |
 |
Changed log out path from 'logout' to 'user/logout' for consistency |
 |
 |
hook_nodeapi, hook_node_type, hook_user, and hook_block removed and replaced with families of related functions |
 |
 |
Save new users and nodes with specified IDs |
 |
 |
user_load_multiple() and hook_user_load(), user_load() signature change, and $reset parameter |
 |
 |
Parameters to function user_authenticate() changed |
 |
 |
Removed several unnecessary arguments to various hook_user_$op hooks and removed hook_profile_alter |
 |
 |
New API function: format_username() and new hook: hook_username_alter() |
 |
 |
hook_user_form(), hook_user_register() are gone |
 |
 |
hook_user_validate() and hook_user_submit() are gone |
 |
 |
hook_user_after_update() replaced by hook_user_update(), amended by hook_user_presave() for common operations |
| Unclear |
Unclear |
New constants for user registration settings, and the default has been changed to "Visitors, but administrator approval is required" |
| Unclear |
Unclear |
Arbitrary user data is harder to stash in the user object |
| Node API |
 |
 |
Move node, taxonomy, and comment links into $node->content; Deprecate hook_link() |
 |
 |
node_load() and node_load_multiple() |
 |
 |
In hook_node_info() change 'module' back to 'base' and change 'node' to 'node_content' |
 |
 |
hook_nodeapi, hook_node_type, hook_user, and hook_block removed and replaced with families of related functions |
 |
 |
node_invoke_nodeapi() removed |
 |
 |
Add node_delete_multiple() |
 |
 |
Removed $op "rss item" from hook_nodeapi() in favor of 'rss' view mode [UPDATED] |
 |
 |
node_get_types($op) replaced by node_type_get_$op() |
 |
 |
$teaser parameter changed to $view_mode in node viewing functions and hooks, $node->build_mode property removed [UPDATED] |
 |
 |
Save new users and nodes with specified IDs |
 |
N/A |
Replace node_view() with node_build() (REVERTED) |
 |
 |
hook_nodeapi_xxx() becomes hook_node_xxx() |
 |
 |
hook_load() signature and return value change |
| Unclear |
Unclear |
Node Body and Teaser Changes |
| Unclear |
Unclear |
COMMENT_NODE_* constants have new names, but same values |
| Unclear |
Unclear |
Node body field now requires normal field API usage |
| Unclear |
Unclear |
node_load() and other entity loading cache behavior has changed |
| Multi-lingual |
 |
 |
Added string context support to t() and format_plural(), changed parameters |
 |
 |
Language neutral content now has an explicit language associated with it |
 |
 |
New language negotiation API introduced |
| Unclear |
Unclear |
Translatable Fields |
| Miscellaneous |
| Unclear |
 |
Code documentation added to module.api.php |
| Unclear |
 |
Commenting style - use 'Implements hook_foo().' when documenting hooks |
 |
 |
Parameters swapped in book_toc() |
 |
 |
Make sticky tableheaders optional |
 |
 |
referer_uri() has been removed |
 |
 |
Replace drupal_clone() with clone |
 |
 |
Parameters for actions_synchronize() have changed |
| Unclear |
 |
Trigger and Actions API overhaul |
 |
 |
Login validation change for distributed authentication modules |
 |
 |
Added hook_entity_load() |
 |
 |
Drupal 7 requires PHP 5.2 or higher |
| N/A |
N/A |
xmlrpc() wrapper function removed (REVERTED) |
 |
 |
Replaced taxonomy_term_path(), hook_term_path(), language_url_rewrite(), and custom_url_alter_outbound() with hook_url_outbound_alter() |
 |
 |
Replaced custom_url_rewrite_inbound() with hook_url_inbound_alter() |
 |
 |
Renamed menu_path_is_external() to url_is_external() |
 |
 |
New entity_info_cache_clear() API function |
| Unclear |
 |
New hooks: hook_admin_paths() and hook_admin_paths_alter() |
 |
 |
The function menu_valid_path() has been renamed to drupal_valid_path(), and its inputs have changed |
 |
 |
Blog API module removed from Drupal core |
 |
 |
drupal_goto() follows parameters of url() |
 |
 |
Format date types "small" and "large" have been changed to "short" and "long" |
 |
 |
url() 'query' field must be array |
 |
 |
User-configured time zones now serve as the default time zone for PHP date/time functions |
| Unclear |
Unclear |
Two page caching functions renamed |
| Unclear |
Unclear |
MIME types list changed from variable to alter hook/function |
| Unclear |
Unclear |
Query string functions renamed |
| Unclear |
Unclear |
Arguments to xmlrpc() have changed |
| Unclear |
Unclear |
Two new functions added: hook_page_build() and hook_page_alter() |
| Unclear |
Unclear |
l() function class attribute |