1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

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

Тема в разделе 'PHP', создана пользователем mr.Slink, 28 апр 2010.

  1. TopicStarter Overlay

    mr.Slink Пользователи

    Сообщения:
    261
    Лайки:
    92
    Пол:
    Мужской
    Репутация:
    0
    Команда:
    odoRemasrered
    Страна:
    Russian Federation Russian Federation
    Этот пример класса строит карту сайта на основании дерева каталогов текущего сайта. Бесполезен для динамических сайтов.

    Код:
    <?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; 
    } 
    } 
    ?>
Черновик сохранён Черновик удалён

Поделиться этой страницей