定制 matperez/yii2-materialized-path 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

matperez/yii2-materialized-path

最新稳定版本:1.0.2

Composer 安装命令:

composer require matperez/yii2-materialized-path

包简介

The materialized path behavior for the Yii framework

README 文档

README

Materialized Path Tree trait for Yii2 ActiveRecord.

Installation

The preferred way to install this extension is through composer.

Either run

$ composer require matperez/yii2-materialized-path

or add

"matperez/yii2-materialized-path": "*"

to the require section of your composer.json file.

Migrations

Run the following command

$ yii migrate/create create_tree_table

Open the /path/to/migrations/m_xxxxxx_xxxxxx_create_tree_table.php file, inside the up() method add the following

$this->createTable('tree', [
    'id' => Schema::TYPE_PK,
    'name' => Schema::TYPE_STRING.' NOT NULL',
    'path' => Schema::TYPE_STRING.' NOT NULL DEFAULT \'.\'',
    'position' => Schema::TYPE_INTEGER.' NOT NULL DEFAULT 0',
    'level' => Schema::TYPE_INTEGER.' NOT NULL DEFAULT 0',
]);

Configuring

Configure model as follow:

use matperez\mp\MaterializedPathBehavior;
use matperez\mp\MaterializedPathQuery;

class Tree extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            [
                'class' => MaterializedPathBehavior::className(),
            ],
        ];
    }


    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['position', 'level'], 'integer'],
            [['path'], 'string', 'max' => 255]
        ];
    }

    /**
     * Query factory
     * @return MaterializedPathQuery
     */
    public static function find()
    {
        return new MaterializedPathQuery(get_called_class());
    }

}

Usage

Making a root node

To make a root node

$root = new Tree(['name' => 'root']);
$root->makeRoot();

The tree will look like this

- root

Appending a node as the child of another node

To prepend a node as the first child of another node

$child = new Tree(['name' => 'child']);
$child->appendTo($root);

The tree will look like this

- root
    - child

Move node up and down among siblings

$node = Tree::findOne(['name' => 'child']);
// move node up
$node->setPosition($node->position - 1);
// move node down
$node->setPosition($node->position + 1);

Getting the root nodes

To get all the root nodes

$roots = Tree::find()->roots()->all();

Getting children of a node

To get all the children of a node

$root = Tree::find()->roots()->one();
foreach($root->children as $child) {
    foreach($child->children as $subchild) {
        // do the things with a subchild    
    }
}

Getting parents of a node

To get all the parents of a node

$node = Tree::findOne(['name' => 'child']);
$parents = Tree::find()->andWhere(['id' => $node->parentIds])->all();

To get the first parent of a node

$node = Tree::findOne(['name' => 'child']);
$parent = $node->parent();

Delete node with children

To delete node with children

$node->delete();

Testing


    ./vendor/bin/codeception build
    ./vendor/bin/codeception run unit
    

Todo

more tests, mode examples

统计信息

  • 总下载量: 3k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 5
  • 点击次数: 0
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 5
  • Watchers: 4
  • Forks: 3
  • 开发语言: PHP

其他信息

  • 授权协议: BSD-3-Clause
  • 更新时间: 2015-04-02