ibexa

Caution: This documentation is for eZ Publish legacy, from version 3.x to 5.x.

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 ] 
          [, indentation_level ]
          [, language ] )

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.
indentation_level integer The size of increment to use when calculating the indentation of the menu entries (15 by default). No.
language string/array The language(s) to use when fetching the nodes. Use either a string, e.g. 'nor-NO', or an array of strings, e.g. array( 'nor-NO', 'eng-GB' ). 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. Please note that the "node_id" parameter is no longer used and its value is ignored by the system (starting from version 3.8.4). This required parameter will become optional in 3.8.5 and deprecated in 3.9. The root of the subtree is now determined by the "path" parameter. If the provided path array points to a node, then a subtree of this node will be fetched. (Use "$module_result.path" to pass the path which leads to the page that is currently being viewed.) If the "path" parameter does not point to a node in the content tree, then a subtree of the "Content" top level node will be fetched.

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 optional "language" parameter makes it possible to specify which languages to use when fetching the nodes. The languages will be prioritized according to the array (this overrides the language settings of the siteaccess).

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.

If the "path" parameter points to a node in the content tree, then the following additional keys will be included in the hash structure:

Key

Type

Description

data_map

array

The attributes (as ezcontentobjectattribute objects) of the actual content object encapsulated by the node.

class_name

string

The name of the class which the object encapsulated by the node is an instance of, for example "Folder".

is_main_node

boolean

TRUE if the node is a main node, FALSE otherwise.

has_children

boolean

TRUE if the node has children, FALSE otherwise.

indent

integer

The indentation of the menu entries. This value is calculated according to the depth of the node using "indentation_level" as increment. A menu item of the level N will have indent=(N-1)*indentation_level.

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}

Balazs Halasy (05/02/2004 10:51 am)

Svitlana Shatokhina (16/10/2006 2:51 pm)


Comments

  • node_id is no longer used

    ... starting from
    3.6.11 (stable/3.6 rev. 16638),
    3.7.9 (stable/3.7 rev. 16637),
    3.8.4 (stable/3.8 rev. 16636),
    3.9.0alpha1 (trunk rev. 16635).

    This parameter has become optional in 3.6.12 (rev.17122), 3.7.10 (rev.17121), 3.8.5 (rev.17120) and deprecated in 3.9.0alpha1 (rev.17119).
  • Bug in example

    Last example has a little bug when you select the last entry in a structure that has more than two levels of depth. The right code is:

    {def $depth=1 $last=0 $lastlevel=0}
            <ol>
    {foreach $mainMenu as $menu}
        {set lastlevel=$last.level}
        {while and($lastlevel|ne(0), $lastlevel|gt($menu.level))}
            </ol>
                    </li>
             {set lastlevel=$lastlevel|sub(1)}
        {/if}
     
                    <li>
     
        {if and($last | ne(0), $last.level|lt($menu.level))}
            <ol>
                    <li{$menu.is_selected|choose('',' class="selected"')}>
        {/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>
            </ol>
        {set depth=$depth|sub(1)}
    {/while}
     
            </ol>
    


    Enjoy :-)

    g
    • Re: Bug in example

      Hello,

      I think you make a little mistake in your correction : it's not while but if
      {foreach $mainMenu as $menu}
          {set lastlevel=$last.level}
          {if and($lastlevel|ne(0), $lastlevel|gt($menu.level))}
      


  • The real HTML-Thing is:

    {def $mainMenu=treemenu( $module_result.path,
    $module_result.node_id,
    array('folder','info_page'), 1, 6 )}

    {def $depth=1 $last=0}

    <ul>
    {foreach $mainMenu as $menu}
    {def $level = sum($menu.level,1)}
    {def $class = concat('SubNaviL', $level)}
    {def $classActive = concat('SubNaviL', $level , 'Active')}

    {if and($last | ne(0), $last.level|gt($menu.level))}
    </li>
    </ul>
    {/if}

    {if and($last | ne(0), $last.level| lt($menu.level))}
    <ul>


    {/if}

    {if $menu.is_selected}
    <li class="{$classActive}">
    {else}
    <li class="{$class}">
    {/if}

    <a href={$menu.url_alias|ezurl}>{$menu.text}</a>

    {set $last=$menu}
    {/foreach}

    {while $depth |gt(1)}
    </ul>
    </li>
    {set depth=$depth|sub(1)}
    {/while}
    </ul>