treemenu

Summary

Fetches a subtree of nodes for the purpose of menu generation.

Usage

treemenu( path, 
          node_id
          [, class_filter       ]
          [, depth_skip         ]
          [, max_level          ] 
          [, is_selected_method ] )

Parameters

NameTypeDescriptionRequired
path array An array of the path ($module_result.path). Yes.
node_id integer The node ID number (the root of the subtree). Yes.
class_filter array An array of classes that should be filtered. No.
depth_skip integer Number of levels that should be skipped. No.
max_level integer The max depth that should be explored. (2 by default) No.
is_selected_method string Sets whether "is_selected=TRUE" should be assigned to the parents of the current node as well. No.

Returns

A complex structure that can be used to build a menu (see below).

Description

This operator fetches a subtree of nodes and returns a complex structure (an array of hashes) that can be used to generate a menu.

If the optional "class_filter" parameter is omitted, all nodes will be fetched without filtering. If an empty array is passed, then only folder nodes (class ID = 1) will be fetched.

The default value of the "is_selected_method" parameter is "tree". This value determines that the current node and its parent nodes will be considered as selected (is_selected=TRUE). If this parameter is set to "node", only the current node will be considered as selected.

The following table shows the hash-structure for each element in the array that will be returned.

Key

Type

Description

id

integer

The ID of the node.

level

integer

The depth of the node.

url_alias

string

The URL alias of the node.

url

string

The system URL of the node.

text

string

The name of the node.

is_selected

boolean

TRUE if the node is currently being viewed/selected, FALSE otherwise.

Examples

Example 1 (explanatory)

Let's use a small site with the following content structure (see the screenshot) for the purpose of demonstration

The content tree

The content tree

and insert the following code into "pagelayout.tpl":

{def $mainMenu=treemenu( $module_result.path, $module_result.node_id ) }
{foreach $mainMenu as $menu}
{$menu.level} - {$menu.text}<br />
{/foreach}
{undef $mainMenu}

 

If the "Weblog" node is being viewed, then the following output will be produced:

0 - Weblog
1 - July, 29
1 - July, 14
1 - June, 25
0 - Galleries
0 - Products

 

If the "Blue flower" node is being viewed, then the following output will be produced:

0 - Weblog
0 - Galleries
1 - Misc flowers
1 - Landscape
0 - Products

 

Since the "max_level" parameter is omitted, only two levels are explored. To set the "max_level" parameter to 3, change the first line of the previous code fragment in the following way:

{def $mainMenu=treemenu( $module_result.path, $module_result.node_id, , , 3 ) }

 

This will produce the following output for the "Blue flower" node:

0 - Weblog
0 - Galleries
1 - Misc flowers
2 - Red flower
2 - Blue flower
1 - Landscape
0 - Products

 

To skip the first level, set the "depth_skip" parameter to 1 by changing the first line of the code fragment as shown below:

{def $mainMenu=treemenu( $module_result.path, $module_result.node_id, , 1, 3 ) }

 

If the "Blue flower" node is being viewed, then the following output will be produced:

0 - Misc flowers
1 - Red flower
1 - Blue flower
0 - Landscape

 

Now, let's use another code fragment in order to see which items are selected:

{def $mainMenu=treemenu( $module_result.path, $module_result.node_id, , , 3 )}
{foreach $mainMenu as $menu}
    {if $menu.is_selected}
        {$menu.level} - {$menu.text} (selected) <br />
    {else}
        {$menu.level} - {$menu.text} <br />
    {/if}
{/foreach}
{undef $mainMenu}

 

Since the "is_selected_method" parameter is omitted, the "tree" mode will be used and the following output will be produced for the "Blue flower" node:

0 - Weblog
0 - Galleries (selected)
1 - Misc flowers (selected)
2 - Red flower
2 - Blue flower (selected)
1 - Landscape
0 - Products

 

To set the "is_selected_method" parameter to "node", replace the first line of the last code fragment by the following line:

{def $mainMenu=treemenu( $module_result.path, $module_result.node_id, , , 3, 'node' )}

 

If the "Blue flower" node is being viewed, then the following output will be produced:

0 - Weblog
0 - Galleries
1 - Misc flowers
2 - Red flower
2 - Blue flower (selected)
1 - Landscape
0 - Products

 

Example 2

These examples are from pagelayout.tpl.

Make a menu of folder and info_page classes. Skip the first level and maximum go to depth 6.

<ul>
{def $mainMenu=treemenu( $module_result.path,
                                    $module_result.node_id,
                                    array('folder','info_page'), 1, 6 )}
 
{foreach $mainMenu as $menu}
    <li class="level_{$menu.level}">
 
    {if $menu.is_selected}
        <div class="selected">
        <a href={$menu.url_alias|ezurl}>{$menu.text}</a>
        </div>
    {else}
        <a href={$menu.url_alias|ezurl}>{$menu.text}</a>
    {/if}
 
    </li>
{/foreach}
</ul>

Make a menu which shows the sub menu items when clicked on the parent menu item. Notice that only the objectclass ids: 1, 9, and 17 are visible.

{def $docs=treemenu( $module_result.path, $module_result.node_id,
                                     array(1, 9, 17), 0, 4)}
{def $depth=1 $last=0}
 
{foreach $docs as $menu}
    {if and($last | ne(0), $last.level|gt($menu.level))}
        </ul>
        </li>
    {/if}
 
    <li>
 
    {if and($last | ne(0), $last.level| lt($menu.level))}
        <ul>
        <li>
    {/if}
 
    <a {$menu.is_selected|choose('','class="selected"')}
        href={$menu.url_alias|ezurl}>{$menu.text|shorten(25)}</a>
    </li>
 
    {set last=$menu}
{/foreach}
 
{while $depth |gt(1)}
    </li>
    </ul>
    {set depth=$depth|sub(1)}
{/while}
Powered by eZ Publish™ CMS Open Source Web Content Management. Copyright © 1999-2013 eZ Systems AS (except where otherwise noted). All rights reserved.