TagsPluginの導入
CakeDC様配布の、CakePHP用タグ付けプラグイン TagsPluginを導入しました。
http://cakedc.com/downloads/view/cakephp_tags_plugin
導入時のトラブルや、実際の挙動、そしてタグ削除・タグクラウドを表示する際の疑問点などがあるので、それらについて記載します。
導入
導入方法は以下を参考にしました
http://sonnygauran.co.cc/blog/2010/03/28/cakephp-tags-plugin-documentation/
ただし、書いてある通りに cake schemaを実行すると、エラーになりました。
[cake@cake databank]$ cake/console/cake schema create app -plugin tags
Welcome to CakePHP v1.3.6 Console
- -
App : app
Path: /hogehoge/databank/app
- -
Cake Schema Shell
- -
/hogehoge/databank/app/plugins/tags/config/schema/app.php could not be loaded
正解は、以下の通り。
plugins/tags/config/schema/以下にあるスキーマファイル名は、「tags.php」なので、上記「app」を「tags」に変えて行います。
あと、実際の実行前に、 -dryをつけて動作確認してみます。
[cake@cake databank]$ cake/console/cake schema create tags -plugin tags -dry
Creating table(s).
Dry run for tagged :
CREATE TABLE `tagged` (
`id` varchar(36) NOT NULL,
`foreign_key` varchar(36) NOT NULL,
`tag_id` varchar(36) NOT NULL,
`model` varchar(255) NOT NULL,
`language` varchar(6) DEFAULT NULL,
`times_tagged` int(11) DEFAULT 1 NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL, PRIMARY KEY (`id`),
UNIQUE KEY `UNIQUE_TAGGING` (`model`, `foreign_key`, `tag_id`, `language`),
KEY `INDEX_TAGGED` (`model`),
KEY `INDEX_LANGUAGE` (`language`)) ;
Dry run for tags :
CREATE TABLE `tags` (
`id` varchar(36) NOT NULL,
`identifier` varchar(30) DEFAULT NULL,
`name` varchar(30) NOT NULL,
`keyname` varchar(30) NOT NULL,
`weight` int(2) DEFAULT 0 NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL, PRIMARY KEY (`id`),
UNIQUE KEY `UNIQUE_TAG` (`identifier`, `keyname`)) ;
End create.
-dryをはずして実行すると、taggedおよびtagsテーブルが生成されます。
モデル・ビューへの改修は、参考URL記載通りでOK。
ただし、モデルの関連付けをcontain設定やbindModelで定義している場合は、そこにTagを追加する必要があります。
$contain = array( 'User', (中略) + 'Tag', );
TagsPluginにはCRUD機能が一通り付属しているので、登録済みのタグを
http://hogehoge/admin/tags/
のURLで、参照・操作できます。
(ただし、フル機能はadmin側のみ。一般ユーザ側はindex,viewのみ)
多言語化対応ファイルの中に日本語設定は無いので、日本語表示は自作の必要があります。
データの構造
実際に保存されているデータは、以下のような感じです。
例:ID=62のCharacterに「高校生」というタグを設定
mysql> SELECT * FROM tagged\G *************************** 1. row *************************** id: 4d39436c-6954-4ff8-ade1-0a73c0a80b08 foreign_key: 62 tag_id: 4d39436c-16cc-4b84-86d4-0a73c0a80b08 model: Character language: jpn times_tagged: 1 created: 2011-01-21 17:27:24 modified: 2011-01-21 17:27:24 mysql> SELECT * FROM tags\G *************************** 1. row *************************** id: 4d39436c-16cc-4b84-86d4-0a73c0a80b08 identifier: name: 高校生 keyname: 高校生 weight: 0 created: 2011-01-21 17:27:24 modified: 2011-01-21 17:27:24
指定のモデル⇔tagged⇔tags という形で関連付けされています。
複数のデータに同じタグが登録されると、tagsの1つのデータに関連するtaggedが複数生成されます。
ID=62, 51のCharacterに「高校生」とタグ付け
mysql> SELECT * FROM tagged\G *************************** 1. row *************************** id: 4d39436c-6954-4ff8-ade1-0a73c0a80b08 foreign_key: 62 tag_id: 4d39436c-16cc-4b84-86d4-0a73c0a80b08 model: Character language: jpn times_tagged: 1 created: 2011-01-21 17:27:24 modified: 2011-01-21 17:27:24 *************************** 5. row *************************** id: 4d3968f9-fec0-48d9-aaaa-0a71c0a80b08 foreign_key: 51 tag_id: 4d39436c-16cc-4b84-86d4-0a73c0a80b08 model: Character language: jpn times_tagged: 1 created: 2011-01-21 20:07:37 modified: 2011-01-21 20:07:37
異なるモデルで同じタグをつけた場合も、tagged.modelの内容が変わるだけで、ほぼ同じです。
不明点1:タグ削除の方法
上記で触れましたが、deleteアクションは管理側にしかありません。
複数のタグを指定していた場合、編集時に消して送信すれば消えるのですが、最後の一個が消せません。空欄で送信すると、編集なし・送信前の値そのままになります。
空欄送信時処理の改修がいりそうです。
不明点2:タグクラウド生成関連
TagsPluginにはtag_croudヘルパーが付属しており、display()によりタグクラウドの出力が可能です。
ただ、タグクラウドに良くある「人気のタグを大きく表示する」機能を使うには、何か追加がいるようです。
なぜかというと、文字サイズを決めるのはtags.weightの値のようなのですが、このwidthを更新する処理系が、見当たりません・・・
cloneか何かで、使用環境に合わせて適宜更新しろ、という意図なのかと推測しています。
また、似たような項目に、tagged.times_taggedというカラムがあるのですが、
こちらはもっと、謎項目です・・・
タグ数をカウントするなら、tagged.tag_idでGROUPしてカウントすれば良いだけのこと。
根本的に、times_taggedを記録して、何に使うものなのか、目的が不明です。
times_taggedを更新するには、
・TaggableビヘイビアのtaggedCounterをtrueにして
・automaticTaggingをfalseにして、タグ保存saveTags()を逐次行い
・その際、第4引数を$update=falseにする
$update=false でカウントする扱いに、ヒントがありそうです。