kongondo Posted March 26, 2020 Author Share Posted March 26, 2020 On 3/24/2020 at 4:03 PM, maddmac said: Just a question that might be answered in a previous post. If I want to apply a class to the <a> tag how would I do this using the module options? See the two posts above yours ?. Currently, this is not possible if using the render() method but I have added it to my todo list. 2 Link to comment Share on other sites More sharing options...
Mackski Posted March 26, 2020 Share Posted March 26, 2020 7 hours ago, kongondo said: Actually, this is not true ?. I don't know what version you are using but there has always been a save as unpublished or published during menu creation and an unpublish/publish action that can be applied to existing menu items in the menus list/table. See the big green shiny buttons ?. Am I missing something? You're right, It just wasn't obvious at the time, now that I create another menu it's fine, i must have been smoking something.. ?? Thanks for this great module!! Link to comment Share on other sites More sharing options...
pmichaelis Posted May 28, 2020 Share Posted May 28, 2020 Hey, I searched the forum, but I couldn't find any post with a topic of the problem that I am facing with the module. I setup multilingual menues nd have different roles which have the menu-builder permission. As soon as Editors save a Menu, the custom title translations of the menu are gone. Menu Item titles of the default language are editable as a non-admin user, but all other language titles are ignored / deleted on save. Are only admin users allowed to edit title translations? Thanks for a short hint on that. Link to comment Share on other sites More sharing options...
kongondo Posted May 29, 2020 Author Share Posted May 29, 2020 Hi @pmichaelis, I'll have look. Thanks for reporting. 1 Link to comment Share on other sites More sharing options...
antpre Posted June 25, 2020 Share Posted June 25, 2020 Hi, I am using Menu builder on a new multi-language web site. It's a simple use case : only on level on the main menu. It'is working fine. Thanks again for the module. However I have one issue. the class for the current item is not rendered in the html. My code is like this : $menu = $modules->get('MarkupMenuBuilder'); $options = array( 'current_class' => 'active', ); echo $menu->render('MainMenu', $options); One point though : each menu item is a "custom item" with a url to the page and url segments (2 or 3) and all the menu item points to the same page (with different url segment). Do you think this is the reason why the current class is not present in the html ? If so is there any workaround ? Thanks a lot Link to comment Share on other sites More sharing options...
kongondo Posted June 25, 2020 Author Share Posted June 25, 2020 1 hour ago, antpre said: It'is working fine. Thanks again for the module. Glad you find the module useful. 1 hour ago, antpre said: One point though : each menu item is a "custom item" with a url to the page and url segments (2 or 3) and all the menu item points to the same page (with different url segment). I am not sure I understand this statement. By, "custom item", do you mean external links? (e.g., processwire.com). If not, please explain. Thanks. Link to comment Share on other sites More sharing options...
antpre Posted June 25, 2020 Share Posted June 25, 2020 Kongondo, I am refering to the 3 choices you have to add a menu item in the admin interface of the module : Pages / Custom /selector. Each of the menu item are using the custom option. here are 2 items of this menu The base url is the same, cause this a single process wire page, and the 2 last bit of the url are the url segments (ie /type/talk or /type/cours). Link to comment Share on other sites More sharing options...
kongondo Posted June 25, 2020 Author Share Posted June 25, 2020 (edited) 2 hours ago, antpre said: 2 last bit of the url are the url segments ( My hunch is that this is the reason. I don't think I ever tested MB with url segments. I'll have to look into this. Not sure when though, sorry. By the way, although the option to use HTML in the title is available, I'd encourage you to use the method getMenuItems() instead (in your template file). It is much more powerful and will give you full control over the markup. Edited June 25, 2020 by kongondo Link to comment Share on other sites More sharing options...
Roych Posted September 10, 2020 Share Posted September 10, 2020 Hello, Im kinda lost here, can't make it work, what am I doing wrong here. It kinda work but not the way it should it looks messy. HTML: <nav class="collapse"> <ul class="nav nav-pills" id="mainNav"> <li class="dropdown"><a class="dropdown-item dropdown-toggle" href="#">Features</a> <ul class="dropdown-menu"> <li class="dropdown-submenu"> <a class="dropdown-item" href="#">Headers</a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="feature-headers-overview.html">Overview</a></li> </ul> </li> </ul> </li> </ul> </nav> <?php $menu = $modules->get('MarkupMenuBuilder'); $options = array( 'wrapper_list_type' => 'ul',// ul, ol, nav, div, etc. 'list_type' => 'li',// li, a, span, etc. 'menu_css_id' => 'mainNav',// a CSS ID for the menu 'menu_css_class' => 'nav nav-pills',// a CSS Class for the menu 'submenu_css_class' => 'dropdown dropdown-menu dropdown-item',// CSS Class for sub-menus 'has_children_class' => 'dropdown dropdown-submenu',// CSS Class for any menu item that has children 'first_class'=>'',// CSS Class for the first item in 'last_class' => '', 'current_class' => 'active', 'default_title' => 0,// 0=show saved titles;1=show actual/current titles 'include_children' => 4,// show 'natural' MB non-native descendant items as part of navigation 'm_max_level' => 5,// how deep to fetch 'include_children' 'current_class_level' => 1,// how high up the ancestral tree to apply 'current_class' 'default_class' => '',// a CSS class to apply to all menu items ); echo $menu->render(1022, $options); ?> This is the best combination I could found that doesn't look totaly broken. Any help appreciated thank you R Link to comment Share on other sites More sharing options...
kongondo Posted September 10, 2020 Author Share Posted September 10, 2020 1 hour ago, Roych said: Im kinda lost here, can't make it work How should it work? What is not working? ? 1 hour ago, Roych said: what am I doing wrong here Impossible to tell since we don't know what is not working and what you mean by 'working'. 1 hour ago, Roych said: It kinda work but not the way it should it looks messy. No idea what this means. What do you mean messy? Maybe show us what you are trying to replicate first. 1 hour ago, Roych said: I could found that doesn't look totaly broken. Is it broken or does it look broken? What is broken? Looks like valid HTML to me. @Roych, please give a better description and/or illustration of how you want the menu output to appear. Thanks. Link to comment Share on other sites More sharing options...
Roych Posted September 10, 2020 Share Posted September 10, 2020 Sorry for beeing so unclear. So the menu doesnt look like it should. The main menu looks ok, but the submenu looks messy. It does not work as in normal html. I guess my classes in code are not in the right place. posting gifs below Looking good: (original HTML) Not looking good (my code) I hope Im making more sense now Thank you R Link to comment Share on other sites More sharing options...
kongondo Posted September 10, 2020 Author Share Posted September 10, 2020 1 hour ago, Roych said: I guess my classes in code are not in the right place. Probably. Please copy paste here the original menu HTML that you are trying to replicate. Link to comment Share on other sites More sharing options...
Roych Posted September 10, 2020 Share Posted September 10, 2020 19 minutes ago, kongondo said: Probably. Please copy paste here the original menu HTML that you are trying to replicate. here is my original html (already posted above) ? <nav class="collapse"> <ul class="nav nav-pills" id="mainNav"> <li class="dropdown"><a class="dropdown-item dropdown-toggle" href="#">Features</a> <ul class="dropdown-menu"> <li class="dropdown-submenu"> <a class="dropdown-item" href="#">Headers</a> <ul class="dropdown-menu"> <li><a class="dropdown-item" href="feature-headers-overview.html">Overview</a></li> </ul> </li> </ul> </li> </ul> </nav> Thank you R Link to comment Share on other sites More sharing options...
kongondo Posted September 10, 2020 Author Share Posted September 10, 2020 2 minutes ago, Roych said: here is my original html (already posted above) ? I thought this was the output from echo $menu->render(1022, $options);, hence the confusion. In that case then, please post the 'messy/broken' output that results from echo $menu->render().... Link to comment Share on other sites More sharing options...
Roych Posted September 10, 2020 Share Posted September 10, 2020 1 hour ago, kongondo said: I thought this was the output from echo $menu->render(1022, $options);, hence the confusion. In that case then, please post the 'messy/broken' output that results from echo $menu->render().... Here it is: <ul id="mainNav" class="nav nav-pills"> <li class="active"> <a href='/'>Domov</a> </li> <li class="dropdown dropdown-submenu"> <a href='/about/'>Mladi</a> <ul class="dropdown dropdown-menu dropdown-item"> <li class="dropdown dropdown-submenu"> <a href='/site-map/'>Site Map</a> <ul class="dropdown dropdown-menu dropdown-item"> <li class="dropdown dropdown-submenu"> <a href='#'>Test 1</a> <ul class="dropdown dropdown-menu dropdown-item"> <li> <a href='#'>Test 2</a> </li> </ul> </li> </ul> </li> </ul> </li> <li> <a href='#'>Test 3</a> </li> </ul> Thank you R Link to comment Share on other sites More sharing options...
kongondo Posted September 10, 2020 Author Share Posted September 10, 2020 @Roych. OK. Thanks. I'll have a look. Link to comment Share on other sites More sharing options...
kongondo Posted September 11, 2020 Author Share Posted September 11, 2020 @Roych The menu you want cannot presently be achieved by using the render() method. For instance, looking at your <li> tags, going down the levels/depth, they have different classes. This is currently not possible in MB but I will add it to my todo list, e.g. a 'levels class'. For custom menus such as yours, it is better to use the getMenuItems() method together with a custom recursive function. Below is an example recursive function that will output the example menu you provided. You can adapt it to your needs if you find it useful. It might need a bit of polishing. Spoiler <?php namespace ProcessWire; function buildMenuFromObject($parent = 0, $menu, $first = 0, $level = 0) { if (!is_object($menu)) return; $level += 1; //------- LEVELS CLASSES ------- // $liLevelClasses = ''; $aLevelClasses = 'dropdown-item'; if ($level === 1) { $liLevelClasses = 'dropdown'; $aLevelClasses .= ' dropdown-toggle'; } elseif ($level === 2) $liLevelClasses = 'dropdown-submenu'; //---------- $out = ''; $hasChild = false; foreach ($menu as $m) { // if this menu item is a parent; create the sub-items/child-menu-items if ($m->parentID == $parent) { // if this is the first child if ($hasChild === false) { $hasChild = true; // is a parent // top/outer <ul></ul> if ($first == 0) { $out .= "<ul id='mainNav' class='nav nav-pills'>\n"; $first = 1; } // submenu/inner <ul></ul> else $out .= "\n<ul class='dropdown-menu'>\n"; } // CLASSES FINAL // ** li classes ** // current class if ($m->isCurrent) $liLevelClasses .= ' active'; $liClasses = $liLevelClasses ? " class='{$liLevelClasses}'" : ''; // ** anchor classes ** $aClasses = $aLevelClasses ? " class='{$aLevelClasses}'" : ''; // anchor link (hash for top 2, else real URL) $href = $level < 3 ? '#' : $m->url; //--------- // single menu item $out .= "<li$liClasses><a$aClasses href='$href'>{$m->title}</a>"; // call function again to generate nested list for sub-menu items belonging to this menu item. $out .= buildMenuFromObject($m->id, $menu, $first, $level); $out .= "</li>\n"; } // end if parent } // end foreach if ($hasChild === true) { $out .= "</ul>\n"; } return $out; } //---------------- END FUNCTIONS ------------- $options = array('include_children' => 1, 'm_max_level' => 3); $mb = $modules->get('MarkupMenuBuilder'); /* grab menu items as a WireArray with Menu objects */ $menuItems = $mb->getMenuItems(1022, 2, $options); // render custom menu echo '<nav class="collapse">' . buildMenuFromObject(0, $menuItems) . '</nav>'; 1 Link to comment Share on other sites More sharing options...
Roych Posted September 11, 2020 Share Posted September 11, 2020 Yes, it would be a great feature for the module. Im mostly using MB. ? Thank you for the code I'll try to addapt it to my needs ? Thank you very much R Link to comment Share on other sites More sharing options...
DV-JF Posted October 23, 2020 Share Posted October 23, 2020 Hey @kongondo I've found a PHP warning, i guess, when there a no items assigned to a menu, have a look at the screenshot: Latest Version of PW 3.0.167 / Menu Builder 0.2.5 / PHP 7.2.34 Link to comment Share on other sites More sharing options...
kongondo Posted October 23, 2020 Author Share Posted October 23, 2020 10 hours ago, DV-JF said: I've found a PHP warning, Thanks for reporting this @DV-JF. Incidentally, @Ivan Gretsky reported the same warning yesterday in the GitHub repo ?. 1 Link to comment Share on other sites More sharing options...
Christophe Posted October 23, 2020 Share Posted October 23, 2020 Knowing the version(s) of PHP would help. Link to comment Share on other sites More sharing options...
Ivan Gretsky Posted October 26, 2020 Share Posted October 26, 2020 Good day, @kongondo! I can see some great features (like extra_fields option) on a dev branch (added in version 0.2.7). Is there a reason for not releasing it yet for everyone to enjoy on a master branch, which is being installed by default? 1 Link to comment Share on other sites More sharing options...
kongondo Posted October 26, 2020 Author Share Posted October 26, 2020 3 hours ago, Ivan Gretsky said: Is there a reason for not releasing it yet for everyone to enjoy on a master branch, @Ivan Gretsky Thank you for reminding me about this! Not only are there new features, but the dev version already has fixes for the issue you filed recently! I note that I added these features way back in January 2020! For now, I'll just blame the pandemic/isolation for my forgetfulness ?. I'll merge to master asap. Thanks. 1 Link to comment Share on other sites More sharing options...
kongondo Posted October 26, 2020 Author Share Posted October 26, 2020 Quick update. MB version 026 and 027 have now been merged into master. Please see the linked posts and the extra fields section of the docs for the changes. Thanks. 1 Link to comment Share on other sites More sharing options...
DV-JF Posted October 29, 2020 Share Posted October 29, 2020 Hey @kongondo I've read the docs and tried to find some hints here in the forum, but couldn't find anything regarding to my problem: I need some menus only be displayed on the frontend when they are filled in the backend. When I try to render a menu <?=$menus->render('footer-3', $scnd_options);?> with no items in it I get an error: Even if i try to count the items before with <?php bd($menus->getMenuItems('footer-3'));?> I get this error. So how can I check, if a specific menu has some items, is not empty or is unpublished and render it only if these conditions match? Many greets. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now