update to D 7.17

Signed-off-by: bachy <git@g-u-i.net>
This commit is contained in:
bachy
2012-12-08 11:35:42 +01:00
parent 975d758599
commit 5396b3e2b5
284 changed files with 3674 additions and 1854 deletions

View File

@@ -168,7 +168,7 @@
* displayed while awaiting a response from the callback, and add an optional
* message. Possible keys: 'type', 'message', 'url', 'interval'.
* More information is available in the
* @link http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/7 Form API Reference @endlink
* @link forms_api_reference.html Form API Reference @endlink
*
* In addition to using Form API for doing in-form modification, Ajax may be
* enabled by adding classes to buttons and links. By adding the 'use-ajax'

View File

@@ -18,7 +18,7 @@ function authorize_filetransfer_form($form, &$form_state) {
global $base_url, $is_https;
$form = array();
// If possible, we want to post this form securely via https.
// If possible, we want to post this form securely via HTTPS.
$form['#https'] = TRUE;
// CSS we depend on lives in modules/system/maintenance.css, which is loaded

View File

@@ -8,7 +8,7 @@
/**
* The current system version.
*/
define('VERSION', '7.16');
define('VERSION', '7.17');
/**
* Core API compatibility.
@@ -25,6 +25,21 @@ define('DRUPAL_MINIMUM_PHP', '5.2.4');
*/
define('DRUPAL_MINIMUM_PHP_MEMORY_LIMIT', '32M');
/**
* Error reporting level: display no errors.
*/
define('ERROR_REPORTING_HIDE', 0);
/**
* Error reporting level: display errors and warnings.
*/
define('ERROR_REPORTING_DISPLAY_SOME', 1);
/**
* Error reporting level: display all messages.
*/
define('ERROR_REPORTING_DISPLAY_ALL', 2);
/**
* Indicates that the item should never be removed unless explicitly selected.
*
@@ -498,56 +513,12 @@ function timer_stop($name) {
}
/**
* Finds the appropriate configuration directory.
* Returns the appropriate configuration directory.
*
* Finds a matching configuration directory by stripping the website's
* hostname from left to right and pathname from right to left. The first
* configuration file found will be used and the remaining ones will be ignored.
* If no configuration file is found, return a default value '$confdir/default'.
*
* With a site located at http://www.example.com:8080/mysite/test/, the file,
* settings.php, is searched for in the following directories:
*
* - $confdir/8080.www.example.com.mysite.test
* - $confdir/www.example.com.mysite.test
* - $confdir/example.com.mysite.test
* - $confdir/com.mysite.test
*
* - $confdir/8080.www.example.com.mysite
* - $confdir/www.example.com.mysite
* - $confdir/example.com.mysite
* - $confdir/com.mysite
*
* - $confdir/8080.www.example.com
* - $confdir/www.example.com
* - $confdir/example.com
* - $confdir/com
*
* - $confdir/default
*
* If a file named sites.php is present in the $confdir, it will be loaded
* prior to scanning for directories. It should define an associative array
* named $sites, which maps domains to directories. It should be in the form
* of:
* @code
* $sites = array(
* 'The url to alias' => 'A directory within the sites directory'
* );
* @endcode
* For example:
* @code
* $sites = array(
* 'devexample.com' => 'example.com',
* 'localhost.example' => 'example.com',
* );
* @endcode
* The above array will cause Drupal to look for a directory named
* "example.com" in the sites directory whenever a request comes from
* "example.com", "devexample.com", or "localhost/example". That is useful
* on development servers, where the domain name may not be the same as the
* domain of the live server. Since Drupal stores file paths into the database
* (files, system table, etc.) this will ensure the paths are correct while
* accessed on development servers.
* Returns the configuration path based on the site's hostname, port, and
* pathname. Uses find_conf_path() to find the current configuration directory.
* See default.settings.php for examples on how the URL is converted to a
* directory.
*
* @param bool $require_settings
* Only configuration directories with an existing settings.php file
@@ -560,6 +531,8 @@ function timer_stop($name) {
*
* @return
* The path of the matching directory.
*
* @see default.settings.php
*/
function conf_path($require_settings = TRUE, $reset = FALSE) {
$conf = &drupal_static(__FUNCTION__, '');
@@ -731,7 +704,7 @@ function drupal_valid_http_host($host) {
function drupal_settings_initialize() {
global $base_url, $base_path, $base_root;
// Export the following settings.php variables to the global namespace
// Export these settings.php variables to the global namespace.
global $databases, $cookie_domain, $conf, $installed_profile, $update_free_access, $db_url, $db_prefix, $drupal_hash_salt, $is_https, $base_secure_url, $base_insecure_url;
$conf = array();
@@ -752,7 +725,7 @@ function drupal_settings_initialize() {
$base_root = substr($base_url, 0, strlen($base_url) - strlen($parts['path']));
}
else {
// Create base URL
// Create base URL.
$http_protocol = $is_https ? 'https' : 'http';
$base_root = $http_protocol . '://' . $_SERVER['HTTP_HOST'];
@@ -778,7 +751,7 @@ function drupal_settings_initialize() {
}
else {
// Otherwise use $base_url as session name, without the protocol
// to use the same session identifiers across http and https.
// to use the same session identifiers across HTTP and HTTPS.
list( , $session_name) = explode('://', $base_url, 2);
// HTTP_HOST can be modified by a visitor, but we already sanitized it
// in drupal_settings_initialize().
@@ -1732,7 +1705,8 @@ function watchdog($type, $message, $variables = array(), $severity = WATCHDOG_NO
'request_uri' => $base_root . request_uri(),
'referer' => isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '',
'ip' => ip_address(),
'timestamp' => REQUEST_TIME,
// Request time isn't accurate for long processes, use time() instead.
'timestamp' => time(),
);
// Call the logging hooks to log/process the message
@@ -1798,18 +1772,29 @@ function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
}
/**
* Returns all messages that have been set.
* Returns all messages that have been set with drupal_set_message().
*
* @param $type
* (optional) Only return messages of this type.
* @param $clear_queue
* (optional) Set to FALSE if you do not want to clear the messages queue
* @param string $type
* (optional) Limit the messages returned by type. Defaults to NULL, meaning
* all types. These values are supported:
* - NULL
* - 'status'
* - 'warning'
* - 'error'
* @param bool $clear_queue
* (optional) If this is TRUE, the queue will be cleared of messages of the
* type specified in the $type parameter. Otherwise the queue will be left
* intact. Defaults to TRUE.
*
* @return
* An associative array, the key is the message type, the value an array
* of messages. If the $type parameter is passed, you get only that type,
* or an empty array if there are no such messages. If $type is not passed,
* all message types are returned, or an empty array if none exist.
* @return array
* A multidimensional array with keys corresponding to the set message types.
* The indexed array values of each contain the set messages for that type.
* The messages returned are limited to the type specified in the $type
* parameter. If there are no messages of the specified type, an empty array
* is returned.
*
* @see drupal_set_message()
* @see theme_status_messages()
*/
function drupal_get_messages($type = NULL, $clear_queue = TRUE) {
if ($messages = drupal_set_message()) {
@@ -2115,14 +2100,26 @@ function drupal_anonymous_user() {
/**
* Ensures Drupal is bootstrapped to the specified phase.
*
* The bootstrap phase is an integer constant identifying a phase of Drupal
* to load. Each phase adds to the previous one, so invoking a later phase
* automatically runs the earlier phases as well. To access the Drupal
* database from a script without loading anything else, include bootstrap.inc
* and call drupal_bootstrap(DRUPAL_BOOTSTRAP_DATABASE).
* In order to bootstrap Drupal from another PHP script, you can use this code:
* @code
* define('DRUPAL_ROOT', '/path/to/drupal');
* require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
* drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
* @endcode
*
* @param $phase
* A constant. Allowed values are the DRUPAL_BOOTSTRAP_* constants.
* A constant telling which phase to bootstrap to. When you bootstrap to a
* particular phase, all earlier phases are run automatically. Possible
* values:
* - DRUPAL_BOOTSTRAP_CONFIGURATION: Initializes configuration.
* - DRUPAL_BOOTSTRAP_PAGE_CACHE: Tries to serve a cached page.
* - DRUPAL_BOOTSTRAP_DATABASE: Initializes the database layer.
* - DRUPAL_BOOTSTRAP_VARIABLES: Initializes the variable system.
* - DRUPAL_BOOTSTRAP_SESSION: Initializes session handling.
* - DRUPAL_BOOTSTRAP_PAGE_HEADER: Sets up the page header.
* - DRUPAL_BOOTSTRAP_LANGUAGE: Finds out the language of the page.
* - DRUPAL_BOOTSTRAP_FULL: Fully loads Drupal. Validates and fixes input
* data.
* @param $new_phase
* A boolean, set to FALSE if calling drupal_bootstrap from inside a
* function called from drupal_bootstrap (recursion).
@@ -2521,7 +2518,7 @@ function drupal_fast_404() {
$fast_paths = variable_get('404_fast_paths', FALSE);
if ($fast_paths && preg_match($fast_paths, $_GET['q'])) {
drupal_add_http_header('Status', '404 Not Found');
$fast_404_html = variable_get('404_fast_html', '<html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');
$fast_404_html = variable_get('404_fast_html', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML+RDFa 1.0//EN" "http://www.w3.org/MarkUp/DTD/xhtml-rdfa-1.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title>404 Not Found</title></head><body><h1>Not Found</h1><p>The requested URL "@path" was not found on this server.</p></body></html>');
// Replace @path in the variable with the page path.
print strtr($fast_404_html, array('@path' => check_plain(request_uri())));
exit;
@@ -2614,6 +2611,9 @@ function drupal_language_types() {
/**
* Returns TRUE if there is more than one language enabled.
*
* @return
* TRUE if more than one language is enabled.
*/
function drupal_multilingual() {
// The "language_count" variable stores the number of enabled languages to
@@ -2624,6 +2624,10 @@ function drupal_multilingual() {
/**
* Returns an array of the available language types.
*
* @return
* An array of all language types where the keys of each are the language type
* name and its value is its configurability (TRUE/FALSE).
*/
function language_types() {
return array_keys(variable_get('language_types', drupal_language_types()));

View File

@@ -92,14 +92,20 @@ define('JS_THEME', 100);
define('HTTP_REQUEST_TIMEOUT', -1);
/**
* Constants defining cache granularity for blocks and renderable arrays.
* @defgroup block_caching Block Caching
* @{
* Constants that define each block's caching state.
*
* Modules specify the caching patterns for their blocks using binary
* combinations of these constants in their hook_block_info():
* $block[delta]['cache'] = DRUPAL_CACHE_PER_ROLE | DRUPAL_CACHE_PER_PAGE;
* DRUPAL_CACHE_PER_ROLE is used as a default when no caching pattern is
* specified. Use DRUPAL_CACHE_CUSTOM to disable standard block cache and
* implement
* Modules specify how their blocks can be cached in their hook_block_info()
* implementations. Caching can be turned off (DRUPAL_NO_CACHE), managed by the
* module declaring the block (DRUPAL_CACHE_CUSTOM), or managed by the core
* Block module. If the Block module is managing the cache, you can specify that
* the block is the same for every page and user (DRUPAL_CACHE_GLOBAL), or that
* it can change depending on the page (DRUPAL_CACHE_PER_PAGE) or by user
* (DRUPAL_CACHE_PER_ROLE or DRUPAL_CACHE_PER_USER). Page and user settings can
* be combined with a bitwise-binary or operator; for example,
* DRUPAL_CACHE_PER_ROLE | DRUPAL_CACHE_PER_PAGE means that the block can change
* depending on the user role or page it is on.
*
* The block cache is cleared in cache_clear_all(), and uses the same clearing
* policy than page cache (node, comment, user, taxonomy added or updated...).
@@ -123,9 +129,8 @@ define('DRUPAL_NO_CACHE', -1);
/**
* The block is handling its own caching in its hook_block_view().
*
* From the perspective of the block cache system, this is equivalent to
* DRUPAL_NO_CACHE. Useful when time based expiration is needed or a site uses
* a node access which invalidates standard block cache.
* This setting is useful when time based expiration is needed or a site uses a
* node access which invalidates standard block cache.
*/
define('DRUPAL_CACHE_CUSTOM', -2);
@@ -155,6 +160,10 @@ define('DRUPAL_CACHE_PER_PAGE', 0x0004);
*/
define('DRUPAL_CACHE_GLOBAL', 0x0008);
/**
* @} End of "defgroup block_caching".
*/
/**
* Adds content to a specified region.
*
@@ -199,7 +208,7 @@ function drupal_get_region_content($region = NULL, $delimiter = ' ') {
}
/**
* Gets the name of the currently active install profile.
* Gets the name of the currently active installation profile.
*
* When this function is called during Drupal's initial installation process,
* the name of the profile that's about to be installed is stored in the global
@@ -208,7 +217,7 @@ function drupal_get_region_content($region = NULL, $delimiter = ' ') {
* variable_get() to determine what one is active.
*
* @return $profile
* The name of the install profile.
* The name of the installation profile.
*/
function drupal_get_profile() {
global $install_state;
@@ -443,7 +452,7 @@ function drupal_get_query_parameters(array $query = NULL, array $exclude = array
* The query string to split.
*
* @return
* An array of url decoded couples $param_name => $value.
* An array of URL decoded couples $param_name => $value.
*/
function drupal_get_query_array($query) {
$result = array();
@@ -505,6 +514,12 @@ function drupal_http_build_query(array $query, $parent = '') {
* previous request, that destination is returned. As such, a destination can
* persist across multiple pages.
*
* @return
* An associative array containing the key:
* - destination: The path provided via the destination query string or, if
* not available, the current path.
*
* @see current_path()
* @see drupal_goto()
*/
function drupal_get_destination() {
@@ -798,10 +813,51 @@ function drupal_http_request($url, array $options = array()) {
'timeout' => 30.0,
'context' => NULL,
);
// Merge the default headers.
$options['headers'] += array(
'User-Agent' => 'Drupal (+http://drupal.org/)',
);
// stream_socket_client() requires timeout to be a float.
$options['timeout'] = (float) $options['timeout'];
// Use a proxy if one is defined and the host is not on the excluded list.
$proxy_server = variable_get('proxy_server', '');
if ($proxy_server && _drupal_http_use_proxy($uri['host'])) {
// Set the scheme so we open a socket to the proxy server.
$uri['scheme'] = 'proxy';
// Set the path to be the full URL.
$uri['path'] = $url;
// Since the URL is passed as the path, we won't use the parsed query.
unset($uri['query']);
// Add in username and password to Proxy-Authorization header if needed.
if ($proxy_username = variable_get('proxy_username', '')) {
$proxy_password = variable_get('proxy_password', '');
$options['headers']['Proxy-Authorization'] = 'Basic ' . base64_encode($proxy_username . (!empty($proxy_password) ? ":" . $proxy_password : ''));
}
// Some proxies reject requests with any User-Agent headers, while others
// require a specific one.
$proxy_user_agent = variable_get('proxy_user_agent', '');
// The default value matches neither condition.
if ($proxy_user_agent === NULL) {
unset($options['headers']['User-Agent']);
}
elseif ($proxy_user_agent) {
$options['headers']['User-Agent'] = $proxy_user_agent;
}
}
switch ($uri['scheme']) {
case 'proxy':
// Make the socket connection to a proxy server.
$socket = 'tcp://' . $proxy_server . ':' . variable_get('proxy_port', 8080);
// The Host header still needs to match the real request.
$options['headers']['Host'] = $uri['host'];
$options['headers']['Host'] .= isset($uri['port']) && $uri['port'] != 80 ? ':' . $uri['port'] : '';
break;
case 'http':
case 'feed':
$port = isset($uri['port']) ? $uri['port'] : 80;
@@ -811,12 +867,14 @@ function drupal_http_request($url, array $options = array()) {
// checking the host that do not take into account the port number.
$options['headers']['Host'] = $uri['host'] . ($port != 80 ? ':' . $port : '');
break;
case 'https':
// Note: Only works when PHP is compiled with OpenSSL support.
$port = isset($uri['port']) ? $uri['port'] : 443;
$socket = 'ssl://' . $uri['host'] . ':' . $port;
$options['headers']['Host'] = $uri['host'] . ($port != 443 ? ':' . $port : '');
break;
default:
$result->error = 'invalid schema ' . $uri['scheme'];
$result->code = -1003;
@@ -853,11 +911,6 @@ function drupal_http_request($url, array $options = array()) {
$path .= '?' . $uri['query'];
}
// Merge the default headers.
$options['headers'] += array(
'User-Agent' => 'Drupal (+http://drupal.org/)',
);
// Only add Content-Length if we actually have any content or if it is a POST
// or PUT request. Some non-standard servers get confused by Content-Length in
// at least HEAD/GET requests, and Squid always requires Content-Length in
@@ -1028,6 +1081,18 @@ function drupal_http_request($url, array $options = array()) {
return $result;
}
/**
* Helper function for determining hosts excluded from needing a proxy.
*
* @return
* TRUE if a proxy should be used for this host.
*/
function _drupal_http_use_proxy($host) {
$proxy_exceptions = variable_get('proxy_exceptions', array('localhost', '127.0.0.1'));
return !in_array(strtolower($host), $proxy_exceptions, TRUE);
}
/**
* @} End of "HTTP handling".
*/
@@ -1701,7 +1766,7 @@ function format_xml_elements($array) {
* $output = format_plural($update_count,
* 'Changed the content type of 1 post from %old-type to %new-type.',
* 'Changed the content type of @count posts from %old-type to %new-type.',
* array('%old-type' => $info->old_type, '%new-type' => $info->new_type)));
* array('%old-type' => $info->old_type, '%new-type' => $info->new_type));
* @endcode
*
* @param $count
@@ -2079,7 +2144,7 @@ function format_username($account) {
* for the URL. If $options['language'] is omitted, the global $language_url
* will be used.
* - 'https': Whether this URL should point to a secure location. If not
* defined, the current scheme is used, so the user stays on http or https
* defined, the current scheme is used, so the user stays on HTTP or HTTPS
* respectively. TRUE enforces HTTPS and FALSE enforces HTTP, but HTTPS can
* only be enforced when the variable 'https' is set to TRUE.
* - 'base_url': Only used internally, to modify the base URL when a language
@@ -2309,21 +2374,22 @@ function drupal_attributes(array $attributes = array()) {
/**
* Formats an internal or external URL link as an HTML anchor tag.
*
* This function correctly handles aliased paths, and adds an 'active' class
* This function correctly handles aliased paths and adds an 'active' class
* attribute to links that point to the current page (for theming), so all
* internal links output by modules should be generated by this function if
* possible.
*
* @param $text
* The link text for the anchor tag.
* @param $path
* @param string $text
* The translated link text for the anchor tag.
* @param string $path
* The internal path or external URL being linked to, such as "node/34" or
* "http://example.com/foo". After the url() function is called to construct
* the URL from $path and $options, the resulting URL is passed through
* check_plain() before it is inserted into the HTML anchor tag, to ensure
* well-formed HTML. See url() for more information and notes.
* @param array $options
* An associative array of additional options, with the following elements:
* An associative array of additional options. Defaults to an empty array. It
* may contain the following elements.
* - 'attributes': An associative array of HTML attributes to apply to the
* anchor tag. If element 'class' is included, it must be an array; 'title'
* must be a string; other elements are more flexible, as they just need
@@ -2339,8 +2405,10 @@ function drupal_attributes(array $attributes = array()) {
* well as the path must match). This element is also used by url().
* - Additional $options elements used by the url() function.
*
* @return
* @return string
* An HTML string containing a link to the given path.
*
* @see url()
*/
function l($text, $path, array $options = array()) {
global $language_url;
@@ -3927,7 +3995,8 @@ function drupal_region_class($region) {
* actually needed.
*
* @param $data
* (optional) If given, the value depends on the $options parameter:
* (optional) If given, the value depends on the $options parameter, or
* $options['type'] if $options is passed as an associative array:
* - 'file': Path to the file relative to base_path().
* - 'inline': The JavaScript code that should be placed in the given scope.
* - 'external': The absolute path to an external JavaScript file that is not
@@ -5114,6 +5183,7 @@ function drupal_cron_run() {
@ignore_user_abort(TRUE);
// Prevent session information from being saved while cron is running.
$original_session_saving = drupal_save_session();
drupal_save_session(FALSE);
// Force the current user to anonymous to ensure consistent permissions on
@@ -5176,7 +5246,7 @@ function drupal_cron_run() {
}
// Restore the user.
$GLOBALS['user'] = $original_user;
drupal_save_session(TRUE);
drupal_save_session($original_session_saving);
return $return;
}
@@ -5208,7 +5278,7 @@ function drupal_cron_cleanup() {
* drupal_system_listing("/\.module$/", "modules", 'name', 0);
* @endcode
* this function will search the site-wide modules directory (i.e., /modules/),
* your install profile's directory (i.e.,
* your installation profile's directory (i.e.,
* /profiles/your_site_profile/modules/), the all-sites directory (i.e.,
* /sites/all/modules/), and your site-specific directory (i.e.,
* /sites/your_site_dir/modules/), in that order, and return information about
@@ -7449,12 +7519,12 @@ function drupal_check_incompatibility($v, $current_version) {
/**
* Get the entity info array of an entity type.
*
* @see hook_entity_info()
* @see hook_entity_info_alter()
*
* @param $entity_type
* The entity type, e.g. node, for which the info shall be returned, or NULL
* to return an array with info about all types.
*
* @see hook_entity_info()
* @see hook_entity_info_alter()
*/
function entity_get_info($entity_type = NULL) {
global $language;
@@ -7542,12 +7612,13 @@ function entity_info_cache_clear() {
* The entity type; e.g. 'node' or 'user'.
* @param $entity
* The entity from which to extract values.
*
* @return
* A numerically indexed array (not a hash table) containing these
* elements:
* 0: primary id of the entity
* 1: revision id of the entity, or NULL if $entity_type is not versioned
* 2: bundle name of the entity
* - 0: Primary ID of the entity.
* - 1: Revision ID of the entity, or NULL if $entity_type is not versioned.
* - 2: Bundle name of the entity, or NULL if $entity_type has no bundles.
*/
function entity_extract_ids($entity_type, $entity) {
$info = entity_get_info($entity_type);
@@ -7580,13 +7651,12 @@ function entity_extract_ids($entity_type, $entity) {
* @param $entity_type
* The entity type; e.g. 'node' or 'user'.
* @param $ids
* A numerically indexed array, as returned by entity_extract_ids(),
* containing these elements:
* 0: primary id of the entity
* 1: revision id of the entity, or NULL if $entity_type is not versioned
* 2: bundle name of the entity, or NULL if $entity_type has no bundles
* A numerically indexed array, as returned by entity_extract_ids().
*
* @return
* An entity structure, initialized with the ids provided.
*
* @see entity_extract_ids()
*/
function entity_create_stub_entity($entity_type, $ids) {
$entity = new stdClass();
@@ -7616,11 +7686,6 @@ function entity_create_stub_entity($entity_type, $ids) {
* DrupalDefaultEntityController class. See node_entity_info() and the
* NodeController in node.module as an example.
*
* @see hook_entity_info()
* @see DrupalEntityControllerInterface
* @see DrupalDefaultEntityController
* @see EntityFieldQuery
*
* @param $entity_type
* The entity type to load, e.g. node or user.
* @param $ids
@@ -7638,6 +7703,11 @@ function entity_create_stub_entity($entity_type, $ids) {
* found, an empty array is returned.
*
* @todo Remove $conditions in Drupal 8.
*
* @see hook_entity_info()
* @see DrupalEntityControllerInterface
* @see DrupalDefaultEntityController
* @see EntityFieldQuery
*/
function entity_load($entity_type, $ids = FALSE, $conditions = array(), $reset = FALSE) {
if ($reset) {
@@ -7657,7 +7727,7 @@ function entity_load($entity_type, $ids = FALSE, $conditions = array(), $reset =
* @param $entity_type
* The entity type to load, e.g. node or user.
* @param $id
* The id of the entity to load.
* The ID of the entity to load.
*
* @return
* The unchanged entity, or FALSE if the entity cannot be loaded.
@@ -7694,7 +7764,6 @@ function entity_get_controller($entity_type) {
* recursion. By convention, entity_prepare_view() is called after
* field_attach_prepare_view() to allow entity level hooks to act on content
* loaded by field API.
* @see hook_entity_prepare_view()
*
* @param $entity_type
* The type of entity, i.e. 'node', 'user'.
@@ -7703,6 +7772,8 @@ function entity_get_controller($entity_type) {
* @param $langcode
* (optional) A language code to be used for rendering. Defaults to the global
* content language of the current request.
*
* @see hook_entity_prepare_view()
*/
function entity_prepare_view($entity_type, $entities, $langcode = NULL) {
if (!isset($langcode)) {
@@ -7729,16 +7800,16 @@ function entity_prepare_view($entity_type, $entities, $langcode = NULL) {
}
/**
* Returns the uri elements of an entity.
* Returns the URI elements of an entity.
*
* @param $entity_type
* The entity type; e.g. 'node' or 'user'.
* @param $entity
* The entity for which to generate a path.
* @return
* An array containing the 'path' and 'options' keys used to build the uri of
* An array containing the 'path' and 'options' keys used to build the URI of
* the entity, and matching the signature of url(). NULL if the entity has no
* uri of its own.
* URI of its own.
*/
function entity_uri($entity_type, $entity) {
$info = entity_get_info($entity_type);
@@ -7833,7 +7904,7 @@ function entity_language($entity_type, $entity) {
}
/**
* Helper function for attaching field API validation to entity forms.
* Attaches field API validation to entity forms.
*/
function entity_form_field_validate($entity_type, $form, &$form_state) {
// All field attach API functions act on an entity object, but during form
@@ -7846,7 +7917,7 @@ function entity_form_field_validate($entity_type, $form, &$form_state) {
}
/**
* Helper function for copying submitted values to entity properties for simple entity forms.
* Copies submitted values to entity properties for simple entity forms.
*
* During the submission handling of an entity form's "Save", "Preview", and
* possibly other buttons, the form state's entity needs to be updated with the

View File

@@ -167,7 +167,7 @@
* }
* @endcode
*
* @link http://drupal.org/developing/api/database
* @link http://drupal.org/developing/api/database @endlink
*/
@@ -2769,7 +2769,7 @@ function _db_create_keys_sql($spec) {
* Renames a table.
*
* @param $table
* The table to be renamed.
* The current name of the table to be renamed.
* @param $new_name
* The new name for the table.
*/

View File

@@ -128,9 +128,10 @@ class DatabaseLog {
* Determine the routine that called this query.
*
* We define "the routine that called this query" as the first entry in
* the call stack that is not inside includes/database. That makes the
* climbing logic very simple, and handles the variable stack depth caused
* by the query builders.
* the call stack that is not inside includes/database and does have a file
* (which excludes call_user_func_array(), anonymous functions and similar).
* That makes the climbing logic very simple, and handles the variable stack
* depth caused by the query builders.
*
* @link http://www.php.net/debug_backtrace
* @return
@@ -144,7 +145,8 @@ class DatabaseLog {
$stack = debug_backtrace();
$stack_count = count($stack);
for ($i = 0; $i < $stack_count; ++$i) {
if (strpos($stack[$i]['file'], 'includes' . DIRECTORY_SEPARATOR . 'database') === FALSE) {
if (!empty($stack[$i]['file']) && strpos($stack[$i]['file'], 'includes' . DIRECTORY_SEPARATOR . 'database') === FALSE) {
$stack[$i] += array('args' => array());
return array(
'file' => $stack[$i]['file'],
'line' => $stack[$i]['line'],

View File

@@ -74,6 +74,17 @@ class DatabaseConnection_pgsql extends DatabaseConnection {
}
}
public function prepareQuery($query) {
// mapConditionOperator converts LIKE operations to ILIKE for consistency
// with MySQL. However, Postgres does not support ILIKE on bytea (blobs)
// fields.
// To make the ILIKE operator work, we type-cast bytea fields into text.
// @todo This workaround only affects bytea fields, but the involved field
// types involved in the query are unknown, so there is no way to
// conditionally execute this for affected queries only.
return parent::prepareQuery(preg_replace('/ ([^ ]+) +(I*LIKE|NOT +I*LIKE) /i', ' ${1}::text ${2} ', $query));
}
public function query($query, array $args = array(), $options = array()) {
$options += $this->defaultOptions();

View File

@@ -160,18 +160,6 @@ class DrupalDefaultEntityController implements DrupalEntityControllerInterface {
public function load($ids = array(), $conditions = array()) {
$entities = array();
# PATCH http://drupal.org/node/1003788#comment-5195682
// Clean the $ids array to remove non-integer values that can be passed
// in from various sources, including menu callbacks.
if (is_array($ids)) {
foreach ($ids as $key => $id) {
if (empty($id) || ((string) $id !== (string) (int) $id)) {
unset($ids[$key]);
}
}
}
# endpatch
// Revisions are not statically cached, and require a different query to
// other conditions, so separate the revision id into its own variable.
if ($this->revisionKey && isset($conditions[$this->revisionKey])) {
@@ -308,6 +296,7 @@ class DrupalDefaultEntityController implements DrupalEntityControllerInterface {
/**
* Attaches data to entities upon loading.
*
* This will attach fields, if the entity is fieldable. It calls
* hook_entity_load() for modules which need to add data to all entities.
* It also calls hook_TYPE_load() on the loaded entities. For example
@@ -427,13 +416,14 @@ class EntityFieldQueryException extends Exception {}
* an EntityFieldQueryException will be raised if an unsupported condition is
* specified or if the query has field conditions or sorts that are stored in
* different field storage engines. However, this logic can be overridden in
* hook_entity_query().
* hook_entity_query_alter().
*
* Also note that this query does not automatically respect entity access
* restrictions. Node access control is performed by the SQL storage engine but
* other storage engines might not do this.
*/
class EntityFieldQuery {
/**
* Indicates that both deleted and non-deleted fields should be returned.
*
@@ -606,9 +596,7 @@ class EntityFieldQuery {
*
* 'bundle', 'revision_id' and 'entity_id' have no such restrictions.
*
* Note: The "comment" and "taxonomy_term" entity types don't support bundle
* conditions. For "taxonomy_term", propertyCondition('vid') can be used
* instead.
* Note: The "comment" entity type does not support bundle conditions.
*
* @param $name
* 'entity_type', 'bundle', 'revision_id' or 'entity_id'.
@@ -970,7 +958,7 @@ class EntityFieldQuery {
}
/**
* Enable a pager for the query.
* Enables a pager for the query.
*
* @param $limit
* An integer specifying the number of elements per page. If passed a false
@@ -998,10 +986,11 @@ class EntityFieldQuery {
}
/**
* Enable sortable tables for this query.
* Enables sortable tables for this query.
*
* @param $headers
* An EFQ Header array based on which the order clause is added to the query.
* An EFQ Header array based on which the order clause is added to the
* query.
*
* @return EntityFieldQuery
* The called object.
@@ -1284,7 +1273,7 @@ class EntityFieldQuery {
}
/**
* Get the total number of results and initialize a pager for the query.
* Gets the total number of results and initializes a pager for the query.
*
* The pager can be disabled by either setting the pager limit to 0, or by
* setting this query to be a count query.
@@ -1371,6 +1360,6 @@ class EntityFieldQuery {
}
/**
* Exception thrown when a malformed entity is passed.
* Defines an exception thrown when a malformed entity is passed.
*/
class EntityMalformedException extends Exception { }

View File

@@ -5,21 +5,6 @@
* Functions for error handling.
*/
/**
* Error reporting level: display no errors.
*/
define('ERROR_REPORTING_HIDE', 0);
/**
* Error reporting level: display errors and warnings.
*/
define('ERROR_REPORTING_DISPLAY_SOME', 1);
/**
* Error reporting level: display all messages.
*/
define('ERROR_REPORTING_DISPLAY_ALL', 2);
/**
* Maps PHP error constants to watchdog severity levels.
*

View File

@@ -398,8 +398,8 @@ function file_create_url($uri) {
}
}
elseif ($scheme == 'http' || $scheme == 'https') {
// Check for http so that we don't have to implement getExternalUrl() for
// the http wrapper.
// Check for HTTP so that we don't have to implement getExternalUrl() for
// the HTTP wrapper.
return $uri;
}
else {
@@ -2236,7 +2236,7 @@ function drupal_realpath($uri) {
if ($wrapper = file_stream_wrapper_get_instance_by_uri($uri)) {
return $wrapper->realpath();
}
// Check that the uri has a value. There is a bug in PHP 5.2 on *BSD systems
// Check that the URI has a value. There is a bug in PHP 5.2 on *BSD systems
// that makes realpath not return FALSE as expected when passing an empty
// variable.
// @todo Remove when Drupal drops support for PHP 5.2.
@@ -2489,7 +2489,7 @@ function file_get_content_headers($file) {
}
return array(
'Content-Type' => $type . '; name="' . $name . '"',
'Content-Type' => $type,
'Content-Length' => $file->filesize,
'Content-Disposition' => $disposition . '; filename="' . $name . '"',
'Cache-Control' => 'private',

View File

@@ -381,7 +381,7 @@ interface FileTransferChmodInterface {
* @param string $path
* Path to change permissions of.
* @param long $mode
* @see http://php.net/chmod
* The new file permission mode to be passed to chmod().
* @param boolean $recursive
* Pass TRUE to recursively chmod the entire directory specified in $path.
*/

View File

@@ -78,7 +78,7 @@
* the elements and properties of the form. For information on the array
* components and format, and more detailed explanations of the Form API
* workflow, see the
* @link http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html Form API reference @endlink
* @link forms_api_reference.html Form API reference @endlink
* and the
* @link http://drupal.org/node/37775 Form API documentation section. @endlink
* In addition, there is a set of Form API tutorials in
@@ -215,17 +215,15 @@ function drupal_get_form($form_id) {
* set.
* - values: An associative array of values submitted to the form. The
* validation functions and submit functions use this array for nearly all
* their decision making. (Note that
* @link http://api.drupal.org/api/drupal/developer--topics--forms_api_reference.html/7#tree #tree @endlink
* determines whether the values are a flat array or an array whose
* structure parallels the $form array.)
* - input: The array of values as they were submitted by the user. These are
* raw and unvalidated, so should not be used without a thorough
* understanding of security implications. In almost all cases, code should
* use the data in the 'values' array exclusively. The most common use of
* this key is for multi-step forms that need to clear some of the user
* input when setting 'rebuild'. The values correspond to $_POST or $_GET,
* depending on the 'method' chosen.
* their decision making. (Note that #tree determines whether the values are
* a flat array or an array whose structure parallels the $form array. See
* @link forms_api_reference.html Form API reference @endlink for more
* information.) These are raw and unvalidated, so should not be used
* without a thorough understanding of security implications. In almost all
* cases, code should use the data in the 'values' array exclusively. The
* most common use of this key is for multi-step forms that need to clear
* some of the user input when setting 'rebuild'. The values correspond to
* $_POST or $_GET, depending on the 'method' chosen.
* - always_process: If TRUE and the method is GET, a form_id is not
* necessary. This should only be used on RESTful GET forms that do NOT
* write data, as this could lead to security issues. It is useful so that
@@ -730,7 +728,7 @@ function drupal_retrieve_form($form_id, &$form_state) {
// the form builder callbacks can be loaded when the form is being rebuilt
// from cache on a different path (such as 'system/ajax'). See
// form_get_cache().
// $menu_get_item() is not available at installation time.
// $menu_get_item() is not available during installation.
if (!isset($form_state['build_info']['files']['menu']) && !defined('MAINTENANCE_MODE')) {
$item = menu_get_item();
if (!empty($item['include_file'])) {
@@ -852,7 +850,10 @@ function drupal_process_form($form_id, &$form, &$form_state) {
// cache when a form is processed, so scenarios that result in
// the form being built behind the scenes and again for the
// browser don't increment all the element IDs needlessly.
drupal_static_reset('drupal_html_id');
if (!form_get_errors()) {
// In case of errors, do not break HTML IDs of other forms.
drupal_static_reset('drupal_html_id');
}
if ($form_state['submitted'] && !form_get_errors() && !$form_state['rebuild']) {
// Execute form submit handlers.
@@ -1177,18 +1178,23 @@ function drupal_validate_form($form_id, &$form, &$form_state) {
/**
* Redirects the user to a URL after a form has been processed.
*
* After a form was executed, the data in $form_state controls whether the form
* is redirected. By default, we redirect to a new destination page. The path
* of the destination page can be set in $form_state['redirect'], as either a
* string containing the destination or an array of arguments compatible with
* drupal_goto(). If that is not set, the user is redirected to the current
* page to display a fresh, unpopulated copy of the form.
* After a form is submitted and processed, normally the user should be
* redirected to a new destination page. This function figures out what that
* destination should be, based on the $form_state array and the 'destination'
* query string in the request URL, and redirects the user there.
*
* For example, to redirect to 'node':
* Usually (for exceptions, see below) $form_state['redirect'] determines where
* to redirect the user. This can be set either to a string (the path to
* redirect to), or an array of arguments for drupal_goto(). If
* $form_state['redirect'] is missing, the user is usually (again, see below for
* exceptions) redirected back to the page they came from, where they should see
* a fresh, unpopulated copy of the form.
*
* Here is an example of how to set up a form to redirect to the path 'node':
* @code
* $form_state['redirect'] = 'node';
* @endcode
* Or to redirect to 'node/123?foo=bar#baz':
* And here is an example of how to redirect to 'node/123?foo=bar#baz':
* @code
* $form_state['redirect'] = array(
* 'node/123',
@@ -1201,29 +1207,27 @@ function drupal_validate_form($form_id, &$form, &$form_state) {
* );
* @endcode
*
* There are several triggers that may prevent a redirection though:
* - If $form_state['redirect'] is FALSE, a form builder function or form
* validation/submit handler does not want a user to be redirected, which
* means that drupal_goto() is not invoked. For most forms, the redirection
* logic will be the same regardless of whether $form_state['redirect'] is
* undefined or FALSE. However, in case it was not defined and the current
* request contains a 'destination' query string, drupal_goto() will redirect
* to that given destination instead. Only setting $form_state['redirect'] to
* FALSE will prevent any redirection.
* - If $form_state['no_redirect'] is TRUE, then the callback that originally
* built the form explicitly disallows any redirection, regardless of the
* redirection value in $form_state['redirect']. For example, ajax_get_form()
* defines $form_state['no_redirect'] when building a form in an Ajax
* callback to prevent any redirection. $form_state['no_redirect'] should NOT
* be altered by form builder functions or form validation/submit handlers.
* There are several exceptions to the "usual" behavior described above:
* - If $form_state['programmed'] is TRUE, the form submission was usually
* invoked via drupal_form_submit(), so any redirection would break the script
* that invoked drupal_form_submit().
* - If $form_state['rebuild'] is TRUE, the form needs to be rebuilt without
* redirection.
* that invoked drupal_form_submit() and no redirection is done.
* - If $form_state['rebuild'] is TRUE, the form is being rebuilt, and no
* redirection is done.
* - If $form_state['no_redirect'] is TRUE, redirection is disabled. This is
* set, for instance, by ajax_get_form() to prevent redirection in Ajax
* callbacks. $form_state['no_redirect'] should never be set or altered by
* form builder functions or form validation/submit handlers.
* - If $form_state['redirect'] is set to FALSE, redirection is disabled.
* - If none of the above conditions has prevented redirection, then the
* redirect is accomplished by calling drupal_goto(), passing in the value of
* $form_state['redirect'] if it is set, or the current path if it is
* not. drupal_goto() preferentially uses the value of $_GET['destination']
* (the 'destination' URL query string) if it is present, so this will
* override any values set by $form_state['redirect']. Note that during
* installation, install_goto() is called in place of drupal_goto().
*
* @param $form_state
* A keyed array containing the current state of the form.
* An associative array containing the current state of the form.
*
* @see drupal_process_form()
* @see drupal_build_form()
@@ -1255,7 +1259,7 @@ function drupal_redirect_form($form_state) {
$function($form_state['redirect']);
}
}
drupal_goto($_GET['q']);
drupal_goto(current_path(), array('query' => drupal_get_query_parameters()));
}
}
@@ -3251,21 +3255,6 @@ function theme_container($variables) {
/**
* Returns HTML for a table with radio buttons or checkboxes.
*
* An example of per-row options:
* @code
* $options = array();
* $options[0]['title'] = "A red row"
* $options[0]['#attributes'] = array ('class' => array('red-row'));
* $options[1]['title'] = "A blue row"
* $options[1]['#attributes'] = array ('class' => array('blue-row'));
*
* $form['myselector'] = array (
* '#type' => 'tableselect',
* '#title' => 'My Selector'
* '#options' => $options,
* );
* @endcode
*
* @param $variables
* An associative array containing:
* - element: An associative array containing the properties and children of
@@ -3273,7 +3262,35 @@ function theme_container($variables) {
* and #js_select. The #options property is an array of selection options;
* each array element of #options is an array of properties. These
* properties can include #attributes, which is added to the
* table row's HTML attributes; see theme_table().
* table row's HTML attributes; see theme_table(). An example of per-row
* options:
* @code
* $options = array(
* array(
* 'title' => 'How to Learn Drupal',
* 'content_type' => 'Article',
* 'status' => 'published',
* '#attributes' => array('class' => array('article-row')),
* ),
* array(
* 'title' => 'Privacy Policy',
* 'content_type' => 'Page',
* 'status' => 'published',
* '#attributes' => array('class' => array('page-row')),
* ),
* );
* $header = array(
* 'title' => t('Title'),
* 'content_type' => t('Content type'),
* 'status' => t('Status'),
* );
* $form['table'] = array(
* '#type' => 'tableselect',
* '#header' => $header,
* '#options' => $options,
* '#empty' => t('No content available.'),
* );
* @endcode
*
* @ingroup themeable
*/
@@ -3645,6 +3662,35 @@ function form_pre_render_fieldset($element) {
/**
* Creates a group formatted as vertical tabs.
*
* Note that autocomplete callbacks should include special handling as the
* user's input may contain forward slashes. If the user-submitted string has a
* '/' in the text that is sent in the autocomplete request, the menu system
* will split the text and pass it to the callback as multiple arguments.
*
* Suppose your autocomplete path in the menu system is 'mymodule_autocomplete.'
* In your form you have:
* @code
* '#autocomplete_path' => 'mymodule_autocomplete/' . $some_key . '/' . $some_id,
* @endcode
* The user types in "keywords" so the full path called is:
* 'mymodule_autocomplete/$some_key/$some_id/keywords'
*
* You should include code similar to the following to handle slashes in the
* input:
* @code
* function mymodule_autocomplete_callback($arg1, $arg2, $keywords) {
* $args = func_get_args();
* // We need to remove $arg1 and $arg2 from the beginning of the array so we
* // are left with the keywords.
* array_shift($args);
* array_shift($args);
* // We store the user's original input in $keywords, including any slashes.
* $keywords = implode('/', $args);
*
* // Your code here.
* }
* @endcode
*
* @param $element
* An associative array containing the properties and children of the
* fieldset.
@@ -4153,7 +4199,7 @@ function _form_set_class(&$element, $class = array()) {
if (!empty($element['#required'])) {
$element['#attributes']['class'][] = 'required';
}
if (isset($element['#parents']) && form_get_error($element)) {
if (isset($element['#parents']) && form_get_error($element) !== NULL) {
$element['#attributes']['class'][] = 'error';
}
}
@@ -4363,7 +4409,7 @@ function batch_set($batch_definition) {
}
// Base and default properties for the batch set.
// Use get_t() to allow batches at install time.
// Use get_t() to allow batches during installation.
$t = get_t();
$init = array(
'sandbox' => array(),

View File

@@ -34,7 +34,7 @@
*/
/**
* Return a list of available toolkits.
* Gets a list of available toolkits.
*
* @return
* An array with the toolkit names as keys and the descriptions as values.
@@ -55,7 +55,7 @@ function image_get_available_toolkits() {
}
/**
* Retrieve the name of the currently used toolkit.
* Gets the name of the currently used toolkit.
*
* @return
* String containing the name of the selected toolkit, or FALSE on error.
@@ -101,7 +101,7 @@ function image_toolkit_invoke($method, stdClass $image, array $params = array())
}
/**
* Get details about an image.
* Gets details about an image.
*
* Drupal supports GIF, JPG and PNG file formats when used with the GD
* toolkit, and may support others, depending on which toolkits are
@@ -261,7 +261,7 @@ function image_scale(stdClass $image, $width = NULL, $height = NULL, $upscale =
}
/**
* Resize an image to the given dimensions (ignoring aspect ratio).
* Resizes an image to the given dimensions (ignoring aspect ratio).
*
* @param $image
* An image object returned by image_load().
@@ -284,7 +284,7 @@ function image_resize(stdClass $image, $width, $height) {
}
/**
* Rotate an image by the given number of degrees.
* Rotates an image by the given number of degrees.
*
* @param $image
* An image object returned by image_load().
@@ -308,7 +308,7 @@ function image_rotate(stdClass $image, $degrees, $background = NULL) {
}
/**
* Crop an image to the rectangle specified by the given rectangle.
* Crops an image to a rectangle specified by the given dimensions.
*
* @param $image
* An image object returned by image_load().
@@ -340,7 +340,7 @@ function image_crop(stdClass $image, $x, $y, $width, $height) {
}
/**
* Convert an image to grayscale.
* Converts an image to grayscale.
*
* @param $image
* An image object returned by image_load().
@@ -355,9 +355,8 @@ function image_desaturate(stdClass $image) {
return image_toolkit_invoke('desaturate', $image);
}
/**
* Load an image file and return an image object.
* Loads an image file and returns an image object.
*
* Any changes to the file are not saved until image_save() is called.
*
@@ -400,7 +399,7 @@ function image_load($file, $toolkit = FALSE) {
}
/**
* Close the image and save the changes to a file.
* Closes the image and saves the changes to a file.
*
* @param $image
* An image object returned by image_load(). The object's 'info' property

View File

@@ -6,8 +6,7 @@
*/
/**
* Global flag to indicate that a task should not be run during the current
* installation request.
* Do not run the task during the current installation request.
*
* This can be used to skip running an installation task when certain
* conditions are met, even though the task may still show on the list of
@@ -20,8 +19,7 @@
define('INSTALL_TASK_SKIP', 1);
/**
* Global flag to indicate that a task should be run on each installation
* request that reaches it.
* Run the task on each installation request until the database is set up.
*
* This is primarily used by the Drupal installer for bootstrap-related tasks.
*/
@@ -200,7 +198,7 @@ function install_state_defaults() {
}
/**
* Begin an installation request, modifying the installation state as needed.
* Begins an installation request, modifying the installation state as needed.
*
* This function performs commands that must run at the beginning of every page
* request. It throws an exception if the installation should not proceed.
@@ -524,7 +522,7 @@ function install_tasks($install_state) {
$needs_translations = count($install_state['locales']) > 1 && !empty($install_state['parameters']['locale']) && $install_state['parameters']['locale'] != 'en';
// Start with the core installation tasks that run before handing control
// to the install profile.
// to the installation profile.
$tasks = array(
'install_select_profile' => array(
'display_name' => st('Choose profile'),
@@ -708,7 +706,7 @@ function install_display_output($output, $install_state) {
}
/**
* Installation task; verify the requirements for installing Drupal.
* Verifies the requirements for installing Drupal.
*
* @param $install_state
* An array of information about the current installation state.
@@ -776,7 +774,7 @@ function install_system_module(&$install_state) {
// variable_set() can be used now that system.module is installed.
$modules = $install_state['profile_info']['dependencies'];
// The install profile is also a module, which needs to be installed
// The installation profile is also a module, which needs to be installed
// after all the dependencies have been installed.
$modules[] = drupal_get_profile();
@@ -785,7 +783,7 @@ function install_system_module(&$install_state) {
}
/**
* Verify and return the last installation task that was completed.
* Verifies and returns the last installation task that was completed.
*
* @return
* The last completed task, if there is one. An exception is thrown if Drupal
@@ -829,7 +827,7 @@ function install_verify_settings() {
}
/**
* Verify PDO library.
* Verifies the PDO library.
*/
function install_verify_pdo() {
// PDO was moved to PHP core in 5.2.0, but the old extension (targeting 5.0
@@ -841,15 +839,14 @@ function install_verify_pdo() {
}
/**
* Installation task; define a form to configure and rewrite settings.php.
* Form constructor for a form to configure and rewrite settings.php.
*
* @param $form_state
* An associative array containing the current state of the form.
* @param $install_state
* An array of information about the current installation state.
*
* @return
* The form API definition for the database configuration form.
* @see install_settings_form_validate()
* @see install_settings_form_submit()
* @ingroup forms
*/
function install_settings_form($form, &$form_state, &$install_state) {
global $databases;
@@ -912,7 +909,9 @@ function install_settings_form($form, &$form_state, &$install_state) {
}
/**
* Form API validate for install_settings form.
* Form validation handler for install_settings_form().
*
* @see install_settings_form_submit()
*/
function install_settings_form_validate($form, &$form_state) {
$driver = $form_state['values']['driver'];
@@ -969,7 +968,9 @@ function install_database_errors($database, $settings_file) {
}
/**
* Form API submit for install_settings form.
* Form submission handler for install_settings_form().
*
* @see install_settings_form_validate()
*/
function install_settings_form_submit($form, &$form_state) {
global $install_state;
@@ -1000,7 +1001,7 @@ function install_find_profiles() {
}
/**
* Installation task; select which profile to install.
* Selects which profile to install.
*
* @param $install_state
* An array of information about the current installation state. The chosen
@@ -1040,8 +1041,7 @@ function install_select_profile(&$install_state) {
}
/**
* Helper function for automatically selecting an installation profile from a
* list or from a selection passed in via $_POST.
* Selects an installation profile from a list or from a $_POST submission.
*/
function _install_select_profile($profiles) {
if (sizeof($profiles) == 0) {
@@ -1064,12 +1064,14 @@ function _install_select_profile($profiles) {
}
/**
* Form API array definition for the profile selection form.
* Form constructor for the profile selection form.
*
* @param $form_state
* Array of metadata about state of form processing.
* @param $profile_files
* Array of .profile files, as returned from file_scan_directory().
*
* @ingroup forms
*/
function install_select_profile_form($form, &$form_state, $profile_files) {
$profiles = array();
@@ -1246,7 +1248,9 @@ function install_select_locale(&$install_state) {
}
/**
* Form API array definition for language selection.
* Form constructor for the language selection form.
*
* @ingroup forms
*/
function install_select_locale_form($form, &$form_state, $locales, $profilename) {
include_once DRUPAL_ROOT . '/includes/iso.inc';
@@ -1296,7 +1300,7 @@ function install_already_done_error() {
}
/**
* Installation task; load information about the chosen profile.
* Loads information about the chosen profile during installation.
*
* @param $install_state
* An array of information about the current installation state. The loaded
@@ -1315,7 +1319,7 @@ function install_load_profile(&$install_state) {
}
/**
* Installation task; perform a full bootstrap of Drupal.
* Performs a full bootstrap of Drupal during installation.
*
* @param $install_state
* An array of information about the current installation state.
@@ -1325,7 +1329,7 @@ function install_bootstrap_full(&$install_state) {
}
/**
* Installation task; install required modules via a batch process.
* Installs required modules via a batch process.
*
* @param $install_state
* An array of information about the current installation state.
@@ -1378,7 +1382,7 @@ function install_profile_modules(&$install_state) {
}
/**
* Installation task; import languages via a batch process.
* Imports languages via a batch process during installation.
*
* @param $install_state
* An array of information about the current installation state.
@@ -1412,15 +1416,14 @@ function install_import_locales(&$install_state) {
}
/**
* Installation task; configure settings for the new site.
* Form constructor for a form to configure the new site.
*
* @param $form_state
* An associative array containing the current state of the form.
* @param $install_state
* An array of information about the current installation state.
*
* @return
* The form API definition for the site configuration form.
* @see install_configure_form_validate()
* @see install_configure_form_submit()
* @ingroup forms
*/
function install_configure_form($form, &$form_state, &$install_state) {
drupal_set_title(st('Configure site'));
@@ -1443,7 +1446,7 @@ function install_configure_form($form, &$form_state, &$install_state) {
// Add JavaScript time zone detection.
drupal_add_js('misc/timezone.js');
// We add these strings as settings because JavaScript translation does not
// work on install time.
// work during installation.
drupal_add_js(array('copyFieldValue' => array('edit-site-mail' => array('edit-account-mail'))), 'setting');
drupal_add_js('jQuery(function () { Drupal.cleanURLsInstallCheck(); });', 'inline');
// Add JS to show / hide the 'Email administrator about site updates' elements
@@ -1486,7 +1489,7 @@ function install_import_locales_remaining(&$install_state) {
}
/**
* Installation task; perform final steps and display a 'finished' page.
* Finishes importing files at end of installation.
*
* @param $install_state
* An array of information about the current installation state.
@@ -1502,13 +1505,13 @@ function install_finished(&$install_state) {
// Flush all caches to ensure that any full bootstraps during the installer
// do not leave stale cached data, and that any content types or other items
// registered by the install profile are registered correctly.
// registered by the installation profile are registered correctly.
drupal_flush_all_caches();
// Remember the profile which was used.
variable_set('install_profile', drupal_get_profile());
// Install profiles are always loaded last
// Installation profiles are always loaded last
db_update('system')
->fields(array('weight' => 1000))
->condition('type', 'module')
@@ -1673,7 +1676,15 @@ function install_check_requirements($install_state) {
}
/**
* Forms API array definition for site configuration.
* Form constructor for a site configuration form.
*
* @param $install_state
* An array of information about the current installation state.
*
* @see install_configure_form()
* @see install_configure_form_validate()
* @see install_configure_form_submit()
* @ingroup forms
*/
function _install_configure_form($form, &$form_state, &$install_state) {
include_once DRUPAL_ROOT . '/includes/locale.inc';
@@ -1786,7 +1797,9 @@ function _install_configure_form($form, &$form_state, &$install_state) {
}
/**
* Forms API validate for the site configuration form.
* Form validation handler for install_configure_form().
*
* @see install_configure_form_submit()
*/
function install_configure_form_validate($form, &$form_state) {
if ($error = user_validate_name($form_state['values']['account']['name'])) {
@@ -1801,7 +1814,9 @@ function install_configure_form_validate($form, &$form_state) {
}
/**
* Forms API submit for the site configuration form.
* Form submission handler for install_configure_form().
*
* @see install_configure_form_validate()
*/
function install_configure_form_submit($form, &$form_state) {
global $user;

View File

@@ -1,5 +1,10 @@
<?php
/**
* @file
* API functions for installing modules and themes.
*/
/**
* Indicates that a module has not been installed yet.
*/
@@ -71,7 +76,7 @@ define('FILE_NOT_WRITABLE', 64);
define('FILE_NOT_EXECUTABLE', 128);
/**
* Initialize the update system by loading all installed module's .install files.
* Loads .install files for installed modules to initialize the update system.
*/
function drupal_load_updates() {
foreach (drupal_get_installed_schema_version(NULL, FALSE, TRUE) as $module => $schema_version) {
@@ -180,11 +185,11 @@ function drupal_set_installed_schema_version($module, $version) {
}
/**
* Loads the install profile, extracting its defined distribution name.
* Loads the installation profile, extracting its defined distribution name.
*
* @return
* The distribution name defined in the profile's .info file. Defaults to
* "Drupal" if none is explicitly provided by the install profile.
* "Drupal" if none is explicitly provided by the installation profile.
*
* @see install_profile_info()
*/
@@ -204,11 +209,12 @@ function drupal_install_profile_distribution_name() {
}
/**
* Auto detect the base_url with PHP predefined variables.
* Detects the base URL using the PHP $_SERVER variables.
*
* @param $file
* The name of the file calling this function so we can strip it out of
* the URI when generating the base_url.
*
* @return
* The auto-detected $base_url that should be configured in settings.php
*/
@@ -223,7 +229,7 @@ function drupal_detect_baseurl($file = 'install.php') {
}
/**
* Detect all supported databases that are compiled into PHP.
* Detects all supported databases that are compiled into PHP.
*
* @return
* An array of database types compiled into PHP.
@@ -239,7 +245,7 @@ function drupal_detect_database_types() {
}
/**
* Return all supported database installer objects that are compiled into PHP.
* Returns all supported database installer objects that are compiled into PHP.
*
* @return
* An array of database installer objects compiled into PHP.
@@ -576,7 +582,7 @@ class DatabaseTaskException extends Exception {
}
/**
* Replace values in settings.php with values in the submitted array.
* Replaces values in settings.php with values in the submitted array.
*
* @param $settings
* An array of settings that need to be updated.
@@ -654,10 +660,11 @@ function drupal_rewrite_settings($settings = array(), $prefix = '') {
}
/**
* Verify an install profile for installation.
* Verifies an installation profile for installation.
*
* @param $install_state
* An array of information about the current installation state.
*
* @return
* The list of modules to install.
*/
@@ -681,8 +688,8 @@ function drupal_verify_profile($install_state) {
$present_modules[] = $present_module->name;
}
// The install profile is also a module, which needs to be installed after all the other dependencies
// have been installed.
// The installation profile is also a module, which needs to be installed
// after all the other dependencies have been installed.
$present_modules[] = drupal_get_profile();
// Verify that all of the profile's required modules are present.
@@ -706,7 +713,7 @@ function drupal_verify_profile($install_state) {
}
/**
* Callback to install the system module.
* Installs the system module.
*
* Separated from the installation of other modules so core system
* functions can be made available while other modules are installed.
@@ -800,7 +807,7 @@ function drupal_uninstall_modules($module_list = array(), $uninstall_dependents
}
/**
* Verify the state of the specified file.
* Verifies the state of the specified file.
*
* @param $file
* The file to check for.
@@ -808,6 +815,7 @@ function drupal_uninstall_modules($module_list = array(), $uninstall_dependents
* An optional bitmask created from various FILE_* constants.
* @param $type
* The type of file. Can be file (default), dir, or link.
*
* @return
* TRUE on success or FALSE on failure. A message is set for the latter.
*/
@@ -879,7 +887,7 @@ function drupal_verify_install_file($file, $mask = NULL, $type = 'file') {
}
/**
* Create a directory with specified permissions.
* Creates a directory with the specified permissions.
*
* @param $file
* The name of the directory to create;
@@ -887,6 +895,7 @@ function drupal_verify_install_file($file, $mask = NULL, $type = 'file') {
* The permissions of the directory to create.
* @param $message
* (optional) Whether to output messages. Defaults to TRUE.
*
* @return
* TRUE/FALSE whether or not the directory was successfully created.
*/
@@ -918,7 +927,7 @@ function drupal_install_mkdir($file, $mask, $message = TRUE) {
}
/**
* Attempt to fix file permissions.
* Attempts to fix file permissions.
*
* The general approach here is that, because we do not know the security
* setup of the webserver, we apply our permission changes to all three
@@ -935,6 +944,7 @@ function drupal_install_mkdir($file, $mask, $message = TRUE) {
* The desired permissions for the file.
* @param $message
* (optional) Whether to output messages. Defaults to TRUE.
*
* @return
* TRUE/FALSE whether or not we were able to fix the file's permissions.
*/
@@ -1000,7 +1010,7 @@ function drupal_install_fix_file($file, $mask, $message = TRUE) {
}
/**
* Send the user to a different installer page.
* Sends the user to a different installer page.
*
* This issues an on-site HTTP redirect. Messages (and errors) are erased.
*
@@ -1078,7 +1088,7 @@ function drupal_requirements_url($severity) {
}
/**
* Functional equivalent of t(), used when some systems are not available.
* Translates a string when some systems are not available.
*
* Used during the install process, when database, theme, and localization
* system is possibly not yet available.
@@ -1138,12 +1148,12 @@ function st($string, array $args = array(), array $options = array()) {
}
/**
* Check an install profile's requirements.
* Checks an installation profile's requirements.
*
* @param $profile
* Name of install profile to check.
* Name of installation profile to check.
* @return
* Array of the install profile's requirements.
* Array of the installation profile's requirements.
*/
function drupal_check_profile($profile) {
include_once DRUPAL_ROOT . '/includes/file.inc';
@@ -1169,11 +1179,12 @@ function drupal_check_profile($profile) {
}
/**
* Extract highest severity from requirements array.
* Extracts the highest severity from the requirements array.
*
* @param $requirements
* An array of requirements, in the same format as is returned by
* hook_requirements().
*
* @return
* The highest severity in the array.
*/
@@ -1188,12 +1199,13 @@ function drupal_requirements_severity(&$requirements) {
}
/**
* Check a module's requirements.
* Checks a module's requirements.
*
* @param $module
* Machine name of module to check.
*
* @return
* TRUE/FALSE depending on the requirements are in place.
* TRUE or FALSE, depending on whether the requirements are met.
*/
function drupal_check_module($module) {
module_load_install($module);
@@ -1218,13 +1230,14 @@ function drupal_check_module($module) {
}
/**
* Retrieve info about an install profile from its .info file.
* Retrieves information about an installation profile from its .info file.
*
* The information stored in a profile .info file is similar to that stored in
* a normal Drupal module .info file. For example:
* - name: The real name of the install profile for display purposes.
* - name: The real name of the installation profile for display purposes.
* - description: A brief description of the profile.
* - dependencies: An array of shortnames of other modules this install profile requires.
* - dependencies: An array of shortnames of other modules that this install
* profile requires.
*
* Additional, less commonly-used information that can appear in a profile.info
* file but not in a normal Drupal module .info file includes:

View File

@@ -461,7 +461,7 @@ function _locale_get_predefined_list() {
'tt' => array('Tatar', 'Tatarça'),
'tw' => array('Twi'),
'ty' => array('Tahitian'),
'ug' => array('Uighur'),
'ug' => array('Uyghur'),
'uk' => array('Ukrainian', 'Українська'),
'ur' => array('Urdu', /* Left-to-right marker "" */ 'اردو', LANGUAGE_RTL),
'uz' => array('Uzbek', "o'zbek"),

View File

@@ -190,6 +190,11 @@ function language_negotiation_get_switch_links($type, $path) {
$links = FALSE;
$negotiation = variable_get("language_negotiation_$type", array());
// Only get the languages if we have more than one.
if (count(language_list()) >= 2) {
$language = language_initialize($type);
}
foreach ($negotiation as $id => $provider) {
if (isset($provider['callbacks']['switcher'])) {
if (isset($provider['file'])) {
@@ -199,6 +204,12 @@ function language_negotiation_get_switch_links($type, $path) {
$callback = $provider['callbacks']['switcher'];
$result = $callback($type, $path);
// Add support for WCAG 2.0's Language of Parts to add language identifiers.
// http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-other-lang-id.html
foreach ($result as $langcode => $link) {
$result[$langcode]['attributes']['lang'] = $langcode;
}
if (!empty($result)) {
// Allow modules to provide translations for specific links.
drupal_alter('language_switch_links', $result, $type, $path);
@@ -408,7 +419,7 @@ function language_from_default() {
}
/**
* Split the given path into prefix and actual path.
* Splits the given path into prefix and actual path.
*
* Parse the given path and return the language object identified by the
* prefix and the actual path.
@@ -440,10 +451,10 @@ function language_url_split_prefix($path, $languages) {
}
/**
* Return the possible fallback languages ordered by language weight.
* Returns the possible fallback languages ordered by language weight.
*
* @param
* The language type.
* (optional) The language type. Defaults to LANGUAGE_TYPE_CONTENT.
*
* @return
* An array of language codes.

View File

@@ -13,7 +13,7 @@
define('MAIL_LINE_ENDINGS', isset($_SERVER['WINDIR']) || strpos($_SERVER['SERVER_SOFTWARE'], 'Win32') !== FALSE ? "\r\n" : "\n");
/**
* Compose and optionally send an e-mail message.
* Composes and optionally sends an e-mail message.
*
* Sending an e-mail works with defining an e-mail template (subject, text
* and possibly e-mail headers) and the replacement values to use in the
@@ -191,7 +191,7 @@ function drupal_mail($module, $key, $to, $language, $params = array(), $from = N
}
/**
* Returns an object that implements the MailSystemInterface.
* Returns an object that implements the MailSystemInterface interface.
*
* Allows for one or more custom mail backends to format and send mail messages
* composed using drupal_mail().
@@ -328,7 +328,7 @@ interface MailSystemInterface {
}
/**
* Perform format=flowed soft wrapping for mail (RFC 3676).
* Performs format=flowed soft wrapping for mail (RFC 3676).
*
* We use delsp=yes wrapping, but only break non-spaced languages when
* absolutely necessary to avoid compatibility issues.
@@ -340,6 +340,9 @@ interface MailSystemInterface {
* @param $indent (optional)
* A string to indent the text with. Only '>' characters are repeated on
* subsequent wrapped lines. Others are replaced by spaces.
*
* @return
* The content of the email as a string with formatting applied.
*/
function drupal_wrap_mail($text, $indent = '') {
// Convert CRLF into LF.
@@ -371,8 +374,7 @@ function drupal_wrap_mail($text, $indent = '') {
}
/**
* Transform an HTML string into plain text, preserving the structure of the
* markup. Useful for preparing the body of a node to be sent by e-mail.
* Transforms an HTML string into plain text, preserving its structure.
*
* The output will be suitable for use as 'format=flowed; delsp=yes' text
* (RFC 3676) and can be passed directly to drupal_mail() for sending.
@@ -551,9 +553,9 @@ function drupal_html_to_text($string, $allowed_tags = NULL) {
}
/**
* Helper function for array_walk in drupal_wrap_mail().
*
* Wraps words on a single line.
*
* Callback for array_walk() winthin drupal_wrap_mail().
*/
function _drupal_wrap_mail_line(&$line, $key, $values) {
// Use soft-breaks only for purely quoted or unindented text.
@@ -563,9 +565,9 @@ function _drupal_wrap_mail_line(&$line, $key, $values) {
}
/**
* Helper function for drupal_html_to_text().
*
* Keeps track of URLs and replaces them with placeholder tokens.
*
* Callback for preg_replace_callback() within drupal_html_to_text().
*/
function _drupal_html_to_mail_urls($match = NULL, $reset = FALSE) {
global $base_url, $base_path;
@@ -590,18 +592,18 @@ function _drupal_html_to_mail_urls($match = NULL, $reset = FALSE) {
}
/**
* Helper function for drupal_wrap_mail() and drupal_html_to_text().
* Replaces non-quotation markers from a given piece of indentation with spaces.
*
* Replace all non-quotation markers from a given piece of indentation with spaces.
* Callback for array_map() within drupal_html_to_text().
*/
function _drupal_html_to_text_clean($indent) {
return preg_replace('/[^>]/', ' ', $indent);
}
/**
* Helper function for drupal_html_to_text().
* Pads the last line with the given character.
*
* Pad the last line with the given character.
* @see drupal_html_to_text()
*/
function _drupal_html_to_text_pad($text, $pad, $prefix = '') {
// Remove last line break.

View File

@@ -417,9 +417,9 @@ function menu_unserialize($data, $map) {
* @param $path
* The path.
* @param $router_item
* The router item. Usually you take a router entry from menu_get_item and
* set it back either modified or to a different path. This lets you modify the
* navigation block, the page title, the breadcrumb and the page help in one
* The router item. Usually a router entry from menu_get_item() is either
* modified or set to a different path. This allows the navigation block,
* the page title, the breadcrumb, and the page help to be modified in one
* call.
*/
function menu_set_item($path, $router_item) {
@@ -427,7 +427,7 @@ function menu_set_item($path, $router_item) {
}
/**
* Get a router item.
* Gets a router item.
*
* @param $path
* The path, for example node/5. The function will find the corresponding
@@ -436,12 +436,13 @@ function menu_set_item($path, $router_item) {
* Internal use only.
*
* @return
* The router item, an associate array corresponding to one row in the
* menu_router table. The value of key map holds the loaded objects. The
* value of key access is TRUE if the current user can access this page.
* The values for key title, page_arguments, access_arguments, and
* theme_arguments will be filled in based on the database values and the
* objects loaded.
* The router item or, if an error occurs in _menu_translate(), FALSE. A
* router item is an associative array corresponding to one row in the
* menu_router table. The value corresponding to the key 'map' holds the
* loaded objects. The value corresponding to the key 'access' is TRUE if the
* current user can access this page. The values corresponding to the keys
* 'title', 'page_arguments', 'access_arguments', and 'theme_arguments' will
* be filled in based on the database values and the objects loaded.
*/
function menu_get_item($path = NULL, $router_item = NULL) {
$router_items = &drupal_static(__FUNCTION__);
@@ -606,7 +607,7 @@ function _menu_load_objects(&$item, &$map) {
}
/**
* Check access to a menu item using the access callback
* Checks access to a menu item using the access callback.
*
* @param $item
* A menu router or menu link item
@@ -638,7 +639,7 @@ function _menu_check_access(&$item, $map) {
}
/**
* Localize the router item title using t() or another callback.
* Localizes the router item title using t() or another callback.
*
* Translate the title and description to allow storage of English title
* strings in the database, yet display of them in the language required
@@ -746,7 +747,7 @@ function _menu_item_localize(&$item, $map, $link_translate = FALSE) {
* $item['load_functions']. $item['access'] becomes TRUE if the item is
* accessible, FALSE otherwise. $item['href'] is set according to the map.
* If an error occurs during calling the load_functions (like trying to load
* a non existing node) then this function return FALSE.
* a non-existent node) then this function returns FALSE.
*/
function _menu_translate(&$router_item, $map, $to_arg = FALSE) {
if ($to_arg && !empty($router_item['to_arg_functions'])) {
@@ -796,14 +797,14 @@ function _menu_translate(&$router_item, $map, $to_arg = FALSE) {
}
/**
* This function translates the path elements in the map using any to_arg
* helper function. These functions take an argument and return an object.
* See http://drupal.org/node/109153 for more information.
* Translates the path elements in the map using any to_arg helper function.
*
* @param $map
* An array of path arguments (ex: array('node', '5'))
* @param $to_arg_functions
* An array of helper function (ex: array(2 => 'menu_tail_to_arg'))
*
* @see hook_menu()
*/
function _menu_link_map_translate(&$map, $to_arg_functions) {
$to_arg_functions = unserialize($to_arg_functions);
@@ -820,14 +821,14 @@ function _menu_link_map_translate(&$map, $to_arg_functions) {
}
/**
* Returns path as one string from the argument we are currently at.
* Returns a string containing the path relative to the current index.
*/
function menu_tail_to_arg($arg, $map, $index) {
return implode('/', array_slice($map, $index));
}
/**
* Loads path as one string from the argument we are currently at.
* Loads the path as one string relative to the current index.
*
* To use this load function, you must specify the load arguments
* in the router item as:
@@ -844,8 +845,10 @@ function menu_tail_load($arg, &$map, $index) {
}
/**
* This function is similar to _menu_translate() but does link-specific
* preparation such as always calling to_arg functions
* Provides menu link access control, translation, and argument handling.
*
* This function is similar to _menu_translate(), but it also does
* link-specific preparation (such as always calling to_arg() functions).
*
* @param $item
* A menu link.
@@ -939,7 +942,7 @@ function _menu_link_translate(&$item, $translate = FALSE) {
}
/**
* Get a loaded object from a router item.
* Gets a loaded object from a router item.
*
* menu_get_object() provides access to objects loaded by the current router
* item. For example, on the page node/%node, the router loads the %node object,
@@ -1079,7 +1082,7 @@ function menu_tree_output($tree) {
}
/**
* Get the data structure representing a named menu tree.
* Gets the data structure representing a named menu tree.
*
* Since this can be the full tree including hidden items, the data returned
* may be used for generating an an admin interface or a select.
@@ -1147,7 +1150,7 @@ function menu_tree_all_data($menu_name, $link = NULL, $max_depth = NULL) {
}
/**
* Set the path for determining the active trail of the specified menu tree.
* Sets the path for determining the active trail of the specified menu tree.
*
* This path will also affect the breadcrumbs under some circumstances.
* Breadcrumbs are built using the preferred link returned by
@@ -1172,7 +1175,7 @@ function menu_tree_set_path($menu_name, $path = NULL) {
}
/**
* Get the path for determining the active trail of the specified menu tree.
* Gets the path for determining the active trail of the specified menu tree.
*
* @param $menu_name
* The menu name of the requested tree.
@@ -1186,7 +1189,7 @@ function menu_tree_get_path($menu_name) {
}
/**
* Get the data structure representing a named menu tree, based on the current page.
* Gets the data structure for a named menu tree, based on the current page.
*
* The tree order is maintained by storing each parent in an individual
* field, see http://drupal.org/node/141866 for more.
@@ -1320,7 +1323,7 @@ function menu_tree_page_data($menu_name, $max_depth = NULL, $only_active_trail =
}
/**
* Build a menu tree, translate links, and check access.
* Builds a menu tree, translates links, and checks access.
*
* @param $menu_name
* The name of the menu.
@@ -1335,8 +1338,8 @@ function menu_tree_page_data($menu_name, $max_depth = NULL, $only_active_trail =
* trail. This option is ignored, if 'expanded' is non-empty. Internally
* used for breadcrumbs.
* - min_depth: The minimum depth of menu links in the resulting tree.
* Defaults to 1, which is the default to build a whole tree for a menu, i.e.
* excluding menu container itself.
* Defaults to 1, which is the default to build a whole tree for a menu
* (excluding menu container itself).
* - max_depth: The maximum depth of menu links in the resulting tree.
* - conditions: An associative array of custom database select query
* condition key/value pairs; see _menu_build_tree() for the actual query.
@@ -1353,7 +1356,7 @@ function menu_build_tree($menu_name, array $parameters = array()) {
}
/**
* Build a menu tree.
* Builds a menu tree.
*
* This function may be used build the data for a menu tree only, for example
* to further massage the data manually before further processing happens.
@@ -1449,7 +1452,7 @@ function _menu_build_tree($menu_name, array $parameters = array()) {
}
/**
* Recursive helper function - collect node links.
* Collects node links from a given menu tree recursively.
*
* @param $tree
* The menu tree you wish to collect node links from.
@@ -1472,7 +1475,7 @@ function menu_tree_collect_node_links(&$tree, &$node_links) {
}
/**
* Check access and perform other dynamic operations for each link in the tree.
* Checks access and performs dynamic operations for each link in the tree.
*
* @param $tree
* The menu tree you wish to operate on.
@@ -1499,7 +1502,7 @@ function menu_tree_check_access(&$tree, $node_links = array()) {
}
/**
* Recursive helper function for menu_tree_check_access()
* Sorts the menu tree and recursively checks access for each item.
*/
function _menu_tree_check_access(&$tree) {
$new_tree = array();
@@ -1522,7 +1525,7 @@ function _menu_tree_check_access(&$tree) {
}
/**
* Builds the data representing a menu tree.
* Sorts and returns the built data representing a menu tree.
*
* @param $links
* A flat array of menu links that are part of the menu. Each array element
@@ -1554,7 +1557,7 @@ function menu_tree_data(array $links, array $parents = array(), $depth = 1) {
}
/**
* Recursive helper function to build the data representing a menu tree.
* Builds the data representing a menu tree.
*
* The function is a bit complex because the rendering of a link depends on
* the next menu link.
@@ -1589,7 +1592,7 @@ function _menu_tree_data(&$links, $parents, $depth) {
}
/**
* Preprocesses the rendered tree for theme_menu_tree().
* Implements template_preprocess_HOOK() for theme_menu_tree().
*/
function template_preprocess_menu_tree(&$variables) {
$variables['tree'] = $variables['tree']['#children'];
@@ -1783,7 +1786,7 @@ function menu_get_names() {
}
/**
* Return an array containing the names of system-defined (default) menus.
* Returns an array containing the names of system-defined (default) menus.
*/
function menu_list_system_menus() {
return array(
@@ -1795,14 +1798,14 @@ function menu_list_system_menus() {
}
/**
* Return an array of links to be rendered as the Main menu.
* Returns an array of links to be rendered as the Main menu.
*/
function menu_main_menu() {
return menu_navigation_links(variable_get('menu_main_links_source', 'main-menu'));
}
/**
* Return an array of links to be rendered as the Secondary links.
* Returns an array of links to be rendered as the Secondary links.
*/
function menu_secondary_menu() {
@@ -1817,7 +1820,7 @@ function menu_secondary_menu() {
}
/**
* Return an array of links for a navigation menu.
* Returns an array of links for a navigation menu.
*
* @param $menu_name
* The name of the menu.
@@ -2109,14 +2112,12 @@ function menu_local_tasks($level = 0) {
}
/**
* Retrieve contextual links for a system object based on registered local tasks.
* Retrieves contextual links for a path based on registered local tasks.
*
* This leverages the menu system to retrieve the first layer of registered
* local tasks for a given system path. All local tasks of the tab type
* MENU_CONTEXT_INLINE are taken into account.
*
* @see hook_menu()
*
* For example, when considering the following registered local tasks:
* - node/%node/view (default local task) with no 'context' defined
* - node/%node/edit with context: MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE
@@ -2144,6 +2145,7 @@ function menu_local_tasks($level = 0) {
* A list of menu router items that are local tasks for the passed-in path.
*
* @see contextual_links_preprocess()
* @see hook_menu()
*/
function menu_contextual_links($module, $parent_path, $args) {
static $path_empty = array();
@@ -2237,7 +2239,7 @@ function menu_local_actions() {
}
/**
* Returns the router path, or the path of the parent tab of a default local task.
* Returns the router path, or the path for a default local task's parent.
*/
function menu_tab_root_path() {
$links = menu_local_tasks();
@@ -2258,7 +2260,13 @@ function menu_local_tabs() {
/**
* Returns HTML for primary and secondary local tasks.
*
* @param $variables
* An associative array containing:
* - primary: (optional) An array of local tasks (tabs).
* - secondary: (optional) An array of local tasks (tabs).
*
* @ingroup themeable
* @see menu_local_tasks()
*/
function theme_menu_local_tasks(&$variables) {
$output = '';
@@ -2280,7 +2288,9 @@ function theme_menu_local_tasks(&$variables) {
}
/**
* Set (or get) the active menu for the current page - determines the active trail.
* Sets (or gets) the active menu for the current page.
*
* The active menu for the page determines the active trail.
*
* @return
* An array of menu machine names, in order of preference. The
@@ -2302,17 +2312,17 @@ function menu_set_active_menu_names($menu_names = NULL) {
}
/**
* Get the active menu for the current page - determines the active trail.
* Gets the active menu for the current page.
*/
function menu_get_active_menu_names() {
return menu_set_active_menu_names();
}
/**
* Set the active path, which determines which page is loaded.
* Sets the active path, which determines which page is loaded.
*
* Note that this may not have the desired effect unless invoked very early
* in the page load, such as during hook_boot, or unless you call
* in the page load, such as during hook_boot(), or unless you call
* menu_execute_active_handler() to generate your page output.
*
* @param $path
@@ -2326,7 +2336,7 @@ function menu_set_active_item($path) {
}
/**
* Sets the active trail (path to menu tree root) of the current page.
* Sets the active trail (path to the menu tree root) of the current page.
*
* Any trail set by this function will only be used for functionality that calls
* menu_get_active_trail(). Drupal core only uses trails set here for
@@ -2416,7 +2426,7 @@ function menu_set_active_trail($new_trail = NULL) {
}
/**
* Lookup the preferred menu link for a given system path.
* Looks up the preferred menu link for a given system path.
*
* @param $path
* The path, for example 'node/5'. The function will find the corresponding
@@ -2536,7 +2546,7 @@ function menu_get_active_trail() {
}
/**
* Get the breadcrumb for the current page, as determined by the active trail.
* Gets the breadcrumb for the current page, as determined by the active trail.
*
* @see menu_set_active_trail()
*/
@@ -2587,7 +2597,7 @@ function menu_get_active_breadcrumb() {
}
/**
* Get the title of the current page, as determined by the active trail.
* Gets the title of the current page, as determined by the active trail.
*/
function menu_get_active_title() {
$active_trail = menu_get_active_trail();
@@ -2600,7 +2610,7 @@ function menu_get_active_title() {
}
/**
* Get a menu link by its mlid, access checked and link translated for rendering.
* Gets a translated, access-checked menu link that is ready for rendering.
*
* This function should never be called from within node_load() or any other
* function used as a menu object load function since an infinite recursion may
@@ -2651,7 +2661,9 @@ function menu_cache_clear($menu_name = 'navigation') {
}
/**
* Clears all cached menu data. This should be called any time broad changes
* Clears all cached menu data.
*
* This should be called any time broad changes
* might have been made to the router items or menu links.
*/
function menu_cache_clear_all() {
@@ -2672,10 +2684,10 @@ function menu_reset_static_cache() {
}
/**
* (Re)populate the database tables used by various menu functions.
* Populates the database tables used by various menu functions.
*
* This function will clear and populate the {menu_router} table, add entries
* to {menu_links} for new router items, then remove stale items from
* to {menu_links} for new router items, and then remove stale items from
* {menu_links}. If called from update.php or install.php, it will also
* schedule a call to itself on the first real page load from
* menu_execute_active_handler(), because the maintenance page environment
@@ -2721,7 +2733,7 @@ function menu_rebuild() {
}
/**
* Collect and alter the menu definitions.
* Collects and alters the menu definitions.
*/
function menu_router_build() {
// We need to manually call each module so that we can know which module
@@ -2745,7 +2757,7 @@ function menu_router_build() {
}
/**
* Helper function to store the menu router if we have it in memory.
* Stores the menu router if we have it in memory.
*/
function _menu_router_cache($new_menu = NULL) {
$menu = &drupal_static(__FUNCTION__);
@@ -2757,7 +2769,7 @@ function _menu_router_cache($new_menu = NULL) {
}
/**
* Get the menu router.
* Gets the menu router.
*/
function menu_get_router() {
// Check first if we have it in memory already.
@@ -2794,7 +2806,7 @@ function _menu_link_build($item) {
}
/**
* Helper function to build menu links for the items in the menu router.
* Builds menu links for the items in the menu router.
*/
function _menu_navigation_links_rebuild($menu) {
// Add normal and suggested items as links.
@@ -2894,7 +2906,7 @@ function _menu_navigation_links_rebuild($menu) {
}
/**
* Clone an array of menu links.
* Clones an array of menu links.
*
* @param $links
* An array of menu links to clone.
@@ -2985,12 +2997,14 @@ function menu_link_delete($mlid, $path = NULL) {
}
/**
* Helper function for menu_link_delete; deletes a single menu link.
* Deletes a single menu link.
*
* @param $item
* Item to be deleted.
* @param $force
* Forces deletion. Internal use only, setting to TRUE is discouraged.
*
* @see menu_link_delete()
*/
function _menu_delete_item($item, $force = FALSE) {
$item = is_object($item) ? get_object_vars($item) : $item;
@@ -3202,7 +3216,7 @@ function menu_link_save(&$item, $existing_item = array(), $parent_candidates = a
}
/**
* Find a possible parent for a given menu link.
* Finds a possible parent for a given menu link.
*
* Because the parent of a given link might not exist anymore in the database,
* we apply a set of heuristics to determine a proper parent:
@@ -3216,6 +3230,7 @@ function menu_link_save(&$item, $existing_item = array(), $parent_candidates = a
* A menu link.
* @param $parent_candidates
* An array of menu links keyed by mlid.
*
* @return
* A menu link structure of the possible parent or FALSE if no valid parent
* has been found.
@@ -3281,7 +3296,7 @@ function _menu_link_find_parent($menu_link, $parent_candidates = array()) {
}
/**
* Helper function to clear the page and block caches at most twice per page load.
* Clears the page and block caches at most twice per page load.
*/
function _menu_clear_page_cache() {
$cache_cleared = &drupal_static(__FUNCTION__, 0);
@@ -3303,7 +3318,7 @@ function _menu_clear_page_cache() {
}
/**
* Helper function to update a list of menus with expanded items
* Updates a list of menus with expanded items.
*/
function _menu_set_expanded_menus() {
$names = db_query("SELECT menu_name FROM {menu_links} WHERE expanded <> 0 GROUP BY menu_name")->fetchCol();
@@ -3311,7 +3326,7 @@ function _menu_set_expanded_menus() {
}
/**
* Find the router path which will serve this path.
* Finds the router path which will serve this path.
*
* @param $link_path
* The path for we are looking up its router path.
@@ -3353,7 +3368,7 @@ function _menu_find_router_path($link_path) {
}
/**
* Insert, update or delete an uncustomized menu link related to a module.
* Inserts, updates, or deletes an uncustomized menu link related to a module.
*
* @param $module
* The name of the module.
@@ -3393,7 +3408,7 @@ function menu_link_maintain($module, $op, $link_path, $link_title) {
}
/**
* Find the depth of an item's children relative to its depth.
* Finds the depth of an item's children relative to its depth.
*
* For example, if the item has a depth of 2, and the maximum of any child in
* the menu link tree is 5, the relative depth is 3.
@@ -3425,7 +3440,7 @@ function menu_link_children_relative_depth($item) {
}
/**
* Update the children of a menu link that's being moved.
* Updates the children of a menu link that is being moved.
*
* The menu name, parents (p1 - p6), and depth are updated for all children of
* the link, and the has_children status of the previous parent is updated.
@@ -3474,7 +3489,7 @@ function _menu_link_move_children($item, $existing_item) {
}
/**
* Check and update the has_children status for the parent of a link.
* Checks and updates the 'has_children' status for the parent of a link.
*/
function _menu_update_parental_status($item, $exclude = FALSE) {
// If plid == 0, there is nothing to update.
@@ -3498,7 +3513,7 @@ function _menu_update_parental_status($item, $exclude = FALSE) {
}
/**
* Helper function that sets the p1..p9 values for a menu link being saved.
* Sets the p1 through p9 values for a menu link being saved.
*/
function _menu_link_parents_set(&$item, $parent) {
$i = 1;
@@ -3516,7 +3531,7 @@ function _menu_link_parents_set(&$item, $parent) {
}
/**
* Helper function to build the router table based on the data from hook_menu.
* Builds the router table based on the data from hook_menu().
*/
function _menu_router_build($callbacks) {
// First pass: separate callbacks from paths, making paths ready for
@@ -3743,7 +3758,7 @@ function _menu_router_build($callbacks) {
}
/**
* Helper function to save data from menu_router_build() to the router table.
* Saves data from menu_router_build() to the router table.
*/
function _menu_router_save($menu, $masks) {
// Delete the existing router since we have some data to replace it.

View File

@@ -6,7 +6,7 @@
*/
/**
* Load all the modules that have been enabled in the system table.
* Loads all the modules that have been enabled in the system table.
*
* @param $bootstrap
* Whether to load only the reduced set of modules loaded in "bootstrap mode"
@@ -102,7 +102,7 @@ function module_list($refresh = FALSE, $bootstrap_refresh = FALSE, $sort = FALSE
}
/**
* Build a list of bootstrap modules and enabled modules and themes.
* Builds a list of bootstrap modules and enabled modules and themes.
*
* @param $type
* The type of list to return:
@@ -181,6 +181,7 @@ function system_list($type) {
foreach ($lists['theme'] as $key => $theme) {
if (!empty($theme->info['base theme'])) {
// Make a list of the theme's base themes.
require_once DRUPAL_ROOT . '/includes/theme.inc';
$lists['theme'][$key]->base_themes = drupal_find_base_themes($lists['theme'], $key);
// Don't proceed if there was a problem with the root base theme.
if (!current($lists['theme'][$key]->base_themes)) {
@@ -218,7 +219,7 @@ function system_list($type) {
}
/**
* Reset all system_list() caches.
* Resets all system_list() caches.
*/
function system_list_reset() {
drupal_static_reset('system_list');
@@ -229,7 +230,7 @@ function system_list_reset() {
}
/**
* Find dependencies any level deep and fill in required by information too.
* Determines which modules require and are required by each module.
*
* @param $files
* The array of filesystem objects used to rebuild the cache.
@@ -262,7 +263,7 @@ function _module_build_dependencies($files) {
}
/**
* Determine whether a given module exists.
* Determines whether a given module exists.
*
* @param $module
* The name of the module (without the .module extension).
@@ -276,7 +277,7 @@ function module_exists($module) {
}
/**
* Load a module's installation hooks.
* Loads a module's installation hooks.
*
* @param $module
* The name of the module (without the .module extension).
@@ -292,7 +293,7 @@ function module_load_install($module) {
}
/**
* Load a module include file.
* Loads a module include file.
*
* Examples:
* @code
@@ -334,8 +335,7 @@ function module_load_include($type, $module, $name = NULL) {
}
/**
* Load an include file for each of the modules that have been enabled in
* the system table.
* Loads an include file for each module enabled in the {system} table.
*/
function module_load_all_includes($type, $name = NULL) {
$modules = module_list();
@@ -503,7 +503,7 @@ function module_enable($module_list, $enable_dependencies = TRUE) {
}
/**
* Disable a given set of modules.
* Disables a given set of modules.
*
* @param $module_list
* An array of module names.
@@ -614,7 +614,7 @@ function module_disable($module_list, $disable_dependents = TRUE) {
*/
/**
* Determine whether a module implements a hook.
* Determines whether a module implements a hook.
*
* @param $module
* The name of the module (without the .module extension).
@@ -643,7 +643,7 @@ function module_hook($module, $hook) {
}
/**
* Determine which modules are implementing a hook.
* Determines which modules are implementing a hook.
*
* @param $hook
* The name of the hook (e.g. "help" or "menu").
@@ -744,7 +744,14 @@ function module_implements($hook, $sort = FALSE, $reset = FALSE) {
}
/**
* Retrieve a list of what hooks are explicitly declared.
* Retrieves a list of hooks that are declared through hook_hook_info().
*
* @return
* An associative array whose keys are hook names and whose values are an
* associative array containing a group name. The structure of the array
* is the same as the return value of hook_hook_info().
*
* @see hook_hook_info()
*/
function module_hook_info() {
// This function is indirectly invoked from bootstrap_invoke_all(), in which
@@ -806,7 +813,7 @@ function module_implements_write_cache() {
}
/**
* Invoke a hook in a particular module.
* Invokes a hook in a particular module.
*
* @param $module
* The name of the module (without the .module extension).
@@ -828,7 +835,7 @@ function module_invoke($module, $hook) {
}
/**
* Invoke a hook in all enabled modules that implement it.
* Invokes a hook in all enabled modules that implement it.
*
* @param $hook
* The name of the hook to invoke.
@@ -865,13 +872,13 @@ function module_invoke_all($hook) {
*/
/**
* Array of modules required by core.
* Returns an array of modules required by core.
*/
function drupal_required_modules() {
$files = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.info$/', 'modules', 'name', 0);
$required = array();
// An install profile is required and one must always be loaded.
// An installation profile is required and one must always be loaded.
$required[] = drupal_get_profile();
foreach ($files as $name => $file) {
@@ -885,7 +892,7 @@ function drupal_required_modules() {
}
/**
* Hands off alterable variables to type-specific *_alter implementations.
* Passes alterable variables to specific hook_TYPE_alter() implementations.
*
* This dispatch function hands off the passed-in variables to type-specific
* hook_TYPE_alter() implementations in modules. It ensures a consistent

View File

@@ -349,6 +349,11 @@ function drupal_session_started($set = NULL) {
*/
function drupal_session_regenerate() {
global $user, $is_https;
// Nothing to do if we are not allowed to change the session.
if (!drupal_save_session()) {
return;
}
if ($is_https && variable_get('https', FALSE)) {
$insecure_session_name = substr(session_name(), 1);
if (!isset($GLOBALS['lazy_session']) && isset($_COOKIE[$insecure_session_name])) {
@@ -418,6 +423,11 @@ function drupal_session_regenerate() {
function _drupal_session_destroy($sid) {
global $user, $is_https;
// Nothing to do if we are not allowed to change the session.
if (!drupal_save_session()) {
return;
}
// Delete session data.
db_delete('sessions')
->condition($is_https ? 'ssid' : 'sid', $sid)
@@ -465,6 +475,11 @@ function _drupal_session_delete_cookie($name, $secure = NULL) {
* User ID.
*/
function drupal_session_destroy_uid($uid) {
// Nothing to do if we are not allowed to change the session.
if (!drupal_save_session()) {
return;
}
db_delete('sessions')
->condition('uid', $uid)
->execute();
@@ -507,7 +522,10 @@ function _drupal_session_garbage_collection($lifetime) {
* FALSE if writing session data has been disabled. Otherwise, TRUE.
*/
function drupal_save_session($status = NULL) {
$save_session = &drupal_static(__FUNCTION__, TRUE);
// PHP session ID, session, and cookie handling happens in the global scope.
// This value has to persist across calls to drupal_static_reset(), since a
// potentially wrong or disallowed session would be written otherwise.
static $save_session = TRUE;
if (isset($status)) {
$save_session = $status;
}

View File

@@ -553,7 +553,7 @@ abstract class DrupalLocalStreamWrapper implements DrupalStreamWrapperInterface
* Support for unlink().
*
* @param $uri
* A string containing the uri to the resource to delete.
* A string containing the URI to the resource to delete.
*
* @return
* TRUE if resource was successfully deleted.
@@ -569,9 +569,9 @@ abstract class DrupalLocalStreamWrapper implements DrupalStreamWrapperInterface
* Support for rename().
*
* @param $from_uri,
* The uri to the file to rename.
* The URI to the file to rename.
* @param $to_uri
* The new uri for file.
* The new URI for file.
*
* @return
* TRUE if file was successfully renamed.

View File

@@ -2069,10 +2069,12 @@ function theme_item_list($variables) {
if (!empty($items)) {
$output .= "<$type" . drupal_attributes($attributes) . '>';
$num_items = count($items);
foreach ($items as $i => $item) {
$i = 0;
foreach ($items as $item) {
$attributes = array();
$children = array();
$data = '';
$i++;
if (is_array($item)) {
foreach ($item as $key => $value) {
if ($key == 'data') {
@@ -2093,10 +2095,10 @@ function theme_item_list($variables) {
// Render nested list.
$data .= theme_item_list(array('items' => $children, 'title' => NULL, 'type' => $type, 'attributes' => $attributes));
}
if ($i == 0) {
if ($i == 1) {
$attributes['class'][] = 'first';
}
if ($i == $num_items - 1) {
if ($i == $num_items) {
$attributes['class'][] = 'last';
}
$output .= '<li' . drupal_attributes($attributes) . '>' . $data . "</li>\n";
@@ -2112,7 +2114,7 @@ function theme_item_list($variables) {
*
* @param $variables
* An associative array containing:
* - url: The url for the link.
* - url: The URL for the link.
*/
function theme_more_help_link($variables) {
return '<div class="more-help-link">' . l(t('More help'), $variables['url']) . '</div>';
@@ -2128,7 +2130,7 @@ function theme_more_help_link($variables) {
* - title: A descriptive title of the feed.
*/
function theme_feed_icon($variables) {
$text = t('Subscribe to @feed-title', array('@feed-title' => $variables['title']));
$text = t('Subscribe to !feed-title', array('!feed-title' => $variables['title']));
if ($image = theme('image', array('path' => 'misc/feed.png', 'width' => 16, 'height' => 16, 'alt' => $text))) {
return l($image, $variables['url'], array('html' => TRUE, 'attributes' => array('class' => array('feed-icon'), 'title' => $text)));
}
@@ -2177,7 +2179,7 @@ function theme_html_tag($variables) {
*
* @param $variables
* An associative array containing:
* - url: The url of the main page.
* - url: The URL of the main page.
* - title: A descriptive verb for the link, like 'Read more'.
*/
function theme_more_link($variables) {

View File

@@ -96,7 +96,7 @@ function unicode_check() {
* Whether to report any fatal errors with form_set_error().
*/
function _unicode_check() {
// Ensure translations don't break at install time
// Ensure translations don't break during installation.
$t = get_t();
// Check for mbstring extension
@@ -128,7 +128,7 @@ function _unicode_check() {
* Return Unicode library status and errors.
*/
function unicode_requirements() {
// Ensure translations don't break at install time
// Ensure translations don't break during installation.
$t = get_t();
$libraries = array(

View File

@@ -785,12 +785,12 @@ function update_fix_d7_requirements() {
/**
* Register the currently installed profile in the system table.
*
* Install profiles are now treated as modules by Drupal, and have an upgrade
* path based on their schema version in the system table.
* Installation profiles are now treated as modules by Drupal, and have an
* upgrade path based on their schema version in the system table.
*
* The install profile will be set to schema_version 0, as it has already been
* installed. Any other hook_update_N functions provided by the install profile
* will be run by update.php.
* The installation profile will be set to schema_version 0, as it has already
* been installed. Any other hook_update_N functions provided by the
* installation profile will be run by update.php.
*/
function update_fix_d7_install_profile() {
$profile = drupal_get_profile();
@@ -828,10 +828,10 @@ function update_fix_d7_install_profile() {
'owner' => '',
);
// Install profile hooks are always executed last by the module system
// Installation profile hooks are always executed last by the module system
$values['weight'] = 1000;
// Initializing the system table entry for the install profile
// Initializing the system table entry for the installation profile
db_insert('system')
->fields(array_keys($values))
->values($values)
@@ -840,7 +840,8 @@ function update_fix_d7_install_profile() {
// Reset the cached schema version.
drupal_get_installed_schema_version($profile, TRUE);
// Load the updates again to make sure the install profile updates are loaded
// Load the updates again to make sure the installation profile updates
// are loaded.
drupal_load_updates();
}
}
@@ -895,7 +896,7 @@ function update_get_d6_session_name() {
}
else {
// Otherwise use $base_url as session name, without the protocol
// to use the same session identifiers across http and https.
// to use the same session identifiers across HTTP and HTTPS.
list( , $session_name) = explode('://', $base_url, 2);
}
@@ -1474,17 +1475,3 @@ function update_retrieve_dependencies() {
return $return;
}
/**
* @defgroup update-api-6.x-to-7.x Update versions of API functions
* @{
* Functions similar to normal API function but not firing hooks.
*
* During update, it is impossible to judge the consequences of firing a hook
* as it might hit a module not yet updated. So simplified versions of some
* core APIs are provided.
*/
/**
* @} End of "defgroup update-api-6.x-to-7.x".
*/