Location: PHPKode > scripts > Create Sitemap > create-sitemap/sitemap.inc.php
<?php
	/**
	 * Class to generate the sitemap ( output a dir structure)
	 * Thsi class outputs the result in XMl or displays the result on the browser
	 * 
	 * @author Rochak Chauhan
	 */
	class Sitemap
	{
		private $_dirArray = array() ;
		private $_fileArray = array() ;
		private $_dirName = '/';
		private $_nameArray = array();

		private static $_flag = true;
		private $_nodeFlag = true;
		
		private $_dom = '';
		private $_root = '';
		private $_fileNode = '';
		private $_dirNode = '';
		private $_childDirNode = '';
		
		/**
		 * Contruction fucntion
		 *
		 * @param string $dirName
		 * 
		 * @return void
		 */
		public function __construct($dirName)
		{
			if (trim($dirName) != '')
			{
				$this->_dirName = trim($dirName);
			}
		}
	
	
		/**
	     * Function to convert time in secs into mins
	     *
	     * @param $timeInSec int
	     *
	     * $return string
	     */	
		public function convertSecToMins($timeInSec)
		{
			if( $timeInSec < 60 )
			{
				if( $timeInSec > 1)
				{
					$secString = "secs";
				}
				else
				{
					$secString = "sec";
				}
				$timeTaken = "$timeInSec $secString";
			}
			else
			{
				$seconds = ($timeInSec % 60);
				$minutes = ($timeInSec/60);
				$minutes = sprintf("%01.0f", $minutes);
	
				if( $minutes > 1)
				{
					$minString = "mins";
				}
				else
				{
					$minString = "min";
				}
	
				if( $seconds > 1)
				{
					$secString = "secs";
				}
				else
				{
					$secString = "sec";
				}
				$timeTaken = "$minutes $minString $seconds $secString";
			}
			return trim($timeTaken);
		}
	
	
	   /**
	    *
	    * Function to read a directory recursively and finds a string in all the files.
	    * it also returns the number of times a sting was found in a file
	    *
	    * @param $path string
	    *
	    * @return mixed
	    */
		public function readDirectory($path = '')
		{
			if (trim($path) == '')
			{
				$path = $this->_dirName;
			}
			$returnArray = array();
			$handle = @opendir($path);
	
			while ($file = @readdir($handle) )
			{
				if (is_dir($path.$file) && $file != "." && $file != "..")
				{
					$sub_dir = $path . $file . "/" ;
					array_push($this->_dirArray, $sub_dir);
					$this->readDirectory($sub_dir);
				}
				elseif (is_file($path.$file) && $file != "." && $file != "..")
				{
					$sub_dir = $path . $file  ;
					array_push($this->_fileArray, $sub_dir);
				}
			}
			$returnArray = array($this->_dirArray, $this->_fileArray );
			return $returnArray;
		}
	
	
		/**
		 * This function generates the sitemap
		 *
		 * @return mixed
		 */
		public function generateXmlSiteMap($writeToFile = false)
		{
			$mainArray = $this->readDirectory('');
			$fileArray = $mainArray[1];
			
			$this->startDomXml('sitemap');			
			
			for ($i=0; $i < count($fileArray); $i++)
			{
				$fileName = trim(substr(strrchr($fileArray[$i], '/'), 1));
				$dirName = trim(str_replace($fileName, '', $fileArray[$i]));
	
				$this->populateArray($dirName);
			}
			
			$foldersInRootDir = $this->getFoldersInRootDir();	
						
			foreach ($this->_nameArray as $name=>$key)
			{
				$this->generateNodes($name, $key , $foldersInRootDir);
			}
			if ($writeToFile)
			{
				$fp = fopen('xmlOutput.xml', 'w+') or die("<B>ERROR: </B> Failed to open file for writing.");
				fwrite($fp, $this->_dom->saveXML()) or die("<B>ERROR: </B> Failed to write contents to the file.");
				fclose($fp);
				echo "Content written to file: <a href='xmlOutput.xml'> Click to open.</a>";
			}
			else 
			{
				return $this->_dom->saveXML();
			}
		}
		
		/**
		 * This function generates the nodes
		 * 
		 * @param string $name
		 * @param array $foldersInRootDir
		 * @param array $key
		 * 
		 * @return void
		 */
		private function generateNodes($name, $key, $foldersInRootDir)
		{	
			$childDirArray = $this->getChildDir($name);
			/*echo "<pre>";
			echo $name."<br>";
			print_r($foldersInRootDir);
			print_r($this->_dirArray);
			print_r($childDirArray);
			echo "<HR>";*/
			if (in_array($name, $foldersInRootDir))
			{
				$this->createDirNode('dirname', $name);
				for ($i=0; $i < count($key); $i++)
				{
					$this->createFileNode('filenode', $key[$i]);
				}
				if (count($childDirArray))
				{
					for ($i=0; $i < count($childDirArray); $i++)
					{
						$this->createDirNode('dirname', $childDirArray[$i], true);
						$this->generateNodes($childDirArray[$i], $key, $this->_dirArray);
					}
				}
			}
			
		}
		/**
		 * This fucntion creates the instance of DOM Xml object
		 *
		 * @return void
		 */
		private function startDomXml($rootNodeName)
		{
			$this->_dom = new DOMDocument('1.0');
			$this->_dom->formatOutput = true;
			$this->_root = $this->_dom->createElement($rootNodeName);
			$this->_root = $this->_dom->appendChild($this->_root);
		}
		
		/**
		 * This function creates a dir node in the xml file
		 *
		 * @param string $dirNode
		 * @return void
		 */
		private function createDirNode($dirNode, $value, $isChildNode = false, $appendToChildNode = false)
		{
			if (!is_object($this->_dom))
			{
				die ("<B>ERROR:</B> Cannot call fucntion: ".__FUNCTION__." without creating dom xml object");
			}
			else 
			{ 
				if ($appendToChildNode) 
				{
					$node = $this->_childDirNode;
				}
				else 
				{
					$node = $this->_dirNode;
				}
				
				if ($isChildNode)
				{
					$this->_childDirNode = $this->_dom->createElement($dirNode, $value);
					$this->_childDirNode = $node->appendChild($this->_childDirNode);
				}
				else 
				{
					$this->_dirNode = $this->_dom->createElement($dirNode, $value);
					$this->_dirNode = $this->_root->appendChild($this->_dirNode);
				}
			}
		}
		
		/**
		 * This function creates a file node in the xml file
		 * 
		 * @param string $fileNode
		 * @return void
		 */
		private function createFileNode($fileNode, $value, $appendToChildNode = false)
		{
			if (!is_object($this->_dom))
			{
				die ("<B>ERROR:</B> Cannot call fucntion: ".__FUNCTION__." without creating dom xml object");
			}
			else
			{
				if ($appendToChildNode)
				{
					$this->_fileNode = $this->_dom->createElement($fileNode, $value);
					$this->_fileNode = $this->_childDirNode->appendChild($this->_fileNode);	
				}
				else 
				{
					$this->_fileNode = $this->_dom->createElement($fileNode, $value);
					$this->_fileNode = $this->_dirNode->appendChild($this->_fileNode);	
				}
			}
		}
		/**
		 * This function returns the names of the folder inside the parent dir
		 *
		 * @param string $parentDir
		 * @access private
		 * 
		 * @return array
		 */
		public function getChildDir($parentDir)
		{
			$returnArray = array();
			foreach ($this->_dirArray as $tmp)
			{
				if (substr_count($tmp, $parentDir))
				{
					$dirToBeAdded = substr($tmp, (strpos($tmp, $parentDir)+strlen($parentDir)) ) ;
					if ( trim($dirToBeAdded) != '' && substr_count($dirToBeAdded, '/') == 1)
					{
						$returnArray[] = $parentDir.$dirToBeAdded;
					}
				}				
			}
			return $returnArray;
		}
		
		/**
		 * This function returns the name(s) of all folders in the root/parent dir
		 * 
		 * @param string $rootdir
		 * 
		 * @return array
		 */
		private function getFoldersInRootDir()
		{
			$returnArray = array();
			foreach ($this->_dirArray as $dir)
			{
				$tmpArray = explode('/', $dir);
				if (isset($tmpArray[1]))
				{
					if (!in_array($this->_dirName.$tmpArray[1]."/", $returnArray))
					{
						array_push($returnArray, $this->_dirName.$tmpArray[1]."/");
					}
				}
			}
			return $returnArray;
		}
		/**
		 * This function populated the array for dir/file
		 *
		 * @param array $dirName
		 * @return void
		 */
		private function populateArray($dirName)
		{
			$fileArray = $this->_fileArray;
			
			for ($i=0; $i < count($fileArray); $i++)
			{
				$dirPath = substr($fileArray[$i], 0, strrpos($fileArray[$i], '/')).'/';
				if (trim($dirName) == trim($dirPath))
				{
					$tempArray[] = trim(str_replace($dirPath, '', $fileArray[$i]));
				}
			}
			$this->_nameArray[$dirName] = $tempArray;
		}
	}
?>
Return current item: Create Sitemap