Jump to content

Recommended Posts

Posted
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
Posted
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!!

  • 2 months later...
Posted

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.

  • 4 weeks later...
Posted

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

Posted
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.

Posted

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).
 

Posted (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 by kongondo
  • 2 months later...
Posted

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

Posted
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.

Posted

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

Posted
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.

Posted
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

Posted
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()....

Posted
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

Posted

@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
Posted

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

  • 1 month later...
Posted

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:

2030783994_2020-10-2310_28_39.thumb.jpg.e1fe166db791c872be35b47765491ced.jpg

Latest Version of PW 3.0.167 / Menu Builder 0.2.5 / PHP 7.2.34

Posted

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?

  • Like 1
Posted
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
Posted

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.

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...