Skip to content
Snippets Groups Projects
Commit 1e79f5be authored by catch's avatar catch
Browse files

Issue #3518822 by berdir, nicxvan: Convert template preprocess hooks in core/includes/theme.inc

parent 0f4a4b5a
No related branches found
No related tags found
3 merge requests!12628#3524738 backport without deprecation,!12477#3532243: JSON support status during updates,!213Issue #2906496: Give Media a menu item under Content
Pipeline #537897 passed with warnings
Pipeline: drupal

#537902

    Showing
    with 756 additions and 359 deletions
    ......@@ -854,6 +854,9 @@ services:
    class: Drupal\Core\Menu\ContextualLinkManager
    arguments: ['@controller_resolver', '@module_handler', '@cache.discovery', '@language_manager', '@access_manager', '@current_user', '@request_stack']
    Drupal\Core\Menu\ContextualLinkManagerInterface: '@plugin.manager.menu.contextual_link'
    Drupal\Core\Menu\MenuPreprocess:
    class: Drupal\Core\Menu\MenuPreprocess
    autowire: true
    plugin.manager.display_variant:
    class: Drupal\Core\Display\VariantManager
    parent: default_plugin_manager
    ......@@ -1535,6 +1538,9 @@ services:
    tags:
    - { name: service_collector, tag: breadcrumb_builder, call: addBuilder }
    Drupal\Core\Breadcrumb\ChainBreadcrumbBuilderInterface: '@breadcrumb'
    Drupal\Core\Breadcrumb\BreadcrumbPreprocess:
    class: Drupal\Core\Breadcrumb\BreadcrumbPreprocess
    autowire: true
    token:
    class: Drupal\Core\Utility\Token
    arguments: ['@module_handler', '@cache.default', '@language_manager', '@cache_tags.invalidator', '@renderer']
    ......@@ -1575,6 +1581,9 @@ services:
    Drupal\Core\Theme\ThemePreprocess:
    class: Drupal\Core\Theme\ThemePreprocess
    autowire: true
    Drupal\Core\Theme\ImagePreprocess:
    class: Drupal\Core\Theme\ImagePreprocess
    autowire: true
    Drupal\Core\Datetime\DatePreprocess:
    class: Drupal\Core\Datetime\DatePreprocess
    autowire: true
    ......
    This diff is collapsed.
    <?php
    namespace Drupal\Core\Breadcrumb;
    /**
    * Breadcrumb theme preprocess.
    *
    * @internal
    */
    class BreadcrumbPreprocess {
    /**
    * Prepares variables for breadcrumb templates.
    *
    * Default template: breadcrumb.html.twig.
    *
    * @param array $variables
    * An associative array containing:
    * - links: A list of \Drupal\Core\Link objects which should be rendered.
    */
    public function preprocessBreadcrumb(array &$variables): void {
    $variables['breadcrumb'] = [];
    /** @var \Drupal\Core\Link $link */
    foreach ($variables['links'] as $key => $link) {
    $variables['breadcrumb'][$key] = [
    'text' => $link->getText(),
    'url' => $link->getUrl()->toString(),
    ];
    }
    }
    }
    ......@@ -204,9 +204,9 @@ public function count();
    *
    * @param array $headers
    * An array of headers of the same structure as described in
    * template_preprocess_table(). Use a 'specifier' in place of a 'field' to
    * specify what to sort on. This can be an entity or a field as described
    * in condition().
    * \Drupal\Core\Theme\ThemePreprocess::preprocessTable(). Use a 'specifier'
    * in place of a 'field' to specify what to sort on. This can be an entity
    * or a field as described in condition().
    *
    * @return $this
    */
    ......
    <?php
    namespace Drupal\Core\Menu;
    /**
    * Menu theme preprocess.
    *
    * @internal
    */
    class MenuPreprocess {
    /**
    * Prepares variables for single local task link templates.
    *
    * Default template: menu-local-task.html.twig.
    *
    * @param array $variables
    * An associative array containing:
    * - element: A render element containing:
    * - #link: A menu link array with 'title', 'url', and (optionally)
    * 'localized_options' keys.
    * - #active: A boolean indicating whether the local task is active.
    */
    public function preprocessMenuLocalTask(array &$variables): void {
    $link = $variables['element']['#link'];
    $link += [
    'localized_options' => [],
    ];
    $link_text = $link['title'];
    if (!empty($variables['element']['#active'])) {
    $variables['is_active'] = TRUE;
    }
    $link['localized_options']['set_active_class'] = TRUE;
    $variables['link'] = [
    '#type' => 'link',
    '#title' => $link_text,
    '#url' => $link['url'],
    '#options' => $link['localized_options'],
    ];
    }
    /**
    * Prepares variables for single local action link templates.
    *
    * Default template: menu-local-action.html.twig.
    *
    * @param array $variables
    * An associative array containing:
    * - element: A render element containing:
    * - #link: A menu link array with 'title', 'url', and (optionally)
    * 'localized_options' keys.
    */
    public function preprocessMenuLocalAction(array &$variables): void {
    $link = $variables['element']['#link'];
    $link += [
    'localized_options' => [],
    ];
    $link['localized_options']['attributes']['class'][] = 'button';
    $link['localized_options']['attributes']['class'][] = 'button-action';
    $link['localized_options']['set_active_class'] = TRUE;
    $variables['link'] = [
    '#type' => 'link',
    '#title' => $link['title'],
    '#options' => $link['localized_options'],
    '#url' => $link['url'],
    ];
    }
    }
    ......@@ -88,7 +88,8 @@ public function renderBarePage(array $content, $title, $page_theme_property, arr
    * The page to attach to.
    */
    public function systemPageAttachments(array &$page): void {
    // Ensure the same CSS is loaded in template_preprocess_maintenance_page().
    // Ensure the same CSS is loaded in
    // \Drupal\Core\Theme\ThemePreprocess::preprocessMaintenancePage().
    $page['#attached']['library'][] = 'system/base';
    if (\Drupal::service('router.admin_context')->isAdminRoute()) {
    $page['#attached']['library'][] = 'system/admin';
    ......
    ......@@ -402,7 +402,7 @@ public static function validateTable(&$element, FormStateInterface $form_state,
    * @return array
    * Associative array of rendered child elements for a table.
    *
    * @see template_preprocess_table()
    * @see \Drupal\Core\Theme\ThemePreprocess::preprocessTable()
    * @see \Drupal\Core\Render\AttachmentsResponseProcessorInterface::processAttachments()
    * @see drupal_attach_tabledrag()
    */
    ......
    <?php
    namespace Drupal\Core\Theme;
    use Drupal\Core\File\FileUrlGeneratorInterface;
    use Drupal\Core\Template\AttributeHelper;
    /**
    * Image theme preprocess.
    *
    * @internal
    */
    class ImagePreprocess {
    public function __construct(protected FileUrlGeneratorInterface $fileUrlGenerator) {
    }
    /**
    * 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
    */
    public function preprocessImage(array &$variables): void {
    if (!empty($variables['uri'])) {
    $variables['attributes']['src'] = $this->fileUrlGenerator->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 = $this->fileUrlGenerator->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';
    }
    }
    }
    ......@@ -4,8 +4,10 @@
    namespace Drupal\Core\Theme;
    use Drupal\Core\Breadcrumb\BreadcrumbPreprocess;
    use Drupal\Core\Datetime\DatePreprocess;
    use Drupal\Core\Field\FieldPreprocess;
    use Drupal\Core\Menu\MenuPreprocess;
    use Drupal\Core\Pager\PagerPreprocess;
    /**
    ......@@ -36,6 +38,7 @@ public static function commonElements(): array {
    ],
    'region' => [
    'render element' => 'elements',
    'initial preprocess' => ThemePreprocess::class . ':preprocessRegion',
    ],
    'time' => [
    'variables' => [
    ......@@ -100,11 +103,13 @@ public static function commonElements(): array {
    'srcset' => [],
    'style_name' => NULL,
    ],
    'initial preprocess' => ImagePreprocess::class . ':preprocessImage',
    ],
    'breadcrumb' => [
    'variables' => [
    'links' => [],
    ],
    'initial preprocess' => BreadcrumbPreprocess::class . ':preprocessBreadcrumb',
    ],
    'table' => [
    'variables' => [
    ......@@ -118,11 +123,13 @@ public static function commonElements(): array {
    'responsive' => TRUE,
    'empty' => '',
    ],
    'initial preprocess' => ThemePreprocess::class . ':preprocessTable',
    ],
    'tablesort_indicator' => [
    'variables' => [
    'style' => NULL,
    ],
    'initial preprocess' => ThemePreprocess::class . ':preprocessTablesortIndicator',
    ],
    'mark' => [
    'variables' => [
    ......@@ -139,6 +146,7 @@ public static function commonElements(): array {
    'empty' => NULL,
    'context' => [],
    ],
    'initial preprocess' => ThemePreprocess::class . ':preprocessItemList',
    ],
    'feed_icon' => [
    'variables' => [
    ......@@ -157,12 +165,13 @@ public static function commonElements(): array {
    'indentation' => [
    'variables' => ['size' => 1],
    ],
    // From theme.maintenance.inc.
    'maintenance_page' => [
    'render element' => 'page',
    'initial preprocess' => ThemePreprocess::class . ':preprocessMaintenancePage',
    ],
    'install_page' => [
    'render element' => 'page',
    'initial preprocess' => ThemePreprocess::class . ':preprocessInstallPage',
    ],
    'maintenance_task_list' => [
    'variables' => [
    ......@@ -170,6 +179,7 @@ public static function commonElements(): array {
    'active' => NULL,
    'variant' => NULL,
    ],
    'initial preprocess' => ThemePreprocess::class . ':preprocessMaintenanceTaskList',
    ],
    'authorize_report' => [
    'variables' => [
    ......@@ -193,9 +203,11 @@ public static function commonElements(): array {
    ],
    'menu_local_task' => [
    'render element' => 'element',
    'initial preprocess' => MenuPreprocess::class . ':preprocessMenuLocalTask',
    ],
    'menu_local_action' => [
    'render element' => 'element',
    'initial preprocess' => MenuPreprocess::class . ':preprocessMenuLocalAction',
    ],
    'menu_local_tasks' => [
    'variables' => [
    ......
    ......@@ -5,15 +5,18 @@
    use Drupal\Component\Serialization\Json;
    use Drupal\Component\Utility\Crypt;
    use Drupal\Core\Config\ConfigFactoryInterface;
    use Drupal\Core\Installer\InstallerKernel;
    use Drupal\Core\Language\LanguageManagerInterface;
    use Drupal\Core\Path\CurrentPathStack;
    use Drupal\Core\Path\PathMatcherInterface;
    use Drupal\Core\Render\Element;
    use Drupal\Core\Render\Markup;
    use Drupal\Core\Render\RendererInterface;
    use Drupal\Core\Routing\RouteMatchInterface;
    use Drupal\Core\StringTranslation\StringTranslationTrait;
    use Drupal\Core\Template\Attribute;
    use Drupal\Core\Url;
    use Drupal\Core\Utility\TableSort;
    /**
    * Preprocess for common/core theme templates.
    ......@@ -356,4 +359,445 @@ public function preprocessPage(array &$variables): void {
    }
    }
    /**
    * Prepares variables for maintenance page templates.
    *
    * Default template: maintenance-page.html.twig.
    *
    * @param array $variables
    * An associative array containing:
    * - content - An array of page content.
    *
    * @see system_page_attachments()
    */
    public function preprocessMaintenancePage(array &$variables): void {
    // @todo Rename the templates to page--maintenance + page--install.
    $this->preprocessPage($variables);
    // @see system_page_attachments()
    $variables['#attached']['library'][] = 'system/maintenance';
    // Maintenance page and install page need branding info in variables because
    // there is no blocks.
    $site_config = $this->configFactory->get('system.site');
    $variables['logo'] = theme_get_setting('logo.url');
    $variables['site_name'] = $site_config->get('name');
    $variables['site_slogan'] = $site_config->get('slogan');
    // Maintenance page and install page need page title in variable because
    // there are no blocks.
    $variables['title'] = $variables['page']['#title'];
    }
    /**
    * Prepares variables for install page templates.
    *
    * Default template: install-page.html.twig.
    *
    * @param array $variables
    * An associative array containing:
    * - content - An array of page content.
    *
    * @see \Drupal\Core\Theme\ThemePreprocess::preprocessMaintenancePage()
    */
    public function preprocessInstallPage(array &$variables): void {
    $installer_active_task = NULL;
    if (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE === 'install' && InstallerKernel::installationAttempted()) {
    $installer_active_task = $GLOBALS['install_state']['active_task'];
    }
    $this->preprocessMaintenancePage($variables);
    // Override the site name that is displayed on the page, since Drupal is
    // still in the process of being installed.
    $distribution_name = drupal_install_profile_distribution_name();
    $variables['site_name'] = $distribution_name;
    $variables['site_version'] = $installer_active_task ? drupal_install_profile_distribution_version() : '';
    }
    /**
    * Prepares variables for region templates.
    *
    * Default template: region.html.twig.
    *
    * Prepares the values passed to the theme_region function to be passed into a
    * pluggable template engine. Uses the region name to generate a template file
    * suggestions.
    *
    * @param array $variables
    * An associative array containing:
    * - elements: An associative array containing properties of the region.
    */
    public function preprocessRegion(array &$variables): void {
    // Create the $content variable that templates expect.
    $variables['content'] = $variables['elements']['#children'];
    $variables['region'] = $variables['elements']['#region'];
    }
    /**
    * 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 <tfoot>
    * 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 <caption> 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 <col> element.
    * - An array of attributes applied to the <colgroup> element, which must
    * include a "data" attribute. To add attributes to <col> 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 = [
    * // <colgroup> with one <col> element.
    * [
    * [
    * 'class' => ['funky'], // Attribute for the <col> element.
    * ],
    * ],
    * // <colgroup> with attributes and inner <col> elements.
    * [
    * 'data' => [
    * [
    * 'class' => ['funky'], // Attribute for the <col> element.
    * ],
    * ],
    * 'class' => ['jazzy'], // Attribute for the <colgroup> 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.
    */
    public function preprocessTable(array &$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 tablesort indicators.
    *
    * Default template: tablesort-indicator.html.twig.
    */
    public function preprocessTablesortIndicator(array &$variables): void {
    $variables['#attached']['library'][] = 'core/drupal.tablesort';
    }
    /**
    * 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
    */
    public function preprocessItemList(array &$variables): void {
    $variables['wrapper_attributes'] = new Attribute($variables['wrapper_attributes']);
    $variables['#attached']['library'][] = 'core/drupal.item-list';
    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 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 <script> tags.
    * - active: The key for the currently active maintenance task.
    */
    public function preprocessMaintenanceTaskList(array &$variables): void {
    $items = $variables['items'];
    $active = $variables['active'];
    $done = isset($items[$active]) || $active == NULL;
    foreach ($items as $k => $item) {
    $variables['tasks'][$k]['item'] = $item;
    $variables['tasks'][$k]['attributes'] = new Attribute();
    if ($active == $k) {
    $variables['tasks'][$k]['attributes']->addClass('is-active');
    $variables['tasks'][$k]['status'] = $this->t('active');
    $done = FALSE;
    }
    else {
    if ($done) {
    $variables['tasks'][$k]['attributes']->addClass('done');
    $variables['tasks'][$k]['status'] = $this->t('done');
    }
    }
    }
    }
    }
    ......@@ -5,6 +5,7 @@
    */
    use Drupal\Core\Form\FormStateInterface;
    use Drupal\Core\Theme\ThemePreprocess;
    use Drupal\field_ui\FieldUI;
    /**
    ......@@ -18,7 +19,7 @@
    * rendered as a table.
    */
    function template_preprocess_field_ui_table(&$variables): void {
    template_preprocess_table($variables);
    \Drupal::service(ThemePreprocess::class)->preprocessTable($variables);
    }
    /**
    ......
    ......@@ -19,7 +19,7 @@ public function __construct(
    /**
    * Implements hook_page_attachments().
    *
    * @see template_preprocess_maintenance_page()
    * @see \Drupal\Core\Theme\ThemePreprocess::preprocessMaintenancePage()
    * @see \Drupal\Core\EventSubscriber\ActiveLinkResponseFilter
    */
    #[Hook('page_attachments')]
    ......
    ......@@ -7,7 +7,7 @@
    * - attributes: HTML attributes for the img tag.
    * - style_name: (optional) The name of the image style applied.
    *
    * @see template_preprocess_image()
    * @see \Drupal\Core\Theme\ImagePreprocess::preprocessImage()
    *
    * @ingroup themeable
    */
    ......
    ......@@ -6,7 +6,7 @@
    * All available variables are mirrored in page.html.twig.
    * Some may be blank but they are provided for consistency.
    *
    * @see template_preprocess_install_page()
    * @see \Drupal\Core\Theme\ThemePreprocess::preprocessInstallPage()
    *
    * @ingroup themeable
    */
    ......
    ......@@ -16,7 +16,7 @@
    * - context: A list of contextual data associated with the list. May contain:
    * - list_style: The custom list style.
    *
    * @see template_preprocess_item_list()
    * @see \Drupal\Core\Theme\ThemePreprocess::preprocessItemList()
    *
    * @ingroup themeable
    */
    ......
    ......@@ -6,7 +6,7 @@
    * All available variables are mirrored in page.html.twig.
    * Some may be blank but they are provided for consistency.
    *
    * @see template_preprocess_maintenance_page()
    * @see \Drupal\Core\Theme\ThemePreprocess::preprocessMaintenancePage()
    *
    * @ingroup themeable
    */
    ......
    ......@@ -7,7 +7,7 @@
    * - attributes: HTML attributes for the wrapper element.
    * - link: A rendered link element.
    *
    * @see template_preprocess_menu_local_action()
    * @see \Drupal\Core\Menu\MenuPreprocess::preprocessMenuLocalAction()
    *
    * @ingroup themeable
    */
    ......
    ......@@ -11,7 +11,7 @@
    * Note: This template renders the content for each task item in
    * menu-local-tasks.html.twig.
    *
    * @see template_preprocess_menu_local_task()
    * @see \Drupal\Core\Menu\MenuPreprocess::preprocessMenuLocalTask()
    *
    * @ingroup themeable
    */
    ......
    ......@@ -9,7 +9,7 @@
    * - region: The name of the region variable as defined in the theme's
    * .info.yml file.
    *
    * @see template_preprocess_region()
    * @see \Drupal\Core\Theme\ThemePreprocess::preprocessRegion()
    *
    * @ingroup themeable
    */
    ......
    ......@@ -38,7 +38,7 @@
    * - no_striping: A boolean indicating that the row should receive no striping.
    * - header_columns: The number of columns in the header.
    *
    * @see template_preprocess_table()
    * @see \Drupal\Core\Theme\ThemePreprocess::preprocessTable()
    *
    * @ingroup themeable
    */
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment