Theme system overview in Zircon Profile 8
Same name and namespace in other branches
Functions and templates for the user interface that themes can override.
Drupal's theme system allows a theme to have nearly complete control over the appearance of the site, which includes both the markup and the CSS used to style the markup. For this system to work, modules, instead of writing HTML markup directly, need to return "render arrays", which are structured hierarchical arrays that include the data to be rendered into HTML (or XML or another output format), and options that affect the markup. Render arrays are ultimately rendered into HTML or other output formats by recursive calls to drupal_render(), traversing the depth of the render array hierarchy. At each level, the theme system is invoked to do the actual rendering. See the documentation of drupal_render() and the Theme system and Render API topic for more information about render arrays and rendering.
Twig Templating Engine
Drupal 8 uses the templating engine Twig. Twig offers developers a fast, secure, and flexible method for building templates for Drupal 8 sites. Twig also offers substantial usability improvements over PHPTemplate, and does not require front-end developers to know PHP to build and manipulate Drupal 8 themes.
For further information on theming in Drupal 8 see https://www.drupal.org/theme-guide/8
For further Twig documentation see http://twig.sensiolabs.org/doc/templates.html
Theme Hooks
The theme system is invoked in drupal_render() by calling the internal _theme() function, which operates on the concept of "theme hooks". Theme hooks define how a particular type of data should be rendered. They are registered by modules by implementing hook_theme(), which specifies the name of the hook, the input "variables" used to provide data and options, and other information. Modules implementing hook_theme() also need to provide a default implementation for each of their theme hooks, normally in a Twig file, and they may also provide preprocessing functions. For example, the core Search module defines a theme hook for a search result item in search_theme():
return array(
'search_result' => array(
'variables' => array(
'result' => NULL,
'plugin_id' => NULL,
),
'file' => 'search.pages.inc',
),
);
Given this definition, the template file with the default implementation is search-result.html.twig, which can be found in the core/modules/search/templates directory, and the variables for rendering are the search result and the plugin ID. In addition, there is a function template_preprocess_search_result(), located in file search.pages.inc, which preprocesses the information from the input variables so that it can be rendered by the Twig template; the processed variables that the Twig template receives are documented in the header of the default Twig template file.
hook_theme() implementations can also specify that a theme hook implementation is a theme function, but that is uncommon. It is only used for special cases, for performance reasons, because rendering using theme functions is somewhat faster than theme templates. Note that while Twig templates will auto-escape variables, theme functions must explicitly escape any variables by using theme_render_and_autoescape(). Failure to do so is likely to result in security vulnerabilities.
Overriding Theme Hooks
Themes may register new theme hooks within a hook_theme() implementation, but it is more common for themes to override default implementations provided by modules than to register entirely new theme hooks. Themes can override a default implementation by creating a template file with the same name as the default implementation; for example, to override the display of search results, a theme would add a file called search-result.html.twig to its templates directory. A good starting point for doing this is normally to copy the default implementation template, and then modifying it as desired.
In the uncommon case that a theme hook uses a theme function instead of a template file, a module would provide a default implementation function called theme_HOOK, where HOOK is the name of the theme hook (for example, theme_search_result() would be the name of the function for search result theming). In this case, a theme can override the default implementation by defining a function called THEME_HOOK() in its THEME.theme file, where THEME is the machine name of the theme (for example, 'bartik' is the machine name of the core Bartik theme, and it would define a function called bartik_search_result() in the bartik.theme file, if the search_result hook implementation was a function instead of a template). Normally, copying the default function is again a good starting point for overriding its behavior. Again, note that theme functions (unlike templates) must explicitly escape variables using theme_render_and_autoescape() or risk security vulnerabilities.
Preprocessing for Template Files
If the theme implementation is a template file, several functions are called before the template file is invoked to modify the variables that are passed to the template. These make up the "preprocessing" phase, and are executed (if they exist), in the following order (note that in the following list, HOOK indicates the hook being called or a less specific hook. For example, if '#theme' => 'node__article' is called, hook is node__article and node. MODULE indicates a module name, THEME indicates a theme name, and ENGINE indicates a theme engine name). Modules, themes, and theme engines can provide these functions to modify how the data is preprocessed, before it is passed to the theme template:
- template_preprocess(&$variables, $hook): Creates a default set of variables for all theme hooks with template implementations. Provided by Drupal Core.
- template_preprocess_HOOK(&$variables): Should be implemented by the module that registers the theme hook, to set up default variables.
- MODULE_preprocess(&$variables, $hook): hook_preprocess() is invoked on all implementing modules.
- MODULE_preprocess_HOOK(&$variables): hook_preprocess_HOOK() is invoked on all implementing modules, so that modules that didn't define the theme hook can alter the variables.
- ENGINE_engine_preprocess(&$variables, $hook): Allows the theme engine to set necessary variables for all theme hooks with template implementations.
- ENGINE_engine_preprocess_HOOK(&$variables): Allows the theme engine to set necessary variables for the particular theme hook.
- THEME_preprocess(&$variables, $hook): Allows the theme to set necessary variables for all theme hooks with template implementations.
- THEME_preprocess_HOOK(&$variables): Allows the theme to set necessary variables specific to the particular theme hook.
Preprocessing for Theme Functions
If the theming implementation is a function, only the theme-hook-specific preprocess functions (the ones ending in _HOOK) are called from the list above. This is because theme hooks with function implementations need to be fast, and calling the non-theme-hook-specific preprocess functions for them would incur a noticeable performance penalty.
Theme hook suggestions
In some cases, instead of calling the base theme hook implementation (either the default provided by the module that defined the hook, or the override provided by the theme), the theme system will instead look for "suggestions" of other hook names to look for. Suggestions can be specified in several ways:
- In a render array, the '#theme' property (which gives the name of the hook to use) can be an array of theme hook names instead of a single hook name. In this case, the render system will look first for the highest-priority hook name, and if no implementation is found, look for the second, and so on. Note that the highest-priority suggestion is at the end of the array.
- In a render array, the '#theme' property can be set to the name of a hook with a '__SUGGESTION' suffix. For example, in search results theming, the hook 'item_list__search_results' is given. In this case, the render system will look for theme templates called item-list--search-results.html.twig, which would only be used for rendering item lists containing search results, and if this template is not found, it will fall back to using the base item-list.html.twig template. This type of suggestion can also be combined with providing an array of theme hook names as described above.
- A module can implement hook_theme_suggestions_HOOK(). This allows the module that defines the theme template to dynamically return an array containing specific theme hook names (presumably with '__' suffixes as defined above) to use as suggestions. For example, the Search module does this in search_theme_suggestions_search_result() to suggest search_result__PLUGIN as the theme hook for search result items, where PLUGIN is the machine name of the particular search plugin type that was used for the search (such as node_search or user_search).
For further information on overriding theme hooks see https://www.drupal.org/node/2186401
Altering theme hook suggestions
Modules can also alter the theme suggestions provided using the mechanisms of the previous section. There are two hooks for this: the theme-hook-specific hook_theme_suggestions_HOOK_alter() and the generic hook_theme_suggestions_alter(). These hooks get the current list of suggestions as input, and can change this array (adding suggestions and removing them).
Assets
We can distinguish between three types of assets:
- Unconditional page-level assets (loaded on all pages where the theme is in use): these are defined in the theme's *.info.yml file.
- Conditional page-level assets (loaded on all pages where the theme is in use and a certain condition is met): these are attached in hook_page_attachments_alter(), e.g.:
function THEME_page_attachments_alter(array &$page) {
if ($some_condition) {
$page['#attached']['library'][] = 'mytheme/something';
}
}
- Template-specific assets (loaded on all pages where a specific template is in use): these can be added by in preprocessing functions, using
$variables['#attached'];
, e.g.:
function THEME_preprocess_menu_local_action(array &$variables) {
// We require Modernizr's touch test for button styling.
$variables['#attached']['library'][] = 'core/modernizr';
}
See also
File
- core/
lib/ Drupal/ Core/ Render/ theme.api.php, line 8 - Hooks and documentation related to the theme and render system.
Functions
Name | Location | Description |
---|---|---|
template_preprocess_system_modules_uninstall |
core/ |
Prepares variables for module uninstall templates. |
Files
Name | Location | Description |
---|---|---|
admin-block-content.html.twig |
core/ |
Default theme implementation for the content of an administrative block. |
admin-block.html.twig |
core/ |
Default theme implementation for an administrative block. |
admin-page.html.twig |
core/ |
Default theme implementation for an administrative page. |
aggregator-feed.html.twig |
core/ |
Default theme implementation to present an aggregator feed. |
aggregator-item.html.twig |
core/ |
Default theme implementation to present a feed item in an aggregator page. |
authorize-report.html.twig |
core/ |
Default theme implementation for authorize.php operation report templates. |
block--search-form-block.html.twig |
core/ |
Bartik's theme implementation for a search form block. Extends Classy's search form block template. |
block--system-branding-block.html.twig |
core/ |
Default theme implementation for a branding block. |
block--system-menu-block.html.twig |
core/ |
Bartik's theme implementation for a menu block. |
block--system-menu-block.html.twig |
core/ |
Default theme implementation for a menu block. |
block--system-messages-block.html.twig |
core/ |
Default theme implementation for the messages block. |
block-content-add-list.html.twig |
core/ |
Default theme implementation to present a list of custom block types. |
block-list.html.twig |
core/ |
Two column template for the block add/edit form. |
block.html.twig |
core/ |
Default theme implementation to display a block. |
block.html.twig |
core/ |
Default theme implementation to display a block. |
book-all-books-block.html.twig |
core/ |
Default theme implementation for rendering book outlines within a block. |
book-export-html.html.twig |
core/ |
Default theme implementation for printed version of book outline. |
book-navigation.html.twig |
core/ |
Default theme implementation to navigate books. |
book-node-export-html.html.twig |
core/ |
Default theme implementation for a single node in a printer-friendly outline. |
book-tree.html.twig |
core/ |
Default theme implementation to display a book tree. |
breadcrumb.html.twig |
core/ |
Default theme implementation for a breadcrumb trail. |
checkboxes.html.twig |
core/ |
Default theme implementation for a 'checkboxes' #type form element. |
ckeditor-settings-toolbar.html.twig |
core/ |
Default theme implementation for the CKEditor settings toolbar. |
color-scheme-form.html.twig |
core/ |
Default theme implementation for a theme's color form. |
comment.html.twig |
core/ |
Default theme implementation for comments. |
common-test-foo.html.twig |
core/ |
Default theme implementation for the common test foo. |
common-test-render-element.html.twig |
core/ |
Default theme implementation for the common test render element. |
config_translation_manage_form_element.html.twig |
core/ |
Default theme implementation for a form element in config_translation. |
confirm-form.html.twig |
core/ |
Default theme implementation for confirm form. |
container.html.twig |
core/ |
Default theme implementation of a container used to wrap child elements. |
datetime-form.html.twig |
core/ |
Default theme implementation of a datetime form element. |
datetime-wrapper.html.twig |
core/ |
Default theme implementation of a datetime form wrapper. |
details.html.twig |
core/ |
Default theme implementation for a details element. |
dropbutton-wrapper.html.twig |
core/ |
Default theme implementation for a dropbutton wrapper. |
feed-icon.html.twig |
core/ |
Default theme implementation for a feed icon. |
field--node--created.html.twig |
core/ |
Default theme implementation for the node created field. |
field--node--title.html.twig |
core/ |
Default theme implementation for the node title field. |
field--node--uid.html.twig |
core/ |
Default theme implementation for the node user field. |
field--text.html.twig |
core/ |
Default theme implementation for a text field. |
field-multiple-value-form.html.twig |
core/ |
Default theme implementation for an individual form element. |
field-ui-table.html.twig |
core/ |
Default theme implementation to display a Field UI table. |
field.html.twig |
core/ |
Default theme implementation for a field. |
fieldset.html.twig |
core/ |
Default theme implementation for a fieldset element and its children. |
file-link.html.twig |
core/ |
Default theme implementation for a link to a file. |
file-managed-file.html.twig |
core/ |
Default theme implementation to display a file form widget. |
file-upload-help.html.twig |
core/ |
Default theme implementation to display help text for file fields. |
file-widget-multiple.html.twig |
core/ |
Default theme implementation to display a multi file form widget. |
file-widget.html.twig |
core/ |
Default theme implementation to display a file widget. |
filter-guidelines.html.twig |
core/ |
Default theme implementation for guidelines for a text format. |
filter-tips.html.twig |
core/ |
Default theme implementation for a set of filter tips. |
form-element-label.html.twig |
core/ |
Default theme implementation for a form element label. |
form-element.html.twig |
core/ |
Default theme implementation for a form element. |
form.html.twig |
core/ |
Default theme implementation for a 'form' element. |
forum-icon.html.twig |
core/ |
Default theme implementation to display a status icon for a forum post. |
forum-list.html.twig |
core/ |
Default theme implementation to display a list of forums and containers. |
forum-submitted.html.twig |
core/ |
Default theme implementation for a forum post submission string. |
forums.html.twig |
core/ |
Default theme implementation to display a forum. |
html.html.twig |
core/ |
Default theme implementation for the basic structure of a single Drupal page. |
image-anchor.html.twig |
core/ |
Default theme implementation for a 3x3 grid of checkboxes for image anchors. |
image-crop-summary.html.twig |
core/ |
Default theme implementation for a summary of an image crop effect. |
image-formatter.html.twig |
core/ |
Default theme implementation to display a formatted image field. |
image-resize-summary.html.twig |
core/ |
Default theme implementation for a summary of an image resize effect. |
image-rotate-summary.html.twig |
core/ |
Default theme implementation for a summary of an image rotate effect. |
image-scale-summary.html.twig |
core/ |
Default theme implementation for a summary of an image scale effect. |
image-style-preview.html.twig |
core/ |
Default theme implementation to display a preview of an image style. |
image-style.html.twig |
core/ |
Default theme implementation for an image using a specific image style. |
image-widget.html.twig |
core/ |
Default theme implementation for an image field widget. |
image.html.twig |
core/ |
Default theme implementation of an image. |
indentation.html.twig |
core/ |
Default theme implementation for a set of indentation divs. |
input.html.twig |
core/ |
Default theme implementation for an 'input' #type form element. |
install-page.html.twig |
core/ |
Default theme implementation to display a Drupal installation page. |
item-list.html.twig |
core/ |
Default theme implementation for an item list. |
language-content-settings-table.html.twig |
core/ |
Default theme implementation to display a language content settings table. |
language-negotiation-configure-form.html.twig |
core/ |
Default theme implementation for a language negotiation configuration form. |
link-formatter-link-separate.html.twig |
core/ |
Default theme implementation of a link with separate title and URL elements. |
links--node.html.twig |
core/ |
Theme override to display node links. |
links.html.twig |
core/ |
Default theme implementation for a set of links. |
locale-translation-last-check.html.twig |
core/ |
Default theme implementation for the last time we checked for update data. |
locale-translation-update-info.html.twig |
core/ |
Default theme implementation for displaying translation status information. |
maintenance-page.html.twig |
core/ |
Default theme implementation to display a single Drupal page while offline. |
maintenance-task-list.html.twig |
core/ |
Default theme implementation for a list of maintenance tasks to perform. |
mark.html.twig |
core/ |
Default theme implementation for a marker for new or updated content. |
menu--toolbar.html.twig |
core/ |
Default theme implementation to display a toolbar menu. |
menu-local-action.html.twig |
core/ |
Default theme implementation for a single local action link. |
menu-local-task.html.twig |
core/ |
Default theme implementation for a local task link. |
menu-local-tasks.html.twig |
core/ |
Seven theme implementation to display primary and secondary local tasks. |
menu-local-tasks.html.twig |
core/ |
Default theme implementation to display primary and secondary local tasks. |
menu.html.twig |
core/ |
Default theme implementation to display a menu. |
node-add-list.html.twig |
core/ |
Default theme implementation to list node types available for adding content. |
node-edit-form.html.twig |
core/ |
Default theme implementation for a node edit form. |
node.html.twig |
core/ |
Default theme implementation to display a node. |
page-title.html.twig |
core/ |
Default theme implementation for page titles. |
page.html.twig |
core/ |
Default theme implementation to display a single page. |
pager.html.twig |
core/ |
Default theme implementation to display a pager. |
progress-bar.html.twig |
core/ |
Default theme implementation for a progress bar. |
radios.html.twig |
core/ |
Default theme implementation for a 'radios' #type form element. |
rdf-metadata.html.twig |
core/ |
Default theme implementation for empty spans with RDF attributes. |
rdf-wrapper.html.twig |
core/ |
Default theme implementation for wrapping content with RDF attributes. |
region.html.twig |
core/ |
Default theme implementation to display a region. |
responsive-image-formatter.html.twig |
core/ |
Default theme implementation to display a formatted responsive image field. |
responsive-image.html.twig |
core/ |
Default theme implementation of a responsive image. |
search-result.html.twig |
core/ |
Default theme implementation for displaying a single search result. |
select.html.twig |
core/ |
Default theme implementation for a select element. |
simpletest-result-summary.html.twig |
core/ |
Default theme implementation for simpletest result summaries. |
status-messages.html.twig |
core/ |
Default theme implementation for status messages. |
status-report.html.twig |
core/ |
Default theme implementation for the status report. |
system-admin-index.html.twig |
core/ |
Default theme implementation for the admin index page. |
system-config-form.html.twig |
core/ |
Default theme implementation for a system settings form. |
system-modules-details.html.twig |
core/ |
Default theme implementation for the modules listing page. |
system-modules-uninstall.html.twig |
core/ |
Default theme implementation for the modules uninstall page. |
system-themes-page.html.twig |
core/ |
Default theme implementation for the Appearance page. |
table.html.twig |
core/ |
Default theme implementation to display a table. |
tablesort-indicator.html.twig |
core/ |
Default theme implementation for displaying a tablesort indicator. |
taxonomy-term.html.twig |
core/ |
Default theme implementation to display a taxonomy term. |
text-format-wrapper.html.twig |
core/ |
Default theme implementation for a text format-enabled form element. |
textarea.html.twig |
core/ |
Default theme implementation for a 'textarea' #type form element. |
toolbar.html.twig |
core/ |
Default theme implementation for the administrative toolbar. |
update-last-check.html.twig |
core/ |
Default theme implementation for the last time update data was checked. |
update-project-status.html.twig |
core/ |
Default theme implementation for the project status report. |
update-report.html.twig |
core/ |
Default theme implementation for the project status report. |
update-version.html.twig |
core/ |
Default theme implementation for the version display of a project. |
user.html.twig |
core/ |
Default theme implementation to present all user data. |
username.html.twig |
core/ |
Default theme implementation for displaying a username. |
vertical-tabs.html.twig |
core/ |
Default theme implementation for vertical tabs. |
views-exposed-form.html.twig |
core/ |
Default theme implementation of a views exposed form. |
views-mini-pager.html.twig |
core/ |
Default theme implementation for a views mini-pager. |
views-ui-build-group-filter-form.html.twig |
core/ |
Default theme implementation for Views UI build group filter form. |
views-ui-container.html.twig |
core/ |
Default theme implementation for a generic views UI container/wrapper. |
views-ui-display-tab-bucket.html.twig |
core/ |
Default theme implementation for each "box" on the display query edit screen. |
views-ui-display-tab-setting.html.twig |
core/ |
Default theme implementation for Views UI display tab settings. |
views-ui-expose-filter-form.html.twig |
core/ |
Default theme implementation for exposed filter form. |
views-ui-rearrange-filter-form.html.twig |
core/ |
Default theme implementation for Views UI rearrange filter form. |
views-ui-style-plugin-table.html.twig |
core/ |
Default template for the settings of a table style views display. |
views-ui-view-info.html.twig |
core/ |
Default theme implementation for basic administrative info about a View. |
views-ui-view-preview-section.html.twig |
core/ |
Default theme implementation for a views UI preview section. |
views-view--frontpage.html.twig |
core/ |
Default theme implementation for the frontpage view template. |
views-view-field.html.twig |
core/ |
Default theme implementation for a single field in a view. |
views-view-fields.html.twig |
core/ |
Default view template to display all the fields in a row. |
views-view-grid.html.twig |
themes/ |
Default theme implementation for views to display rows in a grid. |
views-view-grid.html.twig |
core/ |
Default theme implementation for views to display rows in a grid. |
views-view-grouping.html.twig |
core/ |
Default theme implementation to display a single views grouping. |
views-view-list.html.twig |
core/ |
Default theme implementation for a view template to display a list of rows. |
views-view-mapping-test.html.twig |
core/ |
Default theme implementation for testing the mapping row style. |
views-view-mapping-test.html.twig |
core/ |
Default theme implementation to display a view of mapping_test rows. |
views-view-opml.html.twig |
core/ |
Default template for feed displays that use the OPML style. |
views-view-row-opml.html.twig |
core/ |
Default theme implementation to display an item in a views OPML feed. |
views-view-row-rss.html.twig |
core/ |
Default theme implementation to display an item in a views RSS feed. |
views-view-row-rss.html.twig |
core/ |
Theme override to display an item in a views RSS feed. |
views-view-rss.html.twig |
core/ |
Default template for feed displays that use the RSS style. |
views-view-summary-unformatted.html.twig |
core/ |
Default theme implementation for unformatted summary links. |
views-view-summary.html.twig |
core/ |
Default theme implementation to display a list of summary lines. |
views-view-table.html.twig |
core/ |
Default theme implementation for displaying a view as a table. |
views-view-unformatted.html.twig |
core/ |
Default theme implementation to display a view of unformatted rows. |
views-view.html.twig |
themes/ |
Default theme implementation for main view template. |
views-view.html.twig |
core/ |
Default theme implementation for main view template. |