diff --git a/core/includes/menu.inc b/core/includes/menu.inc index d8dab77..81fa507 100644 --- a/core/includes/menu.inc +++ b/core/includes/menu.inc @@ -9,7 +9,6 @@ use Drupal\Core\Cache\Cache; use Drupal\Core\Language\Language; use Drupal\Core\Render\Element; -use Drupal\Core\Template\Attribute; use Symfony\Cmf\Component\Routing\RouteObjectInterface; /** @@ -242,60 +241,48 @@ function _menu_link_translate(&$item) { } /** - * Implements template_preprocess_HOOK() for theme_menu_tree(). + * Prepares variables for menu tree templates. + * + * Default template: menu-tree.html.twig. + * + * @param array $variables + * An associative array containing: + * - tree: A render array for a menu tree. */ function template_preprocess_menu_tree(&$variables) { $variables['tree'] = $variables['tree']['#children']; } /** - * Returns HTML for a wrapper for a menu sub-tree. + * Prepares variables for menu link plus submenu templates. * - * @param $variables - * An associative array containing: - * - tree: An HTML string containing the tree's items. - * - * @see template_preprocess_menu_tree() - * @ingroup themeable - */ -function theme_menu_tree($variables) { - return ''; -} - -/** - * Returns HTML for a menu link and submenu. + * Default template: menu-link.html.twig. * - * @param $variables + * @param array $variables * An associative array containing: * - element: Structured array data for a menu link. - * - * @ingroup themeable */ -function theme_menu_link(array $variables) { +function template_preprocess_menu_link(&$variables) { $element = $variables['element']; - $sub_menu = ''; - - if ($element['#below']) { - $sub_menu = drupal_render($element['#below']); - } $element['#localized_options']['set_active_class'] = TRUE; - $output = l($element['#title'], $element['#href'], $element['#localized_options']); - return '' . $output . $sub_menu . "\n"; + $variables['sub_menu'] = $element['#below']; + $variables['link'] = l($element['#title'], $element['#href'], $element['#localized_options']); + $variables['attributes'] = $element['#attributes']; } /** - * Returns HTML for a single local task link. + * Prepares variables for single local task link templates. + * + * Default template: menu-local-task.html.twig. * - * @param $variables + * @param array $variables * An associative array containing: * - element: A render element containing: * - #link: A menu link array with 'title', 'href', and 'localized_options' * keys. * - #active: A boolean indicating whether the local task is active. - * - * @ingroup themeable */ -function theme_menu_local_task($variables) { +function template_preprocess_menu_local_task(&$variables) { $link = $variables['element']['#link']; $link += array( 'localized_options' => array(), @@ -305,6 +292,7 @@ function theme_menu_local_task($variables) { if (!empty($variables['element']['#active'])) { // Add text to indicate active tab for non-visual users. $active = '' . t('(active tab)') . ''; + $variables['attributes']['class'] = array('active'); // If the link does not contain HTML already, String::checkPlain() it now. // After we set 'html'=TRUE the link will not be sanitized by l(). @@ -324,21 +312,21 @@ function theme_menu_local_task($variables) { $a_tag = \Drupal::l($link_text, $link['route_name'], $link['route_parameters'], $link['localized_options']); } - return '' . $a_tag . ''; + $variables['link'] = $a_tag; } /** - * Returns HTML for a single local action link. + * Prepares variables for single local action link templates. * - * @param $variables + * 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', 'href', and 'localized_options' * keys. - * - * @ingroup themeable */ -function theme_menu_local_action($variables) { +function template_preprocess_menu_local_action(&$variables) { $link = $variables['element']['#link']; $link += array( 'href' => '', @@ -349,19 +337,15 @@ function theme_menu_local_action($variables) { $link['localized_options']['attributes']['class'][] = 'button-action'; $link['localized_options']['set_active_class'] = TRUE; - $output = '
  • '; // @todo Remove this check and the call to l() when all pages are converted to // routes. // @todo Figure out how to support local actions without a href properly. if ($link['href'] === '' && !empty($link['route_name'])) { - $output .= Drupal::l($link['title'], $link['route_name'], $link['route_parameters'], $link['localized_options']); + $variables['link'] = Drupal::l($link['title'], $link['route_name'], $link['route_parameters'], $link['localized_options']); } else { - $output .= l($link['title'], $link['href'], $link['localized_options']); + $variables['link'] = l($link['title'], $link['href'], $link['localized_options']); } - $output .= "
  • "; - - return $output; } /** @@ -597,36 +581,6 @@ function menu_local_tabs() { } /** - * Returns HTML for primary and secondary local tasks. - * - * @param $variables - * An associative array containing: - * - primary: (optional) An array of local tasks (tabs). - * - secondary: (optional) An array of local tasks (tabs). - * - * @ingroup themeable - * @see menu_local_tasks() - */ -function theme_menu_local_tasks(&$variables) { - $output = ''; - - if (!empty($variables['primary'])) { - $variables['primary']['#prefix'] = '

    ' . t('Primary tabs') . '

    '; - $variables['primary']['#prefix'] .= ''; - $output .= drupal_render($variables['primary']); - } - if (!empty($variables['secondary'])) { - $variables['secondary']['#prefix'] = '

    ' . t('Secondary tabs') . '

    '; - $variables['secondary']['#prefix'] .= ''; - $output .= drupal_render($variables['secondary']); - } - - return $output; -} - -/** * Sets (or gets) the active menu for the current page. * * The active menu for the page determines the active trail. diff --git a/core/includes/theme.inc b/core/includes/theme.inc index 0775bbf..a3e4924 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -2846,18 +2846,23 @@ function drupal_common_theme() { // From menu.inc. 'menu_link' => array( 'render element' => 'element', + 'template' => 'menu-link', ), 'menu_tree' => array( 'render element' => 'tree', + 'template' => 'menu-tree', ), 'menu_local_task' => array( 'render element' => 'element', + 'template' => 'menu-local-task', ), 'menu_local_action' => array( 'render element' => 'element', + 'template' => 'menu-local-action', ), 'menu_local_tasks' => array( 'variables' => array('primary' => array(), 'secondary' => array()), + 'template' => 'menu-local-tasks', ), // From form.inc. 'input' => array( diff --git a/core/modules/system/css/system.theme.css b/core/modules/system/css/system.theme.css index dd03d49..cea84fb 100644 --- a/core/modules/system/css/system.theme.css +++ b/core/modules/system/css/system.theme.css @@ -441,7 +441,7 @@ ul.links a.active { } /** - * Markup generated by theme_menu_local_tasks(). + * Markup generated by menu-local-tasks.html.twig. */ div.tabs { margin: 1em 0; diff --git a/core/modules/system/templates/menu-link.html.twig b/core/modules/system/templates/menu-link.html.twig new file mode 100644 index 0000000..72fc813 --- /dev/null +++ b/core/modules/system/templates/menu-link.html.twig @@ -0,0 +1,21 @@ +{# +/** + * @file + * Default theme implementation for a menu link and submenu. + * + * Available variables: + * - attributes: HTML attributes for the wrapper element. + * - link: An HTML link element. + * - sub_menu: Rendered list item children of the element. + * + * Note: This template renders the content for each individual menu item in + * menu-local-tasks.html.twig. + * + * @see template_preprocess_menu_link() + * + * @ingroup themeable + */ +#} + + {{ link }}{{ sub_menu }} + \ No newline at end of file diff --git a/core/modules/system/templates/menu-local-action.html.twig b/core/modules/system/templates/menu-local-action.html.twig new file mode 100644 index 0000000..1844182 --- /dev/null +++ b/core/modules/system/templates/menu-local-action.html.twig @@ -0,0 +1,14 @@ +{# +/** + * @file + * Default theme implementation for a single local action link. + * + * Available variables: + * - link: A rendered link element. + * + * @see template_preprocess_menu_local_action() + * + * @ingroup themeable + */ +#} +
  • {{ link }}
  • \ No newline at end of file diff --git a/core/modules/system/templates/menu-local-task.html.twig b/core/modules/system/templates/menu-local-task.html.twig new file mode 100644 index 0000000..fff9b97 --- /dev/null +++ b/core/modules/system/templates/menu-local-task.html.twig @@ -0,0 +1,22 @@ +{# +/** + * @file + * Default theme implementation for a local task link. + * + * Available variables: + * - attributes: HTML attributes for the wrapper element. + * - link: The rendered link ( tag). + * + * Note: This template renders the content for each individual task item in + * menu-local-tasks.html.twig. + * + * @see template_preprocess_menu_local_task() + * + * @ingroup themeable + */ +#} +{% spaceless %} + + {{ link }} + +{% endspaceless %} \ No newline at end of file diff --git a/core/modules/system/templates/menu-local-tasks.html.twig b/core/modules/system/templates/menu-local-tasks.html.twig new file mode 100644 index 0000000..314a536 --- /dev/null +++ b/core/modules/system/templates/menu-local-tasks.html.twig @@ -0,0 +1,25 @@ +{# +/** + * @file + * Default theme implementation to display primary and secondary local tasks. + * + * Available variables: + * - primary_tasks: HTML list items representing primary tasks. + * - secondary_tasks: HTML list items representing primary tasks. + * + * Note: Each item for both sets of tasks can be individually themed in + * menu-local-task.html.twig. + * + * @see template_preprocess_menu_local_tasks() + * + * @ingroup themeable + */ +#} +{% if primary %} +

    {{ 'Primary tabs'|t }}

    +
      {{ primary }}
    +{% endif %} +{% if secondary %} +

    {{ 'Secondary tabs'|t }}

    +
      {{ secondary }}
    +{% endif %} \ No newline at end of file diff --git a/core/modules/system/templates/menu-tree.html.twig b/core/modules/system/templates/menu-tree.html.twig new file mode 100644 index 0000000..bad0c94 --- /dev/null +++ b/core/modules/system/templates/menu-tree.html.twig @@ -0,0 +1,19 @@ +{# +/** + * @file + * Default theme implementation for the wrapper of a menu tree. + * + * Available variables: + * - tree: An HTML string containing the tree's items. + * + * Note: Each item in the menu tree can be individually themed in + * menu-link.html.twig. + * + * @see template_preprocess_menu_tree() + * + * @ingroup themeable + */ +#} + \ No newline at end of file diff --git a/core/themes/bartik/bartik.theme b/core/themes/bartik/bartik.theme index 54f5bb2..3d6e716 100644 --- a/core/themes/bartik/bartik.theme +++ b/core/themes/bartik/bartik.theme @@ -138,20 +138,6 @@ function bartik_preprocess_block(&$variables) { } /** - * Implements THEME_menu_tree(). - */ -function bartik_menu_tree($variables) { - return ''; -} - -/** - * Implements THEME_menu_tree__MENUNAME(). - */ -function bartik_menu_tree__shortcut_default($variables) { - return ''; -} - -/** * Implements hook_preprocess_HOOK() for field.html.twig. * * @see template_preprocess_field() diff --git a/core/themes/bartik/templates/menu-tree--shortcut-default.html.twig b/core/themes/bartik/templates/menu-tree--shortcut-default.html.twig new file mode 100644 index 0000000..c387f1e --- /dev/null +++ b/core/themes/bartik/templates/menu-tree--shortcut-default.html.twig @@ -0,0 +1,19 @@ +{# +/** + * @file + * Bartik's theme implementation for the wrapper of a shortcut menu tree. + * + * Available variables: + * - tree: An HTML string containing the tree's items. + * + * Note: Each item in the menu tree can be individually themed in + * menu-link.html.twig. + * + * @see template_preprocess_menu_tree() + * + * @ingroup themeable + */ +#} + \ No newline at end of file diff --git a/core/themes/bartik/templates/menu-tree.html.twig b/core/themes/bartik/templates/menu-tree.html.twig new file mode 100644 index 0000000..0435217 --- /dev/null +++ b/core/themes/bartik/templates/menu-tree.html.twig @@ -0,0 +1,19 @@ +{# +/** + * @file + * Bartik's theme implementation for the wrapper of a menu tree. + * + * Available variables: + * - tree: An HTML string containing the tree's items. + * + * Note: Each item in the menu tree can be individually themed in + * menu-link.html.twig. + * + * @see template_preprocess_menu_tree() + * + * @ingroup themeable + */ +#} + \ No newline at end of file