rde/menutree

菜单树

0.2.13 2015-06-03 07:14 UTC

README

Build Status Scrutinizer Code Quality SensioLabsInsight

安装:

{
    "require": {
        "rde/menutree": "0.2.*@dev"
    }
}
  • PHP环境需要pdo_sqlite pdo_mysql (默认驱动)
  • 将db_schema文件夹中的sql文件部署到database。
  • 默认数据载体sqlite (/src/storage/menudata.slite3) 中的数据格式(id, item_id, parent_id, depth, left, right, url_name, url),其中item_id为不可重复的唯一键,可以是字符串。如果不小心写入了重复的键,在MenuData获取数据时也会忽略重复的字符串。id为一般流水号,其他字段可填可不填。
  • 唯一需要注意的是,如果此数据为树状数据的顶层,其parent_id需要填入字符串'null'。
  • 也可以分别实现IMenuProvider & IUserProvider来使用自己的存储体。

用法:

/*
假設原始資料為:
array(
    array(
    "id" => 1,
    "item_id" => key_1,
    "parent_id" => 'null'
    "depth" => 0,
    "left" => 1,
    "right" => 2,
    "url_name" => test1,
    "url" => contorller1/method1
    ),
    array(
    "id" => 2,
    "item_id" => key_2,
    "parent_id" => key_1,
    "depth" => 1,
    "left" => 3,
    "right" => 4,
    "url_name" => test2,
    "url" => contorller2/method2
    ),
);
*/


//可自行實作使用者選單,只要最後給MenuData的過濾資料格式如下面範例即可
$pdo_mysql = new PDO('mysql:host=127.0.0.1;dbname=account','root','xxxx');
$user = new User($pdo_mysql);

//find_menu() 會用array回傳 每個item_id  ex array(key_1,key_2...)
//建構參數pdo 可選填,沒填預設會讀取src/storage/menudata.sqlite3 裡的資料
$menuOrigin = new MenuData();


$insertData = array(
    array(
        "id" => 1,
        "item_id" => key_3,
        "parent_id" => 'key_1'
        "depth" => 0,
        "left" => 1,
        "right" => 2,
        "url_name" => test3,
        "url" => contorller3/method3
        ),
);
/*
結果為
array(
    array(
    "id" => 1,
    "item_id" => key_1,
    "parent_id" => 'null'
    "depth" => 0,
    "left" => 1,
    "right" => 2,
    "url_name" => test1,
    "url" => contorller1/method1
    ),
    array(
    "id" => 1,
    "item_id" => key_3,
    "parent_id" => 'key_1'
    "depth" => 0,
    "left" => 1,
    "right" => 2,
    "url_name" => test3,
    "url" => contorller3/method3
    ),
    array(
    "id" => 2,
    "item_id" => key_2,
    "parent_id" => key_1,
    "depth" => 1,
    "left" => 3,
    "right" => 4,
    "url_name" => test2,
    "url" => contorller2/method2
    ),
);
*/
$menuOrigin->setFilter($user->find_menu())->insert(1, $insertData)->get(); 


//建構選單樹狀物件
$menutree = new MenuTree($menuOrigin); 

//可拿到完整的樹狀結構
$tree = $menutree->get(); 
/*
最後get回來的資料格式如以下:
array(
    array(
        "deep" => 0,
        "self" => array(
            "id" => 1,
            "item_id" => key_1,
            "parent_id" => 'null'
            "depth" => 0,
            "left" => 1,
            "right" => 2,
            "url_name" => test1,
            "url" => contorller1/method1
        ),
        "children" => array(
            array(
                "deep" => 2,
                "self" => array(
                    "id" => 2,
                    "item_id" => key_2,
                    "parent_id" => key_1,
                    "depth" => 1,
                    "left" => 3,
                    "right" => 4,
                    "url_name" => test2,
                    "url" => contorller2/method2
                ),
                "children" => array(),
            )
        )
    
    )
)
*/
$bool = $menutree->check("controller/method"); //可判斷此uri是否符合權限 會回傳 true false

许可

Composer遵循MIT许可协议 - 详细信息请查看LICENSE文件