備忘録的な @7wk

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

fuel-nestedsetsを試す。の続き。

昨日は動作確認ができたので、
続けて実用ができるように進めていきます。

まずツリー構造全体を確認したいと思いますが、
READMEを見る限りそれっぽいメソッド名は見つかりません。
コードを読むより書いた方が早いので
確認できるよう下記のコードを書きます。

<?php
$tree = \Model\Tree::forge();
// ツリーの最上位のリストを取得
$parents = $tree->find('all', array('where'=>array('left_id'=>1)));
foreach ($parents as $parent)
{
	echo $parent->tree_get_root()->tree_dump_as_html(array('id'), false);
}

昨日作ったプログラムを2回実行した後、
これを実行すると下記のような結果が表示されます。

1
    2
        3
        4
5
    6
        7
        8


次に、現在はIDのみを表示しているので
名前を付けたいと思います。

とその前に、treesなんてテーブル名を付けてしまったため
idとtree_idがわかりにくいです。
なので名称を変更します。
ツリー構造で思いつくのがカテゴリ管理なので、
categoriesにします。
そしてカテゴリ名を保存する為、
nameフィールドを追加して適当に名前を付けます。

RENAME TABLE  `trees` TO  `categories`;
ALTER TABLE  `categories` ADD  `name` VARCHAR( 24 ) NOT NULL AFTER  `id`;
UPDATE `categories` SET `name` = 'ルート1' WHERE `categories`.`id` =1;
UPDATE `categories` SET `name` = 'カテゴリ1' WHERE `categories`.`id` =2;
UPDATE `categories` SET `name` = 'サブカテゴリ1' WHERE `categories`.`id` =3;
UPDATE `categories` SET `name` = 'サブカテゴリ2' WHERE `categories`.`id` =4;
UPDATE `categories` SET `name` = 'ルート2' WHERE `categories`.`id` =5;
UPDATE `categories` SET `name` = 'カテゴリ2' WHERE `categories`.`id` =6;
UPDATE `categories` SET `name` = 'サブカテゴリ3' WHERE `categories`.`id` =7;
UPDATE `categories` SET `name` = 'サブカテゴリ4' WHERE `categories`.`id` =8;

モデルも同時に修正します。
今回はnameを追加したので
title_fieldにnameを設定です。

<?php

namespace Model;

class Category 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'    => 'name',           // 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?
    );

}


ツリー構造を確認するのに
tree_dump_as_htmlのIDを設定している配列にnameを追加します。
これで下記のようになります。

1 "ルート1"
    2 "カテゴリ1"
        3 "サブカテゴリ1"
        4 "サブカテゴリ2"
5 "ルート2"
    6 "カテゴリ2"
        7 "サブカテゴリ3"
        8 "サブカテゴリ4"


最後にテンプレート側で使えるようにし、
tree_dump_as_htmlと同等の表示をします。

コントローラーを下記のように修正。

<?php
\Package::load('fuel-nestedsets');
$tree = \Model\Category::forge();
$parents = $tree->find('all', array('where'=>array('left_id'=>1)));
$categories = array();
foreach ($parents as $parent)
{
	$categories[] = $parent->tree_get_root()->tree_dump_as_array(array(), false);
}

return \Response::forge(\View::forge('member/category.html', array('categories' => $categories)));

テンプレートを作成。
自分の場合はtwigを使っているので下記のようになっています。

{% extends "layout.html" %}

{% block content %}
		{% for tree in categories %}
			{% for category in tree %}
				{% for i in 0..category._level_ %}  {% endfor %}
				{{ category.id }}:{{ category.name }}<br />
			{% endfor %}
		{% endfor %}
{% endblock %}

それでアクセスすると

  	 1:ルート1
    	 2:カテゴリ1
      	 3:サブカテゴリ1
      	 4:サブカテゴリ2
  	 5:ルート2
    	 6:カテゴリ2
      	 7:サブカテゴリ3
      	 8:サブカテゴリ4

こんな感じで表示されます。

あとは追加・修正・削除・移動を実装すればいいのですが、
これは既存のメソッドをラップするだけで可能すね。

というわけで今日はここまで。
次回は別の事書く予定です。