Only show submenu when parent page is active?
Posted: Tue Dec 28, 2010 8:35 pm
I'm trying to figure out how to make an only subpages menu when the parent page is active... Can anybody guide me in the right direction... Tutorial etc...
Content management as it is meant to be
https://forum.cmsmadesimple.org/
That is exactly what I am looking for...gdur wrote: Hi Jmansma,
Have a look at the submenu at the left site of the page at www.duran-audio.com.
Is this what you are looking for?
Code: Select all
{get_page_depth assign="depth"}
{get_parent_page_alias assign="parent" page=$title}
{get_page_menutext assign="parent_menutext" page=$parent}
{assign var="level" value=$depth}
{if $count > 0}
{foreach from=$nodelist item=node}
{if $node->current == true && $node->depth == 2 && $node->haschildren == false}
{assign var="level" value=0}
{/if}
{/foreach}
{/if}
{if $level ==2}
<ul class="menu_vert">
<li><a href="?page={$parent}">{$parent_menutext}</a></li>
{/if}
{if $depth == 2}
{assign var="depth" value="-2"}
{assign var="depthcheck" value="0"}
{if $count > 0}
{foreach from=$nodelist item=node}
{if $node->index == 0}
{elseif $node->haschildren == false }
{/if}
{if $depthcheck == 1 && $node->depth != $node->prevdepth}
{assign var="depth" value=$node->depth}
{assign var="depthcheck" value="0"}
{assign var="listopened" value="1"}
{/if}
{if $node->depth == $depth}
<li>
<a href="{$node->url}"{if $node->target ne ""} target="{$node->target}"{/if}>{$node->menutext}</a><br />
</li>
{/if}
{if $node->current == true && $node->haschildren == true}
<li>
{* This is the current page of level 2, strong no link *}
<a {*href="{$node->url}"*}{if $node->target ne ""} target="{$node->target}"{/if}><strong>{$node->menutext}</strong></a><br /></li>
{assign var="depthcheck" value="1"}
{/if}
{/foreach}
{if $listopened == 1}
</ul>
{/if}
{/if}
{/if}
{if $level > 2}
{assign var="startshowing" value="0"}
{assign var="stopshowing" value="0"}
{if $count > 0}
{foreach from=$nodelist item=node}
{if $startshowing == 1 }
<ul class="menu_vert">
<li>
{* this is the parent page, first in the list, of level 3*}
<a href="{$node->url}"{if $node->target ne ""} target="{$node->target}"{/if}>{$node->menutext}</a><br />
</li>
{assign var="startshowing" value=$startshowing+1}
{/if}
{if $node->parent == true}
{assign var="passed" value="true"}
{assign var="nodedept" value=$node->depth+1}
{assign var="startshowing" value=$startshowing+1}
{elseif $node->depth == $nodedept && $passed == true}
{if $node->current == true}
<li>
{* This is the current page, displayed bold, of level 3*}
<a{if $node->target ne ""} target="{$node->target}"{/if}><strong>{$node->menutext}</strong> </a><br />
</li>
{else}
<li>
{* These are the level 3 pages *}
<a href="{$node->url}"{if $node->target ne ""} target="{$node->target}"{/if}>{$node->menutext}</a><br />
</li>
{/if}
{assign var="stopshowing" value="0"}
{/if}
{/foreach}
</ul>
{/if}
{/if}
{if $level < 2}
{assign var="firstsub" value="1"}
{assign var="depth" value="-2"}
{assign var="depthcheck" value="0"}
{assign var="listopened" value="0"}
{if $count > 0}
{foreach from=$nodelist item=node}
{if $node->index == 0}
{assign var="icon" value="house"}
{elseif $node->haschildren == true }
{assign var="icon" value="folder"}
{elseif $node->haschildren == false }
{assign var="icon" value="page"}
{/if}
{if $depthcheck == 1 && $node->depth != $node->prevdepth}
<ul class="menu_vert">
{assign var="depth" value=$node->depth}
{assign var="depthcheck" value="0"}
{assign var="listopened" value="1"}
{/if}
{if $node->depth == $depth && $firstsub == 1}
<li style="list-style-image: url('images/icons/{$icon}.png') ">
{* These are the level 1 pages *}
<a href="{$node->url}"{if $node->target ne ""} target="{$node->target}"{/if}>{$node->menutext}</a><br />
{$node->titleattribute}</li>
{elseif $listopened == 1}
{assign var="firstsub" value="0"}
{/if}
{if $node->current == true && $node->haschildren == true}
{assign var="depthcheck" value="1"}
{/if}
{/foreach}
{if $listopened == 1}
</ul>
{/if}
{/if}
{/if}
{if $level == 0}
{assign var="firstsub" value="1"}
{assign var="depth" value="-2"}
{assign var="depthcheck" value="0"}
{assign var="listopened" value="0"}
{if $count > 0}
{foreach from=$nodelist item=node}
{if $node->index == 0}
{assign var="icon" value="house"}
{elseif $node->haschildren == true }
{assign var="icon" value="folder"}
{elseif $node->haschildren == false }
{assign var="icon" value="page"}
{/if}
{if $depthcheck == 1 && $node->depth != $node->prevdepth}
<ul class="menu_vert">
{assign var="depth" value=$node->depth}
{assign var="depthcheck" value="0"}
{assign var="listopened" value="1"}
{/if}
{if $node->depth == $depth && $firstsub == 1}
{if $node->current == true}
<li>
<a href="{$node->url}"{if $node->target ne ""} target="{$node->target}"{/if}><strong>{$node->menutext}</strong> </a><br />
</li>
{else}
<li>
<a href="{$node->url}"{if $node->target ne ""} target="{$node->target}"{/if}>{$node->menutext}</a><br />
</li>
{/if}
{elseif $listopened == 1}
{assign var="firstsub" value="0"}
{/if}
{if $node->parent == true && $node->haschildren == true}
{assign var="depthcheck" value="1"}
{/if}
{/foreach}
{if $listopened == 1}
</ul>
{/if}
{/if}
{/if}
I get this error when trying to use the solution?gdur wrote: The code isn't clean at all but it works and I'm a kind of lazy...
Use Menu Manager to add a new template and just call it in your page template where you want the submenu to appear.
Code: Select all
global $gCms;
global $smarty;
$manager =& $gCms->GetHierarchyManager();
if( isset($params['assign']) && $params['assign'] != '' )
{
$var = $params['assign'];
}
$thisPage = $gCms->variables['content_id'];
$currentNode = &$manager->sureGetNodeById($thisPage);
$result = $currentNode->getLevel() + 1;
if( isset($params['assign']) && $params['assign'] != '' )
{
$var = $params['assign'];
$smarty->assign($var,$result);
}
else
{
return $result;
}
Code: Select all
global $gCms;
$contentops =& $gCms->GetContentOperations();
$smarty =& $gCms->GetSmarty();
if( isset($params['page']) )
{
$alias = $params['page'];
}
else
{
$alias = $smarty->get_template_vars('page_alias');
}
$content =& $contentops->LoadContentFromAlias($alias);
if( !is_object($content) ) return '';
$text = $content->MenuText();
if( isset($params['assign']) )
{
$smarty->assign($params['assign'],$text);
}
else
{
return $text;
}
Code: Select all
global $gCms;
$contentops =& $gCms->GetContentOperations();
$smarty =& $gCms->GetSmarty();
if( isset($params['page']) )
{
$alias = $params['page'];
}
else
{
$alias = $smarty->get_template_vars('page_alias');
}
$content =& $contentops->LoadContentFromAlias($alias);
if( !is_object($content) ) return '';
$parentid = $content->ParentId();
if( $parentid != 0 )
{
$alias = $contentops->GetPageAliasFromId($parentid);
}
else
{
$alias = '';
}
if( isset($params['assign']) )
{
$smarty->assign($params['assign'],$alias);
}
else
{
return $alias;
}
Well, actually... I have the menu within the html like this...gdur wrote: It appears that you don't call a menu at all in your template but you are calling a javascript instead. The little bit what looks like a menu is commented out in the source code.
Code: Select all
<div id="back_front">
<div id="rightmenu">{menu template="submenu"}</div>
<div style="padding-right:0px;width:560px; z-index:-5;padding-top:260px;text-align:right;">
<div id="erhverv" OnClick="javascript:window.open('index.php?page=erhverv','_self')">Erhverv</div>
<div id="bolig" OnClick="javascript:window.open('index.php?page=bolig','_self')">Bolig</div>
<div id="interier" OnClick="javascript:window.open('index.php?page=interior','_self')">{global_content name='cm_interier'}</div>
<div id="andet" OnClick="javascript:window.open('index.php?page=andet','_self')">Andet</div>
</div>
</div>