gpt4 book ai didi

php - 需要帮助格式化 PHP、javascript 树控件中目录列表的结果

转载 作者:行者123 更新时间:2023-11-28 00:12:33 28 4
gpt4 key购买 nike

我正在尝试使用 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++;
}

上面的代码会输出如下内容:

文件夹1
文件夹1/文件1.PDF
文件夹1/文件2.PDF
文件夹2
文件夹2/文件1.PDF
文件夹2/文件2.PDF

以下是我对以下评论的回复:@hek2mgl 这正是我想要做的。我想要一个树型 View 。

@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 支持的格式之一。这是目前

  • 杰森
  • XMl
  • HTML

这是一个基本的例子。完成后,它将如下所示:

finished example in browser

您可以尝试打开和关闭树节点。

我已将您的目录列表功能更改为为 jstree 生成 JSON 的功能。它实际上源自这个 SO post让事情快速运作。谢谢! :) 这是 php.ini 文件。将它放在您的网络服务器中的一个文件夹中,并将其命名为 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;
}

这是基本的 HTML 和 javascript。给它一个合适的名称并将其放在 tree.php 旁边.我将 jstree 的 json_data 插件与 ajax 一起使用。我还使用类型插件为文件夹和文件呈现不同类型的图标。 (如果需要,也可以为每种文件类型设置自定义图标)。您必须在 html 文件旁边放置适当的 folder.png 和 image.png。

<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 项目页面链接。

关于php - 需要帮助格式化 PHP、javascript 树控件中目录列表的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14389757/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com