Menu manager
Un menu horizontal typique :
{* CSS classes used in this template:
.activeparent - The top level parent when a child is the active/current page
li.active0n h3 - n is the depth/level of the node. To style the active page for each level separately. The active page is not clickable.
.clearfix - Used for the unclickable h3 to use the entire width of the li, just like the anchors. See the Tools stylesheet in the default CMSMS installation.
li.sectionheader h3 - To style section header
li.separator - To style the ruler for the separator *}
{if $count > 0}
<ul>
{foreach from=$nodelist item=node}
{if $node->depth > $node->prevdepth}
{repeat string="<ul>" times=$node->depth-$node->prevdepth}
{elseif $node->depth < $node->prevdepth}
{repeat string="</li></ul>" times=$node->prevdepth-$node->depth}
</li>
{elseif $node->index > 0}</li>
{/if}
{if $node->current == true}
{* *}
<li class="currentpage">{$node->menutext}
{elseif $node->parent == true}
<li class="currentpage">
<a href="{$node->url}"
{if $node->accesskey != ''}
accesskey="{$node->accesskey}"
{/if}
{if $node->tabindex != ''}
tabindex="{$node->tabindex}"
{/if}
{if $node->titleattribute != ''}
title="{$node->titleattribute}"
{/if}
>
{$node->menutext}
</a>
{elseif $node->type == 'sectionheader'}
<li class="sectionheader">{$node->menutext}
{elseif $node->type == 'separator'}
<li class="separator" style="list-style-type: none;"> <hr />
{else}
<li><a href="{$node->url}"{if $node->accesskey != ''} accesskey="{$node->accesskey}"{/if}{if $node->tabindex != ''} tabindex="{$node->tabindex}"{/if}{if $node->titleattribute != ''} title="{$node->titleattribute}"{/if}{if $node->target != ''} target="{$node->target}"{/if}>{$node->menutext}</a>
{/if}
{/foreach}
{repeat string="</li></ul>" times=$node->depth-1}</li>
</ul>
{/if}
Un menu latéral typique :
{if $count > 0}
<ul>
{foreach from=$nodelist item=node}
{if $node->depth > $node->prevdepth}
{repeat string="<ul>" times=$node->depth-$node->prevdepth}
{elseif $node->depth < $node->prevdepth}
{repeat string="</li></ul>" times=$node->prevdepth-$node->depth}
</li>
{elseif $node->index > 0}</li>
{/if}
{if $node->current == true}
{* *}
<li>{$node->menutext}
{elseif $node->parent == true}
<li>
<a href="{$node->url}"
{if $node->accesskey != ''}
accesskey="{$node->accesskey}"
{/if}
{if $node->tabindex != ''}
tabindex="{$node->tabindex}"
{/if}
{if $node->titleattribute != ''}
title="{$node->titleattribute}"
{/if}
>
{$node->menutext}
</a>
{elseif $node->type == 'sectionheader'}
<li >{$node->menutext}
{elseif $node->type == 'separator'}
<li class="separator" style="list-style-type: none;"> <hr />
{else}
<li><a href="{$node->url}"{if $node->accesskey != ''} accesskey="{$node->accesskey}"{/if}{if $node->tabindex != ''} tabindex="{$node->tabindex}"{/if}{if $node->titleattribute != ''} title="{$node->titleattribute}"{/if}{if $node->target != ''} target="{$node->target}"{/if}>{$node->menutext}</a>
{/if}
{/foreach}
{repeat string="</li></ul>" times=$node->depth-1}</li>
</ul>
{/if}
Deux menus dépendants l'un de l'autre
A mettre dans le template (menu principal)
{hierarchy}
{cms_module module='menumanager' start_element=$h_this template='menu-lateral' collapse='0'}
{hierarchy}
{menu template="menu-lateral" start_level=$h_this number_of_levels="1"}
Template de mon menu secondaire
{if $count > 0}
<ul>
{foreach from=$nodelist item=node}
{if $node->depth > $node->prevdepth}
{repeat string="<ul>" times=$node->depth-$node->prevdepth}
{elseif $node->depth < $node->prevdepth}
{repeat string="</li></ul>" times=$node->prevdepth-$node->depth}
</li>
{elseif $node->index > 0}</li>
{/if}
{if $node->current == true}
{* *}
<li>{$node->menutext}
{elseif $node->parent == true}
<li>
<a href="{$node->url}"
{if $node->accesskey != ''}
accesskey="{$node->accesskey}"
{/if}
{if $node->tabindex != ''}
tabindex="{$node->tabindex}"
{/if}
{if $node->titleattribute != ''}
title="{$node->titleattribute}"
{/if}
>
{$node->menutext}
</a>
{elseif $node->type == 'sectionheader'}
<li >{$node->menutext}
{elseif $node->type == 'separator'}
<li class="separator" style="list-style-type: none;"> <hr />
{else}
<li><a href="{$node->url}"{if $node->accesskey != ''} accesskey="{$node->accesskey}"{/if}{if $node->tabindex != ''} tabindex="{$node->tabindex}"{/if}{if $node->titleattribute != ''} title="{$node->titleattribute}"{/if}{if $node->target != ''} target="{$node->target}"{/if}>{$node->menutext}</a>
{/if}
{/foreach}
{repeat string="</li></ul>" times=$node->depth-1}</li>
</ul>
{/if}
Le tag "hierarchy" (user defined tag)
global $gCms;
$pos = $gCms->variables['position'];
$base = explode('.', $pos);
$totalDepth = count($base);
$parentDepth = $totalDepth;
$count = 0;
foreach($base as $parentLevel) {
$parentLevel = ltrim($parentLevel, "0" );
if($count <= $parentDepth) {
$thisLevel .= $parentLevel . ".";
}
if($count < $parentDepth) {
$theParent .= $parentLevel . ".";
}
$count++;
}
$smarty->assign('h_toplevel', $base[0] * 1);
$smarty->assign('h_parent', rtrim($theParent, "." ));
$smarty->assign('h_this', rtrim($thisLevel, "." ));
Le menu du magasin de jouets (footer)
{if $count > 0}
<ul>
{foreach from=$nodelist item=node}
{if $node->depth > $node->prevdepth}
{repeat string="<ul>" times=$node->depth-$node->prevdepth}
{elseif $node->depth < $node->prevdepth}
{repeat string="</li>
<li><div class="blank">|</div></li>
</ul>" times=$node->prevdepth-$node->depth}
</li>
<li><div class="blank">|</div></li>
{elseif $node->index > 0}</li>
<li><div class="blank">|</div></li>
{/if}
{if $node->current == true}
<li><a href="{$node->url}" class="active"
{if $node->target ne ""} target="{$node->target}"
{/if}>
{$node->menutext} </a>
{elseif $node->parent == true && $node->depth == 1 and $node->type != 'sectionheader' and $node->type != 'separator'}
<li class="activeparent"> <a href="{$node->url}" class="activeparent"
{if $node->target ne ""} target="{$node->target}"
{/if}> {$node->menutext} </a>
{elseif $node->type == 'sectionheader'}
<li class="sectionheader">{$node->menutext}
{elseif $node->type == 'separator'}
<li style="list-style-type: none;"> <hr class="separator" />
{else}
<li><a href="{$node->url}"{if $node->target ne ""} target="{$node->target}"{/if}> {$node->menutext} </a>
{/if}
{/foreach}
{repeat string="</li>
<li><div class="blank">|</div></li>
</ul>" times=$node->depth-1}</li>
</ul>
{/if}
Dernier item du menu sans séparateur

Dans le menu ci-dessus, la barre verticale utilisée comme séparateur ( | ) apparaît après chaque lien sauf le dernier.
{if $node->index != ($count-1)} {* dernier *}
|
{/if}
Il suffit de comparer l'index du lien (0, 1, 2) avec le nombre total de liens (3).
Le template de menu du menumanager
{if $count > 0}
{foreach from=$nodelist item=node}
{if $node->current == true}
{$node->menutext}</a>
{if $node->index != ($count-1)} {* dernier *}
|
{/if}
{elseif $node->parent == true}
<a href="{$node->url}"
{if $node->accesskey != ''}
accesskey="{$node->accesskey}"
{/if}
{if $node->tabindex != ''}
tabindex="{$node->tabindex}"
{/if}
{if $node->titleattribute != ''}
title="{$node->titleattribute}"
{/if}
>
{$node->menutext}</a>
{else}
<a href="{$node->url}"
{if $node->accesskey != ''} accesskey="{$node->accesskey}"{/if}
{if $node->tabindex != ''} tabindex="{$node->tabindex}"{/if}
{if $node->titleattribute != ''} title="{$node->titleattribute}"{/if}
{if $node->target != ''} target="{$node->target}"{/if}>
{$node->menutext}</a>
{if $node->index != ($count-1)}
|
{/if}
{/if}
{/foreach}
{/if}
... et son appel dans le template
{cms_module module='menumanager' start_element='1.2' template='menu_navigation'}
Extrait de la CSS
D'habitude on souhaite que la page courante se différencie des autres éléments du menu, mais pas cette fois.
Page précédente : Aide-mémoire de TAGS de CMSMS
Page suivante : UDT : titrage intelligent d'une page