「チュートリアルで作成したブログにタグ機能を実装するチュートリアル」をcakePHP2.0でやってみた。

元ネタはこれ。チュートリアルで作成したブログにタグ機能を実装するチュートリアル – 「最果て」の支部

cakePHPを最近触りだしたのですが、巷にcakePHP1系の情報があふれているのでなかなか大変な今日この頃です。

とりあえず、cakePHP2.0のブログチュートリアルにタグ機能を実装してみました。

やっていることは元ネタと変わらないので、そちらを読みつつやっていければと思います。

テーブルの作成

タグ機能みたいな、複数の値と複数の値を関連づけるような機能(この場合だと複数の記事が一つのタグに所属する&複数のタグが一つの記事に所属する)は、一筋縄ではいかないようです。投稿を管理するテーブルにタグを管理するフィールドを作って、タグのテーブルにもその逆を作って、そこにカンマ区切りとかjsonとかで・・・・とか、どう考えても無茶が過ぎるし、SQLで対処できなくなりますよね。

なので、タグと投稿を関連づけるための別のテーブルを用意します。WordPressだと、term_relationshipsっていうテーブルが有るのですが、それと同じ事をやろうというわけ。

それをcakePHPではhasAndBelongsToMany通称HABTMと言う機能で実装できるようです。

なので、まずその二つのテーブルを作成します。

HABTMのテーブル名は、関連づけるテーブル1_テーブル2、フィールド名も、テーブル1の単数形_idで作成するようにと規約にあるようなので、その方がベターだと思われます。

モデルの作成

Tag.phpをModelディレクトリ内に作成します。
この中にタグの追加、編集などを行うメソッド(parseTags)を定義します。これをコントローラーで呼ぶ訳ですね。

$hasAndBelongsToMany繋ぐテーブルを定義します。
結合とかはこれだけで勝手にやってくれる模様。

次いで、Post.php。
$hasAndBelongsToManyを定義するのは一緒。
Tag.phpでは書いてあった、’foreignKey’と’associationForeignKey’が書いてません。ただ、デフォルト値でforeignKeyは現在のモデル名_id,associationForteignKeyは外部モデル名_idになるようですので問題ないようです。
ここで、findAllByTagsというデータベースからあるタグがついた記事のデータを持ってくるメソッドと、それの数を数えるfindCountByTagsというメソッドの二つを用意します。

コントローラーの作成、編集

PostController.phpでは、
まず、add,editにタグを追加、編集する機能を追加。元記事では、$this->dataとなっていますが、cakePHP2.0の場合は$this->request->dataとしないとエラーになります。なりました。

そして、tagアクションの追加。ここで、先ほどPostモデルで作ったメソッドが使われるわけですね。

Viewの編集

とりあえず、add.ctpとedit.ctpにタグ用のテキストボックスを追加。

edit.ctpはこんな感じ。add.ctpは省略。

ここまででちゃんと動くはず!

タグクラウドの作成

ここではタグクラウドをTagsController.phpに作成です。タグクラウド(゚⊿゚)イラネって人は別に作らないでいいと思います。

んで、View/Tags/tagcloudbox.ctpを作成

ここでは普通にViewにしてありますが、エレメントにしてあげて、他のViewから呼んであげるとかの使い方が良さそうです。

とりあえず何とかcakePHP2.0で実装できました。
ちょっとできる人になった気分!笑
まぁ、タグって結構需要はあると思うので、こんな感じで実装できました!ってだけのエントリーなんですけどね。

posts/tag/tag1/tag2/tag3
みたいな絞り込みもできるようです。

ただ、この元ネタのcheesecake-photoblogのライセンスはGPLv2ですので、当然このエントリーのコードもGPLv2です。使う際はご注意下さい。