Location: PHPKode > scripts > xPandMenu > xpandmenu/xPandMenu.php
<?php

/*********************************
* xpandMenu class
**********************************
*
* Given a set of parent and child
* nodes, this class generates an
* organised menu with expand/collapse
* function.
* The menu is enterely rendered using
* DIVs, hence it can be fully
* personnalised using CSS rules.
* The expand/collapse function is
* done by javascript the class
* also generates.
*
**********************************
* How to use the class
**********************************
*
* Include the class file
* include('xPandMenu.php');
*
* Create a new object
* $myMenu = new xPandMenu();
*
*	Optionnaly, set an image that will be
* used as the parent node expand/collapse
* box (you may also set the left and right
* margin to position the image)
* $myMenu->setXCbox(array("c"=>"absolutePathToClosedBoxImage","o"=>"absolutePathToOpenBoxImage"),array("l"=>imageLeftMargin,"r"=>imageRightMargin));
*
* Add parents and children
* $myMenu->addParent($name[,$link]);
* $myMenu->addChild($name[,$link]);
*
* When entering a child node, it is
* added into the last parent added and
* follows the last child added.
* When entering a new parent, the previous
* parent is closed.
* Just remember to enter your items in
* the order you would like to see them.
*
**********************************
*
* Patrick Brosset 2004
* hide@address.com
*
**********************************
*/
class xpandMenu {


	/* VARIABLES */
	
	// Array containing all the parent nodes in order
	var $parents = array();
	// Array containing, in each cell, an array of children
	var $children = array();
	// Index of the current parent, used to store the children at the right index in the $children Array
	var $countParent;
	// Index of the current child, used to number xChild objects
	var $currentChildID;
	// String containing the generated javscript for expanding/collapsing the menus (and optionnaly, swapping the box images)
	var $javaScript;
	// String containing the absolute path to the box image (for parent nodes) in its closed state
	var $boxC;
	// String containing the absolute path to the box image (for parent nodes) in its opened state
	var $boxO;
	// Int containing the number of pixels to used as left margin of the box image
	var $boxImgMarginL;
	// Int containing the number of pixels to used as right margin of the box image
	var $boxImgMarginR;

	
	/* CONSTRUCTOR */
	
	function xpandMenu(){
	
		$this->countParent = 0;
		$this->currentChildID = 0;
	
	}//xpandMenu constructor


	/* EXTERNAL FUNCTIONS */
	
	// setXCbox : The use of this function is optional, it allows the use of an image for the parent nodes x/c box
	function setXCbox($imgs = array(),$margin = array()){
		
		if(isset($imgs['c']) && isset($imgs['o'])){
			$this->boxC = $imgs['c'];
			$this->boxO = $imgs['o'];
		}
		if(isset($margin['l']) && isset($margin['r'])){
			$this->boxImgMarginL = $margin['l'];
			$this->boxImgMarginR = $margin['r'];
		}
		
	}//setXCbox
	
	
	// addParent : Appends a new parent in the menu list
	function addParent($title,$link = false){
		
		$this->countParent ++;
		$newParent = new xParent($title,$link);
		$this->parents[$this->countParent] = $newParent;
		
	}//addParent


	// addChild : Appends a new child in the menu list and under the last parent added
	function addChild($title,$link = false){
		
		$this->currentChildID ++;
		$newChild = new xChild($this->currentChildID,$title,$link);
		$this->children[$this->countParent][] = $newChild;
		
	}//addChild
	
	
	// generateMenu : Lists the parents and children and generates both html and javascript code
	// The code is ready to be use in the webpage to display the menu
	function generateMenu(){
		
		foreach($this->parents as $index=>$parent){
			
			if(!empty($parent)){
				
				//Opening the parent DIV
				$str .= "<div id=\"parentX\" onClick=\"xMenu".$index."();\">";
				
				//Adding the XC images if it is set
				if(isset($this->boxC) && isset($this->boxO)){
					$str .= "<img src=\"".$this->boxC."\" border=\"0\" id=\"xcBox".$index."\" style=\"margin-right:".$this->boxImgMarginR."px;margin-left:".$this->boxImgMarginL."px;\">";
				}
				
				//This parent may have a link on itself to display
				if(empty($parent->link)){
					$str .= $parent->title."</div>\n";
				}else{
					$str .= "<a href=\"".$parent->link."\">".$parent->title."</a></div>\n";
				}
				
				//If this parent has children (1 or more)
				if(isset($this->children[$index])){

					//create the js for showing/hiding the children
					$this->jsOnClickStr($index);
					
					//List the children of this parent
					foreach($this->children[$index] as $child){
						
						if(empty($child->link)){
							$str .= "	<div id=\"xChild".$child->id."\" style=\"display:none;\"><div id=\"childX\"><span style=\"cursor:text;\">".$child->title."</span></div></div>\n";
						}else{
							$str .= "	<div id=\"xChild".$child->id."\" style=\"display:none;\"><div id=\"childX\"><a href=\"".$child->link."\">".$child->title."</a></div></div>\n";
						}
							
					}//for each child
					
				}//if there are one or more children

			}//if not empty
		
		}//for each parent
		
		return array("html"=>$str,"js"=>$this->javaScript);
		
	}//generateMenu


	/* INTERNAL FUNCTIONS */

	// jsOnClickStr : Called by the function 'generateMenu', this function create the correct
	// javascript for showing or hiding a specific parent's children
	function jsOnClickStr($index){
	
		$str .= "function xMenu".$index."(){\n";
		foreach($this->children[$index] as $child){
			$str .= "	if(document.getElementById('xChild".$child->id."').style.display=='none'){document.getElementById('xChild".$child->id."').style.display='block';}else{document.getElementById('xChild".$child->id."').style.display='none';}\n";
		}
		//Adding the script to swap the XC box image when clicked
		if(isset($this->boxC) && isset($this->boxO)){
			$str .= "	if(document.getElementById('xcBox".$index."').src == '".$this->boxC."'){document.getElementById('xcBox".$index."').src = '".$this->boxO."';}else{document.getElementById('xcBox".$index."').src = '".$this->boxC."';}\n";
		}
		$str .= "}\n";
		$this->javaScript .= $str;
	
	}//jsOnClickStr


}//class xpandMenu



/* INTERNAL CLASSES */


// xParent : Created by the 'xpandMenu' object, contains all information about a specific parent
class xParent {
	
	var $title;
	var $link;
	
	function xParent($title,$link = false){
		
		$this->title = $title;
		$this->link = $link;
		
	}//xParent constructor
	
}//xParent


// xChild : Created by the 'xpandMenu' object, contains all information about a specific child
class xChild {

	var $title;
	var $link;
	var $id;
	
	function xChild($id,$title,$link = false){
		
		$this->id = $id;
		$this->title = $title;
		$this->link = $link;
	
	}//xChild constructor

}//xChild



?>
Return current item: xPandMenu