Issue #2307859 by rpayanm, dankh, shumer: Move theme-render hooks from system.api.php to theme.api.php

8.0.x
Jennifer Hodgdon 2014-10-28 14:10:02 -07:00
parent ffe035e68f
commit 7bd652eb0c
2 changed files with 491 additions and 505 deletions

View File

@ -118,160 +118,6 @@ function hook_queue_info_alter(&$queues) {
$queues['aggregator_feeds']['cron']['time'] = 90;
}
/**
* Allows modules to declare their own Form API element types and specify their
* default values.
*
* This hook allows modules to declare their own form element types and to
* specify their default values. The values returned by this hook will be
* merged with the elements returned by form constructor implementations and so
* can return defaults for any Form APIs keys in addition to those explicitly
* documented by \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
*
* @return array
* An associative array with structure identical to that of the return value
* of \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
*
* @deprecated Use an annotated class instead, see
* \Drupal\Core\Render\Element\ElementInterface.
*
* @see hook_element_info_alter()
*/
function hook_element_info() {
$types['filter_format'] = array(
'#input' => TRUE,
);
return $types;
}
/**
* Alter the element type information returned from modules.
*
* A module may implement this hook in order to alter the element type defaults
* defined by a module.
*
* @param array $types
* An associative array with structure identical to that of the return value
* of \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
*
* @see hook_element_info()
*/
function hook_element_info_alter(array &$types) {
// Decrease the default size of textfields.
if (isset($types['textfield']['#size'])) {
$types['textfield']['#size'] = 40;
}
}
/**
* Perform necessary alterations to the JavaScript before it is presented on
* the page.
*
* @param $javascript
* An array of all JavaScript being presented on the page.
*
* @see _drupal_add_js()
* @see drupal_get_js()
* @see drupal_js_defaults()
*/
function hook_js_alter(&$javascript) {
// Swap out jQuery to use an updated version of the library.
$javascript['core/assets/vendor/jquery/jquery.js']['data'] = drupal_get_path('module', 'jquery_update') . '/jquery.js';
}
/**
* Alters the JavaScript/CSS library registry.
*
* Allows certain, contributed modules to update libraries to newer versions
* while ensuring backwards compatibility. In general, such manipulations should
* only be done by designated modules, since most modules that integrate with a
* certain library also depend on the API of a certain library version.
*
* @param $libraries
* The JavaScript/CSS libraries provided by $module. Keyed by internal library
* name and passed by reference.
* @param $module
* The name of the module that registered the libraries.
*/
function hook_library_info_alter(&$libraries, $module) {
// Update Farbtastic to version 2.0.
if ($module == 'core' && isset($libraries['jquery.farbtastic'])) {
// Verify existing version is older than the one we are updating to.
if (version_compare($libraries['jquery.farbtastic']['version'], '2.0', '<')) {
// Update the existing Farbtastic to version 2.0.
$libraries['jquery.farbtastic']['version'] = '2.0';
// To accurately replace library files, the order of files and the options
// of each file have to be retained; e.g., like this:
$old_path = 'assets/vendor/farbtastic';
// Since the replaced library files are no longer located in a directory
// relative to the original extension, specify an absolute path (relative
// to DRUPAL_ROOT / base_path()) to the new location.
$new_path = '/' . drupal_get_path('module', 'farbtastic_update') . '/js';
$new_js = array();
$replacements = array(
$old_path . '/farbtastic.js' => $new_path . '/farbtastic-2.0.js',
);
foreach ($libraries['jquery.farbtastic']['js'] as $source => $options) {
if (isset($replacements[$source])) {
$new_js[$replacements[$source]] = $options;
}
else {
$new_js[$source] = $options;
}
}
$libraries['jquery.farbtastic']['js'] = $new_js;
}
}
}
/**
* Alters a JavaScript/CSS library before it is attached.
*
* Allows modules and themes to dynamically attach further assets to a library
* when it is added to the page; e.g., to add JavaScript settings.
*
* This hook is only invoked once per library and page.
*
* @param array $library
* The JavaScript/CSS library that is being added.
* @param string $name
* The name of the library.
*
* @see _drupal_add_library()
*/
function hook_library_alter(array &$library, $name) {
if ($name == 'core/jquery.ui.datepicker') {
// Note: If the added assets do not depend on additional request-specific
// data supplied here, consider to statically register it directly via
// hook_library_info_alter() already.
$library['dependencies'][] = 'locale/drupal.locale.datepicker';
$language_interface = \Drupal::languageManager()->getCurrentLanguage();
$settings['jquery']['ui']['datepicker'] = array(
'isRTL' => $language_interface->getDirection() == LanguageInterface::DIRECTION_RTL,
'firstDay' => \Drupal::config('system.date')->get('first_day'),
);
$library['js'][] = array(
'type' => 'setting',
'data' => $settings,
);
}
}
/**
* Alter CSS files before they are output on the page.
*
* @param $css
* An array of all CSS items (files and inline CSS) being requested on the page.
*
* @see _drupal_add_css()
* @see drupal_get_css()
*/
function hook_css_alter(&$css) {
// Remove defaults.css file.
unset($css[drupal_get_path('module', 'system') . '/defaults.css']);
}
/**
* Alter the Ajax command data that is sent to the client.
*
@ -287,102 +133,6 @@ function hook_ajax_render_alter(array &$data) {
$data[] = $command->render();
}
/**
* Add attachments (typically assets) to a page before it is rendered.
*
* Kept around for backwards compatibility, but now allows only attachments to
* be added, adding renderable arrays is no longer allowed.
*
* @deprecated in Drupal 8.x, will be removed before Drupal 9.0. Successor:
* hook_page_attachments(). Is now effectively an alias of that hook.
*
* @param $page
* The page to which to add attachments.
*
* @see hook_page_attachments()
*/
function hook_page_build(&$page) {
$path = drupal_get_path('module', 'foo');
// Add JavaScript/CSS assets to all pages.
// @see drupal_process_attached()
$page['#attached']['js'][$path . '/foo.js'] = array('every_page' => TRUE);
$page['#attached']['css'][$path . '/foo.base.css'] = array('every_page' => TRUE);
$page['#attached']['css'][$path . '/foo.theme.css'] = array('every_page' => TRUE);
// Add a special CSS file to a certain page only.
if (drupal_is_front_page()) {
$page['#attached']['css'][] = $path . '/foo.front.css';
}
}
/**
* Add attachments (typically assets) to a page before it is rendered.
*
* Use this hook when you want to conditionally add attachments to a page.
*
* If you want to alter the attachments added by other modules or if your module
* depends on the elements of other modules, use hook_page_attachments_alter()
* instead, which runs after this hook.
*
* @param array &$page
* An empty renderable array representing the page.
*
* @see hook_page_attachments_alter()
*/
function hook_page_attachments(array &$page) {
// Unconditionally attach an asset to the page.
$page['#attached']['library'][] = 'core/domready';
// Conditionally attach an asset to the page.
if (!\Drupal::currentUser()->hasPermission('may pet kittens')) {
$page['#attached']['library'][] = 'core/jquery';
}
}
/**
* Alter attachments (typically assets) to a page before it is rendered.
*
* Use this hook when you want to remove or alter attachments on the page, or
* add attachments to the page that depend on aonther module's attachments (this
* hook runs after hook_page_attachments().
*
* If you want to alter the attachments added by other modules or if your module
* depends on the elements of other modules, use hook_page_attachments_alter()
* instead, which runs after this hook.
*
* @param array &$page
* An empty renderable array representing the page.
*
* @see hook_page_attachments_alter()
*/
function hook_page_attachments_alter(array &$page) {
// Conditionally remove an asset.
if (in_array('core/jquery', $page['#attached']['library'])) {
$index = array_search('core/jquery', $page['#attached']['library']);
unset($page['#attached']['library'][$index]);
}
}
/**
* Add a renderable array to the top of the page.
*
* @param array $page_top
* A renderable array representing the top of the page.
*/
function hook_page_top(array &$page_top) {
$page_top['mymodule'] = ['#markup' => 'This is the top.'];
}
/**
* Add a renderable array to the bottom of the page.
*
* @param array $page_top
* A renderable array representing the bottom of the page.
*/
function hook_page_bottom(array &$page) {
$page_bottom['mymodule'] = ['#markup' => 'This is the bottom.'];
}
/**
* Alters all the menu links discovered by the menu link plugin manager.
*
@ -595,32 +345,6 @@ function hook_contextual_links_plugins_alter(array &$contextual_links) {
$contextual_links['menu_edit']['title'] = 'Edit the menu';
}
/**
* Perform alterations before a page is rendered.
*
* Kept around for backwards compatibility, but now allows only attachments to
* be added, altering the renderable array for the page is no longer allowed.
*
* @deprecated in Drupal 8.x, will be removed before Drupal 9.0. Successor:
* hook_page_attachments_alter(). Is now effectively an alias of that hook.
*
* Use this hook when you want to remove or alter attachments at the page
* level, or add attachments at the page level that depend on an other module's
* attachments (this hook runs after hook_page_build().
*
* @param $page
* An empty renderable array representing the page.
*
* @see hook_page_build()
*/
function hook_page_alter(&$page) {
// Conditionally remove an asset.
if (in_array('core/jquery', $page['#attached']['library'])) {
$index = array_search('core/jquery', $page['#attached']['library']);
unset($page['#attached']['library'][$index]);
}
}
/**
* Perform alterations before a form is rendered.
*
@ -937,212 +661,6 @@ function hook_help($route_name, \Drupal\Core\Routing\RouteMatchInterface $route_
}
}
/**
* Register a module or theme's theme implementations.
*
* The implementations declared by this hook have several purposes:
* - They can specify how a particular render array is to be rendered as HTML.
* This is usually the case if the theme function is assigned to the render
* array's #theme property.
* - They can return HTML for default calls to _theme().
* - They can return HTML for calls to _theme() for a theme suggestion.
*
* @param array $existing
* An array of existing implementations that may be used for override
* purposes. This is primarily useful for themes that may wish to examine
* existing implementations to extract data (such as arguments) so that
* it may properly register its own, higher priority implementations.
* @param $type
* Whether a theme, module, etc. is being processed. This is primarily useful
* so that themes tell if they are the actual theme being called or a parent
* theme. May be one of:
* - 'module': A module is being checked for theme implementations.
* - 'base_theme_engine': A theme engine is being checked for a theme that is
* a parent of the actual theme being used.
* - 'theme_engine': A theme engine is being checked for the actual theme
* being used.
* - 'base_theme': A base theme is being checked for theme implementations.
* - 'theme': The actual theme in use is being checked.
* @param $theme
* The actual name of theme, module, etc. that is being being processed.
* @param $path
* The directory path of the theme or module, so that it doesn't need to be
* looked up.
*
* @return array
* An associative array of information about theme implementations. The keys
* on the outer array are known as "theme hooks". For simple theme
* implementations for regular calls to _theme(), the theme hook is the first
* argument. For theme suggestions, instead of the array key being the base
* theme hook, the key is a theme suggestion name with the format
* 'base_hook_name__sub_hook_name'. For render elements, the key is the
* machine name of the render element. The array values are themselves arrays
* containing information about the theme hook and its implementation. Each
* information array must contain either a 'variables' element (for _theme()
* calls) or a 'render element' element (for render elements), but not both.
* The following elements may be part of each information array:
* - variables: Used for _theme() call items only: an array of variables,
* where the array keys are the names of the variables, and the array
* values are the default values if they are not passed into _theme().
* Template implementations receive each array key as a variable in the
* template file (so they must be legal PHP/Twig variable names). Function
* implementations are passed the variables in a single $variables function
* argument.
* - render element: Used for render element items only: the name of the
* renderable element or element tree to pass to the theme function. This
* name is used as the name of the variable that holds the renderable
* element or tree in preprocess and process functions.
* - file: The file the implementation resides in. This file will be included
* prior to the theme being rendered, to make sure that the function or
* preprocess function (as needed) is actually loaded; this makes it
* possible to split theme functions out into separate files quite easily.
* - path: Override the path of the file to be used. Ordinarily the module or
* theme path will be used, but if the file will not be in the default
* path, include it here. This path should be relative to the Drupal root
* directory.
* - template: If specified, the theme implementation is a template file, and
* this is the template name. Do not add 'html.twig' on the end of the
* template name. The extension will be added automatically by the default
* rendering engine (which is Twig.) If 'path' is specified, 'template'
* should also be specified. If neither 'template' nor 'function' are
* specified, a default template name will be assumed. For example, if a
* module registers the 'search_result' theme hook, 'search-result' will be
* assigned as its template name.
* - function: If specified, this will be the function name to invoke for
* this implementation. If neither 'template' nor 'function' are specified,
* a default template name will be assumed. See above for more details.
* - base hook: Used for _theme() suggestions only: the base theme hook name.
* Instead of this suggestion's implementation being used directly, the base
* hook will be invoked with this implementation as its first suggestion.
* The base hook's files will be included and the base hook's preprocess
* functions will be called in place of any suggestion's preprocess
* functions. If an implementation of hook_theme_suggestions_HOOK() (where
* HOOK is the base hook) changes the suggestion order, a different
* suggestion may be used in place of this suggestion. If after
* hook_theme_suggestions_HOOK() this suggestion remains the first
* suggestion, then this suggestion's function or template will be used to
* generate the output for _theme().
* - pattern: A regular expression pattern to be used to allow this theme
* implementation to have a dynamic name. The convention is to use __ to
* differentiate the dynamic portion of the theme. For example, to allow
* forums to be themed individually, the pattern might be: 'forum__'. Then,
* when the forum is themed, call:
* @code
* _theme(array('forum__' . $tid, 'forum'), $forum)
* @endcode
* - preprocess functions: A list of functions used to preprocess this data.
* Ordinarily this won't be used; it's automatically filled in. By default,
* for a module this will be filled in as template_preprocess_HOOK. For
* a theme this will be filled in as twig_preprocess and
* twig_preprocess_HOOK as well as themename_preprocess and
* themename_preprocess_HOOK.
* - override preprocess functions: Set to TRUE when a theme does NOT want
* the standard preprocess functions to run. This can be used to give a
* theme FULL control over how variables are set. For example, if a theme
* wants total control over how certain variables in the page.html.twig are
* set, this can be set to true. Please keep in mind that when this is used
* by a theme, that theme becomes responsible for making sure necessary
* variables are set.
* - type: (automatically derived) Where the theme hook is defined:
* 'module', 'theme_engine', or 'theme'.
* - theme path: (automatically derived) The directory path of the theme or
* module, so that it doesn't need to be looked up.
*
* @see hook_theme_registry_alter()
*/
function hook_theme($existing, $type, $theme, $path) {
return array(
'forum_display' => array(
'variables' => array('forums' => NULL, 'topics' => NULL, 'parents' => NULL, 'tid' => NULL, 'sortby' => NULL, 'forum_per_page' => NULL),
),
'forum_list' => array(
'variables' => array('forums' => NULL, 'parents' => NULL, 'tid' => NULL),
),
'forum_icon' => array(
'variables' => array('new_posts' => NULL, 'num_posts' => 0, 'comment_mode' => 0, 'sticky' => 0),
),
'status_report' => array(
'render element' => 'requirements',
'file' => 'system.admin.inc',
),
);
}
/**
* Alter the theme registry information returned from hook_theme().
*
* The theme registry stores information about all available theme hooks,
* including which callback functions those hooks will call when triggered,
* what template files are exposed by these hooks, and so on.
*
* Note that this hook is only executed as the theme cache is re-built.
* Changes here will not be visible until the next cache clear.
*
* The $theme_registry array is keyed by theme hook name, and contains the
* information returned from hook_theme(), as well as additional properties
* added by \Drupal\Core\Theme\Registry::processExtension().
*
* For example:
* @code
* $theme_registry['user'] = array(
* 'variables' => array(
* 'account' => NULL,
* ),
* 'template' => 'core/modules/user/user',
* 'file' => 'core/modules/user/user.pages.inc',
* 'type' => 'module',
* 'theme path' => 'core/modules/user',
* 'preprocess functions' => array(
* 0 => 'template_preprocess',
* 1 => 'template_preprocess_user_profile',
* ),
* );
* @endcode
*
* @param $theme_registry
* The entire cache of theme registry information, post-processing.
*
* @see hook_theme()
* @see \Drupal\Core\Theme\Registry::processExtension()
*/
function hook_theme_registry_alter(&$theme_registry) {
// Kill the next/previous forum topic navigation links.
foreach ($theme_registry['forum_topic_navigation']['preprocess functions'] as $key => $value) {
if ($value == 'template_preprocess_forum_topic_navigation') {
unset($theme_registry['forum_topic_navigation']['preprocess functions'][$key]);
}
}
}
/**
* Alter the default, hook-independent variables for all templates.
*
* Allows modules to provide additional default template variables or manipulate
* existing. This hook is invoked from template_preprocess() after basic default
* template variables have been set up and before the next template preprocess
* function is invoked.
*
* Note that the default template variables are statically cached within a
* request. When adding a template variable that depends on other context, it is
* your responsibility to appropriately reset the static cache in
* template_preprocess() when needed:
* @code
* drupal_static_reset('template_preprocess');
* @endcode
*
* See user_template_preprocess_default_variables_alter() for an example.
*
* @param array $variables
* An associative array of default template variables, as set up by
* _template_preprocess_default_variables(). Passed by reference.
*
* @see template_preprocess()
* @see _template_preprocess_default_variables()
*/
function hook_template_preprocess_default_variables_alter(&$variables) {
$variables['is_admin'] = \Drupal::currentUser()->hasPermission('access administration pages');
}
/**
* Prepare a message based on parameters; called from drupal_mail().
*
@ -1300,29 +818,6 @@ function hook_module_preuninstall($module) {
mymodule_cache_clear();
}
/**
* Perform necessary actions when themes are installed.
*
* @param array $themes
* An array of theme names which are installed.
*/
function hook_themes_installed(array $themes) {
// Add some state entries depending on the theme.
foreach ($themes as $theme) {
\Drupal::state()->set('example.' . $theme, 'some-value');
}
}
/**
* Perform necessary actions when themes are uninstalled.
*/
function hook_themes_uninstalled(array $themes) {
// Remove some state entries depending on the theme.
foreach ($themes as $theme) {
\Drupal::state()->delete('example.' . $theme);
}
}
/**
* Perform necessary actions after modules are uninstalled.
*

View File

@ -307,6 +307,11 @@
* @}
*/
/**
* @addtogroup hooks
* @{
*/
/**
* Allow themes to alter the theme-specific settings form.
*
@ -576,3 +581,489 @@ function hook_render_template($template_file, $variables) {
return $twig_service->loadTemplate($template_file)->render($variables);
}
/**
* Allows modules to declare their own Form API element types and specify their
* default values.
*
* This hook allows modules to declare their own form element types and to
* specify their default values. The values returned by this hook will be
* merged with the elements returned by form constructor implementations and so
* can return defaults for any Form APIs keys in addition to those explicitly
* documented by \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
*
* @return array
* An associative array with structure identical to that of the return value
* of \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
*
* @deprecated Use an annotated class instead, see
* \Drupal\Core\Render\Element\ElementInterface.
*
* @see hook_element_info_alter()
*/
function hook_element_info() {
$types['filter_format'] = array(
'#input' => TRUE,
);
return $types;
}
/**
* Alter the element type information returned from modules.
*
* A module may implement this hook in order to alter the element type defaults
* defined by a module.
*
* @param array $types
* An associative array with structure identical to that of the return value
* of \Drupal\Core\Render\ElementInfoManagerInterface::getInfo().
*
* @see hook_element_info()
*/
function hook_element_info_alter(array &$types) {
// Decrease the default size of textfields.
if (isset($types['textfield']['#size'])) {
$types['textfield']['#size'] = 40;
}
}
/**
* Perform necessary alterations to the JavaScript before it is presented on
* the page.
*
* @param $javascript
* An array of all JavaScript being presented on the page.
*
* @see _drupal_add_js()
* @see drupal_get_js()
* @see drupal_js_defaults()
*/
function hook_js_alter(&$javascript) {
// Swap out jQuery to use an updated version of the library.
$javascript['core/assets/vendor/jquery/jquery.js']['data'] = drupal_get_path('module', 'jquery_update') . '/jquery.js';
}
/**
* Alters the JavaScript/CSS library registry.
*
* Allows certain, contributed modules to update libraries to newer versions
* while ensuring backwards compatibility. In general, such manipulations should
* only be done by designated modules, since most modules that integrate with a
* certain library also depend on the API of a certain library version.
*
* @param $libraries
* The JavaScript/CSS libraries provided by $module. Keyed by internal library
* name and passed by reference.
* @param $module
* The name of the module that registered the libraries.
*/
function hook_library_info_alter(&$libraries, $module) {
// Update Farbtastic to version 2.0.
if ($module == 'core' && isset($libraries['jquery.farbtastic'])) {
// Verify existing version is older than the one we are updating to.
if (version_compare($libraries['jquery.farbtastic']['version'], '2.0', '<')) {
// Update the existing Farbtastic to version 2.0.
$libraries['jquery.farbtastic']['version'] = '2.0';
// To accurately replace library files, the order of files and the options
// of each file have to be retained; e.g., like this:
$old_path = 'assets/vendor/farbtastic';
// Since the replaced library files are no longer located in a directory
// relative to the original extension, specify an absolute path (relative
// to DRUPAL_ROOT / base_path()) to the new location.
$new_path = '/' . drupal_get_path('module', 'farbtastic_update') . '/js';
$new_js = array();
$replacements = array(
$old_path . '/farbtastic.js' => $new_path . '/farbtastic-2.0.js',
);
foreach ($libraries['jquery.farbtastic']['js'] as $source => $options) {
if (isset($replacements[$source])) {
$new_js[$replacements[$source]] = $options;
}
else {
$new_js[$source] = $options;
}
}
$libraries['jquery.farbtastic']['js'] = $new_js;
}
}
}
/**
* Alters a JavaScript/CSS library before it is attached.
*
* Allows modules and themes to dynamically attach further assets to a library
* when it is added to the page; e.g., to add JavaScript settings.
*
* This hook is only invoked once per library and page.
*
* @param array $library
* The JavaScript/CSS library that is being added.
* @param string $name
* The name of the library.
*
* @see _drupal_add_library()
*/
function hook_library_alter(array &$library, $name) {
if ($name == 'core/jquery.ui.datepicker') {
// Note: If the added assets do not depend on additional request-specific
// data supplied here, consider to statically register it directly via
// hook_library_info_alter() already.
$library['dependencies'][] = 'locale/drupal.locale.datepicker';
$language_interface = \Drupal::languageManager()->getCurrentLanguage();
$settings['jquery']['ui']['datepicker'] = array(
'isRTL' => $language_interface->getDirection() == LanguageInterface::DIRECTION_RTL,
'firstDay' => \Drupal::config('system.date')->get('first_day'),
);
$library['js'][] = array(
'type' => 'setting',
'data' => $settings,
);
}
}
/**
* Alter CSS files before they are output on the page.
*
* @param $css
* An array of all CSS items (files and inline CSS) being requested on the page.
*
* @see _drupal_add_css()
* @see drupal_get_css()
*/
function hook_css_alter(&$css) {
// Remove defaults.css file.
unset($css[drupal_get_path('module', 'system') . '/defaults.css']);
}
/**
* Add attachments (typically assets) to a page before it is rendered.
*
* Kept around for backwards compatibility, but now allows only attachments to
* be added, adding renderable arrays is no longer allowed.
*
* @deprecated in Drupal 8.x, will be removed before Drupal 9.0. Successor:
* hook_page_attachments(). Is now effectively an alias of that hook.
*
* @param $page
* The page to which to add attachments.
*
* @see hook_page_attachments()
*/
function hook_page_build(&$page) {
$path = drupal_get_path('module', 'foo');
// Add JavaScript/CSS assets to all pages.
// @see drupal_process_attached()
$page['#attached']['js'][$path . '/foo.js'] = array('every_page' => TRUE);
$page['#attached']['css'][$path . '/foo.base.css'] = array('every_page' => TRUE);
$page['#attached']['css'][$path . '/foo.theme.css'] = array('every_page' => TRUE);
// Add a special CSS file to a certain page only.
if (drupal_is_front_page()) {
$page['#attached']['css'][] = $path . '/foo.front.css';
}
}
/**
* Perform alterations before a page is rendered.
*
* Kept around for backwards compatibility, but now allows only attachments to
* be added, altering the renderable array for the page is no longer allowed.
*
* @deprecated in Drupal 8.x, will be removed before Drupal 9.0. Successor:
* hook_page_attachments_alter(). Is now effectively an alias of that hook.
*
* Use this hook when you want to remove or alter attachments at the page
* level, or add attachments at the page level that depend on an other module's
* attachments (this hook runs after hook_page_build().
*
* @param $page
* An empty renderable array representing the page.
*
* @see hook_page_build()
*/
function hook_page_alter(&$page) {
// Conditionally remove an asset.
if (in_array('core/jquery', $page['#attached']['library'])) {
$index = array_search('core/jquery', $page['#attached']['library']);
unset($page['#attached']['library'][$index]);
}
}
/**
* Add attachments (typically assets) to a page before it is rendered.
*
* Use this hook when you want to conditionally add attachments to a page.
*
* If you want to alter the attachments added by other modules or if your module
* depends on the elements of other modules, use hook_page_attachments_alter()
* instead, which runs after this hook.
*
* @param array &$page
* An empty renderable array representing the page.
*
* @see hook_page_attachments_alter()
*/
function hook_page_attachments(array &$page) {
// Unconditionally attach an asset to the page.
$page['#attached']['library'][] = 'core/domready';
// Conditionally attach an asset to the page.
if (!\Drupal::currentUser()->hasPermission('may pet kittens')) {
$page['#attached']['library'][] = 'core/jquery';
}
}
/**
* Alter attachments (typically assets) to a page before it is rendered.
*
* Use this hook when you want to remove or alter attachments on the page, or
* add attachments to the page that depend on aonther module's attachments (this
* hook runs after hook_page_attachments().
*
* If you want to alter the attachments added by other modules or if your module
* depends on the elements of other modules, use hook_page_attachments_alter()
* instead, which runs after this hook.
*
* @param array &$page
* An empty renderable array representing the page.
*
* @see hook_page_attachments_alter()
*/
function hook_page_attachments_alter(array &$page) {
// Conditionally remove an asset.
if (in_array('core/jquery', $page['#attached']['library'])) {
$index = array_search('core/jquery', $page['#attached']['library']);
unset($page['#attached']['library'][$index]);
}
}
/**
* Add a renderable array to the top of the page.
*
* @param array $page_top
* A renderable array representing the top of the page.
*/
function hook_page_top(array &$page_top) {
$page_top['mymodule'] = ['#markup' => 'This is the top.'];
}
/**
* Add a renderable array to the bottom of the page.
*
* @param array $page_top
* A renderable array representing the bottom of the page.
*/
function hook_page_bottom(array &$page) {
$page_bottom['mymodule'] = ['#markup' => 'This is the bottom.'];
}
/**
* Register a module or theme's theme implementations.
*
* The implementations declared by this hook have several purposes:
* - They can specify how a particular render array is to be rendered as HTML.
* This is usually the case if the theme function is assigned to the render
* array's #theme property.
* - They can return HTML for default calls to _theme().
* - They can return HTML for calls to _theme() for a theme suggestion.
*
* @param array $existing
* An array of existing implementations that may be used for override
* purposes. This is primarily useful for themes that may wish to examine
* existing implementations to extract data (such as arguments) so that
* it may properly register its own, higher priority implementations.
* @param $type
* Whether a theme, module, etc. is being processed. This is primarily useful
* so that themes tell if they are the actual theme being called or a parent
* theme. May be one of:
* - 'module': A module is being checked for theme implementations.
* - 'base_theme_engine': A theme engine is being checked for a theme that is
* a parent of the actual theme being used.
* - 'theme_engine': A theme engine is being checked for the actual theme
* being used.
* - 'base_theme': A base theme is being checked for theme implementations.
* - 'theme': The actual theme in use is being checked.
* @param $theme
* The actual name of theme, module, etc. that is being being processed.
* @param $path
* The directory path of the theme or module, so that it doesn't need to be
* looked up.
*
* @return array
* An associative array of information about theme implementations. The keys
* on the outer array are known as "theme hooks". For simple theme
* implementations for regular calls to _theme(), the theme hook is the first
* argument. For theme suggestions, instead of the array key being the base
* theme hook, the key is a theme suggestion name with the format
* 'base_hook_name__sub_hook_name'. For render elements, the key is the
* machine name of the render element. The array values are themselves arrays
* containing information about the theme hook and its implementation. Each
* information array must contain either a 'variables' element (for _theme()
* calls) or a 'render element' element (for render elements), but not both.
* The following elements may be part of each information array:
* - variables: Used for _theme() call items only: an array of variables,
* where the array keys are the names of the variables, and the array
* values are the default values if they are not passed into _theme().
* Template implementations receive each array key as a variable in the
* template file (so they must be legal PHP/Twig variable names). Function
* implementations are passed the variables in a single $variables function
* argument.
* - render element: Used for render element items only: the name of the
* renderable element or element tree to pass to the theme function. This
* name is used as the name of the variable that holds the renderable
* element or tree in preprocess and process functions.
* - file: The file the implementation resides in. This file will be included
* prior to the theme being rendered, to make sure that the function or
* preprocess function (as needed) is actually loaded; this makes it
* possible to split theme functions out into separate files quite easily.
* - path: Override the path of the file to be used. Ordinarily the module or
* theme path will be used, but if the file will not be in the default
* path, include it here. This path should be relative to the Drupal root
* directory.
* - template: If specified, the theme implementation is a template file, and
* this is the template name. Do not add 'html.twig' on the end of the
* template name. The extension will be added automatically by the default
* rendering engine (which is Twig.) If 'path' is specified, 'template'
* should also be specified. If neither 'template' nor 'function' are
* specified, a default template name will be assumed. For example, if a
* module registers the 'search_result' theme hook, 'search-result' will be
* assigned as its template name.
* - function: If specified, this will be the function name to invoke for
* this implementation. If neither 'template' nor 'function' are specified,
* a default template name will be assumed. See above for more details.
* - base hook: Used for _theme() suggestions only: the base theme hook name.
* Instead of this suggestion's implementation being used directly, the base
* hook will be invoked with this implementation as its first suggestion.
* The base hook's files will be included and the base hook's preprocess
* functions will be called in place of any suggestion's preprocess
* functions. If an implementation of hook_theme_suggestions_HOOK() (where
* HOOK is the base hook) changes the suggestion order, a different
* suggestion may be used in place of this suggestion. If after
* hook_theme_suggestions_HOOK() this suggestion remains the first
* suggestion, then this suggestion's function or template will be used to
* generate the output for _theme().
* - pattern: A regular expression pattern to be used to allow this theme
* implementation to have a dynamic name. The convention is to use __ to
* differentiate the dynamic portion of the theme. For example, to allow
* forums to be themed individually, the pattern might be: 'forum__'. Then,
* when the forum is themed, call:
* @code
* _theme(array('forum__' . $tid, 'forum'), $forum)
* @endcode
* - preprocess functions: A list of functions used to preprocess this data.
* Ordinarily this won't be used; it's automatically filled in. By default,
* for a module this will be filled in as template_preprocess_HOOK. For
* a theme this will be filled in as twig_preprocess and
* twig_preprocess_HOOK as well as themename_preprocess and
* themename_preprocess_HOOK.
* - override preprocess functions: Set to TRUE when a theme does NOT want
* the standard preprocess functions to run. This can be used to give a
* theme FULL control over how variables are set. For example, if a theme
* wants total control over how certain variables in the page.html.twig are
* set, this can be set to true. Please keep in mind that when this is used
* by a theme, that theme becomes responsible for making sure necessary
* variables are set.
* - type: (automatically derived) Where the theme hook is defined:
* 'module', 'theme_engine', or 'theme'.
* - theme path: (automatically derived) The directory path of the theme or
* module, so that it doesn't need to be looked up.
*
* @see hook_theme_registry_alter()
*/
function hook_theme($existing, $type, $theme, $path) {
return array(
'forum_display' => array(
'variables' => array('forums' => NULL, 'topics' => NULL, 'parents' => NULL, 'tid' => NULL, 'sortby' => NULL, 'forum_per_page' => NULL),
),
'forum_list' => array(
'variables' => array('forums' => NULL, 'parents' => NULL, 'tid' => NULL),
),
'forum_icon' => array(
'variables' => array('new_posts' => NULL, 'num_posts' => 0, 'comment_mode' => 0, 'sticky' => 0),
),
'status_report' => array(
'render element' => 'requirements',
'file' => 'system.admin.inc',
),
);
}
/**
* Alter the theme registry information returned from hook_theme().
*
* The theme registry stores information about all available theme hooks,
* including which callback functions those hooks will call when triggered,
* what template files are exposed by these hooks, and so on.
*
* Note that this hook is only executed as the theme cache is re-built.
* Changes here will not be visible until the next cache clear.
*
* The $theme_registry array is keyed by theme hook name, and contains the
* information returned from hook_theme(), as well as additional properties
* added by \Drupal\Core\Theme\Registry::processExtension().
*
* For example:
* @code
* $theme_registry['user'] = array(
* 'variables' => array(
* 'account' => NULL,
* ),
* 'template' => 'core/modules/user/user',
* 'file' => 'core/modules/user/user.pages.inc',
* 'type' => 'module',
* 'theme path' => 'core/modules/user',
* 'preprocess functions' => array(
* 0 => 'template_preprocess',
* 1 => 'template_preprocess_user_profile',
* ),
* );
* @endcode
*
* @param $theme_registry
* The entire cache of theme registry information, post-processing.
*
* @see hook_theme()
* @see \Drupal\Core\Theme\Registry::processExtension()
*/
function hook_theme_registry_alter(&$theme_registry) {
// Kill the next/previous forum topic navigation links.
foreach ($theme_registry['forum_topic_navigation']['preprocess functions'] as $key => $value) {
if ($value == 'template_preprocess_forum_topic_navigation') {
unset($theme_registry['forum_topic_navigation']['preprocess functions'][$key]);
}
}
}
/**
* Alter the default, hook-independent variables for all templates.
*
* Allows modules to provide additional default template variables or manipulate
* existing. This hook is invoked from template_preprocess() after basic default
* template variables have been set up and before the next template preprocess
* function is invoked.
*
* Note that the default template variables are statically cached within a
* request. When adding a template variable that depends on other context, it is
* your responsibility to appropriately reset the static cache in
* template_preprocess() when needed:
* @code
* drupal_static_reset('template_preprocess');
* @endcode
*
* See user_template_preprocess_default_variables_alter() for an example.
*
* @param array $variables
* An associative array of default template variables, as set up by
* _template_preprocess_default_variables(). Passed by reference.
*
* @see template_preprocess()
* @see _template_preprocess_default_variables()
*/
function hook_template_preprocess_default_variables_alter(&$variables) {
$variables['is_admin'] = \Drupal::currentUser()->hasPermission('access administration pages');
}
/**
* @} End of "addtogroup hooks".
*/