Location: PHPKode > scripts > phpTierMenu > phptiermenu/_class.menu.php
<?
	/*
	   This is my multi-tier menu system. The menu itself is printed into
	   a one-celled table. There are no collapse or expand functions, but
	   you have a high level of control for the rest of the looks. This has
	   great potential since I designed it in such a way to make it very
	   easy to use loops to set the data (especially if you store it in a
	   database like I do).

	   There is no limit to the number of tiers for this menu system, but
	   there are drawbacks also. For instance, if you specify your width
	   say as 150 pixels, and you use indent spacing, you'll have problems
	   with text wrapping or images cutting off. Text wrapping wouldn't be
	   so bad if it also justified itself after the line break.

	   One thing to note is the way the indents and spacing is done. I use
	   an image (1x1 pixel, transparent gif "images/spacer.gif") for all
	   the spacing, so you may want to either create that image, or find it
	   in the code below (lines 114, 160) to change it to your preference.

	   This is a great startting point for a more advanced menuing system.
	   What I have here serves my needs for now, so I don't think I'll be
	   doing a lot of work on it until it's needed. However, feel free to
	   make improvements and fix fea^H^H^H bugs. If you do, please send
	   me a copy!

	   Examples on use at the bottom of the file.

	   Last Modified by Justin Koivisto (hide@address.com) 3/21/01 6:42PM
	*/

$MENU_CLASS_INC=TRUE;

class menu_item_class{
	var $text;	// text of this item
	var $url;	// link - unquoted for ability to add target info
	var $font_size;	// the size that the text will appear as (if any)
	var $font_face;	// the face that the text will appear as (if any)
	var $font_color;	// the color that the text will appear as (if any)
			// NOTE: for the color, you can either use the names
			// (like 'blue') or the hexadecimal value beginning
			// with a pound sign (#)
	var $image;	// file to use as an image link (if any)
	var $image_height;	// the height in pixels of above
	var $image_width;	// the width in pixels of above
	var $items;	// array of children objects (indexed by child text)
	var $num_items;	// the number of sub-items for this one

	// Constructor
	function menu_item_class($text,$url=''){
		$this->text=$text;
		$this->url=$url;
		$this->num_items=0;
	}

	// functions to set values
	function setFontFace($value){$this->font_face=$value;}
	function setFontSize($value){$this->font_size=$value;}
	function setFontColor($value){$this->font_color=$value;}
	function setImage($value){$this->image=$value;}
	function setImageSize($width,$height){
		$this->image_width=$width;
		$this->image_height=$height;
	}

	// adding children to menu items
	function addSub($name,$url=''){
		$this->items[$name]=new menu_item_class($name,$url);
		$this->num_items++;
	}
}

class menu_class{
	var $width;		// the width of the table
	var $spacer;		// the height between items in pixels
	var $indent;		// the width in pixels of sub-item's indent
	var $bgcolor;		// the background color of the row (if any)
	var $background;	// the background image of the row (if any)
	var $padding;		// the cellpadding of the table
	var $border;		// the width of the border around the table
	var $align;		// the horizontal alignment of the cell
	var $valign;		// the vertical alignment of the cell
	var $items;		// the children of the menu (indexed by name)

	// Constructor
	function menu_class($name,$width){
		$this->width=$width;
		$this->padding=0;
		$this->border=0;
		$this->num_items=0;
	}

	// function to set table values
	function setSpacer($value){$this->spacer=$value;}
	function setIndent($value){$this->indent=$value;}
	function setColor($value){$this->bgcolor=$value;}
	function setBorder($value){$this->border=$value;}
	function setBackImage($value){$this->background=$value;}
	function setPadding($value){$this->padding=$value;}
	function setAlignment($horiz,$vert){$this->align=$horiz;$this->valign=$vert;}

	// how to add menu heading items
	function addItem($text,$url=''){
		$this->items[$text]=new menu_item_class($text,$url);
		$this->num_items++;
	}

