test

CakePHP Note

Treeビヘイビア

UPDATE:2010.01.05

木構造のような階層構造を扱うためのビヘイビア。入れ子集合モデルにparent_idを加えた仕組みになっています。(parent_idを加える事でデータは若干冗長になります)
入れ子集合モデルについてはSQLで木と階層構造のデータを扱う(1)―― 入れ子集合モデルで詳しい解説を読む事が出来ます。

Treeビヘイビアを使う準備

Treeビヘイビアを使用するには使用するテーブルに指定のフィールドが存在している必要があります。

  • id
  • parent_id
  • lft
  • rght

lftやrghtフィールドはビヘイビアが面倒を見てくれますので意識する必要はほとんどありません。

CREATE TABLE categories (
	id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	parent_id INTEGER(10) DEFAULT NULL,
	lft INTEGER(10) DEFAULT NULL,
	rght INTEGER(10) DEFAULT NULL,
	name VARCHAR(255) DEFAULT '',
	PRIMARY KEY  (id)
);

Treeビヘイビアを使う

Treeビヘイビアを使うにはモデル内でビヘイビアを使うよう$actsAs属性に'Tree'をセットします。配列になっているのは複数のビヘイビアを指定出来るためです。

    var $actsAs = array('Tree');

ノードの追加/編集/削除

ビヘイビアのメソッドを直接使う必要はありません。モデルのsaveメソッドやdeleteメソッドを使用します。ただしsaveメソッドを使う時はparent_idに親ノードのIDを指定する事を忘れないで下さい。

主なメソッド

  • children( $id = NULL, $direct = false, $fields = NULL, $order = NULL, $limit = NULL, $page = 1, $recursive = NULL )
  • childCount($id = NULL, $direct = false )
  • generatetreelist( $id = NULL, $direct = false, $fields = NULL, $order = NULL, $limit = NULL, $page = 1, $recursive = NULL )
  • getparentnode($id,$fields = NULL, $recursive = NULL )
  • getpath($id,$fields = NULL, $recursive = NULL )
  • reorder($options)

childCount($id = NULL, $direct = false )

子孫ノードの数を取得します。第2引数をtrueにすると直下の子ノードのみの数になります。

getpath($id,$fields = NULL, $recursive = NULL )

ルートからのパスを配列で取得します。

reorder($options)

子要素の並び順を変更します。
$options['id']
$options['field'] フィールド名。デフォルトはdisplayFieldで指定したフィールド(nameやtitle)。
$options['order'] ソート順の指定、'DESC' または 'ASC'。デフォルトは'ASC'。
$options['verify'] 整合性チェック。デフォルトは'true'。

その他のメソッド

  • recover
  • verify


パスからノードを特定する

Treeビヘイビアにはパスを使ってノードを特定するためのメソッドがありません。AclNodeクラスのNodeメソッドの実装が参考になります。