Нужна помощь в форматировании результатов каталога в PHP, javascript tree control

Я пытаюсь перечислить все папки и файлы внутри одной конкретной папки с помощью PHP. Используя приведенный ниже код, мне удалось перечислить все файлы и папки в одном длинном списке. Теперь то, что я действительно пытаюсь сделать, – это перечислить их так, чтобы я мог использовать HTML / jquery, чтобы показать результаты каталога как папки с + знаками рядом с ними, чтобы их можно было расширить, но я не могу понять, как отформатировать результаты в PHP для этого.

include('include/class.dirlist.php'); $resources = "/Inetpub/companyweb/resources"; $dir = getDirectoryListing($resources,"a",1,1,"all",1); $i = 0; //for illustrative purposes only foreach ($dir as $item) { echo "<b><a href='resources/".$dir[$i]."'>".$dir[$i]."</a></b><br>"; $i++; } 

Вышеприведенный код выводит что-то вроде этого:

FOLDER1
FOLDER1 / FILE1.PDF
FOLDER1 / FILE2.PDF
folder2
Folder2 / FILE1.PDF
Folder2 / FILE2.PDF

Вот мои ответы на комментарии ниже: @ hek2mgl, именно это я и пытаюсь сделать. Мне нужен вид типа дерева.

@popnoodles, если я могу получить его в формате «ul li», это то, на что я верю, что я могу работать. Дело в том, что я начинающий PHPer … так ищут здесь рабочее решение.

