PHP Classes

File: navtree001_sample3.php

Recommend this page to a friend!
  Classes of Mark Quah   NavTree   navtree001_sample3.php   Download  
File: navtree001_sample3.php
Role: Example script
Content type: text/plain
Description: Web-based File Management
Class: NavTree
Explorer-like tree
Author: By
Last change: Bug fix
Date: 22 years ago
Size: 25,806 bytes
 

Contents

Class file image Download
<?php // FILE: navtree001_sample3.php // To do simple web-based directory management. // To make this work, it requires: // 1. this file // 2. class_navtree.php // 3. class_navtree_inc.php // 4. image stored in ./IMAGE/NAVTREE, refer to SCREENSHOT.txt // Example script is appended at the end of the class. You can rip out // the example and make this file a class say "class_webdir.php" // // You proceed to specify the base_dir, and correspond base_url which // is the highest level of the directory the class will display. // Use your own logic to determine if you allow admin mode by settin // $admin=FALSE. Pull out the admin button will also work. // // You cannot instantiate multiple copy of the class as the core is // still the javascript which does not support class. Class is used for // lumping all the functions and variables together than for multiple // instances. // // Note the programming logic is very similar to the PageLogic class that // I used. This is my style of programming. You can use PacgeLoic class to // simplify this script. include_once "class_navtree.php"; CLASS WEBDIR extends NAVTREE { var $base_dir; // physical location var $base_url; // URL location var $navdir_curdir=""; // current display page var $recurse_level=999; // set directory recurse depth, 1, top directory and child only // 999 should be a reasonable limit var $current_depth=0; var $admin; // admin privilege TRUE/FALSE var $navdir_admin_mode=FALSE; // navdir_admin_mode "TRUE"/"FALSE" var $navdir_action; // variable from hidden form NAVDIR to determine action var $navtree; function WEBDIR($base_dir, $base_url, $admin, $nav_id, $nav_image_dir) { global $HTTP_POST_VARS; $this->base_dir = $base_dir; $this->base_url = $base_url; $this->admin = $admin; $this->recurse_level=0; $this->navdir_curdir = $base_dir; $this->url_offset = strlen($this->base_dir)+1; //----- define the node type and the image to use $this->NAVTREE($nav_image_dir); $this->nav_id= $nav_id; $this->t_folder = $this->CreateType("folder"); $this->t_document = $this->CreateType("document"); $this->t_action = $this->CreateType("action"); //----- DEBUG: CHECK WHAT DATA HAS BEEN POSTED IN // foreach ($HTTP_POST_VARS as $name => $value) echo "<H6> $name : [$value]<BR></H6>"; //----- Extract FORM data $this->navdir_action = ""; if ( isset($HTTP_POST_VARS['navdir_action']) ) $this->navdir_action = strtoupper($HTTP_POST_VARS['navdir_action']); $this->navdir_item = ""; if ( isset($HTTP_POST_VARS['navdir_item']) ) $this->navdir_item = $HTTP_POST_VARS['navdir_item']; $this->navdir_extension = ""; if ( isset($HTTP_POST_VARS['navdir_extension']) ) $this->navdir_extension = $HTTP_POST_VARS['navdir_extension']; $this->navdir_admin_mode = "FALSE"; if ( isset($HTTP_POST_VARS['navdir_admin_mode']) ) $this->navdir_admin_mode = $HTTP_POST_VARS['navdir_admin_mode']; $this->navdir_curdir = ""; if ( isset($HTTP_POST_VARS['navdir_curdir']) ) $this->navdir_curdir = $HTTP_POST_VARS['navdir_curdir']; //--- STYLE SHEET echo "<style>"; echo ".small, #small { font-size: 8pt; font-weight: bold; padding:0; margin:0; text-align: center}"; echo "</style>"; } function SetDepth($depth) { $this->recurse_level=$depth; } function GenFormNAVDIR() { //----- Dislay Hidden Form $this->NAVDIRForm(); //----- FORM LOGIC switch ($this->navdir_action) { case "ADDDIR" : //$navdir_item: parent directoy name //$navdir_extension: new child directory name $this->AddDir(); break; case "DELDIR" : //$navdir_item: directory to be deleted $this->DelDir(); break; case "RENDIR": // navdir_item: directory name // navdir_extension: new directory name $this->RenDir(); break; case "ADDFILE": // navdir_item: directory name $this->AddFile(); break; case "PROCFILE": // file upload // navdir_item directory name // base_dir: base directory name $this->ProcFile(); break; case "DELFILE": // navdir_item: file to be deleted $this->DelFile(); break; case "RENFILE": // navdir_item: directory name // navdir_extension: new directory name $this->RenFile(); break; case "ADDINFO": // navdir_item: file name // navdir_extension: description $this->AddInfo(); break; default: DisplayMainHTML(); break; } // end switch } // FORMLOGIC //===== END OF FORM LOGIC =============================================== //===== PAGE MAIN ROUTINE =============================================== // Display Admin mode button function DisplayAdminButton($txt="Administration mode") { // Admin mode button $status = ( $this->navdir_admin_mode == "TRUE" ? "CHECKED":""); echo "<INPUT TYPE=CHECKBOX NAME='navdir_admin_input' VALUE='TRUE' $status". " ONCLICK=\"NAVDIR_ADMIN_MODE();\" >$txt"; } function DisplayMain() { global $HTTP_POST_VARS; //----- define root nodes and prepare a stack $this->main_node = $this->CreateNode(-1, $this->t_folder, "close", "ROOT", "NOT DISPLAYED"); $this->f_count = 0; $admin_display = $this->admin && ($this->navdir_admin_mode == "TRUE"); //----- make sure directory follow the path $this->navdir_curdir = dirname($this->navdir_curdir); if ( substr($this->navdir_curdir,0, strlen($this->base_dir)) != $this->base_dir ) $this->navdir_curdir=$this->base_dir; //----- read in tree data $this->TreeReadDir($this->navdir_curdir, $this->main_node, $admin_display, 0, $this->navdir_curdir); //----- define the tree $dir_tree = $this->CreateTree($this->main_node, $this->nav_id, NAV_SETALL|NAV_HIDEROOT); $this->SetTreeStyle($dir_tree, 'navs_content', 'border: groove 2; padding: 5; font-size: 8pt; '. 'font-family: Arial, Helvetica; background: transparent'); //----- Now Display The tree $this->LoadData(); return $dir_tree; } // DisplayMain function TreeReadDir( $dir_name, // directory to be parsed $parent_node, // parent node for this directory to attach to $admin, // display admin action? $depth, // depth (level) of this directory $parent_dir // parent directory name ) { //##### DO SOME CHECKING // check depth $depth = $depth + 1; if ($depth > $this->recurse_level) return; // Check directory if ( !($dir = @opendir($dir_name)) ) return "Can't open directory: $dir_name<BR>"; //##### ADD THE DIRECTORY AS NODE TO PARENT NODE //----- GET DIRECTORY DESCRIPTION $dir_fname = basename($dir_name); $dir_navinfo="$dir_name/$dir_fname.navinfo"; $dir_txt = ""; if ( file_exists("$dir_navinfo") ) { $fp=fopen("$dir_navinfo", "rt"); if ($fp) { rewind($fp); while (! feof($fp)) $dir_txt .= fgets($fp, 512); fclose($fp); } //$dir_txt = addcslashes($dir_txt, "\"/'"); $dir_txt = htmlentities($dir_txt); $dir_txt = str_replace("\n", "<br>", $dir_txt); } //----- SET ACTION: jump to this directory $action = "<A HREF=\"javascript:NAVDIR_CURDIR('$parent_dir');\">$dir_fname</A>"; //----- SET STATE: first level or the parent == base dir then open $state = ( ($depth == 1 || $parent_dir == $this->navdir_curdir) ? "open":"close"); //----- CREATE THE NODE $dir_node = $this->CreateNode($parent_node, $this->t_folder, $state, $action, $dir_txt); //##### ADD ADMINISTRATION ACTIONS if ($admin) $this->AddDirAdmin($dir_node, $dir_name); //##### PROCESS FILE UNDER THIS DIRECTORY //----- read in file list into $file_array $file_array['dir'] = array(); $file_array['file'] = array(); while (($file = readdir($dir)) !== false) { // ignore file begins with ".", include ".", ".." which is directory if ( substr($file, 0, 1) == ".") continue; $file_name = "$dir_name/$file"; $file_type = filetype($file_name); $file_array[$file_type][] = $file_name; } //----- Display directory first, use recursive function to display the node if ( count($file_array['dir']) > 0) { asort($file_array['dir']); foreach ($file_array['dir'] as $file_type => $file_name) $this->TreeReadDir($file_name, $dir_node, $admin, $depth, $dir_name); }// count file_array['file'] //----- Display file list if ( count($file_array['file']) ) { asort($file_array['file']); foreach ($file_array['file'] as $file_type => $file_name) { // ignore description file with .navinfo extension if (strstr($file_name, ".navinfo")) continue; // get description of the file from .navinfo if exists $file_txt = ""; if ( file_exists("$file_name.navinfo") ) { $fp=fopen("$file_name.navinfo", "rt"); if ($fp) { rewind($fp); while (! feof($fp)) $file_txt .= fgets($fp, 512); fclose($fp); } $file_txt = htmlentities($file_txt); $file_txt = str_replace("\n", "<br>", $file_txt); } // now create the node $file = basename($file_name); $file_url = $this->base_url . substr($file_name, $this->url_offset); $file_url = "<A HREF='$file_url'>$file</A>"; $file_node = $this->CreateNode($dir_node, $this->t_document, "close", $file_url, $file_txt); // if admin then create a few option for user if ($admin) $this->AddNodeAdmin($file_node, $file_name); } // foreach } // count file_array['file'] closedir($dir); }// Read Dir function NewFieldName() { $this->f_count ++; return "F_".$this->f_count; } function AddDirAdmin($dir_node, $dir_name) { // Put all the action button into content of a new admin node $action = "<TABLE ID=small BORDER=1 BGCOLOR=#CCCCCC>"; // Add new file $f_name=$this->NewFieldName(); $js_call= "NAVDIR_SUBMIT('ADDFILE','$dir_name');"; $action .= "<TR><TD>"; $action .= "<INPUT ID=small TYPE=SUBMIT VALUE='UPLOAD' ONCLICK=\"$js_call\"><BR>"; // Change/Add Info $f_name=$this->NewFieldName(); $navfile_base=$dir_name."/".basename($dir_name); $js_call= "NAVDIR_SUBMIT_EXT('ADDINFO','$navfile_base','$f_name');"; $action .= "<TR><TD>"; $action .= "<TABLE BORDER=0><TR><TD>"; $action .= "<INPUT ID=small TYPE=SUBMIT VALUE='Change directory desciption' ONCLICK=\"$js_call\">"; $action .= "<TR><TD ALIGN=CENTER>"; $action .= "<TEXTAREA ROWS=3 NAME=$f_name></TEXTAREA><BR>"; $action .= "</TABLE>"; // rename directory if ($dir_name != $this->base_dir) { $f_name=$this->NewFieldName(); $js_call= "NAVDIR_SUBMIT_EXT('RENDIR','$dir_name','$f_name');"; $action .= "<TR><TD>"; $action .= "<TABLE CLASS=small BORDER=0><TR><TD>"; $action .= "<INPUT ID=SMALL TYPE=SUBMIT VALUE='Rename' ONCLICK=\"$js_call\">"; $action .= "<TR><TD>"; $action .="<INPUT ID=small NAME=$f_name>"; $action .="</TABLE>"; } // add directory $f_name=$this->NewFieldName(); $js_call= "NAVDIR_SUBMIT_EXT('ADDDIR','$dir_name','$f_name');"; $action .= "<TR><TD>"; $action .= "<TABLE CLASS=small BORDER=0><TR><TD>"; $action .= "<INPUT ID=small TYPE=SUBMIT VALUE='Add Directory' ONCLICK=\"$js_call\">"; $action .= "<TR><TD>"; $action .="<INPUT ID=small NAME=$f_name><BR>"; $action .= "</TABLE>"; // del directory $f_name=$this->NewFieldName(); $js_call= "NAVDIR_SUBMIT('DELDIR','$dir_name');"; $action .= "<TR><TD>"; $action .= "<INPUT ID=SMALL TYPE=SUBMIT VALUE='Delete this directory' ONCLICK=\"$js_call\">"; // end big table $action .="</TABLE>"; //Create Directory Admin Node $dir_admin=$this->CreateNode($dir_node, $this->t_action, "close", "Directory admin", $action); } function AddNodeAdmin($file_node, $file_name) { global $t_action; global $f_count; global $navtree; // Put all the action button into content of a new admin node $action = "<TABLE ID=small BORDER=1 BGCOLOR=#CCCCCC>"; // Change/Add Info $f_name=$this->NewFieldName(); $js_call= "NAVDIR_SUBMIT_EXT('ADDINFO','$file_name','$f_name');"; $action .= "<TR><TD>"; $action .= "<TABLE CLASS=small BORDER=0 ><TR><TD>"; $action .= "<TR><TD>"; $action .= "<INPUT CLASS=small TYPE=SUBMIT VALUE='Change file info' ONCLICK=\"$js_call\">"; $action .= "<TR><TD>"; $action .="<TEXTAREA CLASS=small ROWS=3 NAME=$f_name></TEXTAREA>"; $action .= "</TABLE>"; // rename file $f_name=$this->NewFieldName(); $js_call= "NAVDIR_SUBMIT_EXT('RENFILE','$file_name','$f_name');"; $action .= "<TR><TD>"; $action .= "<INPUT CLASS=small TYPE=SUBMIT VALUE='Rename' ONCLICK=\"$js_call\"><BR>"; $action .= "<INPUT CLASS=small NAME=$f_name>"; // del file $f_name=$this->NewFieldName(); $js_call= "NAVDIR_SUBMIT('DELFILE','$file_name');"; $action .= "<TR><TD>"; $action .= "<INPUT CLASS=small TYPE=SUBMIT VALUE='Delete this file' ONCLICK=\"$js_call\">"; // Okay, add node admin $action .= "</TABLE>"; $file_admin=$this->CreateNode($file_node, $this->t_action, "close", "File admin", "$action"); } function AddDir() { $navdir_item = $this->navdir_item; $navdir_extension = $this->navdir_extension; $des_name = "$navdir_item/$navdir_extension"; if (! mkdir($des_name, 0700) ) $this->JSAlert("FAILED: create directory $navdir_extension failed!!!"); else $this->JSAlert("SUCCESS: directory $navdir_extension created!!!"); $this->JSScript("GOMAIN();"); } function DelDir() { $navdir_item = $this->navdir_item; if ( ! rmdir($navdir_item) ) $this->JSAlert("Remove directory $navdir_item failed!!!"); else $this->JSAlert("SUCCESS: directory removed!!!"); $this->JSScript("GOMAIN();"); } function RenDir() { $navdir_item = $this->navdir_item; $navdir_extension = $this->navdir_extension; $old_file = $navdir_item; $new_file = dirname($navdir_item)."/".$navdir_extension; if ( ! rename($old_file, $new_file)) $this->JSAlert("FAILED: fail to rename $navdir_item to $navdir_extension!!"); else $this->JSAlert("SUCCESS: Rename $navdir_item to $navdir_extension!!"); $this->JSScript("GOMAIN();"); } function AddInfo() { $navdir_item = $this->navdir_item; $navdir_extension = $this->navdir_extension; $info_file = "$navdir_item.navinfo"; $fp=fopen($info_file, "wb"); if ($fp) { rewind($fp); fwrite($fp, $navdir_extension); fclose($fp); $this->JSAlert("SUCCESS: Info for $navdir_item added.!!!"); } else $this->JSAlert("FAILED: Add info file $info_file failed!!!"); $this->JSScript("GOMAIN();"); } function AddFile() { global $HTTP_POST_VARS; $base_dir = $this->base_dir; $base_url = $this->base_url; $navdir_item = $this->navdir_item; $navdir_admin_mode = $HTTP_POST_VARS['navdir_admin_mode']; echo '<FORM NAME="NAVFILE" METHOD="POST" ENCTYPE="multipart/form-data">'; echo "<INPUT TYPE=HIDDEN NAME='navdir_action' VALUE='PROCFILE'>"; echo "<INPUT TYPE=HIDDEN NAME='navdir_item' VALUE='$navdir_item'>"; echo "<INPUT TYPE=HIDDEN NAME='navdir_admin_mode' VALUE='$navdir_admin_mode'>"; echo "<INPUT TYPE=HIDDEN NAME='base_dir' VALUE='$base_dir'>"; echo "<INPUT TYPE=HIDDEN NAME='base_url' VALUE='$base_url'>"; echo "<INPUT CLASS=small TYPE=SUBMIT VALUE='Upload this file'>"; echo "<BR><INPUT CLASS=small TYPE=FILE NAME=UPLOAD><BR>"; echo "</FORM>"; } function DelFile() { $navdir_item = $this->navdir_item; $navdir_extension = $this->navdir_extension; if ( ! unlink($navdir_item) ) $this->JSAlert("FAILED: Unable to delete $navdir_item!!"); else $this->JSAlert("SUCCESS: $navdir_item deleted!!"); $this->JSScript("GOMAIN();"); } function RenFile() { $navdir_item = $this->navdir_item; $navdir_extension = $this->navdir_extension; $old_file = $navdir_item; $new_file = dirname($navdir_item)."/".$navdir_extension; if ( ! rename($old_file, $new_file)) $this->JSAlert("FAILED: Rename $navdir_item to $navdir_extension FAILED!!"); else $this->JSAlert("SUCCESS: $navdir_item renamed to $navdir_extension!!"); $this->JSScript("GOMAIN();"); } function ProcFile() { global $HTTP_POST_FILES; global $HTTP_POST_VARS; $navdir_item = $this->navdir_item; $base_dir = $this->base_dir; // Get the filename // foreach ($HTTP_POST_FILES['UPLOAD'] as $key=>$value) // echo "<H6>$key: [$value]<BR></H6>"; if ($HTTP_POST_FILES['UPLOAD'] == "none") $this->JSScript("alert('No file upload!!);GOMAIN();"); // now read in file info $tmp_name = $HTTP_POST_FILES['UPLOAD']['tmp_name']; $file_name = basename($HTTP_POST_FILES['UPLOAD']['name']); $file_size = $HTTP_POST_FILES['UPLOAD']['size']; $file_type = $HTTP_POST_FILES['UPLOAD']['type']; // DEBUG echo "TMP:[$tmp_name]<BR>NAME:[$file_name]<BR>SIZE[$file_size]<BR>TYPE[$file_type]<BR>"; echo "UPLOAD_DIR:[$navdir_item]<BR>"; // some check $des_file = $navdir_item."/".$file_name; if ($file_size == 0) $this->JSScript("alert('FAILED $name has zero file size!!');GOMAIN();"); elseif ( ! is_uploaded_file($tmp_name) ) $this->JSScript("alert('FAILED: It is not a upload file!!');GOMAIN();"); elseif ( substr($des_file, 0, strlen($base_dir)) != $base_dir ) $this->JSScript("alert('FAILED: not in base directory!!');GOMAIN();"); elseif ( strstr($navdir_item, "..") ) $this->JSScript("alert('Directory traversal is not allowed.'); GOMAIN();"); // looks okay, let move to the proper place if ( !copy($tmp_name, $des_file) ) $this->JSScript("alert('FAILED: cannot copy!!');GOMAIN();"); // success $this->JSScript("alert('File uploaded!!');GOMAIN();"); } //====== MISCELLANEOUS FUNCTION STARTS HERE function JSAlert($msg) { //$msg=addcslashes($msg, "/'"); echo "<script>alert('$msg');</script>"; } function JSScript($msg) { echo "<script>$msg</script>"; } //===== IN-LINE HTML CODE STARTS HERE ================================= function NAVDIRForm() { global $HTTP_SERVER_VARS; $this_page = $HTTP_SERVER_VARS['PHP_SELF']."?".strftime("%H%M%S"); //$this_page = $HTTP_SERVER_VARS['PHP_SELF']; ?> <STYLE> .small {font-size: 8pt; font-weight:bold; padding:0; margin:0} </STYLE> <FORM NAME="NAVDIR" METHOD="POST" ACTION='<?php echo $this_page; ?>' > <INPUT TYPE=HIDDEN NAME="navdir_action" VALUE="" > <INPUT TYPE=HIDDEN NAME="navdir_admin_mode" VALUE='<?php echo $this->navdir_admin_mode; ?>' > <INPUT TYPE=HIDDEN NAME="navdir_item" VALUE=""> <INPUT TYPE=HIDDEN NAME="navdir_extension" VALUE=""> <INPUT TYPE=HIDDEN NAME="navdir_extension2" VALUE=""> <INPUT TYPE=HIDDEN NAME="navdir_curdir" VALUE='<?php echo $this->navdir_curdir; ?>' > </FORM> <SCRIPT> function GOMAIN() { document.forms.NAVDIR.navdir_action.value=""; document.forms.NAVDIR.navdir_item.value=""; document.forms.NAVDIR.submit(); } function NAVDIR_SUBMIT(action, navdir_item) { if ( confirm("Confirm " + action + " on " + navdir_item + "?") ) { document.forms.NAVDIR.navdir_action.value=action; document.forms.NAVDIR.navdir_item.value=navdir_item; document.forms.NAVDIR.submit(); } } function NAVDIR_SUBMIT_EXT(action, navdir_item, fieldname) { if ( confirm("Confirm " + action + " on " + navdir_item + "?") ) { document.forms.NAVDIR.navdir_action.value=action; document.forms.NAVDIR.navdir_item.value=navdir_item; value = document.getElementById(fieldname).value; document.forms.NAVDIR.navdir_extension.value=value; document.forms.NAVDIR.submit(); } } function NAVDIR_ADMIN_MODE() { if (document.getElementById("navdir_admin_input").checked) value="TRUE"; else value="FALSE"; document.forms.NAVDIR.navdir_admin_mode.value=value; GOMAIN(); } function NAVDIR_CURDIR(cur_dir) { document.forms.NAVDIR.navdir_curdir.value=cur_dir; GOMAIN(); } </script> <?php } // HTMLCommon } // end CLASS ?> <?php //**** EXAMPLE SCRIPT **************************************************** //foreach ($HTTP_POST_VARS as $key => $value) echo "<H6>$key: [$value] </H6><P>"; //----- CONFIGURE the root directory and the corresponding URL address // remember to put / at the back of base_url //$base_dir = $HTTP_SERVER_VARS['DOCUMENT_ROOT']."/TEST"; //$base_url = "/TEST/"; $base_dir = $HTTP_SERVER_VARS['DOCUMENT_ROOT']; $base_url = "/"; $admin = TRUE; $dir_mgt = new WEBDIR($base_dir, $base_url, $admin, "NAVTREE", "./IMAGE/NAVTREE"); // I set it to not more than 5 level to display, // when you click on the directory icon, it will // goto that directory's parent directory. // this is to aovid those deep-level directory loading $dir_mgt->SetDepth(5); //----- some debug // echo "<H6>Action [$navdir_action] Item [$navdir_item] Extension [$navdir_extension]". // "Admin mode [$navdir_admin_mode]</H6><BR>"; // This is HTML page $dir_tree = $dir_mgt->DisplayMain(); // GenFormNav will always call this function function DisplayMainHTML() { global $dir_mgt; global $dir_tree; ?> <! display the admin mode button -> <table border=0 padding=0 cellspacing=0 margin=0 width=80% align=center> <tr><TD> <?php $dir_mgt->DisplayAdminButton("Admin button"); ?> <tr><td> <! Set up a division to hold the tree, take note the id is NAVTREE -> <DIV id='NAVTREE' style="background:lightblue"> <?php $dir_mgt->PrintTree($dir_tree); ?></DIV> </table> <BR> <?php } // End DisplayMainHTML // BELOW IS YOUR WEB TEMPLATE ?> <HTML> <TITLE></TITLE> <BODY PADDING=0 MARGIN=0 WIDTH=100%> <! HEADER -> <SPAN style='text-align:center;background:lightgreen; width: 100%'><H1>My header</H1></SPAN> <! Now the body -> <h2><CENTER>Demo of the Web-based directory management</CENTER></h2> <HR> <BR> <! Slip in a hidden form, immediately after BANNER or other static object This determine which page to display Note that after this staement, different branches causes different HTML to be displayed. -> <?php $dir_mgt->GenFormNAVDIR(); ?> <! Display Your footer here if you want to -> <table width=100% bgcolor=lightgreen> <TD><CENTER>My Footer</CENTER></TD> </BODY> </HTML>