listInfo() as $theme_info) { if (!empty($theme_info->base_theme)) { $theme_paths[$theme_info->base_theme][$theme_info->getName()] = $theme_info->getPath(); } } foreach ($theme_paths as $base_theme => $subthemes) { foreach ($subthemes as $subtheme => $subtheme_path) { if (isset($theme_paths[$subtheme])) { $theme_paths[$base_theme] = array_merge($theme_paths[$base_theme], $theme_paths[$subtheme]); } } } $theme = \Drupal::theme()->getActiveTheme()->getName(); $subtheme_paths = $theme_paths[$theme] ?? []; // Escape the periods in the extension. $regex = '/' . str_replace('.', '\.', $extension) . '$/'; // Get a listing of all template files in the path to search. $files = []; if (is_dir($path)) { $files = \Drupal::service('file_system')->scanDirectory($path, $regex, ['key' => 'filename']); } // Find templates that implement registered theme hooks and include that in // what is returned so that the registry knows that the theme has this // implementation. foreach ($files as $template => $file) { // Ignore sub-theme templates for the current theme. if (!str_starts_with($file->uri, str_replace($subtheme_paths, '', $file->uri))) { continue; } // Remove the extension from the filename. $template = str_replace($extension, '', $template); // Transform - in filenames to _ to match function naming scheme // for the purposes of searching. $hook = strtr($template, '-', '_'); if (isset($cache[$hook])) { $implementations[$hook] = [ 'template' => $template, 'path' => dirname($file->uri), ]; } // Match templates based on the 'template' filename. foreach ($cache as $hook => $info) { if (isset($info['template'])) { if ($template === $info['template']) { $implementations[$hook] = [ 'template' => $template, 'path' => dirname($file->uri), ]; } } } } // Find templates that implement possible "suggestion" variants of registered // theme hooks and add those as new registered theme hooks. See // hook_theme_suggestions_alter() for more information about suggestions and // the use of 'pattern' and 'base hook'. $patterns = array_keys($files); foreach ($cache as $hook => $info) { $pattern = $info['pattern'] ?? ($hook . '__'); if (!isset($info['base hook']) && !empty($pattern)) { // Transform _ in pattern to - to match file naming scheme // for the purposes of searching. $pattern = strtr($pattern, '_', '-'); $matches = preg_grep('/^' . $pattern . '/', $patterns); if ($matches) { foreach ($matches as $match) { $file = $match; // Remove the extension from the filename. $file = str_replace($extension, '', $file); // Put the underscores back in for the hook name and register this // pattern. $arg_name = isset($info['variables']) ? 'variables' : 'render element'; $implementations[strtr($file, '-', '_')] = [ 'template' => $file, 'path' => dirname($files[$match]->uri), $arg_name => $info[$arg_name], 'base hook' => $hook, ]; } } } } return $implementations; } /** * Retrieves a setting for the current theme or for a given theme. * * The final setting is obtained from the last value found in the following * sources: * - the saved values from the global theme settings form * - the saved values from the theme's settings form * To only retrieve the default global theme setting, an empty string should be * given for $theme. * * @param string $setting_name * The name of the setting to be retrieved. * @param string $theme * The name of a given theme; defaults to the current theme. * * @return mixed * The value of the requested setting, NULL if the setting does not exist. */ function theme_get_setting($setting_name, $theme = NULL) { /** @var \Drupal\Core\Theme\ThemeSettings[] $cache */ $cache = &drupal_static(__FUNCTION__, []); // If no key is given, use the current theme if we can determine it. if (!isset($theme)) { $theme = \Drupal::theme()->getActiveTheme()->getName(); } if (empty($cache[$theme])) { // Create a theme settings object. $cache[$theme] = new ThemeSettings($theme); // Get the global settings from configuration. $cache[$theme]->setData(\Drupal::config('system.theme.global')->get()); // Get the values for the theme-specific settings from the .info.yml files // of the theme and all its base themes. $themes = \Drupal::service('theme_handler')->listInfo(); if (isset($themes[$theme])) { $theme_object = $themes[$theme]; // Retrieve configured theme-specific settings, if any. try { if ($theme_settings = \Drupal::config($theme . '.settings')->get()) { $cache[$theme]->merge($theme_settings); } } catch (StorageException) { } // If the theme does not support a particular feature, override the global // setting and set the value to NULL. if (!empty($theme_object->info['features'])) { foreach (_system_default_theme_features() as $feature) { if (!in_array($feature, $theme_object->info['features'])) { $cache[$theme]->set('features.' . $feature, NULL); } } } /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */ $file_url_generator = \Drupal::service('file_url_generator'); // Generate the path to the logo image. if ($cache[$theme]->get('logo.use_default')) { $logo = \Drupal::service('theme.initialization')->getActiveThemeByName($theme)->getLogo(); $cache[$theme]->set('logo.url', $file_url_generator->generateString($logo)); } elseif ($logo_path = $cache[$theme]->get('logo.path')) { $cache[$theme]->set('logo.url', $file_url_generator->generateString($logo_path)); } // Generate the path to the favicon. if ($cache[$theme]->get('features.favicon')) { $favicon_path = $cache[$theme]->get('favicon.path'); if ($cache[$theme]->get('favicon.use_default')) { if (file_exists($favicon = $theme_object->getPath() . '/favicon.ico')) { $cache[$theme]->set('favicon.url', $file_url_generator->generateString($favicon)); } else { $cache[$theme]->set('favicon.url', $file_url_generator->generateString('core/misc/favicon.ico')); } } elseif ($favicon_path) { $cache[$theme]->set('favicon.url', $file_url_generator->generateString($favicon_path)); } else { $cache[$theme]->set('features.favicon', FALSE); } } } } return $cache[$theme]->get($setting_name); } /** * Converts theme settings to configuration. * * @param array $theme_settings * An array of theme settings from system setting form or a Drupal 7 variable. * @param \Drupal\Core\Config\Config $config * The configuration object to update. * * @return \Drupal\Core\Config\Config * The Config object with updated data. * * @see system_theme_settings_submit() */ function theme_settings_convert_to_config(array $theme_settings, Config $config) { foreach ($theme_settings as $key => $value) { if ($key == 'default_logo') { $config->set('logo.use_default', $value); } elseif ($key == 'logo_path') { $config->set('logo.path', $value); } elseif ($key == 'default_favicon') { $config->set('favicon.use_default', $value); } elseif ($key == 'favicon_path') { $config->set('favicon.path', $value); } elseif ($key == 'favicon_mimetype') { $config->set('favicon.mimetype', $value); } elseif (str_starts_with($key, 'toggle_')) { $config->set('features.' . mb_substr($key, 7), $value); } elseif (!in_array($key, ['theme', 'logo_upload'])) { $config->set($key, $value); } } return $config; } /** * Prepares variables for time templates. * * Default template: time.html.twig. * * @param array $variables * An associative array possibly containing: * - "attributes['timestamp']:". * - "timestamp:". * - "text:". * * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial * template_preprocess functions are registered directly in hook_theme(). * * @see https://www.drupal.org/node/3504125 */ function template_preprocess_time(&$variables): void { @trigger_error(__FUNCTION__ . '() is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial template_preprocess functions are registered directly in hook_theme(). See https://www.drupal.org/node/3504125', E_USER_DEPRECATED); \Drupal::service(ThemePreprocess::class)->preprocessTime($variables); } /** * Prepares variables for datetime form element templates. * * The datetime form element serves as a wrapper around the date element type, * which creates a date and a time component for a date. * * Default template: datetime-form.html.twig. * * @param array $variables * An associative array containing: * - element: An associative array containing the properties of the element. * Properties used: #title, #value, #options, #description, #required, * #attributes. * * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial * template_preprocess functions are registered directly in hook_theme(). * * @see https://www.drupal.org/node/3504125 * @see form_process_datetime() */ function template_preprocess_datetime_form(&$variables): void { @trigger_error(__FUNCTION__ . '() is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial template_preprocess functions are registered directly in hook_theme(). See https://www.drupal.org/node/3504125', E_USER_DEPRECATED); \Drupal::service(ThemePreprocess::class)->preprocessDatetimeForm($variables); } /** * Prepares variables for datetime form wrapper templates. * * Default template: datetime-wrapper.html.twig. * * @param array $variables * An associative array containing: * - element: An associative array containing the properties of the element. * Properties used: #title, #children, #required, #attributes. * * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial * template_preprocess functions are registered directly in hook_theme(). * * @see https://www.drupal.org/node/3504125 */ function template_preprocess_datetime_wrapper(&$variables): void { @trigger_error(__FUNCTION__ . '() is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial template_preprocess functions are registered directly in hook_theme(). See https://www.drupal.org/node/3504125', E_USER_DEPRECATED); \Drupal::service(ThemePreprocess::class)->preprocessDatetimeWrapper($variables); } /** * Prepares variables for links templates. * * Default template: links.html.twig. * * Unfortunately links templates duplicate the "active" class handling of l() * and LinkGenerator::generate() because it needs to be able to set the "active" * class not on the links themselves ( tags), but on the list items (
  • * tags) that contain the links. This is necessary for CSS to be able to style * list items differently when the link is active, since CSS does not yet allow * one to style list items only if it contains a certain element with a certain * class. I.e. we cannot yet convert this jQuery selector to a CSS selector: * jQuery('li:has("a.is-active")') * * @param array $variables * An associative array containing: * - links: An array of links to be themed. Each link itself is an array, with * the following elements: * - title: The link text. * - url: (optional) The \Drupal\Core\Url object to link to. If the 'url' * element is supplied, the 'title' and 'url' are used to generate a link * through \Drupal::linkGenerator()->generate(). All data from the link * array other than 'title' and 'url' are added as #options on * the URL object. See \Drupal\Core\Url::fromUri() for details on the * options. If no 'url' is supplied, the 'title' is printed as plain text. * - attributes: (optional) Attributes for the anchor, or for the * tag used in its place if no 'url' is supplied. If element 'class' is * included, it must be an array of one or more class names. * - attributes: A keyed array of attributes for the
      containing the list * of links. * - set_active_class: (optional) Whether each link should compare the * route_name + route_parameters or URL (path), language, and query options * to the current URL, to determine whether the link is "active". If so, * attributes will be added to the HTML elements for both the link and the * list item that contains it, which will result in an "is-active" class * being added to both. The class is added via JavaScript for authenticated * users (in the active-link library), and via PHP for anonymous users (in * the \Drupal\Core\EventSubscriber\ActiveLinkResponseFilter class). * - heading: (optional) A heading to precede the links. May be an * associative array or a string. If it's an array, it can have the * following elements: * - text: The heading text. * - level: The heading level (e.g. 'h2', 'h3'). * - attributes: (optional) An array of the CSS attributes for the heading. * When using a string it will be used as the text of the heading and the * level will default to 'h2'. Headings should be used on navigation menus * and any list of links that consistently appears on multiple pages. To * make the heading invisible use the 'visually-hidden' CSS class. Do not * use 'display:none', which removes it from screen readers and assistive * technology. Headings allow screen reader and keyboard only users to * navigate to or skip the links. See * http://juicystudio.com/article/screen-readers-display-none.php and * https://www.w3.org/TR/WCAG-TECHS/H42.html for more information. * * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial * template_preprocess functions are registered directly in hook_theme(). * * @see https://www.drupal.org/node/3504125 * @see \Drupal\Core\Utility\LinkGenerator * @see \Drupal\Core\Utility\LinkGenerator::generate() * @see system_page_attachments() */ function template_preprocess_links(&$variables): void { @trigger_error(__FUNCTION__ . '() is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial template_preprocess functions are registered directly in hook_theme(). See https://www.drupal.org/node/3504125', E_USER_DEPRECATED); \Drupal::service(ThemePreprocess::class)->preprocessLinks($variables); } /** * Prepares variables for image templates. * * Default template: image.html.twig. * * @param array $variables * An associative array containing: * - uri: Either the path of the image file (relative to base_path()) or a * full URL. * - width: The width of the image (if known). * - height: The height of the image (if known). * - alt: The alternative text for text-based browsers. HTML 4 and XHTML 1.0 * always require an alt attribute. The HTML 5 draft allows the alt * attribute to be omitted in some cases. Therefore, this variable defaults * to an empty string, but can be set to NULL for the attribute to be * omitted. Usually, neither omission nor an empty string satisfies * accessibility requirements, so it is strongly encouraged for code * building variables for image.html.twig templates to pass a meaningful * value for this variable. * - https://www.w3.org/TR/REC-html40/struct/objects.html#h-13.8 * - https://www.w3.org/TR/xhtml1/dtds.html * - http://dev.w3.org/html5/spec/Overview.html#alt * - title: The title text is displayed when the image is hovered in some * popular browsers. * - attributes: Associative array of attributes to be placed in the img tag. * - srcset: Array of multiple URIs and sizes/multipliers. * - sizes: The sizes attribute for viewport-based selection of images. * phpcs:ignore * - http://www.whatwg.org/specs/web-apps/current-work/multipage/embedded-content.html#introduction-3:viewport-based-selection-2 */ function template_preprocess_image(&$variables): void { /** @var \Drupal\Core\File\FileUrlGeneratorInterface $file_url_generator */ $file_url_generator = \Drupal::service('file_url_generator'); if (!empty($variables['uri'])) { $variables['attributes']['src'] = $file_url_generator->generateString($variables['uri']); } // Generate a srcset attribute conforming to the spec at // https://www.w3.org/html/wg/drafts/html/master/embedded-content.html#attr-img-srcset if (!empty($variables['srcset'])) { $srcset = []; foreach ($variables['srcset'] as $src) { // URI is mandatory. $source = $file_url_generator->generateString($src['uri']); if (isset($src['width']) && !empty($src['width'])) { $source .= ' ' . $src['width']; } elseif (isset($src['multiplier']) && !empty($src['multiplier'])) { $source .= ' ' . $src['multiplier']; } $srcset[] = $source; } $variables['attributes']['srcset'] = implode(', ', $srcset); } foreach (['width', 'height', 'alt', 'title', 'sizes'] as $key) { if (isset($variables[$key])) { // If the property has already been defined in the attributes, // do not override, including NULL. if (AttributeHelper::attributeExists($key, $variables['attributes'])) { continue; } $variables['attributes'][$key] = $variables[$key]; } } // Without dimensions specified, layout shifts can occur, // which are more noticeable on pages that take some time to load. // As a result, only mark images as lazy load that have dimensions. if (isset($variables['width'], $variables['height']) && !isset($variables['attributes']['loading'])) { $variables['attributes']['loading'] = 'lazy'; } } /** * Prepares variables for table templates. * * Default template: table.html.twig. * * @param array $variables * An associative array containing: * - header: An array containing the table headers. Each element of the array * can be either a localized string or an associative array with the * following keys: * - data: The localized title of the table column, as a string or render * array. * - field: The database field represented in the table column (required * if user is to be able to sort on this column). * - sort: A default sort order for this column ("asc" or "desc"). Only * one column should be given a default sort order because table sorting * only applies to one column at a time. * - initial_click_sort: Set the initial sort of the column when clicked. * Defaults to "asc". * - class: An array of values for the 'class' attribute. In particular, * the least important columns that can be hidden on narrow and medium * width screens should have a 'priority-low' class, referenced with the * RESPONSIVE_PRIORITY_LOW constant. Columns that should be shown on * medium+ wide screens should be marked up with a class of * 'priority-medium', referenced by with the RESPONSIVE_PRIORITY_MEDIUM * constant. Themes may hide columns with one of these two classes on * narrow viewports to save horizontal space. * - Any HTML attributes, such as "colspan", to apply to the column header * cell. * - rows: An array of table rows. Every row is an array of cells, or an * associative array with the following keys: * - data: An array of cells. * - Any HTML attributes, such as "class", to apply to the table row. * - no_striping: A Boolean indicating that the row should receive no * 'even / odd' styling. Defaults to FALSE. * Each cell can be either a string or an associative array with the * following keys: * - data: The string or render array to display in the table cell. * - header: Indicates this cell is a header. * - Any HTML attributes, such as "colspan", to apply to the table cell. * Here's an example for $rows: * @code * $rows = [ * // Simple row * [ * 'Cell 1', 'Cell 2', 'Cell 3' * ], * // Row with attributes on the row and some of its cells. * [ * 'data' => ['Cell 1', ['data' => 'Cell 2', 'colspan' => 2]], 'class' => ['funky'] * ], * ]; * @endcode * - footer: An array of table rows which will be printed within a * tag, in the same format as the rows element (see above). * - attributes: An array of HTML attributes to apply to the table tag. * - caption: A localized string to use for the tag. * - colgroups: An array of column groups. Each element of the array can be * either: * - An array of columns, each of which is an associative array of HTML * attributes applied to the element. * - An array of attributes applied to the element, which must * include a "data" attribute. To add attributes to elements, * set the "data" attribute with an array of columns, each of which is an * associative array of HTML attributes. * Here's an example for $colgroup: * @code * $colgroup = [ * // with one element. * [ * [ * 'class' => ['funky'], // Attribute for the element. * ], * ], * // with attributes and inner elements. * [ * 'data' => [ * [ * 'class' => ['funky'], // Attribute for the element. * ], * ], * 'class' => ['jazzy'], // Attribute for the element. * ], * ]; * @endcode * These optional tags are used to group and set properties on columns * within a table. For example, one may easily group three columns and * apply same background style to all. * - sticky: Use a "sticky" table header. * - empty: The message to display in an extra row if table does not have any * rows. */ function template_preprocess_table(&$variables): void { // Format the table columns: if (!empty($variables['colgroups'])) { foreach ($variables['colgroups'] as &$colgroup) { // Check if we're dealing with a simple or complex column if (isset($colgroup['data'])) { $cols = $colgroup['data']; unset($colgroup['data']); $colgroup_attributes = $colgroup; } else { $cols = $colgroup; $colgroup_attributes = []; } $colgroup = []; $colgroup['attributes'] = new Attribute($colgroup_attributes); $colgroup['cols'] = []; // Build columns. if (is_array($cols) && !empty($cols)) { foreach ($cols as $col_key => $col) { $colgroup['cols'][$col_key]['attributes'] = new Attribute($col); } } } } // Build an associative array of responsive classes keyed by column. $responsive_classes = []; // Format the table header: $ts = []; $header_columns = 0; if (!empty($variables['header'])) { $ts = TableSort::getContextFromRequest($variables['header'], \Drupal::request()); // Use a separate index with responsive classes as headers // may be associative. $responsive_index = -1; foreach ($variables['header'] as $col_key => $cell) { // Increase the responsive index. $responsive_index++; if (!is_array($cell)) { $header_columns++; $cell_content = $cell; $cell_attributes = new Attribute(); $is_header = TRUE; } else { if (isset($cell['colspan'])) { $header_columns += $cell['colspan']; } else { $header_columns++; } $cell_content = ''; if (isset($cell['data'])) { $cell_content = $cell['data']; unset($cell['data']); } // Flag the cell as a header or not and remove the flag. $is_header = $cell['header'] ?? TRUE; unset($cell['header']); // Track responsive classes for each column as needed. Only the header // cells for a column are marked up with the responsive classes by a // module developer or themer. The responsive classes on the header // cells must be transferred to the content cells. if (!empty($cell['class']) && is_array($cell['class'])) { if (in_array(RESPONSIVE_PRIORITY_MEDIUM, $cell['class'])) { $responsive_classes[$responsive_index] = RESPONSIVE_PRIORITY_MEDIUM; } elseif (in_array(RESPONSIVE_PRIORITY_LOW, $cell['class'])) { $responsive_classes[$responsive_index] = RESPONSIVE_PRIORITY_LOW; } } TableSort::header($cell_content, $cell, $variables['header'], $ts); // TableSort::header() removes the 'sort', 'initial_click_sort' and // 'field' keys. $cell_attributes = new Attribute($cell); } $variables['header'][$col_key] = []; $variables['header'][$col_key]['tag'] = $is_header ? 'th' : 'td'; $variables['header'][$col_key]['attributes'] = $cell_attributes; $variables['header'][$col_key]['content'] = $cell_content; } } $variables['header_columns'] = $header_columns; // Rows and footer have the same structure. $sections = ['rows' , 'footer']; foreach ($sections as $section) { if (!empty($variables[$section])) { foreach ($variables[$section] as $row_key => $row) { $cells = $row; $row_attributes = []; // Check if we're dealing with a simple or complex row if (isset($row['data'])) { $cells = $row['data']; $variables['no_striping'] = $row['no_striping'] ?? FALSE; // Set the attributes array and exclude 'data' and 'no_striping'. $row_attributes = $row; unset($row_attributes['data']); unset($row_attributes['no_striping']); } // Build row. $variables[$section][$row_key] = []; $variables[$section][$row_key]['attributes'] = new Attribute($row_attributes); $variables[$section][$row_key]['cells'] = []; if (!empty($cells)) { // Reset the responsive index. $responsive_index = -1; foreach ($cells as $col_key => $cell) { // Increase the responsive index. $responsive_index++; if (!is_array($cell)) { $cell_content = $cell; $cell_attributes = []; $is_header = FALSE; } else { $cell_content = ''; if (isset($cell['data'])) { $cell_content = $cell['data']; unset($cell['data']); } // Flag the cell as a header or not and remove the flag. $is_header = !empty($cell['header']); unset($cell['header']); $cell_attributes = $cell; } // Active table sort information. if (isset($variables['header'][$col_key]['data']) && $variables['header'][$col_key]['data'] == $ts['name'] && !empty($variables['header'][$col_key]['field'])) { $variables[$section][$row_key]['cells'][$col_key]['active_table_sort'] = TRUE; } // Copy RESPONSIVE_PRIORITY_LOW/RESPONSIVE_PRIORITY_MEDIUM // class from header to cell as needed. if (isset($responsive_classes[$responsive_index])) { $cell_attributes['class'][] = $responsive_classes[$responsive_index]; } $variables[$section][$row_key]['cells'][$col_key]['tag'] = $is_header ? 'th' : 'td'; $variables[$section][$row_key]['cells'][$col_key]['attributes'] = new Attribute($cell_attributes); $variables[$section][$row_key]['cells'][$col_key]['content'] = $cell_content; } } } } } if (empty($variables['no_striping'])) { $variables['attributes']['data-striping'] = 1; } } /** * Prepares variables for item list templates. * * Default template: item-list.html.twig. * * @param array $variables * An associative array containing: * - items: An array of items to be displayed in the list. Each item can be * either a string or a render array. If #type, #theme, or #markup * properties are not specified for child render arrays, they will be * inherited from the parent list, allowing callers to specify larger * nested lists without having to explicitly specify and repeat the * render properties for all nested child lists. * - title: A title to be prepended to the list. * - list_type: The type of list to return (e.g. "ul", "ol"). * - wrapper_attributes: HTML attributes to be applied to the list wrapper. * * @see https://www.drupal.org/node/1842756 */ function template_preprocess_item_list(&$variables): void { $variables['wrapper_attributes'] = new Attribute($variables['wrapper_attributes']); foreach ($variables['items'] as &$item) { $attributes = []; // If the item value is an array, then it is a render array. if (is_array($item)) { // List items support attributes via the '#wrapper_attributes' property. if (isset($item['#wrapper_attributes'])) { $attributes = $item['#wrapper_attributes']; } // Determine whether there are any child elements in the item that are not // fully-specified render arrays. If there are any, then the child // elements present nested lists and we automatically inherit the render // array properties of the current list to them. foreach (Element::children($item) as $key) { $child = &$item[$key]; // If this child element does not specify how it can be rendered, then // we need to inherit the render properties of the current list. if (!isset($child['#type']) && !isset($child['#theme']) && !isset($child['#markup'])) { // Since item-list.html.twig supports both strings and render arrays // as items, the items of the nested list may have been specified as // the child elements of the nested list, instead of #items. For // convenience, we automatically move them into #items. if (!isset($child['#items'])) { // This is the same condition as in // \Drupal\Core\Render\Element::children(), which cannot be used // here, since it triggers an error on string values. foreach ($child as $child_key => $child_value) { if (is_int($child_key) || $child_key === '' || $child_key[0] !== '#') { $child['#items'][$child_key] = $child_value; unset($child[$child_key]); } } } // Lastly, inherit the original theme variables of the current list. $child['#theme'] = $variables['theme_hook_original']; $child['#list_type'] = $variables['list_type']; } } } // Set the item's value and attributes for the template. $item = [ 'value' => $item, 'attributes' => new Attribute($attributes), ]; } } /** * Prepares variables for container templates. * * Default template: container.html.twig. * * @param array $variables * An associative array containing: * - element: An associative array containing the properties of the element. * Properties used: #id, #attributes, #children. * * @deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial * template_preprocess functions are registered directly in hook_theme(). * * @see https://www.drupal.org/node/3504125 */ function template_preprocess_container(&$variables): void { @trigger_error(__FUNCTION__ . '() is deprecated in drupal:11.2.0 and is removed from drupal:12.0.0. Initial template_preprocess functions are registered directly in hook_theme(). See https://www.drupal.org/node/3504125', E_USER_DEPRECATED); \Drupal::service(ThemePreprocess::class)->preprocessContainer($variables); } /** * Prepares variables for maintenance task list templates. * * Default template: maintenance-task-list.html.twig. * * @param array $variables * An associative array containing: * - items: An associative array of maintenance tasks. * It's the caller's responsibility to ensure this array's items contain no * dangerous HTML such as