あいかわらず、カテゴリーの事に関して、頭を抱えていたりする。そうして、悩みに悩んだあげく、カテゴリーの分け方がいけないのだと閃いて(?)、いままでとはまったく違ったカテゴライズをしてみようと、早速新しいカテゴリーを幾つか作成した。そして、その新しいカテゴリーに、各エントリーを割り振って行こうと、管理画面のエントリーからその一覧を表示させてみて、はたと立ち止まった。
エントリーを複数選択して、それら選択したエントリーの、カテゴリーを一括して変更したい。──できない?
「一括編集モード」というのがあるから、これかと思って開いてみても、なんか違う。一括編集モード、この画面では、プルダウンメニューを、「各エントリーの数だけ」プルプル開いて、ひとつひとつ、設定したいカテゴリーに合わせなければならない。そんなことをしていたら、腱鞘炎になってしまうよ。
ということで、腱鞘炎を予防するプラグインか何かがないかと探してみたものの、なかなか見つからなかった。見つからないなら、──しょうがないから作ることにした。
カテゴリーを大掛かりに変更することなんて、そんなに頻繁な作業ではないだろうから、作るにしても、なるべく簡単に済ませたい。とはいうものの、中途半端もイヤなので、まずは理想形を考える。
すぐに思いつくのは、エントリーの一覧画面の右上にある「その他の操作... 」のプルダウンメニュー。ここに、「このカテゴリーにする」みたいなオプションがあるといい。ある任意のエントリー編集画面で、カテゴリーをセットするところにあるような、ああいう感じ。ただ、それはとても面倒そうだ。ちょっと見てみたら、 JavaScript をがしがし書いていて、目眩がしそうだった。これは駄目だ。──ここに、ひとつ妥協が入る。

エントリーのカテゴリーを変更するためのロジックはすぐに想像がつくのだけれど、そのインタフェースが考えものなのだ。管理画面を BigPAPI を用いて改造する? それはいささか躊躇われる。これは妥協ではなくて保留だ。別のページを作らずして、どうにかできないだろうか。
add_itemset_action
MT::App::CMS を開いて、「その他の操作... 」の所を見てみると、次のようになっている:
$app->add_itemset_action({type => 'entry',
key => "set_published",
label => "Publish Entries",
code => ¥&publish_entries,
}, 1);
$app->add_itemset_action({type => 'entry',
key => "set_draft",
label => "Unpublish Entries",
code => ¥&draft_entries,
}, 1);
「その他の操作... 」のお膳立てはこのように、 $app->add_itemset_action というものに、いろいろセットしてあげればよいらしい。上のほうが「公開する」で、下が「未公開(下書き)にする」メニューだ。実際に実行されるのはそれぞれ、 'code' にひもづいている関数になる。その関数には、選択したエントリーの ID がリストで渡されて来る。
ちなみに 'type' はたぶん、管理画面のどの場面でか。 'key' は、プルダウンメニューの OPTION の VALUE 属性だった。それから 'label' は OPTION のラベル。第二引数の '1' は何だ?
ともかく、これにならって、 add_itemset_action を追加してやれば、なんとなく使えそうに思った。選択したエントリーをすべて「公開する」ように、「あるカテゴリーにする」というふうにできればベターかしら。
そこで調べてみると、 Google ではヒット... 日本語のページはヒットしなかった。でもひとつ参考になるページが見つかった。[参考1]
add_itemset_action は、すなわち「その他の操作... 」に、メニューを追加するためのインタフェースだ。
そのページの "Itemset Actions" のセクションを見てみると、さきほどの '1' のところは 'condition' 。コンディション... 。コンディションって何だ? と思ったけれど、サンプルを見てみると、そのサンプルではパーミッションをチェックしてその結果を与えている。そのことから、実行してもよいかどうかの判断をセットしているように思える。まあ、いまは、ここはあまり考えないでもいいだろう。
プルダウンにアクションを追加して、追加したアクションに渡されたエントリー ID をぐるぐる回して、カテゴリーを変更していく。──ただ、どのカテゴリーかを、どうやって選ばせたらいいだろう。単一のプルダウンメニューでは、それがうまく表現できない。「追加する」ことと「どのカテゴリー」かを選ばせるためには、もうひとつメニューが欲しい。
別のページを用意する? エントリーを選択したあとに、そのエントリーについて「どのカテゴリーを」という画面を用意したらいいだろうか。そしたら、 add_itemset_action なんかに頼るより、はじめから新しい管理ページを作った方がよさそうだし、そもそも add_itemset_action からでは実現は困難におもえる。
add_itemset_action を使うのだったら、カテゴリーの数だけのメニューを追加したらどうだろう。つまり「追加する」と「どのカテゴリー」と分けて考えるのではなく「あるカテゴリーを追加する」というメニューを、カテゴリーの数だけ並べるのだ。そうだ、それだ(!)──ここでもひとつ妥協がはいる。かっこわるいけど、でも操作性は悪くはない。
そうして、見よう見まねで作ってみた。選択したエントリーの ID がリストで渡されて来るので、それをぐるぐるまわして、カテゴリーをセットしたりするだけだから、難しくはない。

できれば、「あるカテゴリーを削除する」オプションも入れてみたかった。でも、プルダウンメニューがだらだらっと長引いてしまうので、やめた。でもやはり削除するのもほしいから、そのかわりに「すべてのカテゴリーを削除する」オプションを付け加えることにしたら、それでも用事は済むので、あとから「あるカテゴリーを削除する」機能を作るのが、面倒になってしまった、ということでもあるけれど。
うむ、操作性は悪くない。エントリーをひとつひとつ変更して行くよりも時間はかかったかもしれないけれど、腱鞘炎のおそれは避けることができたので満足だ。
参考: