読者です 読者をやめる 読者になる 読者になる

FuelPHP TreeOrm Packageをより使えるようにした

FuelPHP Tree

前回に作成した、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が一番若いノード、ほぼルートノード)となります

今後の予定・改良点など

まずテストケースを作らなければならない…
しかしながら、どうすればいいか検討がつきません…