vBulletin Mods

The Official vBulletin Modifications Site
https://www.vbulletin.org/forum/showthread.php?t=283146

vB4.2 Navigation Manager - how to discussion
by AusPhotography
19 May 2012 02:23

I have vB 4.2.0 BETA 1 running in my test system.

Products that use templates/hooks to integrate with the navbar will need the following changes to work with the Navigation Manager.

Please post code snips and hints in this thread, we are all on a learning curve.

1. Remove old style navigation hooks/templates etc.

2. Create a new <navigation> section in the product XML file
(You can create the navigation in the navigation manager, linked to a product then export the product file as a skeleton)

3. Set any conditionals in a hook or in your main code
Eg. $show['apmgtug'] = true; is set for one of the menu items in my example
My example relies on $show['member'] = true; as well.
Leave the <show> tag empty for 'public' tabs/links

4. If you have multiple scripts, leave <scripts> blank and set $root at the new hooks set_navigation_tab_fallaback or set_navigation_tab_vbview


Block Disabled:      (Update License Status)  
Suspended or Unlicensed Members Cannot View Code.

I hope that helps you get a quick leg up for this change.

I would probably have a new vB4.2 code base because of the differences, you could have the same code base with some sort of version check.

In the end the new navigation integration is better and easier.

Here are sample <navigation> from one of my own plugins...


Block Disabled:      (Update License Status)  
Suspended or Unlicensed Members Cannot View Code.

Sample phrases the give the text of the navigation items.

Block Disabled:      (Update License Status)  
Suspended or Unlicensed Members Cannot View Code.

--------------- Added 19 May 2012 at 02:31 ---------------

Pull down menu's can also be coded.
Have a look at the vB source for examples.
Specifically "./install/vbulletin-navigation.xml"

nhawk 19 May 2012 12:01

FYI, the navtab_end template hook in 4.2.0 still works the same as it did in 4.1.12.

It's the navbar that gives headaches.

You can add to the navbar with a DB routine too.

EDIT: But this does totally screw up dynamically built navbar links. On first glance it looks like a phrase needs to be created for each navbar link. If that's the case, the maintenance DB routines for a dynamically created link will be interesting.

Paul M 19 May 2012 14:34

FYI, the 'show' check can use multiple variables, so if you want a link to only appear if $show['cond1'] and $show['cond2'] are set, you add them both, separated by a dot

<show>cond1.cond2</show>

Custom $show variables can be created pretty much in any hook, as the navigation is almost the last thing built, but two common ones added for the purpose are load_show_variables & load_forum_show_variables.

Andreas 19 May 2012 17:34

Quote:

But this does totally screw up dynamically built navbar links
IMHO, there should be no dynamically created links as this defeats the purpose of the navigation manager, which is to allow the administrator full control over the menu structure.

May I ask why you would need dynamically created links?

nhawk 19 May 2012 18:04

Quote:

Originally Posted by Andreas (Post 2330741)
IMHO, there should be no dynamically created links as this defeats the purpose of the navigation manager, which is to allow the administrator full control over the menu structure.

May I ask why you would need dynamically created links?

Posted on vB.com..

'user' in this case means the administrator.

ie: A mod uses a portion of the information entered by the user for the navbar link, say the 'title' portion of the user entry. In order to create the navbar link in the community menu, that 'title' must be also be saved in the phrase table of vB. And then the additional navbar link must be created in the navigation table. Along with that a $show variable must be created in a plugin if the member has permission to view that link.

Now because different 'titles' can have different permissions, there has to be a different $show for each menu item.

That seems like a lot to go through for something that use to take a one line piece of code to throw the menu selection in the community menu in earlier versions.

Andreas 19 May 2012 18:32

Quote:

Originally Posted by nhawk (Post 2330748)
A mod uses a portion of the information entered by the user for the navbar link, say the 'title' portion of the user entry. In order to create the navbar link in the community menu, that 'title' must be also be saved in the phrase table of vB.

Can you give a concreate example of an Add-on so it is easier to understand what exactly you are talking abount?
As far as I understand you intentions by now is that the Add-on allows the administrator to set the title for a link in the Community Menu on the Forum tab?
This can easily be achived by just using the Navigation Manager to rename the link.


Quote:

And then the additional navbar link must be created in the navigation table.
If it is a "static" link - yes, it should be added to the navigation table upon Add-on installation.
(Which will happen automatically if you have already added that link on your developement system, assigned in to the Add-on and exported the XML).


Quote:

Along with that a $show variable must be created in a plugin if the member has permission to view that link.

Now because different 'titles' can have different permissions, there has to be a different $show for each menu item.
Yes, you have to check the permissions and set a flag wether to show the link or not.
But again this is not different from how it worked in vB 4.1


Quote:

That seems like a lot to go through for something that use to take a one line piece of code to throw the menu selection in the community menu in earlier versions.
Not really, in fact it does require less work in my mind:

In vB 4.1 you had to
  • Add a template for the link
  • Add the phrase for the link
  • Create a setting to let the user select where the link should appear (eg. template hook)
  • Write code to check the setting, the user permissions and to render the template for the selected template hook
... and still the administrator might have wanted to have the link appear on a completely different location

