alter('html_head', $elements); if ($render) { return \Drupal::service('renderer')->renderPlain($elements); } else { return $elements; } } /** * Prepares a 'destination' URL query parameter for use with url(). * * Used to direct the user back to the referring page after completing a form. * By default the current URL is returned. If a destination exists in the * previous request, that destination is returned. As such, a destination can * persist across multiple pages. * * @return array * An associative array containing the key: * - destination: The value of the current request's 'destination' query * parameter, if present. This can be either a relative or absolute URL. * However, for security, redirection to external URLs is not performed. * If the query parameter isn't present, then the URL of the current * request is returned. * * @see \Drupal\Core\EventSubscriber\RedirectResponseSubscriber::checkRedirectUrl() * * @ingroup form_api * * @deprecated in Drupal 8.0.x-dev, will be removed before Drupal 9.0.0. * Use the redirect.destination service. */ function drupal_get_destination() { return \Drupal::destination()->getAsArray(); } /** * @defgroup validation Input validation * @{ * Functions to validate user input. */ /** * Verifies the syntax of the given email address. * * @param string $mail * A string containing an email address. * * @return bool * TRUE if the address is in a valid format. * * @deprecated in Drupal 8.0.x-dev, will be removed before Drupal 9.0.0. * Use \Drupal::service('email.validator')->isValid(). */ function valid_email_address($mail) { return \Drupal::service('email.validator')->isValid($mail); } /** * @} End of "defgroup validation". */ /** * @defgroup sanitization Sanitization functions * @{ * Functions to sanitize values. * * See https://www.drupal.org/writing-secure-code for information * on writing secure code. */ /** * Strips dangerous protocols from a URI and encodes it for output to HTML. * * @param $uri * A plain-text URI that might contain dangerous protocols. * * @return * A URI stripped of dangerous protocols and encoded for output to an HTML * attribute value. Because it is already encoded, it should not be set as a * value within a $attributes array passed to Drupal\Core\Template\Attribute, * because Drupal\Core\Template\Attribute expects those values to be * plain-text strings. To pass a filtered URI to * Drupal\Core\Template\Attribute, call * \Drupal\Component\Utility\UrlHelper::stripDangerousProtocols() instead. * * @see \Drupal\Component\Utility\UrlHelper::stripDangerousProtocols() * @see \Drupal\Component\Utility\SafeMarkup::checkPlain() */ function check_url($uri) { return SafeMarkup::checkPlain(UrlHelper::stripDangerousProtocols($uri)); } /** * @} End of "defgroup sanitization". */ /** * @defgroup format Formatting * @{ * Functions to format numbers, strings, dates, etc. */ /** * Generates a string representation for the given byte count. * * @param $size * A size in bytes. * @param $langcode * Optional language code to translate to a language other than what is used * to display the page. * * @return * A translated string representation of the size. */ function format_size($size, $langcode = NULL) { if ($size < Bytes::KILOBYTE) { return \Drupal::translation()->formatPlural($size, '1 byte', '@count bytes', array(), array('langcode' => $langcode)); } else { $size = $size / Bytes::KILOBYTE; // Convert bytes to kilobytes. $units = array( t('@size KB', array(), array('langcode' => $langcode)), t('@size MB', array(), array('langcode' => $langcode)), t('@size GB', array(), array('langcode' => $langcode)), t('@size TB', array(), array('langcode' => $langcode)), t('@size PB', array(), array('langcode' => $langcode)), t('@size EB', array(), array('langcode' => $langcode)), t('@size ZB', array(), array('langcode' => $langcode)), t('@size YB', array(), array('langcode' => $langcode)), ); foreach ($units as $unit) { if (round($size, 2) >= Bytes::KILOBYTE) { $size = $size / Bytes::KILOBYTE; } else { break; } } return str_replace('@size', round($size, 2), $unit); } } /** * Formats a date, using a date type or a custom date format string. * * @param $timestamp * A UNIX timestamp to format. * @param $type * (optional) The format to use, one of: * - One of the built-in formats: 'short', 'medium', * 'long', 'html_datetime', 'html_date', 'html_time', * 'html_yearless_date', 'html_week', 'html_month', 'html_year'. * - The name of a date type defined by a date format config entity. * - The machine name of an administrator-defined date format. * - 'custom', to use $format. * Defaults to 'medium'. * @param $format * (optional) If $type is 'custom', a PHP date format string suitable for * input to date(). Use a backslash to escape ordinary text, so it does not * get interpreted as date format characters. * @param $timezone * (optional) Time zone identifier, as described at * http://php.net/manual/timezones.php Defaults to the time zone used to * display the page. * @param $langcode * (optional) Language code to translate to. Defaults to the language used to * display the page. * * @return * A translated date string in the requested format. * * @see \Drupal\Core\Datetime\DateFormatter::format() */ function format_date($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) { return \Drupal::service('date.formatter')->format($timestamp, $type, $format, $timezone, $langcode); } /** * Returns an ISO8601 formatted date based on the given date. * * @param $date * A UNIX timestamp. * * @return string * An ISO8601 formatted date. */ function date_iso8601($date) { // The DATE_ISO8601 constant cannot be used here because it does not match // date('c') and produces invalid RDF markup. return date('c', $date); } /** * @} End of "defgroup format". */ /** * Formats an attribute string for an HTTP header. * * @param $attributes * An associative array of attributes such as 'rel'. * * @return * A ; separated string ready for insertion in a HTTP header. No escaping is * performed for HTML entities, so this string is not safe to be printed. */ function drupal_http_header_attributes(array $attributes = array()) { foreach ($attributes as $attribute => &$data) { if (is_array($data)) { $data = implode(' ', $data); } $data = $attribute . '="' . $data . '"'; } return $attributes ? ' ' . implode('; ', $attributes) : ''; } /** * Attempts to set the PHP maximum execution time. * * This function is a wrapper around the PHP function set_time_limit(). * When called, set_time_limit() restarts the timeout counter from zero. * In other words, if the timeout is the default 30 seconds, and 25 seconds * into script execution a call such as set_time_limit(20) is made, the * script will run for a total of 45 seconds before timing out. * * If the current time limit is not unlimited it is possible to decrease the * total time limit if the sum of the new time limit and the current time spent * running the script is inferior to the original time limit. It is inherent to * the way set_time_limit() works, it should rather be called with an * appropriate value every time you need to allocate a certain amount of time * to execute a task than only once at the beginning of the script. * * Before calling set_time_limit(), we check if this function is available * because it could be disabled by the server administrator. We also hide all * the errors that could occur when calling set_time_limit(), because it is * not possible to reliably ensure that PHP or a security extension will * not issue a warning/error if they prevent the use of this function. * * @param $time_limit * An integer specifying the new time limit, in seconds. A value of 0 * indicates unlimited execution time. * * @ingroup php_wrappers */ function drupal_set_time_limit($time_limit) { if (function_exists('set_time_limit')) { $current = ini_get('max_execution_time'); // Do not set time limit if it is currently unlimited. if ($current != 0) { @set_time_limit($time_limit); } } } /** * Returns the base URL path (i.e., directory) of the Drupal installation. * * base_path() adds a "/" to the beginning and end of the returned path if the * path is not empty. At the very least, this will return "/". * * Examples: * - http://example.com returns "/" because the path is empty. * - http://example.com/drupal/folder returns "/drupal/folder/". */ function base_path() { return $GLOBALS['base_path']; } /** * Adds a LINK tag with a distinct 'rel' attribute to the page's HEAD. * * This function can be called as long the HTML header hasn't been sent, which * on normal pages is up through the preprocess step of _theme('html'). Adding * a link will overwrite a prior link with the exact same 'rel' and 'href' * attributes. * * @param $attributes * Associative array of element attributes including 'href' and 'rel'. * @param $header * Optional flag to determine if a HTTP 'Link:' header should be sent. * * @deprecated in Drupal 8.0.x, will be removed before Drupal 8.0.0 * Use #attached on render arrays. */ function _drupal_add_html_head_link($attributes, $header = FALSE) { $element = array( '#tag' => 'link', '#attributes' => $attributes, ); $href = $attributes['href']; if ($header) { // Also add a HTTP header "Link:". $href = '<' . SafeMarkup::checkPlain($attributes['href']) . '>;'; unset($attributes['href']); $element['#attached']['http_header'][] = array('Link', $href . drupal_http_header_attributes($attributes), TRUE); } _drupal_add_html_head($element, 'html_head_link:' . $attributes['rel'] . ':' . $href); } /** * Deletes old cached CSS files. * * @deprecated in Drupal 8.x, will be removed before Drupal 9.0. * Use \Drupal\Core\Asset\AssetCollectionOptimizerInterface::deleteAll(). */ function drupal_clear_css_cache() { \Drupal::service('asset.css.collection_optimizer')->deleteAll(); } /** * Constructs an array of the defaults that are used for JavaScript assets. * * @param $data * (optional) The default data parameter for the JavaScript asset array. * * @see hook_js_alter() */ function drupal_js_defaults($data = NULL) { return array( 'type' => 'file', 'group' => JS_DEFAULT, 'every_page' => FALSE, 'weight' => 0, 'scope' => 'header', 'cache' => TRUE, 'preprocess' => TRUE, 'attributes' => array(), 'version' => NULL, 'data' => $data, 'browsers' => array(), ); } /** * Merges two #attached arrays. * * The values under the 'drupalSettings' key are merged in a special way, to * match the behavior of: * * @code * jQuery.extend(true, {}, $settings_items[0], $settings_items[1], ...) * @endcode * * This means integer indices are preserved just like string indices are, * rather than re-indexed as is common in PHP array merging. * * Example: * @code * function module1_page_attachments(&$page) { * $page['a']['#attached']['drupalSettings']['foo'] = ['a', 'b', 'c']; * } * function module2_page_attachments(&$page) { * $page['#attached']['drupalSettings']['foo'] = ['d']; * } * // When the page is rendered after the above code, and the browser runs the * // resulting