私のウェブサイトにツリービューリストを作成する2つの関数があります。これは再帰に基づいており、無制限のノード数でツリービューを構築することができます。PHPを使用して折りたたみ可能なツリービューリストを作成することは可能です(JSなし)
しかし、私は折りたたむことができません。たとえば、スクリプトはかどうかを判断し、そうであれば、ブロック要素とそのすべての親を表示(展開)します。だから、私はその "表示"パラメータをルートに渡す必要があります。
事は$display
と$display2
ヴァルスです。
- 私は3つの列(id、parent_id、name)を持つ古典的なdbテーブルを持っています。ルートノードには、parent_idフィールドが入力されていません。
- hrefはGETパラメータにリンクしています。 GETパラメータはノード番号を意味します。
この折りたたみ技術は、どのノードiが選択されたかに基づいて動作する必要があります。
更新日: いいえ、完全で浄化された情報があります。 データベースを扱うphpファイルを作成しましたが、これには1つのテーブルのみが含まれています。
1私はsqlite3データベース形式を使用しています。これはDBダンプです:
# sqlite3 catalog.sqlite .dump PRAGMA foreign_keys=OFF; BEGIN TRANSACTION; CREATE TABLE groups(id INTEGER PRIMARY KEY NOT NULL, name TEXT, parent_id INTEGER); INSERT INTO "groups" VALUES(1,'root1',''); INSERT INTO "groups" VALUES(2,'root2',''); INSERT INTO "groups" VALUES(3,'root3',''); INSERT INTO "groups" VALUES(4,'root4',''); INSERT INTO "groups" VALUES(5,'sub1',1); INSERT INTO "groups" VALUES(6,'sub3',3); INSERT INTO "groups" VALUES(7,'subsub1',5); INSERT INTO "groups" VALUES(8,'subsubsub1',7); INSERT INTO "groups" VALUES(9,'subb1',1); COMMIT;
2これは、databseを扱うPHPファイルです。
<?php
$db = new SQLite3('catalog.sqlite');
function build_catalog($db){ //build roots and diggs for childnodes for every root in a loop
//$content_root="<ul id='collapsedlist'>";
$content_root = '';
$roots = $db->query('SELECT * from groups WHERE parent_id="" OR parent_id is null');
while($root = $roots->fetchArray()){
list ($content,$display)=get_children_of_node($db,$root['id']);
$content_root .= "<li id='".$root['id']."' ><a href='/?node=".$root['id']."'>".$root['name']."</a>";
$content_root .= $content;
$content_root .= "</li>\n";
}
$content_root = "<ul id='collapsedlist'>".$content_root."</ul>\n";
return $content_root;
}
function get_children_of_node($db,$node_id){
if(!isset($content)) $content = '';
$display = (isset($_GET['node']) && $_GET['node'] == $node_id)? "style='display:block'" : "style='display:none'";
$query = $db->querySingle('SELECT count(*) from groups WHERE parent_id='.$node_id);
if ($query > 0){
//$content .= "<ul class='subcategories'>\n";
$children = $db->query('SELECT * from groups WHERE parent_id =\''.$node_id.'\'');
while ($child = $children->fetchArray()){
list($content2,$display)=get_children_of_node($db,$child['id']);
$content .= "<li id='".$child['id']."' ".$display.">";
$content .= "<a href='/?node=".$child['id']."'>".$child['name']."</a>";
$content .= $content2;
$content .= "</li>\n";
}
$content = "<ul class='subcategories' ".$display.">".$content."</ul>\n";
}
return array($content,$display);
}
?>
ここで、phpファイルは、上記の純粋なHTMLで終了します。私はそれをここから別のものに分けたので、エディタはHTML + PHP構文を一度に解析できません。同じindex.phpファイルです。 HTML部分:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Collapsible Nested List</title>
</head>
<body>
<div id="sidebar">
<?=build_catalog($db);?>
</div>
</body>
</html>
親カラムは 'parent_id'と言いましたが、スクリプト全体で' parend_id'が使用されています。それが正しいと思いますか? – halfer
はい、問題ありません。 DBにテーブルを作成したのは間違いでした。とにかくドラフトです。ロジックは正常に動作していますが、私は表示に関する情報を渡す必要がありますか、上のレベルに折りたたみ可能なdinamicallyで表示するブロックを表示する。現在、すべてのノードがデフォルトとして表示されるので、すべてのサブカテゴリの非集約リストが表示されます。 – remort
私はより多くの情報を提供することができます。テーブル構造、スクリーンショットなどがあります。私は知っているので、再帰は理解するのが難しいです)) – remort