FuelPHP TreeOrm Packageをより使えるようにした
前回に作成した、FuelPHPでもTree Behaviorをより使えるように改良しました。
準備
設置
次の位置においてください
FuelPHP TreeOrm Package
/fuel/packages/treeorm
指定のフィールドの確認
使用するテーブルに以下のフィールドが必要です
`id` int unsigned NOT NULL auto_increment, `parent_id` int unsigned default '0', `lft` int(10) default '0', `rght` int(10) default '0', PRIMARY KEY (`id`)
config.phpを編集
treeormとormをAPPPATH/config/config.php の always_load の部分に追加します
return array( 'always_load' => array( 'packages' => array( 'orm', // 追加 'treeorm', // 追加 ), ) );
モデル毎の設定
該当のモデルにovserversの追加
use Orm\Model; class Model_Testtree extends Model { protected static $_properties = array( 'lft', 'rght', 'parent_id', ); protected static $_observers = array( 'TreeOrm\\Observer_Tree' => array( 'events' => array('before_save','before_delete'), 'property' => array( 'left' => 'lft', 'right' => 'rght', 'parent_id' => 'parent_id', 'id' => 'id') ), ); }
これで、とりあえず使えます
ここまでは前回とほぼ一緒
もし、propertyがなかった場合、上記の値がデフォルトとなります。
基本的な使い方
ノードの追加・編集・削除
モデルのsaveメソッドを呼び出したときに自動でlft,rghtに値がセットされます。
モデルのdeleteメソッドを呼び出したときには、子ノードも含め全て削除されます。
ただし、必ずparent_idを指定して下さい。(ルートノードのparent_idには0もしくはNULLを指定)
なお、ルートノードは1つだけ作成できます
メソッドの呼び出し方法
controller等から
TreeOrm\Tree::forge('モデル名')->メソッド名();
または、
$data = モデル::find($id); TreeOrm\Tree::forge($data)->メソッド名();
メソッド一覧
change( $id1 = null, $id2 = null)
ノードの入れ替え
$id1 対象ノード1のキー
$id2 対象ノード2のキー
返り値 成功したかどうか
childCount( $id = null, $direct = false)
子ノード数の取得をします
$id キー・falseを指定した場合ルートノード、nullを指定した場合インスタンスのノードを示します
$direct 直下の子のみを対象とするか。直下の子のみならばTRUE、子要素全て取得ならばFALSE
元のノードが存在していれば子ノード数、存在していなければfalseを返す
children( $id = null, $direct = false, $orderColumn = null, $orderDirection = null, $limit = null)
子ノードの取得をします
$id キー・falseを指定した場合ルートノード、nullを指定した場合インスタンスのノードを示します
$direct 直下の子のみを対象とするか。直下の子のみならばTRUE、子要素全て取得ならばFALSE
$orderColumn ソートカラム名
$orderDirection ソート順の指定、'DESC' または 'ASC'。デフォルトは'ASC'。
$limit 取得最大数
元のノードが存在していれば子ノードの配列、存在していなければfalseを返します
getParentNode( $id = null)
親ノードの取得をします
$id キー・nullを指定した場合インスタンスのノードを示します
親ノードが存在していれば親ノードの配列、存在していなければfalseを返します
getPath( $id = null)
パスの取得をします
$id キー・nullを指定した場合インスタンスのノードを示します
ノードが存在していればルートから順番に配列として、存在していなければfalseを返します
moveDown( $id = null, $number = 1)
ノードの階層を変えずに位置を下げる
$id キー・nullを指定した場合インスタンスのノードを示します
$number 移動回数、TRUEを指定した場合、端まで移動
moveUp( $id = null, $number = 1)
ノードの階層を変えずに位置を上げる
$id キー・nullを指定した場合インスタンスのノードを示します
$number 移動回数、TRUEを指定した場合、端まで移動
reorder( $id = null, $field = null, $order = 'ASC')
ノードの再配置を行います。lft、rghtが未設定の場合はparent_idに基づき自動的に設定します。
初期データを登録するときなどに使用して下さい。
$id キー・falseを指定した場合ルートノード、nullを指定した場合インスタンスのノードを示します
$orderColumn ソートカラム名
$orderDirection ソート順の指定、'DESC' または 'ASC'。デフォルトは'ASC'。
reset()
ノードの添字振りなおしを行います。
ノードの削除などで添え字が連続しなくなったときに使用して下さい。
注意事項
モデル名でメソッドの呼び出しを行った場合、現在位置は一番最初に見つかったノード(通常はidが一番若いノード、ほぼルートノード)となります
今後の予定・改良点など
まずテストケースを作らなければならない…
しかしながら、どうすればいいか検討がつきません…