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 でカウントする扱いに、ヒントがありそうです。