備忘録的な @7wk

phpとjavascript系をメインに扱っていく予定。

fuel-nestedsetsを試す。

認証周りの記事が下書きにあるけれど、
原因不明のまま動作しなかったのでお蔵入り。
んで、最近は誰かが作ったpackageを色々試している感じです。


そして今回はツリー構造の実装のNestedSetモデルを試します。
NestedSetモデルは自分で作ると割りと面倒なので
githubで誰かが作っていると思われるので検索します。
単純に「fuelphp nestedset」で検索して最初に引っかかったものを使う事にしました。
こちらです→fuel-nestedsets


さて導入。
pakageを導入する時はいつもsubmodule addです。
submoduleを一気にアップデートした時
何かが変わってると動かなくなるけどその時は頑張って修正です。

$ git submodule add https://github.com/WanWizard/fuel-nestedsets.git fuel/packages/fuel-nestedsets

これで導入は完了です。

あとはreadmeに合わせて進めます。

まずはテーブルを作成します。

CREATE TABLE IF NOT EXISTS `trees` (
  `id` int(9) unsigned NOT NULL AUTO_INCREMENT,
  `left_id` int(9) unsigned NOT NULL,
  `right_id` int(9) unsigned NOT NULL,
  `tree_id` int(9) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `left_id` (`left_id`),        # optional, might speed up certain lookups
  KEY `right_id` (`right_id`)      # optional, might speed up certain lookups
)

Treeモデルの作成
tree_valueはnull不可なので0をデフォルトにしておくといいかもです?

fuel/app/classes/model/tree.php

<?php

namespace Model;

class Tree extends \Nestedsets\Model {
    public static $tree = array(
        'left_field'     => 'left_id',      // name of the tree node left index field
        'right_field'    => 'right_id',     // name of the tree node right index field
        'tree_field'     => 'tree_id',           // name of the tree node tree index field
        'tree_value'     => 0,           // value of the selected tree index
        'title_field'    => null,           // value of the tree node title field
        'symlink_field'  => 'symlink_id',   // name of the tree node tree index field
        'use_symlinks'   => false,          // use tree symlinks?
    );
}

controllerの作成

<?php
	public function action_tree()
	{
		\Package::load('fuel-nestedsets');
		$tree = \Model\Tree::forge();
		$tree->tree_new_root();

		// 新しいtreeを作成
		$tree->tree_new_root();

		$child1 = \Model\Tree::forge();
		$child2 = \Model\Tree::forge();
		$child3 = \Model\Tree::forge();

		// 子供
		$child1->tree_new_first_child_of($tree);
		// 孫
		$child2->tree_new_last_child_of($child1);
		$child3->tree_new_next_sibling_of($child2);

		echo $child3->tree_get_root()->tree_dump_as_html(array('id'), false);
	}


これでうまくいけば↓な感じのツリーができているはずです。数字はtreesのidです。

1─2┬3
   └4

以上、今日はここまで。