	// print an item menu
	function printItem(&$tmp,$tier){
		$output='';

		// we need to check if we need an indent
		if($tier>0){
			$output.="<img src=images/spacer.gif width=";
			$indent=$tier*$this->indent;
			$output.="$indent height=1 align=left>";
		}
		$tier++;

		// now we need to add the link stuff
		if($tmp->url)
			$output.="<a href=$tmp->url>";

		// take care of the font stuff if set (otherwise we'll just
		// print an empty font tag - no big deal
		$output.="<font";
		if($tmp->font_face)
			$output.=" face=$tmp->font_face";
		if($tmp->font_size)
			$output.=" size=$tmp->font_size";
		if($tmp->font_color)
			$output.=" color=$tmp->font_color";
		$output.=">";

		// if we are using images, show it
		if($tmp->image){
			$output.="<img src=$tmp->image";
			if($tmp->image_width)
				$output.=" width=$tmp->image_width";
			if($tmp->image_height)
				$output.=" height=$tmp->image_height";
			$output.=" border=0 alt=\"$tmp->text\">";
		}else{
			// if not images, we need the text output then
			$output.=$tmp->text;
		}

		// close font tag
		$output.="</font>";

		// don't forget to close the anchor tag
		if($tmp->url)
			$output.="</a>";

		// add line break after each item
		$output.="<br>";

		// give the spacer a chance
		if($this->spacer)
			$output.="\n        <img src=images/spacer.gif width=1 height=$this->spacer><br>";

		// How about this item's children?
		if($tmp->num_items>0){
			foreach($tmp->items as $submenu){
				$output.=$this->printItem($submenu,$tier);
			}
		}

		return $output;
	}

	// print menu. returns HTML code from function rather than
	// printing directly to output
	function printMenu(){
		$output="\n\n<!-- BEGIN: $this->text -->\n";
		$output.=" <table width=$this->width cellspacing=0 cellpadding"
			."=$this->padding border=$this->border>\n  <tr";
		if($this->background)
			$output.=" background=$this->background";
		if($this->bgcolor)
			$output.=" bgcolor=$this->bgcolor";
		$output.=">\n   <td";
		if($this->align)
			$output.=" align=$this->align";
		if($this->valign)
			$output.=" valign=$this->valign";
		$output.=">";

		// now we need to print the menu items
		foreach($this->items as $item)
			$output.=$this->printItem($item,0);

		$output.="\n   </td>\n  </tr>\n </table>\n<!-- END: "
			."$this->text -->\n\n";
		return $output;
	}
}



// -------------------------------- EXAMPLES ---------------------------------

// start by defining the menu's looks and name
$menu=new menu_class('Menu Title',175);
$menu->setPadding(4);
$menu->setIndent(15);
$menu->setBorder(2);
$menu->setSpacer(7);
$menu->setColor("#dfdfdf");
$menu->setAlignment('left','top');

// now we will add in the menu items
$menu->addItem('Heading 1','1.htm'); // tier 1
$menu->items['Heading 1']->setFontSize(1);
$menu->items['Heading 1']->setFontFace("arial");
$menu->items['Heading 1']->setFontColor("#000000");
$menu->items['Heading 1']->addSub('Sub-heading','images/');
$menu->items['Heading 1']->addSub('Sub-heading0','images/');

$menu->addItem('Heading 2','2.htm'); // tier 1
$menu->items['Heading 2']->setImage("images/test.gif");
$menu->items['Heading 2']->setImageSize(125,20);

$menu->addItem('Heading 3','3.htm'); // tier 1
$menu->items['Heading 3']->addSub('1','images/');
$menu->items['Heading 3']->items['1']->setFontSize(1);
$menu->items['Heading 3']->items['1']->addSub('2','url');
$menu->items['Heading 3']->items['1']->items['2']->setFontSize(1);
$menu->items['Heading 3']->items['1']->items['2']->addSub('3','url');
$menu->items['Heading 3']->items['1']->items['2']->items['3']->addSub('4','url');
$menu->items['Heading 3']->items['1']->items['2']->items['3']->items['4']->addSub('5','url');
$menu->items['Heading 3']->items['1']->items['2']->items['3']->items['4']->items['5']->addSub('6','url');
$menu->items['Heading 3']->items['1']->items['2']->items['3']->items['4']->items['5']->items['6']->addSub('7','url');

$menu->addItem('Heading 4','4.htm'); // tier 1

echo $menu->printMenu();

?>
Return current item: phpTierMenu