[Drupal] How to Create Multi-level Responsive Drop Down Menu in Drupal using Bootstrap
https://www.zyxware.com/sites/default/files/styles/user_image/public/default_images/index.png?itok=2YmREnrP
BY akhila.vn
4 months ago
Bootstrap
0
comments comment

I had a requirement to add a multi-level responsive drop down menu in a Zyxware theme. Please do refer the below reference links to know more about responsive themes and free Drupal themes. So for that I had to edit page.tpl.php, page--front.tpl.php, style.css, template.php etc.

First I added the following code to template.php of my theme. The steps that I followed here are,

  • Added the following code to the function themename__preprocess_page(&$vars) to make the menu as a tree.

    
        //Setting menu in a tree structure
        $main_menu_tree = menu_tree(variable_get('menu_main_links_source', 'main-menu'));
        $vars['main_menu'] =  $main_menu_tree;
        // Get the entire main menu tree
        $main_menu_tree = menu_tree_all_data('main-menu');
        // Add the rendered output to the $main_menu_expanded variable
        $vars['main_menu_expanded'] = menu_tree_output($main_menu_tree);
      
    
  • Added css class to main menu using the function,
    
      function themename_menu_tree__main_menu(&$vars) {        
      return '<ul class="nav navbar-nav">' . $vars['tree'] . '</ul>';
     }
     
    
  • Added css class to inner part of main menu using the function,
    
    function themename_menu_tree__main_menu_inner($vars) {	
        return '<ul class="dropdown-menu">' . $vars['tree'] . '</ul>';
    }
    
    
  • Added the following function to display the links in main menu tree,
    
      function themename_menu_link__main_menu($vars) {
       $element = $vars['element'];
       $sub_menu = '';
    
       if ($element['#below']) {
        foreach ($element['#below'] as $key => $val) {
          if (is_numeric($key)) {             
            $element['#below'][$key]['#theme'] = 'menu_link__main_menu_inner'; // 2 level <li>
          }
        }
        $element['#below']['#theme_wrappers'][0] = 'menu_tree__main_menu_inner';  // 2 level <ul>
        $sub_menu = drupal_render($element['#below']);
      }
      $output = l($element['#title'], $element['#href'], $element['#localized_options']);
    
      $element['#localized_options']['attributes']['class'][] = " dropdown-toggle ";
      $element['#localized_options']['attributes']['role'][] = "menu";
      $element['#localized_options']['attributes']['data-toggle'][] = "dropdown";
      $element['#localized_options']['attributes']['aria-expanded'][] = "true";  
      
      $output = l($element['#title'], $element['#href'], $element['#localized_options']);
      return '<li class="dropdown">' . $output . $sub_menu . '</li>';
     }
     
    
  • Added the following code to make inner <li> tag - links
    
        function themename_menu_link__main_menu_inner($vars) {
          $element = $vars['element'];
          $sub_menu = '';
    
          if ($element['#below']) {
            $sub_menu = drupal_render($element['#below']);
          }
    
          $output = l($element['#title'], $element['#href'], $element['#localized_options']);
    
          return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . '</li>\n';
         }
    
    

Then I added the code ' print render($main_menu); ' to the page.tpl and page--front.tpl for display menu with necessary <div> tag and css styles based on the theme that were downloaded from http://getbootstrap.com/components

References :

  • https://www.drupal.org/node/1178784
  • http://getbootstrap.com/components/
  • http://www.zymphonies.com/metro-responsive-theme

RELATED ARTICLE

more_horiz
close

on 25th March 2015 / by akhila.vn
I had a requirement to add a multi-level responsive drop down menu in a Zyxware theme. Please do refer the below reference links to know more about responsive themes and free Drupal themes. So I need to edit page.tpl.php, page--front.tpl.php, style.css, template.php etc. First I add the following code to template.php of my theme. The steps that I followed here are, Added the following code to the function themename__preprocess_page(&amp;$vars) to make the menu as a tree. //Setting menu in a tree structure $main_menu_tree = menu_tree(variable_get('menu_main_links_source', 'main-menu')); $vars['main_menu'] = $main_menu_tree; // Get the entire main menu tree $main_menu_tree = menu_tree_all_data('main-menu'); // Add the rendered output to the $main_menu_expanded variable $vars['main_menu_expanded'] = menu_tree_output($main_menu_tree); Add css class to main menu using the function, function themename_menu_tree__main_menu(&amp;$vars) { return '&lt;ul class="nav navbar-nav"&gt;' . $vars['tree'] . '&lt;/ul&gt;'; } Add css class to inner part of main menu using the function, function themename_menu_tree__main_menu_inner($vars) { return '&lt;ul class="dropdown-menu"&gt;' . $vars['tree'] . '&lt;/ul&gt;'; } Added the following function to display the links in main menu tree, function themename_menu_link__main_menu($vars) { $element = $vars['element']; $sub_menu = ''; if ($element['#below']) { foreach ($element['#below'] as $key =&gt; $val) { if (is_numeric($key)) { $element['#below'][$key]['#theme'] = 'menu_link__main_menu_inner'; // 2 level &lt;li&gt; } } $element['#below']['#theme_wrappers'][0] = 'menu_tree__main_menu_inner'; // 2 level &lt;ul&gt; $sub_menu = drupal_render($element['#below']); } $output = l($element['#title'], $element['#href'], $element['#localized_options']); $element['#localized_options']['attributes']['class'][] = " dropdown-toggle "; $element['#localized_options']['attributes']['role'][] = "menu"; $element['#localized_options']['attributes']['data-toggle'][] = "dropdown"; $element['#localized_options']['attributes']['aria-expanded'][] = "true"; $output = l($element['#title'], $element['#href'], $element['#localized_options']); return '&lt;li class="dropdown"&gt;' . $output . $sub_menu . '&lt;/li&gt;'; } Added the following code to make inner &lt;li&gt; tag - links function themename_menu_link__main_menu_inner($vars) { $element = $vars['element']; $sub_menu = ''; if ($element['#below']) { $sub_menu = drupal_render($element['#below']); } $output = l($element['#title'], $element['#href'], $element['#localized_options']); return '&lt;li' . drupal_attributes($element['#attributes']) . '&gt;' . $output . $sub_menu . '&lt;/li&gt;\n'; } Then I add the code ' print render($main_menu); ' to the page.tpl and page--front.tpl for display menu with necessary &lt;div&gt; tag and css styles based on the theme that are downloaded from http://getbootstrap.com/components References :https://www.drupal.org/node/1178784, http://getbootstrap.com/components/ , http://www.zymphonies.com/metro-responsive-theme Bootstrap Drupal Leave a reply Your email address will not be published. Required fields are marker * doug (not verified) access_time 18 Apr 2019 - 13:50 Thank you. I was so shocked when I realized that the bootstrap theme did not have more than 2 levels of nav. Wow Your code worked right away. I need to minimally re-work my theme, but it is all good. this - '\n'; should be this - ''; I did not have to add this ' print render($main_menu); ' to the page.tpl and page--front.tpl Add new comment
more_horiz
close

