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. * * @deprecated in drupal:11.3.0 and is removed from drupal:13.0.0. Use * \Drupal::service('Drupal\Core\Extension\ThemeSettingsProvider')->getSetting() * instead. * * @see https://www.drupal.org/node/3035289 */ function theme_get_setting($setting_name, $theme = NULL) { @trigger_error('theme_get_setting() is deprecated in drupal:11.3.0 and is removed from drupal:13.0.0. Use \Drupal::service(\'\Drupal\Core\Extension\ThemeSettingsProvider\')->getSetting() instead. See https://www.drupal.org/node/3035289', E_USER_DEPRECATED); return \Drupal::service(ThemeSettingsProvider::class)->getSetting($setting_name, $theme); } /** * 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(DatePreprocess::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(DatePreprocess::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(DatePreprocess::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 * * @deprecated in drupal:11.3.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_image(&$variables): void { @trigger_error(__FUNCTION__ . '() is deprecated in drupal:11.3.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(ImagePreprocess::class)->preprocessImage($variables); } /** * 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. * * @deprecated in drupal:11.3.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_table(&$variables): void { @trigger_error(__FUNCTION__ . '() is deprecated in drupal:11.3.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)->preprocessTable($variables); } /** * 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. * * @deprecated in drupal:11.3.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_item_list(&$variables): void { @trigger_error(__FUNCTION__ . '() is deprecated in drupal:11.3.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)->preprocessItemList($variables); } /** * 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