cakephp treebehaviorの使いどころ

2012年11月14日更新 view: 11 view

treebehaviorってなに?

カテゴリ付けするときに強力な威力を発揮するプラグイン。
例えば

恋愛 > 男性

程度のカテゴリ付けなら自作でも余裕だけど、

恋愛 > 男性 > 女性の口説き方 > デート > 夜景

のように

  • カテゴリが増える可能性がある
  • 多階層カテゴリ
  • カテゴリから親カテゴリを探す (デートの親カテゴリを一気に取得)

のようなカテゴリに対する処理を全てお任せできる便利なビヘイビアだ。

今回の項目

  • DBへの保存
  • DBから読み込み
  • データをjquery折りたたみ形式で表示する

までを解説する。

下準備

スポンサードリンク

treebehavior自体はcakephpに最初から入っている。
今回は category.php モデルでビヘイビアを使ってみる。

○category.php

class Category extends AppModel {
  var $actsAs = array('Tree');
}

○tree.php という名前で treehelperをダウンロードし helpers フォルダに保存

http://bakery.cakephp.org/articles/AD7six/2008/01/24/tree-helper-1

○テーブルを作成

CREATE TABLE IF NOT EXISTS `yourprefix_categories` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(10) unsigned DEFAULT '0',
  `lft` int(10) DEFAULT '0',
  `rght` int(10) DEFAULT '0',
  `name` varchar(255) DEFAULT NULL,
  `check` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=ujis AUTO_INCREMENT=22 ;



INSERT INTO `yourprefix_categories` (`id`, `parent_id`, `lft`, `rght`, `name`, `check`) VALUES
(1, 0, 1, 16, 'スマートフォン・携帯電話', 0),
(5, 1, 8, 9, 'DOCOMO', 1),
(6, 1, 10, 13, 'AU', 1),
(7, 1, 14, 15, 'SOFTBANK', 1),
(8, 6, 11, 12, 'iphone', 1),
(9, 0, 17, 36, '恋愛', 0),
(10, 0, 37, 42, '生活', 0),
(11, 9, 18, 19, '片思い', 0),
(12, 9, 20, 21, '恋愛したい', 1),
(13, 9, 22, 35, 'モテる方法', 1),
(14, 13, 23, 28, '男性編', 1),
(15, 13, 29, 34, '女性編', 0),
(16, 14, 24, 25, '女心を理解する', 1),
(17, 14, 26, 27, '女心を理解する', 0),
(18, 15, 30, 33, '生理前', 0),
(19, 18, 31, 32, 'ウィスパー', 0),
(20, 10, 38, 39, '必需品', 1),
(21, 10, 40, 41, '器具', 1);

○表示用 category.ctp エレメントを作成
(表示する際のレイアウトはこれで整える。)

<?php

//liタグに section_{id} をつける
$tree->addItemAttribute('id', 'section_'.$data['Category']['id']);

//子要素があれば NavParentを つける
if($hasChildren)
{
  $tree->addItemAttribute('class', 'NavParent');
}

if($data['Category']['check'] == 1){
  echo '<a id="'.$data['Category']['id'].'">'.$data['Category']['name'].'</a>';
} else {
  echo '<span>'.$data['Category']['name'].'</span>';
}
?>

使い方

基礎知識

  • カテゴリを追加、削除するには何も考えずDBに save すればいい

保存

○categories_controller.php

    $this->Category->set(array('name' => '新規サブカテゴリ' , 'parent_id' => 5));
    $this->Category->save();

parent_id には 親カテゴリのIDを入れる。すると自動的に 5 のサブカテゴリになる。
無い場合は一番親カテゴリとして登録される。

表示

○categories_controller.php

$treeList = $this->Category->find('all', array('order' => 'lft ASC'));
  
   $this->set(
    compact(
     'treeList'
    )
   );

○view.ctp
(jqueryを先に読み込んでね)

<script type="text/javascript">
$(function() {
  $('.category ul ul').hide();
  $(".category .NavParent a,.category .NavParent span").click(function(){
   $(this).next("ul").slideToggle();
  });
});
</script>

<div class="category">
<?php
echo $tree->generate($treeList,array('element' => 'category','model' => 'Category'));
?>
</div>

これで表示されたカテゴリーを表示すれば、折りたたみ式のカテゴリリストができあがります。

スポンサードリンク

関連記事

関連カテゴリ