我在使用两个数据库表生成父子树时遇到了麻烦。
它意味着引用其中的文件夹和文件。
我差不多了,下面的代码会生成树(源自here),但是任何分配给包含子类别的类别的文件 - 他们都不会显示..
如何让它们显示?
以下是目前正在发生的事情
这就是我想要发生的事情
我认为问题在于函数Generate_Tree_Of_Categories($ Tree_Data)。
function Generate_Tree_Of_Categories(array $elements, $parentId = "NONE")
{
$branch = array();
foreach ($elements as $element) {
if ($element['child_of'] == $parentId) {
$children = Generate_Tree_Of_Categories($elements, $element['id']);
if ($children) {
$element['children'] = $children;
}
$branch[] = $element;
} else {
$element = null;
}
}
return $branch;
}
以下是我的数据库表:
**Categories table:**
Reference Title Type Child_Of Status
CAT202480 Software CATEGORY NONE ACTIVE
CAT893984 Product Manuals CATEGORY NONE ACTIVE
CAT384594 Manufacturing CATEGORY NONE ACTIVE
CAT394858 Manufacturing Manuals CATEGORY CAT384594 ACTIVE
CAT394811 Videos CATEGORY NONE ACTIVE
CAT111338 Product Videos CATEGORY CAT394811 ACTIVE
CAT339844 Commissioning Software CATEGORY CAT202480 ACTIVE
CAT339845 Release Versions CATEGORY CAT339844 ACTIVE
CAT339846 Beta Versions CATEGORY CAT339844 ACTIVE
**Files Table:**
Reference Type Title Category_Ref Format Status
FILE001393804 SOFTWARE Beta software v0.9.3 CAT339846 ZIP AVAILABLE
FILE001984843 DOCUMENT Product A Installation Manual CAT893984 PDF AVAILABLE
FILE009039742 DOCUMENT Product A Commissioning Guide CAT893984 PDF AVAILABLE
FILE683579248 DOCUMENT Product A User Guide CAT893984 PDF AVAILABLE
FILE001393805 SOFTWARE Product A software Release 1.9 CAT339845 ZIP AVAILABLE
FILE001393803 SOFTWARE Product Z program CAT339844 ZIP AVAILABLE
这是SQL dump
这是我将上述数据转换为JSTree兼容数组的代码,后来我将json_encode。
function Load_Downloads_TreeView()
{
require '../../global/session_manager.php';
require_once '../../permissions/permissions.php';
// Determine the permissions for the current user
$User_Permissions = Get_Permissions_SpecificUser($LoggedInUserReference, $LoggedInFlag);
$Response = Retrieve_All_Download_Categories_SpecificStatus("ACTIVE", $LoggedInFlag);
// $Response = Retrieve_All_Download_Categories($LoggedInFlag);
if ($Response['Decision'] == TRUE) {
$Download_Categories = $Response['Value'];
} else {
echo $Response['Notification'];
exit();
}
// $Response = Retrieve_Specific_Download_Category("CAT339845", $LoggedInFlag);
// $Specific_Category = $Response['Value'];
$Tree_Data = array();
foreach ($Download_Categories as $Current_Category) {
// This code returns an array of files assigned to the $Current_Category reference
$Response = Retrieve_Files_In_Download_Category($Current_Category['Reference'], $LoggedInFlag);
$Files = $Response['Value'];
$Child_Nodes = NULL;
if (count($Files) > 0) {
$Child_Nodes = Return_Files($Files);
}
//$Child_Nodes would be filled with the array of files (array of arrays).
// $Child_Nodes = NULL; //Until I figure out how to nest this information in a multidimensional array with categories
$Response = Generate_Folder_Node($Current_Category['Reference'],$Current_Category['Name'],$Current_Category['Child_Of'], $Child_Nodes);
$Tree_Data[] = $Response;
}
$Generated_Tree = Generate_Tree_Of_Categories($Tree_Data);
echo json_encode($Generated_Tree);
}
function Generate_Folder_Node($Element_ID,$Element_Name,$Child_Of, $Child_Nodes) {
if (!defined('id')) define('id', 'id');
if (!defined('text')) define('text', 'text');
if (!defined('type')) define('type', 'type');
if (!defined('child_of')) define('child_of', 'child_of');
if (!defined('children')) define('children', 'children');
if (!defined('state')) define('state', 'state');
if (!defined('opened')) define('opened', 'opened');
$Node_Open_Array = array(opened=>"false");
$Generated_Node = array(id=> $Element_ID, text=>$Element_Name, type=>"folder", child_of=>$Child_Of, children=>$Child_Nodes, state=>$Node_Open_Array);
return $Generated_Node;
}
function Return_Files($Child_Array)
{
$All_Nodes = array();
foreach ($Child_Array as $Current_Child_Element) {
$Element_ID = $Current_Child_Element['Reference'];
$Element_Name = $Current_Child_Element['Name'];
if ($Current_Child_Element['Status'] == "AVAILABLE") {
$DisabledState = "false";
} else if ($Current_Child_Element['Status'] == "UNAVAILABLE") {
$DisabledState = "true";
}
if ($Current_Child_Element['File_Type'] == "PDF") {
$Icon = "fa fa-file-pdf-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "ZIP") {
$Icon = "fa fa-file-zip-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "JPG" || $Current_Child_Element['File_Type'] == "PNG") {
$Icon = "fa fa-file-picture-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "XLS" || $Current_Child_Element['File_Type'] == "XLSX") {
$Icon = "fa fa-file-excel-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "DOC" || $Current_Child_Element['File_Type'] == "DOCX") {
$Icon = "fa fa-file-word-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "PPT" || $Current_Child_Element['File_Type'] == "PPTX") {
$Icon = "fa fa-file-powerpoint-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "EXE") {
$Icon = "fa fa-desktop fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "AVI" || $Current_Child_Element['File_Type'] == "MP4") {
$Icon = "fa fa-file-video-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "MP3" || $Current_Child_Element['File_Type'] == "WAV") {
$Icon = "fa fa-file-sound-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "TXT") {
$Icon = "fa fa-file-text-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "HEX" || $Current_Child_Element['File_Type'] == "BIN") {
$Icon = "fa fa-file-code-o fa-lg text-inverse";
} else {
$Icon = "fa fa-file fa-lg text-inverse";
}
$Generated_Node = Generate_File_Node($Element_ID,$Element_Name,$Icon,$DisabledState);
if (is_array($Generated_Node) == true) {
if (!empty($Generated_Node)) {
array_push($All_Nodes, $Generated_Node);
}
}
// $All_Nodes[] = $Child_Node;
}
return $All_Nodes;
}
function Generate_File_Node($Element_ID,$Element_Name,$Icon,$DisabledState) {
if (!defined('id')) define('id', 'id');
if (!defined('text')) define('text', 'text');
if (!defined('type')) define('type', 'type');
if (!defined('icon')) define('icon', 'icon');
if (!defined('state')) define('state', 'state');
if (!defined('opened')) define('opened', 'opened');
$Node_Open_Array = array(opened=>$DisabledState);
$Generated_Node = array(id=> $Element_ID, text=>$Element_Name, type=>"file", icon=>$Icon, state=>$Node_Open_Array);
return $Generated_Node;
}
答案 0 :(得分:0)
它可能与Product Z程序的Category_Ref一样简单。你有CAT339844。不应该是CAT339846吗?
答案 1 :(得分:0)
我不知道这是否是您正在寻找的,但我重新编写它以便它提供此JSON输出。你是如何将其转化为结构的视觉显示。我没有看到代码。
[
{
"id": "1",
"text": "Software",
"type": "folder",
"Child_Of": "NONE",
"children": [
{
"id": "7",
"text": "Commissioning Software",
"type": "folder",
"Child_Of": "CAT202480",
"children": [
{
"id": "8",
"text": "Release Versions",
"type": "folder",
"Child_Of": "CAT339844",
"children": [
{
"id": "FILE001393805",
"text": "Product A software Release 1.9",
"type": "file",
"icon": "fa fa-file-zip-o fa-lg text-inverse",
"state": {
"opened": "false"
}
}
],
"state": {
"opened": "false"
}
},
{
"id": "9",
"text": "Beta Versions",
"type": "folder",
"Child_Of": "CAT339844",
"children": [
{
"id": "FILE001393804",
"text": "Beta software v0.9.3",
"type": "file",
"icon": "fa fa-file-zip-o fa-lg text-inverse",
"state": {
"opened": "false"
}
}
],
"state": {
"opened": "false"
}
},
{
"id": "FILE001393803",
"text": "Product Z program",
"type": "file",
"icon": "fa fa-file-zip-o fa-lg text-inverse",
"state": {
"opened": "false"
}
}
],
"state": {
"opened": "false"
}
}
],
"state": {
"opened": "false"
}
},
{
"id": "2",
"text": "Product Manuals",
"type": "folder",
"Child_Of": "NONE",
"children": [
{
"id": "FILE001984843",
"text": "Product A Installation Manual",
"type": "file",
"icon": "fa fa-file-pdf-o fa-lg text-inverse",
"state": {
"opened": "false"
}
},
{
"id": "FILE009039742",
"text": "Product A Commissioning Guide",
"type": "file",
"icon": "fa fa-file-pdf-o fa-lg text-inverse",
"state": {
"opened": "false"
}
},
{
"id": "FILE683579248",
"text": "Product A User Guide",
"type": "file",
"icon": "fa fa-file-pdf-o fa-lg text-inverse",
"state": {
"opened": "false"
}
}
],
"state": {
"opened": "false"
}
},
{
"id": "3",
"text": "Manufacturing",
"type": "folder",
"Child_Of": "NONE",
"children": [
{
"id": "4",
"text": "Manufacturing Manuals",
"type": "folder",
"Child_Of": "CAT384594",
"children": [
{
"id": "FILE2000000001",
"text": "Product A Manufacturing Manual",
"type": "file",
"icon": "fa fa-file-word-o fa-lg text-inverse",
"state": {
"opened": "false"
}
}
],
"state": {
"opened": "false"
}
}
],
"state": {
"opened": "false"
}
},
{
"id": "5",
"text": "Videos",
"type": "folder",
"Child_Of": "NONE",
"children": [
{
"id": "6",
"text": "Product Videos",
"type": "folder",
"Child_Of": "CAT394811",
"children": "NONE",
"state": {
"opened": "false"
}
}
],
"state": {
"opened": "false"
}
}
]
答案 2 :(得分:0)
这是我的代码。可能有更好的方法。我实际上删除了你的一个函数并将其合并到另一个函数中:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>
</title>
<meta name="generator" content="BBEdit 11.5" />
</head>
<body>
<?php
$link = mysqli_connect("127.0.0.1", "root", "root", "stackoverflow");
if (!$link) {
echo "Error: Unable to connect to MySQL." . PHP_EOL;
echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
exit;
}
$sql="SELECT * from Downloads_Categories ORDER BY id";
$result=mysqli_query($link,$sql);
$Download_Categories = mysqli_fetch_all($result,MYSQLI_ASSOC);
$FolderTree = Generate_Tree_Of_Categories($Download_Categories);
usort($FolderTree, function ($item1, $item2) {
if ($item1['id'] == $item2['id']) return 0;
return $item1['id'] < $item2['id'] ? -1 : 1;
});
echo "<pre>" . json_encode($FolderTree, JSON_PRETTY_PRINT) . "</pre>";
mysqli_close($link);
function Generate_Tree_Of_Categories(array $elements, $parentId = "NONE")
{
global $link;
$branch = array();
foreach ($elements as $element) {
if ($element["Child_Of"] == $parentId) {
$sql="SELECT * from Downloads_Files as DF WHERE '" . $element['Reference'] . "' = DF.Child_Of";
$result=mysqli_query($link,$sql);
$Files = mysqli_fetch_all($result,MYSQLI_ASSOC);
$Child_Nodes = NULL;
if (count($Files) > 0) {
$Child_Nodes = Return_Files($Files);
}
$children = array_merge(Generate_Tree_Of_Categories($elements, $element['Reference']), Return_Files($Files));
if ($children) {
$element += ['children' => $children];
}
else {
$element += ['children' => "NONE"];
}
$node = Generate_Folder_Node($element["id"],$element["Name"],$element["Child_Of"], $element["children"]);
$branch[]=$node;
}
}
return $branch;
}
function Generate_Folder_Node($Element_ID,$Element_Name,$Child_Of, $Child_Nodes) {
if (!defined('id')) define('id', 'id');
if (!defined('text')) define('text', 'text');
if (!defined('type')) define('type', 'type');
if (!defined('Child_Of')) define('Child_Of', 'Child_Of');
if (!defined('children')) define('children', 'children');
if (!defined('state')) define('state', 'state');
if (!defined('opened')) define('opened', 'opened');
$Node_Open_Array = array(opened=>"false");
$Generated_Node = array(id=> $Element_ID, text=>$Element_Name, type=>"folder", Child_Of=>$Child_Of, children=>$Child_Nodes, state=>$Node_Open_Array);
return $Generated_Node;
}
function Return_Files($Child_Array) {
$All_Nodes = array();
foreach ($Child_Array as $Current_Child_Element) {
$Element_ID = $Current_Child_Element['Reference'];
$Element_Name = $Current_Child_Element['Name'];
if ($Current_Child_Element['Status'] == "AVAILABLE") {
$DisabledState = "false";
} else if ($Current_Child_Element['Status'] == "UNAVAILABLE") {
$DisabledState = "true";
}
if ($Current_Child_Element['File_Type'] == "PDF") {
$Icon = "fa fa-file-pdf-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "ZIP") {
$Icon = "fa fa-file-zip-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "JPG" || $Current_Child_Element['File_Type'] == "PNG") {
$Icon = "fa fa-file-picture-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "XLS" || $Current_Child_Element['File_Type'] == "XLSX") {
$Icon = "fa fa-file-excel-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "DOC" || $Current_Child_Element['File_Type'] == "DOCX") {
$Icon = "fa fa-file-word-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "PPT" || $Current_Child_Element['File_Type'] == "PPTX") {
$Icon = "fa fa-file-powerpoint-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "EXE") {
$Icon = "fa fa-desktop fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "AVI" || $Current_Child_Element['File_Type'] == "MP4") {
$Icon = "fa fa-file-video-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "MP3" || $Current_Child_Element['File_Type'] == "WAV") {
$Icon = "fa fa-file-sound-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "TXT") {
$Icon = "fa fa-file-text-o fa-lg text-inverse";
} else if ($Current_Child_Element['File_Type'] == "HEX" || $Current_Child_Element['File_Type'] == "BIN") {
$Icon = "fa fa-file-code-o fa-lg text-inverse";
} else {
$Icon = "fa fa-file fa-lg text-inverse";
}
$Generated_Node = Generate_File_Node($Element_ID,$Element_Name,$Icon,$DisabledState);
if (is_array($Generated_Node) == true) {
if (!empty($Generated_Node)) {
array_push($All_Nodes, $Generated_Node);
}
}
}
return $All_Nodes;
}
function Generate_File_Node($Element_ID,$Element_Name,$Icon,$DisabledState) {
if (!defined('id')) define('id', 'id');
if (!defined('text')) define('text', 'text');
if (!defined('type')) define('type', 'type');
if (!defined('icon')) define('icon', 'icon');
if (!defined('state')) define('state', 'state');
if (!defined('opened')) define('opened', 'opened');
$Node_Open_Array = array(opened=>$DisabledState);
$Generated_Node = array(id=> $Element_ID, text=>$Element_Name, type=>"file", icon=>$Icon, state=>$Node_Open_Array);
return $Generated_Node;
}
?>
</body>
</html>
答案 3 :(得分:0)
对于任何希望使用此解决方案的人,下面是JStree初始化指令的链接,下面是我用来填充树的代码:
<强>初始化:强> https://www.jstree.com/docs/config/
注意 - 请务必查看插件并修改初始化代码以包含这些插件。值得庆幸的是,我购买的网站模板带有JSTree和所有相关插件的自定义主题。
function Generate_Downloads_TreeView() {
var FunctionToRun = "Request_Download_Tree";
var http = $.ajax({
type: "POST",
url: "controller.php",
dataType: "json",
data: {
FunctionToRun: FunctionToRun
}
});
http.done(function(data, textStatus, jQxhr) {
$('#jstree-default').jstree({
"core": {
'data': data,
},
"types": {
"default": { "icon": "fa fa-folder text-warning fa-lg" },
"file": { "icon": "fa fa-file text-warning fa-lg" }
},
"plugins": [ "dnd", "state", "types" ]
});
});
这是工作的树: enter image description here
再次感谢@sscotti!