Cakephpでカテゴリ
Webサイトにはカテゴリという概念がほぼ必須になっている。サイトという上位となる概念の下にカテゴリを用意し、webサイトを階層化するために用いられるのがカテゴリかなと思っている。Cakephpなら、そのカテゴリを簡単に導入することができる。具体的には、Cakephpのtreeビヘイビアを用いる。wordpressでカテゴリを設定するほど簡単というわけにはいかないが、treeビヘイビアを利用し開発者がその思想を理解すれば効率的にカテゴリ導入のプロセスを進めることが可能になる。
サイトをカテゴリ化するにあたって考え方というか重要な視点を以下にあげておきたい。
・カテゴリ管理系
・カテゴリ取得系
カテゴリに関して、上の2系統を開発する必要がある。
管理系というのは、カテゴリを登録・編集・削除する機能で、取得系とはカテゴリ情報を意図するデータ構造で取得するための機能である。Cakephpのtreeビヘイビアでは、この管理系と取得系双方を効率的に利用するためのメソッドが備わっているので、開発者はそれらを利用して効率よくカテゴリをサイトに導入することができる。
TreeBehavior
treeビヘイビアの公式ドキュメントは以下のURLで確認可能。
http://book.cakephp.org/2.0/en/core-libraries/behaviors/tree.html
このドキュメントでは、以下の要領で説明がなされている。
1.カテゴリ専用テーブルの構築
2.管理系メソッドの紹介
3.取得系メソッドの紹介
実際には、4と5の説明もあるが、主要な項目は上の3項目で、これらを認識できればCakephpでサイトにカテゴリを導入するイメージは掴める。今回のエントリーでは、上の1と3について書いてみようと思う。2の管理系については、別の機会に再度エントリーできればと考えている。
利用方法
公式ドキュメントでは以下のテーブルを用意することになっている。
CREATE TABLE categories ( id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT, parent_id INTEGER(10) DEFAULT NULL, lft INTEGER(10) DEFAULT NULL, rght INTEGER(10) DEFAULT NULL, name VARCHAR(255) DEFAULT '', PRIMARY KEY (id) );
この中でTreeBehavior的に必須のカラムは、parent_id、lft、そしてrghtとなっている。これらのカラムの値を利用してカテゴリツリーを構築することになっている。また、TreeBehaviorの管理系メソッドを利用してカテゴリデータを投入すれば、上の3つのデータは自動で登録されるようになっている。公式ドキュメントにはcreateだけでなくinsertのsqlも用意されているので、それらのデータでテーブルを用意すれば、取得系メソッドを実際に試してみることができる。
TreeBehaviorを利用するには以下のようにモデル内でactsAsクラス変数を利用して宣言しておくことが前提です。
class Category extends AppModel { public $actsAs = array('Tree'); }
データベースとactsas宣言がなされていれば、コントローラ側から取得系メソッドを実行してデータを取得することができます。
階層データではなく、リスト化したフラットなデータ構造の取得には、generateTreeListが利用できます。フォームのドロップダウンリストの構築に便利な機能です。
$this->Category->generateTreeList(null, null, null, '>');
掲示板のスレッドやコメントツリーなどの構築には、find(‘threaded’)が便利です。
$this->Category->find('threaded');
フラットな構造ではなく、階層化されたデータ構造でデータが返されるので、どのコメントにレスが付いたのかを表現する際に便利です。
カテゴリパスを取得することも出来ます。
$this->Category->getPath($id);
getPathメソッドを利用すれば、引数で指定したカテゴリの上位カテゴリがフラットな構造で返されます。webサイトのパンくずリストを構築する際に便利なメソッドです。
Cakephpのtreeビヘイビアはサイトの開発に必須と考えてもよいでしょう。Cakephpを使うのであれば慣れておきたいビヘイビアです。