Chris@0: [ Chris@0: [$class, 'preRenderToolbar'], Chris@0: ], Chris@0: '#theme' => 'toolbar', Chris@0: '#attached' => [ Chris@0: 'library' => [ Chris@0: 'toolbar/toolbar', Chris@0: ], Chris@0: ], Chris@0: // Metadata for the toolbar wrapping element. Chris@0: '#attributes' => [ Chris@0: // The id cannot be simply "toolbar" or it will clash with the Chris@0: // simpletest tests listing which produces a checkbox with attribute Chris@0: // id="toolbar". Chris@0: 'id' => 'toolbar-administration', Chris@0: 'role' => 'group', Chris@0: 'aria-label' => $this->t('Site administration toolbar'), Chris@0: ], Chris@0: // Metadata for the administration bar. Chris@0: '#bar' => [ Chris@0: '#heading' => $this->t('Toolbar items'), Chris@0: '#attributes' => [ Chris@0: 'id' => 'toolbar-bar', Chris@0: 'role' => 'navigation', Chris@0: 'aria-label' => $this->t('Toolbar items'), Chris@0: ], Chris@0: ], Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Builds the Toolbar as a structured array ready for drupal_render(). Chris@0: * Chris@0: * Since building the toolbar takes some time, it is done just prior to Chris@0: * rendering to ensure that it is built only if it will be displayed. Chris@0: * Chris@0: * @param array $element Chris@0: * A renderable array. Chris@0: * Chris@0: * @return array Chris@0: * A renderable array. Chris@0: * Chris@0: * @see toolbar_page_top() Chris@0: */ Chris@0: public static function preRenderToolbar($element) { Chris@0: // Get the configured breakpoints to switch from vertical to horizontal Chris@0: // toolbar presentation. Chris@0: $breakpoints = static::breakpointManager()->getBreakpointsByGroup('toolbar'); Chris@0: if (!empty($breakpoints)) { Chris@0: $media_queries = []; Chris@0: foreach ($breakpoints as $id => $breakpoint) { Chris@0: $media_queries[$id] = $breakpoint->getMediaQuery(); Chris@0: } Chris@0: Chris@0: $element['#attached']['drupalSettings']['toolbar']['breakpoints'] = $media_queries; Chris@0: } Chris@0: Chris@0: $module_handler = static::moduleHandler(); Chris@0: // Get toolbar items from all modules that implement hook_toolbar(). Chris@0: $items = $module_handler->invokeAll('toolbar'); Chris@0: // Allow for altering of hook_toolbar(). Chris@0: $module_handler->alter('toolbar', $items); Chris@0: // Sort the children. Chris@0: uasort($items, ['\Drupal\Component\Utility\SortArray', 'sortByWeightProperty']); Chris@0: Chris@0: // Merge in the original toolbar values. Chris@0: $element = array_merge($element, $items); Chris@0: Chris@0: // Assign each item a unique ID, based on its key. Chris@0: foreach (Element::children($element) as $key) { Chris@0: $element[$key]['#id'] = Html::getId('toolbar-item-' . $key); Chris@0: } Chris@0: Chris@0: return $element; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Wraps the breakpoint manager. Chris@0: * Chris@0: * @return \Drupal\breakpoint\BreakpointManagerInterface Chris@0: */ Chris@0: protected static function breakpointManager() { Chris@0: return \Drupal::service('breakpoint.manager'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Wraps the module handler. Chris@0: * Chris@0: * @return \Drupal\Core\Extension\ModuleHandlerInterface Chris@0: */ Chris@0: protected static function moduleHandler() { Chris@0: return \Drupal::moduleHandler(); Chris@0: } Chris@0: Chris@0: }