In vB 4.2
  • Add the link in Navigation Manager
  • Write a Plug-in to check permissions and set the $show-Flag

nhawk 19 May 2012 18:39

Quote:

Originally Posted by Andreas (Post 2330753)
Can you give a concreate example of an Add-on so it is easier to understand what exactly you are talking abount?

Sure.. it's my Advanced Application Forms..

Here's a snippet of the code to add an application type to the community menu...

Block Disabled:      (Update License Status)  
Suspended or Unlicensed Members Cannot View Code.

Don't get me wrong. I can create the menu in the database when the application is created. It just seems like more work to me.

This reminds me of the addition of the <vb:each> in templates...
Nobody is going to tell me that reading a database, parse the data to build an array, sending that array to the template and parsing it a second time is faster than bulding/formating the array and sending it in all one lump piece of data to the template. It's just not possible. Two parses take double the time. But that's a different topic. ;)

Andreas 19 May 2012 19:17

Quote:

Originally Posted by nhawk (Post 2330756)
Here's a snippet of the code to add an application type to the community menu...

Block Disabled:      (Update License Status)  
Suspended or Unlicensed Members Cannot View Code.

Thanks, that's what I expected :)

The idea behind Navigation Manager is to give the Administrator full control over the menu structure - if you are creating links dynamically at runtime (which is still possible) you are IMHO somewhat defeating that goal.

Quote:

This reminds me of the addition of the <vb:each> in templates...
Nobody is going to tell me that reading a database, parse the data to build an array, sending that array to the template and parsing it a second time is faster than bulding/formating the array and sending it in all one lump piece of data to the template.
<vb:each> is a lot faster then doing a ton of vB_Template::create() ... render() calls in a loop :)

Here is a little benchmark:

Block Disabled:      (Update License Status)  
Suspended or Unlicensed Members Cannot View Code.


Paul M 19 May 2012 20:13

Just in case you dont bother running that benchmark, here is the result on my local test environment

Time taken for 10.000 Bit Templates: 1.2209470272064
Time taken for 10.000 Array-Elements with <vb:each>: 0.010501146316528 (over 100x faster)
Success - Both methods yielded the same result data

and on my remote test server ;

Time taken for 10.000 Bit Templates: 1.3666188716888
Time taken for 10.000 Array-Elements with <vb:each>: 0.01978611946106 (over 70x faster)
Success - Both methods yielded the same result data

nhawk 19 May 2012 21:04

I've already given in to the idea of having to create the menu additions in the database and have the update for that particular mod ready to be released. And those menu selections were always under the admin's control to begin with. Now they can just move them around a little more.

The bechmark isn't exactly what I was talking about. In the case of rendering bits templates I agree it's much faster.

But I see people using it something like this...


Block Disabled:      (Update License Status)  
Suspended or Unlicensed Members Cannot View Code.

When bulding the array as a static value and displaying it as a single value is much faster..

Block Disabled:      (Update License Status)  
Suspended or Unlicensed Members Cannot View Code.


Andreas 19 May 2012 21:44

Quote:

Originally Posted by nhawk (Post 2330786)
But I see people using it something like this...


Block Disabled:      (Update License Status)  
Suspended or Unlicensed Members Cannot View Code.

Although that is a bit slower than hardcoding the HTML, this is the way it should be done as it separates the presentation from the business logic.

If the designer want's to do smth. complletely different from <ul> he can do that by simply modifying the template - with the list entries being generated in PHP he can't

kh99 19 May 2012 23:25

Quote:

Originally Posted by Andreas (Post 2330764)
<vb:each> is a lot faster then doing a ton of vB_Template::create() ... render() calls in a loop :)

I'm curious, do you know why that is? Is it the time needed to create the objects?

AusPhotography 20 May 2012 08:14

Quote:

Originally Posted by kh99 (Post 2330811)
I'm curious, do you know why that is? Is it the time needed to create the objects?

The render uses 'eval' 'nuff said

Kym

AusPhotography 20 May 2012 08:45

This is very handy... http://www.vbulletin.org/forum/showthread.php?t=283123 (Thanks Andreas)

Also Scott's post on vb.com https://www.vbulletin.com/forum/show...56#post2295256

nhawk 20 May 2012 12:22

Quote:

Originally Posted by Andreas (Post 2330789)
Although that is a bit slower than hardcoding the HTML, this is the way it should be done as it separates the presentation from the business logic.

If the designer want's to do smth. complletely different from <ul> he can do that by simply modifying the template - with the list entries being generated in PHP he can't

Even though I'm not a big fan of anything that increases processing time, I see your point. :)

And a note for any other coders that might want to add menus via DB addition rather than at installation.. Be sure you run build_language() after adding the navigation and phrase info. If you don't, your phrase won't appear in the menus.

EDIT: Another note.. The information that's the original topic of this thread gets added to the install XML when you export it. So, you just need to create the navigation links and export a new XML for the mod.


All times are GMT. The time now is 23:36.

Powered by vBulletin® Version 3.8.14
Copyright © 2020, MH Sub I, LLC dba vBulletin. All Rights Reserved. vBulletin® is a registered trademark of MH Sub I, LLC
Copyright ©2001 - , vbulletin.org. All rights reserved.