@ Bjørne Malmanger Вот содержание включенного класса:

 function getDirectoryListing($dirname, $sortorder = "a", $show_subdirs = 1, $show_subdirfiles = 0, $exts = "all", $ext_save = 1) { // This function will return an array with filenames based on the criteria you can set in the variables // @sortorder : a for ascending (the standard) or d for descending (you can use the "r" for reverse as well, works the same) // @show_subdirs : 0 for NO, 1 for YES - meaning it will show the names of subdirectories if there are any // Logically subdirnames will not be checked for the required extentions // @show_subdirfiles : 0 for NO, 1 for YES - meaning it will show files from the subdirs // Files from subdirs will be prefixed with the subdir name and checked for the required extentions. // @exts can be either a string or an array, if not passed to the function, then the default will be a check for common image files // If exts is set to "all" then all extentions are allowed // @ext_save : 1 for YES, 0 for NO - meaning it will filter out system files or not (such as .htaccess) if (!$exts || empty($exts) || $exts == "") { $exts = array("jpg", "gif", "jpeg", "png", "doc", "xls", "pdf", "tif"); } if ($handle = opendir($dirname)) { $filelist = array(); while (false !== ($file = readdir($handle))) { // Filter out higher directory references if ($file != "." && $file != "..") { // Only look at directories or files, filter out symbolic links if ( filetype ($dirname."/".$file) != "link") { // If it's a file, check against valid extentions and add to the list if ( filetype ($dirname."/".$file) == "file" ) { if (checkFileExtention($file, $exts, $ext_save)) { $filelist[] = $file; } } // If it's a directory and either subdirs should be listed or files from subdirs add relevant names to the list else if ( filetype ($dirname."/".$file) == "dir" && ($show_subdirs == 1 || $show_subdirfiles == 1)) { if ($show_subdirs == 1) { $filelist[] = $file; } if ($show_subdirfiles == 1) { $subdirname = $file; $subdirfilelist = getDirectoryListing($dirname."/".$subdirname."/", $sortorder, $show_subdirs, $show_subdirfiles, $exts, $ext_save); for ($i = 0 ; $i < count($subdirfilelist) ; $i++) { $subdirfilelist[$i] = $subdirname."/".$subdirfilelist[$i]; } $filelist = array_merge($filelist, $subdirfilelist); } } } } } closedir($handle); // Sort the results if (count($filelist) > 1) { natcasesort($filelist); if ($sortorder == "d" || $sortorder == "r" ) { $filelist = array_reverse($filelist, TRUE); } } return $filelist; } else { return false; } } function checkFileExtention($filename, $exts, $ext_save = 1) { $passed = FALSE; if ($ext_save == 1) { if (preg_match("/^\./", $filename)) { return $passed; } } if ($exts == "all") { $passed = TRUE; return $passed; } if (is_string($exts)) { if (eregi("\.". $exts ."$", $filename)) { $passed = TRUE; return $passed; } } else if (is_array($exts)) { foreach ($exts as $theExt) { if (eregi("\.". $theExt ."$", $filename)) { $passed = TRUE; return $passed; } } } return $passed; } 

Посмотрите на jstree . Я думаю, это то, что вы хотите. (Я закончил это с помощью jstree). Jstree – это библиотека javascript, которая может использоваться для визуализации древовидных структур, таких как HTML-списки ( <ul>, <ol> ) или json или xml, в качестве управляемого дерева с '+' для открытия и закрытия папки, как вы хотели.

Конечно, jstree – это только часть javascript. Вам нужно будет отформатировать выходные данные вашего getDirectoryListing() в один из форматов поддержки jstree. Это в настоящее время

  • Json
  • Xml
  • Html

Вот пример. Когда finiehd будет выглядеть так:

готовый пример в браузере

Вы можете играть с открытыми и закрытыми узлами дерева.

Я изменил вашу функцию списка каталогов на версию JSON для jstree. Фактически это происходит от этой должности SO, чтобы быстро работать. Благодаря! 🙂 Вот php. Поместите его в папку на вашем веб-сервере и назовите его tree.php

 <?php header('Content-Type: application/json'); echo json_encode(dir_to_jstree_array(__DIR__)); function dir_to_jstree_array($dir, $order = "a", $ext = array()) { if(empty($ext)) { $ext = array ( "jpg", "gif", "jpeg", "png", "doc", "xls", "pdf", "tif" ); } $listDir = array( 'data' => basename($dir), 'attr' => array ( 'rel' => 'folder' ), 'metadata' => array ( 'id' => $dir ), 'children' => array() ); $files = array(); $dirs = array(); if($handler = opendir($dir)) { while (($sub = readdir($handler)) !== FALSE) { if ($sub != "." && $sub != "..") { if(is_file($dir."/".$sub)) { $extension = pathinfo($dir."/".$sub, PATHINFO_EXTENSION); if(in_array($extension, $ext)) { $files []= $sub; } }elseif(is_dir($dir."/".$sub)) { $dirs []= $dir."/".$sub; } } } if($order === "a") { asort($dirs); } else { arsort($dirs); } foreach($dirs as $d) { $listDir['children'][]= dir_to_jstree_array($d); } if($order === "a") { asort($files); } else { arsort($files); } foreach($files as $file) { $listDir['children'][]= $file; } closedir($handler); } return $listDir; } к <?php header('Content-Type: application/json'); echo json_encode(dir_to_jstree_array(__DIR__)); function dir_to_jstree_array($dir, $order = "a", $ext = array()) { if(empty($ext)) { $ext = array ( "jpg", "gif", "jpeg", "png", "doc", "xls", "pdf", "tif" ); } $listDir = array( 'data' => basename($dir), 'attr' => array ( 'rel' => 'folder' ), 'metadata' => array ( 'id' => $dir ), 'children' => array() ); $files = array(); $dirs = array(); if($handler = opendir($dir)) { while (($sub = readdir($handler)) !== FALSE) { if ($sub != "." && $sub != "..") { if(is_file($dir."/".$sub)) { $extension = pathinfo($dir."/".$sub, PATHINFO_EXTENSION); if(in_array($extension, $ext)) { $files []= $sub; } }elseif(is_dir($dir."/".$sub)) { $dirs []= $dir."/".$sub; } } } if($order === "a") { asort($dirs); } else { arsort($dirs); } foreach($dirs as $d) { $listDir['children'][]= dir_to_jstree_array($d); } if($order === "a") { asort($files); } else { arsort($files); } foreach($files as $file) { $listDir['children'][]= $file; } closedir($handler); } return $listDir; } к <?php header('Content-Type: application/json'); echo json_encode(dir_to_jstree_array(__DIR__)); function dir_to_jstree_array($dir, $order = "a", $ext = array()) { if(empty($ext)) { $ext = array ( "jpg", "gif", "jpeg", "png", "doc", "xls", "pdf", "tif" ); } $listDir = array( 'data' => basename($dir), 'attr' => array ( 'rel' => 'folder' ), 'metadata' => array ( 'id' => $dir ), 'children' => array() ); $files = array(); $dirs = array(); if($handler = opendir($dir)) { while (($sub = readdir($handler)) !== FALSE) { if ($sub != "." && $sub != "..") { if(is_file($dir."/".$sub)) { $extension = pathinfo($dir."/".$sub, PATHINFO_EXTENSION); if(in_array($extension, $ext)) { $files []= $sub; } }elseif(is_dir($dir."/".$sub)) { $dirs []= $dir."/".$sub; } } } if($order === "a") { asort($dirs); } else { arsort($dirs); } foreach($dirs as $d) { $listDir['children'][]= dir_to_jstree_array($d); } if($order === "a") { asort($files); } else { arsort($files); } foreach($files as $file) { $listDir['children'][]= $file; } closedir($handler); } return $listDir; } 

Вот основные HTML и javascript. Дайте ему собственное имя и поместите его рядом с tree.php . Я использую json_data плагин jstree вместе с ajax. Также я использую плагины типов для отображения различных типов значков для папок и файлов. (Если вы захотите, возможно, у вас будет собственный значок для каждого типа файлов). Вам нужно будет поместить надлежащую папку.png и image.png рядом с html-файлом.

 <html> <head> <script type="text/javascript" src="jquery-1.8.3.min.js"></script> <script type="text/javascript" src="jstree-v.pre1.0/jquery.jstree.js"></script> <script type="text/javascript"> $(function() { $('#dirtree').jstree({ plugins : ["json_data", "themes", "types"], json_data : { ajax : { 'url' : 'tree.php' } }, 'types': { 'types' : { 'folder' : { 'icon' : { 'image' : 'folder.png' } }, 'default' : { 'icon' : { 'image' : 'image.png' }, } } } }); }); </script> </head> <body> <div id="dirtree"></div> </body> </html> 

Это оно! 🙂 Обратите внимание, что у вас есть много опций конфигурации, варианты стилей и плагинов в jstree. Конечно, вы продолжите мой пример.

Для получения информации об установке jstree и документации см. Ссылку выше на страницу проекта jstree.