artnv/tree-builder

邻接表

0.2 2019-01-17 21:17 UTC

This package is auto-updated.

Last update: 2024-09-18 19:33:43 UTC


README

php v0.2
js  v0.1.1

用于构建嵌套列表(邻接表)的库。可以用于创建菜单、分类列表、嵌套评论、面包屑导航等。

功能

  • 嵌套级别无限制
  • 数组中的元素可以不连续,即子元素可以位于父元素之上或之下
  • 库提供两种版本,PHP和JavaScript

示例: https://artnv.github.io/tree-builder/index.html
更多示例在 /php/ 目录中

安装

通过Composer

composer require artnv/tree-builder

或者

"artnv/tree-builder": "^0.2"

在文件 composer.json 中 require 部分添加

PHP

$tb = TreeBuilder::create($dataArr, null, null, false);
// create($inputArr, $aliases = null, $userParams = [], $sort_enabled = true);

构建树的输入数据
必填字段: idparenttitleposition(如果使用排序)

$dataArr[] = [
    'id' => 1
    'parent_id' => 0
    'img' => '123.jpg'
    'name' => 'Category #1'
    'keywords' => ''
    'description' => ''
    'position' => 2
];

别名
来自不同源的数据字段名称不同,为了不更改它们,只需将它们作为值指定为键。
如果未传递别名作为参数,则使用默认值

$aliases = [
    'id' => 'id',
    'parent' => 'parent',
    'title' => 'title',
    'child' => 'child',
    'position' => 'position',
];

用户参数
将在 rootNode 和 childNode 模板方法中可用

$userParams = [];

排序

$sort_enabled = true;

默认为 true。为了使排序工作,数组中必须有键 ['position'],如果没有,则禁用排序。
对于每个只有一个父元素的节点 ['parent_id'],位置从0开始,按数字从大到小排序。

树的格式化模板
目录中已有现成的示例 HtmlTree.phpSelectTree.php,如果您需要自定义模板,则从 TreeBuilder 继承并实现接口 TreeBuilderInterface,该接口有两个方法

子节点

childNode($item, $childNodes, $aliases, $nestingLevel, $userParams);
  • $item - 当前数组元素
  • $childNodes - 当前父元素的子节点
  • $aliases - 别名
  • $nestingLevel - 嵌套级别(基于此值可以添加用于视觉格式化的线条)
  • $userParams - 用户参数

根节点

rootNode($nodes, $firstStart, $userParams);
  • $nodes - 这是 childNode() 返回的数据
  • $firstStart - true,在首次启动时
  • $userParams - 用户参数

使用示例

$node_1 = ['parent' => 24];
$node_2 = ['id' => 888];
  • $tb->getTree() - 返回关联数组
  • $tb->showTree() - 根据模板返回 html 树
  • $tb->getParents($node_1) - 返回包含父节点链的关联数组,类似于“面包屑”
  • $tb->getChilds($node_2) - 返回特定节点的后代的关联数组

JavaScript

  • var tb = new TreeBuilder(); - 调用构造函数
  • tb.setData(data); - 设置包含数据数组的对象
  • tb.getTree(); - 返回新的对象数组
  • tb.showTree(); - 根据对象数组创建格式为 html(ul -> li)的树
    tb = new TreeBuilder();

    tb.setData([
        {
            id        : 1,
            title     : 'Electronics',
            parent    : 0
        },    
        {
            id        : 2,
            title     : 'Audio',
            parent    : 1
        } 
    ]);

    console.log( tb.getTree() );        // array
    document.write( tb.showTree() );    // <ul><li>Electronics</li><ul><li>Audio</li></ul></ul>