Datei: /php/Menu_Browser.php, Stand: 22.03.2001, 20:54

<?php
//
// +----------------------------------------------------------------------+
// | PHP version 4.0                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2001 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 of the PHP license,      |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.txt.                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Ulf Wendel <ulf.wendel@phpdoc.de>                           |
// +----------------------------------------------------------------------+
//
// $Id: Menu_Browser.php,v 1.2 2001/03/22 18:38:32 uw Exp $

/**
* Simple filesystem browser that can be used to generated menu (3) hashes based on the directory structure.

* Together with menu (3) and the (userland) cache you can use this 
* browser to generate simple fusebox like applications / content systems.

* Let the menubrowser scan your document root and generate a menu (3) structure
* hash which maps the directory structure, pass it to menu's setMethod() and optionally
* wrap the cache around all this to save script runs. If you do so, it looks
* like this:
*
* // document root directory
* define("DOC_ROOT", "/home/server/www.example.com/");
*  
* // instantiate the menubrowser
* $browser = new menubrowser(DOC_ROOT);
*
* // instantiate menu (3)
* $menu = new menu($browser->getMenu());
*
* // output the sitemap
* $menu->show("sitemap");

* Now, use e.g. simple XML files to store your content and additional menu informations
* (title!). Subclass exploreFile() depending on your file format. 

* @author   Ulf Wendel <ulf.wendel@phpdoc.de>
* @version  $Id: Menu_Browser.php,v 1.2 2001/03/22 18:38:32 uw Exp $
*/
class menubrowser {

    
/**
    * Filesuffix of your XML files.
    * 
    * @var  string  
    * @see  menubrowser()
    */
    
var $file_suffix "xml";
    
    
    
/**
    * Number of characters of the file suffix.
    *
    * @var  int
    * @see  menubrowser()
    */
    
var $file_suffix_length 3;
    
    
    
/**
    * Filename (without suffix) of your index / start pages.
    * 
    * @var  string  
    * @see  menubrowser()
    */
    
var $index "index";
    
    
    
/**
    * Full filename of your index / start pages.
    *
    * @var  string
    * @see  $file_suffix, $index
    */
    
var $index_file "";
    
    
    
/**
    * Directory to scan.
    * 
    * @var  string
    * @see  setDirectory()
    */
    
var $dir "";
    
    
    
/**
    * Menu (3)'s setMenu() hash.
    * 
    * @var  array
    */
    
var $menu = array();
    
    
    
/**
    * Creates the object and optionally sets the directoryto scan. 
    * 
    * @param    string
    * @see      $dir
    */
    
function menubrowser($dir ""$index ""$file_suffix "") {
        
        if (
$dir)
            
$this->dir $dir;                
        if (
$index)
            
$this->index $index;            
        if (
$file_suffix)
            
$this->file_suffix $file_suffix;
            
        
$this->index_file $this->index "." $this->file_suffix;                                
        
$this->file_suffix_length strlen($this->file_suffix);
        
    } 
// end constructor
    
    
    /**
    * Sets the directory to scan. 
    *
    * @param    string  directory to scan
    * @access   public
    */
    
function setDirectory($dir) {
    
        
$this->dir $dir;
        
    } 
// end func setDirectory
    
    
    /**
    * Returns a hash to be used with menu(3)'s setMenu(). 
    *
    * @param    string  directory to scan
    * @access   public
    */
    
function getMenu($dir "") {
        
        if (
$dir)
            
$this->setDirectory($dir);
            
        
// drop the result of previous runs    
        
$this->files = array();          
        
        
$this->menu $this->browse($this->dir);
        
$this->menu $this->addFileInfo($this->menu);
        
        return 
$this->menu;
    } 
// end func getMenu

    
    /**
    * Recursive function that does the scan and builds the menu (3) hash. 
    *
    * @param    string  directory to scan
    * @param    integer entry id - used only for recursion
    * @param    boolean ??? - used only for recursion
    * @return   array
    */
    
function browse($dir$id 0$noindex false) {

      
$struct = array();
      
$dh opendir($dir);
      while (
$file readdir($dh)) {
        if (
"." == $file || ".." == $file)
          continue;
          
        
$ffile $dir $file;      
        if (
is_dir($file)) {
        
          
$ffile .= "/";
          
          if (
file_exists($ffile $this->index_file)) {
    
            
$id++;
            
$struct[$id]["url"] = $ffile $this->index_file;

            
$sub $this->browse($ffile$id 1true);
            if (
!= count($sub))
              
$struct[$id]["sub"] = $sub;
              
          }
          
        } else {
    
          if (
$this->file_suffix == substr($filestrlen($file) - $this->file_suffix_length$this->file_suffix_length)
                && !(
$noindex && $this->index_file == $file) ) {
            
$id++;                
            
$struct[$id]["url"] = $dir $file;
          }
            
        }
          
      }
     
      return 
$struct;
    } 
// end func browse
    
    
    /**
    * Adds further informations to the menu hash gathered from the files in it
    *
    * @var      array   Menu hash to examine
    * @return   array   Modified menu hash with the new informations
    */
    
function addFileInfo($menu) {

        
// no foreach - it works on a copy - the recursive 
        // structure requires already lots of memory        
        
reset($menu);
        while (list(
$id$data) = each($menu)) {
        
            
$menu[$id] = array_merge($data$this->exploreFile($data["url"]));
            if (isset(
$data["sub"]))
                
$menu[$id]["sub"] = $this->addFileInfo($data["sub"]);
                
        }

        return 
$menu;        
    } 
// end func addFileInfo
    
    
    /**
    * Returns additional menu informations decoded in the file that appears in the menu.
    * 
    * You should subclass this method to make it work with your own 
    * file formats. I used a simple XML format to store the content.
    * 
    * @param    string  filename
    */
    
function exploreFile($file) {
    
        
$xml join("", @file($file));
        if (!
$xml)
            return array();

        
$doc xmldoc($xml);
        
$xpc xpath_new_context($doc);
        
        
$menu xpath_eval($xpc"//menu");
        
$node = &$menu->nodeset[0];
        
        return array(
"title" => $node->content);
    } 
// end func exploreFile
    

// end class menubrowser
?>