AAA Главная
Примеры PHP Примеры JavaScript Примеры Ajax Примеры CSS,HTML

Скрипт генератора карты сайта

Этот пример класса строит карту сайта на основании дерева каталогов текущего сайта. Бесполезен для динамических сайтов.

/**
   * 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;
    }
  }
?>

А здесь можно построить карту сайта.

Здесь можно скачать скрипт генератора карты сайта.


.

© Copyright 2008-2016 by KDG