on 01st April 2015 / by aby.va
Bootstrap twitter is includes a responsive, mobile or tablet first fluid grid system that ... it is styling on small and medium devices but also on large devices if a .col-lg-* class is not present. My company has a lot of free Drupal themes developed. But there is a problem i.e these are not responsive. So we started to change this themes in responsive and For that we suggest the new bootstrap framework for responsive. We success fully converted the plane html code in to bootstrap grid format. So I am testing out Bootstrap 3 responsiveness navbar and we have a demo website. When I resize or decreases the size of the browser on a desktop, it all works correctly including collapsible menu with a small icon on the top with the nav bar which I can click to see more menu buttons. I tried it from a iphone mobile browser and tablets (I tried it on internet browser and chrome on an Android), But I didn't see the responsive design. I could only see very small version of desktop like website. This issue is because of We didn't add the meta tag in html header part. So we add the below tag in header part: &lt; meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"&gt; Bootstrap Leave a reply Your email address will not be published. Required fields are marker *
more_horiz
close

on 21st April 2015 / by alfred.paul
Bootstrap is the most popular HTML, CSS, and JavaScript framework for developing responsive, mobile first websites. This framework is also a popular star in drupal themes. There are a lot of drupal themes based on bootstrap, using bootstrap library or subthemes created from bootstrap base theme. Its mobile ready design and predefined classes makes it easier to create a beautifully customized responsive theme. While working on a project I had a requirement to make permanent hamburger menu (That's right, the button with three lines at the top of any mobile page created using bootstrap) regardless of the viewport resolution. Default behaviour of bootstrap is like this, when the viewport width become less than 768 pixels, the main menu will collapse into hamburger button. I had to change this behaviour. This can be done by customizing the bootstrap library from http://getbootstrap.com/customize/ The break point at which main menu collapses to hamburger menu is defined inside @grid-float-breakpoint variable in the bootstrap customization page. We can set that to any screen width. Main menu will be collapsed to hamburger if viewport width is less than the width specified here. I placed 9999px in that field (Hoping nobody is using such resolution devices for browsing!!). This will change the grid-float-breakpoint and hamburger menu will always show. We can download the customized library and replace our bootstrap library to see the changes. Easy right? Well not that easy, because the bootstrap base theme is getting the bootstrap library (CSS and JS) from bootstrap CDN and here we are using a customized bootstrap library. Bootstrap theme does not allow using custom library for bootstrap. Well, there is a module for everything in drupal. Here I am using a module called bootstrap_library which basically does nothing other than allow us to use custom bootstrap libraries to our bootstrap sub-themes. 1. Disable the Bootstrap CDN from our sub-theme by going to Appearence &gt; Select settings of our subtheme &gt; Advanced and disable the CDN. 2. Copy the extracted custom bootstrap library to sites/all/libraries/bootstrap. The bootstrap.min.js file location must be sites/all/libraries/bootstrap/js/bootstrap.min.js so that it is detected properly by the module. 3. Enable module bootstrap_library and goto "admin/config/development/bootstrap_library" and select bootstrap and our sub-theme from the multi-select box in the "Theme Visibility" fieldset and save. That's it. The above steps will enable us to use any customized version of bootstrap. Happy bootstrapping folks. :) Bootstrap Leave a reply Your email address will not be published. Required fields are marker *
Leave a reply
Your email address will not be published. Required fields are marker *

Filtered HTML

  • Web page addresses and email addresses turn into links automatically.
  • Allowed HTML tags: <a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type='1 A I'> <li> <dl> <dt> <dd> <h2 id='jump-*'> <h3 id> <h4 id> <h5 id> <h6 id>
  • Lines and paragraphs break automatically.
The content of this field is kept private and will not be shown publicly.
CAPTCHA This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.