是否可以使用PHP构建可折叠的树视图列表(没有JS)

我有两个功能,一起在我的网站上建立一个树视图列表.它基于递归,允许构建具有无限数量节点的树视图.

但我无法让它折叠起来.例如:脚本应该确定是否$_GET [‘node’] == $node_id,如果是,则显示(展开)块元素及其所有父元素.所以,我需要将顶部的“显示”参数传递给根.

东西是$display和$display2 vars.

>我有一个经典的数据库表,有三列(id,parent_id,name).根节点没有填充parent_id字段.
> hrefs只链接到GET参数. GET参数表示节点号.

我只需要根据我选择的节点工作的这种折叠技术.

更新:
好的,有一个完整和纯化的信息.
我创建了一个PHP文件,使用数据库,只包含一个表.只是为了解问题:

1我使用sqlite3数据库格式.这是数据库转储:


        # 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这是一个处理数据库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,$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>

解决方法

这是一个快速解决您的问题的方法,保持相同的HTML只需用以下代码替换您的PHP.

function get_children($db,$parent_id) {
    $res = $db->query("SELECT * FROM groups WHERE parent_id='$parent_id'");
    if (!$res) return array();

    $out = array();
    while ($row = $res->fetchArray(sqlite3_ASSOC)) $out[$row['id']] = $row;
    return $out;
}

function get_parent_id($db,$node_id) {
    return $db->querySingle("SELECT parent_id FROM groups WHERE id='$node_id'");
}

function get_menu($db,$node_id) {
    $menu = get_children($db,$node_id);
    while (($parent_id = get_parent_id($db,$node_id)) !== null) {
        $temp = get_children($db,$parent_id);
        $temp[$node_id]['children'] = $menu;
        $menu = $temp;
        $node_id = $parent_id;
    }
    return $menu;
}

function build_html(array $menu) {
    $str = '';
    foreach ($menu as $id => $item) {
        $str .= sprintf('<li><a href="?node=%s">%s</a></li>',$id,$item['name']);
        if (isset($item['children']))
            $str .= build_html($item['children']);
    }
    return "<ul>$str</ul>";
}

function build_catalog($db) {
    $menu = get_menu($db,isset($_GET['node']) ? intval($_GET['node']) : '');
    return build_html($menu);
}

如果您的“组”表非常小,则可以真正优化此代码.一个想法是获取$groups数组中的所有记录并构建parent_id索引.然后,目录的构建将变得更加容易.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...