Jump to content

Menu Builder


kongondo

Recommended Posts

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.

  • Like 2
Link to comment
Share on other sites

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

  • 2 months later...

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

  • 4 weeks later...

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

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

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

1534615158_Screenshot2020-06-25at11_33_06.png.936ea634153b4a01e4060a7e4f626e05.png1738638171_Screenshot2020-06-25at11_32_46.png.744dd42d6bfbd8075ae16ada3224cd47.png

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

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 by kongondo
Link to comment
Share on other sites

  • 2 months later...

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

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

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)

Working.gif.a732f35b18a017a9fd8c6684b9f19f95.gif

 

Not looking good (my code)

Not-Working.gif.08a9c1c6a3d9b1abe815a3873ec17f46.gif

 

I hope Im making more sense now

Thank you

R

Link to comment
Share on other sites

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

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

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

@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>';

 

 

  • Like 1
Link to comment
Share on other sites

  • 1 month later...
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.

  • Like 1
Link to comment
Share on other sites

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:

597270331_2020-10-2911_44_12.thumb.jpg.af5d2aedf0c61cf51ea40ca7349a0326.jpg

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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...