thinkt4nk
8/17/2011 - 3:53 PM

Directory Enumerator

Directory Enumerator

<?php
/*
* Directory enumeration and presentation for jQuery TreeView Widget
* Author: Ryan Bales, 2011
*/
class DirectoryEnumerator
{
	private $enumeration_list = array();
	private $directory;
	private $public_directory;

	/**
	 * __construct 
	 *		The constructor
	 * @param string $directory 
	 * @access public
	 * @return void
	 */
	public function __construct($directory=null,$public_directory=null)
	{
		if( $directory === null )
			$this->directory = SITE_LOC;
		else
			$this->directory = $directory;
		if( $public_directory === null )
			$this->public_directory = '';
		else 
			$this->public_directory = $public_directory;
	}
	/**
	 * enumerate 
	 *		Bootstraps recursive enumeration
	 * @access public
	 * @return void
	 */
	public function enumerate()
	{
		return $this->recursively_enumerate($this->directory);
	}
	/**
	 * getRecursiveTree 
	 *		Method outputs the directory tree for jQuery's TreeView plugin
	 * @param array $directory 
	 * @access public
	 * @return void
	 */
	public function getRecursiveTree($directory,$parent=null)
	{
		if( $parent === null )
			$parent = $this->public_directory;
		// create the output buffer
		$ob = "";
		foreach( $directory as $child_name => $child )
		{
			if( is_array($child) && !empty($child) )
			{
				$ob .= '<li class="closed">';
			} else {
				$ob .= '<li>';
			}
			if( is_array($child) )
			{
				$ob .= '<span class="folder">' . $child_name . '</span>';
				// recurse
				$ob .= "<ul>" . $this->getRecursiveTree($child,implode('/',array($parent,$child_name))) . "</ul>";
			}
			else {
				// push file object
				$ob .= '<li><span class="file"><a href="' . implode('/',array($parent,$child)) . '">' . $child . '</a></span></li>';
			}
			$ob .= "</li>";
		}
		return $ob;
	}
	/**
	 * recursively_enumerate 
	 *		Recursively enumerates a directory structure, returning a dictionary
	 *		Directories are arrays, empty or containing their files, and files are simple strings
	 * @param string $directory 
	 * @access private
	 * @return array
	 */
	private function recursively_enumerate($directory)
	{
		$directory_name_parts = explode('/',$directory);
		$directory_basename = (!empty($directory_name_parts)) ? $directory_name_parts[(count($directory_name_parts)-1)] : null;
		if( $directory_basename !== null )
		{
			// create the return object
			$directory_list = array();
			// scan the directory
			$children = scandir($directory);
			foreach($children as $child) {
				// don't recurse up the directory tree or stall or search DS_Store
				if( !in_array($child,array('.','..','.DS_Store')) )
				{
					$child_pathname = sprintf("%s/%s",$directory,$child);
					if( is_dir($child_pathname) )
					{
						// recurse
						$directory_list[$child] = $this->recursively_enumerate($child_pathname);
					}
					elseif( is_file($child_pathname) )
					{
						// push
						array_push($directory_list,$child);
					}
				}
			}
			return $directory_list;
		}
	}
}