Snippet: Template logic to display dynamic tertiary menu
Created by Graham Brookins | Brookins Consulting
About
Initial posting of this example ....
This was created for a client who wanted a menu system that was 3 levels deep, server-side collapsable, current menu/document selected style. All I will say is that it works, fairly well. There are some static exceptions with variables you can change or remove the exceptions entirely.
I will post a cleaned up version of the source code with beter comments and less commented out code.
Template
{* ##################################################################################### *}
{* Level 1 : Top Level Node : Submenu List
{* ##################################################################################### *}
{* Exclude specials_node_id , static exception *}
{set specials_node_id=118}
{let submenu=fetch( content, list, hash( parent_node_id, $module_result.node_id, sort_by,array(array(priority, false() )) ) )
parent=fetch('content','node', hash('node_id', $module_result.node_id) )
}
{* ##################################################################################### *}
{* ##################################################################################### *}
{* Level 3+ : Reverse Submenu List (Which we are not using now)
{* ##################################################################################### *}
{* These are good rules for reverse *}
{*
{section show=and($DesignKeys:used.parent_node|ne(2), $submenu|count|lt(1))}
{set submenu=fetch( content, list, hash( parent_node_id, $DesignKeys:used.parent_node, sort_by,array(array(priority, false() )
) ))
parent=fetch('content', 'node', hash('node_id', $module_result.content_info.parent_node_id) )
}
{/section}
*}
{* END: These are good rules for reverse *}
{* ##################################################################################### *}
{* ##################################################################################### *}
{* Level 3+ : Toplevel Attached Reverse Submenu List (works)
{* ##################################################################################### *}
{section show=and($DesignKeys:used.parent_node|ne(2), $module_result.content_info.node_depth|gt(2) )}
{*
Depth: {$module_result.content_info.node_depth}<br />
Key: {$DesignKeys:used.parent_node}
*}
{* must test each parent per depth or use other to only get top level parents | parent, is not enough, part of prob, *}
{set parent=fetch('content', 'node', hash('node_id', $module_result.content_info.parent_node_id)) }
{* same as parent, need testing to only get top level:
{set submenu=fetch( content, list, hash( parent_node_id, $DesignKeys:used.parent_node )) }
*}
{set submenu=fetch( content, list, hash( parent_node_id, $DesignKeys:used.parent_node, sort_by,array(array(priority, false() )
) )) }
{* ##################################################################################### *}
{* test: if depth is gt(3), then, use depth as a manipulated placer into longer qry *}
{section show=$module_result.content_info.node_depth|gt(3)}
{set current_top_level_node_id=$module_result.path.1.node_id}
{*
<br />Depth gt(3), flag set
{set submenu=fetch( content, list, hash( node_id, $current_top_level_node_id )) }
{set parent=fetch( content, node, hash('node_id', $current_top_level_node_id )) }
*}
{set parent=fetch(content, node, hash( node_id, $current_top_level_node_id ))}
{set submenu=fetch( content, list, hash( parent_node_id, $current_top_level_node_id, sort_by,array(array(priority, false()
)) ))}
{/section}
{/section}
{*
<br /><br />
{$module_result.path.1.node_id}
{$module_result.path|attribute(show,3)}
{$parent|attribute(show,3)}
*}
{*
{$module_result.content_info|attribute(show,3)}
<br />
{$DesignKeys:used|attribute(show,3)}
*}
{*
{$DesignKeys:used|attribute(show,2)}
{$DesignKeys:used|attribute(show,3)}
*}
{* ##################################################################################### *}
{* Level 1 - 2 : Submenu List
{* ##################################################################################### *}
{* Don't Show Submenu if on root page *}
{section show=$module_result.node_id|ne(2)}
{* Don't show menu if there are no submenu items *}
{section show=$submenu|count|gt(0)}
<div id="sectheader" style="margin-top: 8px;"><span class="headerw">{$parent.name}</span></div>
{section var=menu loop=$submenu}
{* Exclude: Company: Specials Folder *}
{section-exclude match=$menu.node_id|eq($specials_node_id)}
{*
{set children=fetch( content, list, hash( parent_node_id, $menu.node_id, sort_by,array(array(priority, false() )) ))}
{section show=$children|count|lt(1)}
*}
{switch name=selected match=$menu.node_id}
{case match=$module_result.node_id}
<div class="sectmain-match">
{/case}
{case}
<div class="sectmain">
{/case}
{/switch}
{switch name=selected match=$menu.node_id}
{case match=$module_result.node_id}
<a href={$menu.url_alias|ezroot} class="mainb-match">{$menu.name|shorten( 25 )}</a>
{/case}
{case}
<a href={$menu.url_alias|ezroot} class="mainb">{$menu.name|shorten( 25 )}</a>
{/case}
{/switch}
</div>
{* ##################################################################################### *}
{* 3rd Level : tertiary (separate) menus
{* ##################################################################################### *}
{* Don't Show Tertiary if on root page *}
{* Exclude: Company: Specials Folder *}
{section-exclude match=$menu.node_id|eq($specials_node_id)}
{set parent=fetch(content, node, hash( node_id, $menu.node_id ))}
{set tertiary=fetch( content, list, hash( parent_node_id, $menu.node_id, sort_by,array(array(priority, false() )) ))}
{* Tertiary Menu *}
{* Don't show menu if there are no tertiary items *}
{section show=$tertiary|count|gt(0)}
{section var=tmenu loop=$tertiary}
{section show=or($menu.node_id|eq($module_result.node_id), $tmenu.node_id|eq($module_result.node_id), and($tmenu.parent_node
_id|eq($menu.node_id), $tmenu.parent_node_id|eq($DesignKeys:used.parent_node)) )}
{* Exclude: Company: Specials Folder *}
{section-exclude match=$tmenu.node_id|eq($specials_node_id)}
{switch name=selected match=$tmenu.node_id}
{case match=$module_result.node_id}<div class="sectmain-child-match">{/case} {case}<div class="sectmain-child">{/case}
{/switch}
<a href={$tmenu.url_alias|ezroot} class="mainb-child" style="padding-left: 10px;">{$tmenu.name|shorten( 25 )}</a></div>
{/section}
{* End of sub-folder loop. *}
{/section}
{* End of dont' show menu if no menus exist *}
{* /section *}
{* End of sub-folder loop. *}
{* /section *}
{* End of dont' show menu on root page *}
{/section}
{* ##################################################################################### *}
{/section}
{* End of sub-folder loop. *}
{/section}
{* End of dont' show menu if no menus exist *}
{/section}
{* End of dont' show menu on root page *}
{/section}
{/let}
{* ///////////////////////////////////////////////////////////////////// *} 