Skip to main content

Main menu dropdown parent item clickable in Drupal 8 using Bootstrap 4

 Edit menu--main.html.twig template file

{#

/**

 * @file

 * Bootstrap Barrio's override to display a menu.

 *

 * Available variables:

 * - menu_name: The machine name of the menu.

 * - items: A nested list of menu items. Each menu item contains:

 *   - attributes: HTML attributes for the menu item.

 *   - below: The menu item child items.

 *   - title: The menu link title.

 *   - url: The menu link url, instance of \Drupal\Core\Url

 *   - localized_options: Menu link localized options.

 *   - is_expanded: TRUE if the link has visible children within the current

 *     menu tree.

 *   - is_collapsed: TRUE if the link has children within the current menu tree

 *     that are not currently visible.

 *   - in_active_trail: TRUE if the link is in the active trail.

 */

#}

{% import _self as menus %}


{#

  We call a macro which calls itself to render the full tree.

  @see http://twig.sensiolabs.org/doc/tags/macro.html

#}

{{ menus.menu_links(items, attributes, 0) }}


{% macro menu_links(items, attributes, menu_level) %}

  {% import _self as menus %}

  {% if items %}

    {% if menu_level == 0 %}

      <ul{{ attributes.addClass('nav navbar-nav') }}>

    {% else %}

      <ul class="dropdown-menu">

    {% endif %}

    {% for item in items %}

      {%

        set classes = [

          menu_level ? 'dropdown-item' : 'nav-item',

          item.is_expanded ? 'menu-item--expanded',

          item.is_collapsed ? 'menu-item--collapsed',

          item.in_active_trail ? 'active',

          item.below ? 'dropdown',

        ]

      %}

      <li{{ item.attributes.addClass(classes) }}>

        {%

          set link_classes = [

            not menu_level ? 'nav-link',

            item.in_active_trail ? 'active',

            item.below ? 'dropdown-toggle-none',

            item.url.getOption('attributes').class ? item.url.getOption('attributes').class | join(' '),

            'nav-link-' ~ item.url.toString() | clean_class,

          ]

        %}

        {% if item.below %}

          {{ link(item.title, item.url, {'class': link_classes}) }}

          <span class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"></span>

          {{ menus.menu_links(item.below, attributes, menu_level + 1) }}

        {% else %}

          {{ link(item.title, item.url, {'class': link_classes}) }}

        {% endif %}

      </li>

    {% endfor %}

    </ul>

  {% endif %}

{% endmacro %}



Javascript to handle multilevel dropdown menu items

$('.dropdown-menu span.dropdown-toggle').on('click', function(e) {
    if (!$(this).next().hasClass('show')) {
      $(this).parents('.dropdown-menu').first().find('.show').removeClass('show');
    }
    var $subMenu = $(this).next('.dropdown-menu');
    $subMenu.toggleClass('show');


    $(this).parents('li.nav-item.dropdown.show').on('hidden.bs.dropdown', function(e) {
      $('.dropdown-submenu .show').removeClass('show');
    });


    return false;
  });

CSS

.dropdown-toggle::after {
        content: '\f078';
        font-family: "Font Awesome 5 Free";
        font-size: 20px;
        right: 35px;
        position: absolute;
        font-weight: 600;
        border: none;
        top: 10px;
    }

Comments

  1. The solution adds jQuery to make the parent item clickable in the dropdown menu for Bootstrap 4 in Drupal 8. For further guidance on optimizing your site, visit PathofBuilding!

    ReplyDelete

Post a Comment

Popular posts from this blog

Add JS to the bottom of the page in Drupal 7

How to add JS at bottom of a particular page in Drupal 7 Step 1: Get the page id. In case of front page "is_front"  Step 2: In template.php file of your theme add the below code : function illume_preprocess_page(&$variables) { if ($variables['is_front']) { drupal_add_js(path_to_theme().'/js/util.js', array('type' => 'file', 'scope' => 'footer')); drupal_add_js(path_to_theme().'/js/main.js', array('type' => 'file', 'scope' => 'footer')); drupal_add_js(path_to_theme().'/js/slideimage.js', array('type' => 'file', 'scope' => 'footer')); $variables['bottom_scripts'] = drupal_get_js(); } } This way you can add JS file using drupal_add_js() and define scope as footer. Step 3: Now you can use bottom_script variable to the page tpl file where you want to add JS print $bottom_scripts;

Use Case Diagram for Online Book Store