ずっと気になっていたこの件。MovableTypeのエントリ投稿画面で、「複数のカテゴリーを指定する」という機能がOperaでは動作しないというヤツだ。どうやら解決の糸口が見えてきたかもしれない。エントリー編集画面のテンプレート”edit_entry.tmpl”を見ていると、どうも妙なコードのせい(というか、Operaが悪いんだろうが)で動作というか反応しないということに気付くだろう。すなわち、「複数のカテゴリーを指定する」に該当する部分、
<div id="assign_multiple_div"><a id="assign-multiple" href="javascript:editPlacements()"><MT_TRANS phrase="Assign Multiple Categories"></a>
である。素人目から見ても、「複数のカテゴリーを指定する」を押すと、”editPlacements()”が召喚されるらしいことぐらいはわかる。
で該当の”editPlacements()”はどこで待ち構えているかというと、”edit_entry.tmpl”の52行目あたりに
function editPlacements () {
el = document.getElementById(‘multiple_cats’);
if (el) {
el.style.display = ‘block’;
el.style.visibility = ‘visible’;
} else {
window.open(‘<TMPL_VAR NAME=SCRIPT_URL>?__mode=edit_placements&entry_id=<TMPL_VAR NAME=ID>&blog_id=<TMPL_VAR NAME=BLOG_ID>’, ‘placements’, ‘width=550,height=520,resizable=yes’);
}
}
鎮座していらっしゃる。はて、ここでgetElementByIdというのは何だろうね?よくわからんが、”multiple_cats”とかいうIdを与えてやることで”Element”なるものが返ってくるんだろう。
ともかく、ifにかけられてるくせに正体のよくわからんこいつが怪しい。OperaだとgetElementByIdがうまく働かんのかもしれんという察しとそれらしい文献もでてきた。ちなみにどうしてダメなのかはよくわからんので賢い人は調べて欲しい。
というわけで、Operaしか使わないんだったら、If文とっぱらって必ずwindow.openさせちまえばいいんじゃね?というエントリを目にしたので参考に引用させて頂こう。
tmpl/cms/edit_entry.tmplの
function editPlacements () {
el = document.getElementById(‘multiple_cats’);
if (el) {
el.style.display = ‘block’;
el.style.visibility = ‘visible’;
} else {
window.open(‘<TMPL_VAR NAME=SCRIPT_URL>?__mode=edit_placements&entry_id=<TMPL_VAR NAME=ID>&blog_id=<TMPL_VAR NAME=BLOG_ID>’, ‘placements’, ‘width=550,height=520,resizable=yes’);
}
}
を
function editPlacements () {
window.open(‘<TMPL_VAR NAME=SCRIPT_URL>?__mode=edit_placements&entry_id=<TMPL_VAR NAME=ID>&blog_id=<TMPL_VAR NAME=BLOG_ID>’, ‘placements’, ‘width=550,height=520,resizable=yes’);
}
に書き換え。
必ず別Windowが出るようにした。
www.okubo.tk: 複数のカテゴリを指定 から引用
さすが先人は既に解っていらっしゃる。
これで解決してしまうのでは?と思ったのだけど、
…のだが、画面もちゃんと出て、うまくいったかに見えて、カテゴライズが反映されない。
Σ(_□_;!!逆ガーン
なんと、うまくいったかに見えて、エントリを保存してもカテゴリの設定が保存されていないという事態に…。ううむ、カテゴリ設定を出すところまではうまくいってるのでなんとかならないものか…。
いろいろ弄ってるうちに、応急的ではあるが対処方法がわかった。
別ウィンドウにてサブカテゴリを追加・変更し、保存ボタンを押す。その後、「サイトへ変更を反映させるには、エントリーを保存してください。」と促されるが、そこで元のエントリ編集ウィンドウへ戻ってエントリ保存のボタンを押すと敵(MT)の思うツボ!
うまく説明するのが下手で申し訳ないが、「エントリ編集ウィンドウに表示されているデータは、カテゴリーの編集が反映されていない」のだ。しかし内部データ的(?)にはカテゴリが編集されているため、このままではカテゴリ編集済みのエントリに未編集のエントリを上書きしてしまう。
これを防ぐには次のようにしたら良いだろう。
まず、複数のカテゴリはいじらずにとりあえずエントリを保存する。
次に、開いた別ウィンドウにてカテゴリを編集・追加した後に、エントリ編集ウィンドウへ戻り、保存ボタンではなく、F5などで画面のリロードを行なう。これによって、エントリ編集ウィンドウに表示されているデータは最新のもの…すなわちカテゴリの編集が終わっているものに置き換わる。確認のため「複数のエントリーを指定する」で別ウィンドウを開いてみよう。カテゴリの編集結果が反映されているはずだ。
この後、しめしめと保存ボタンを押してやればカテゴリの編集完了。
または、カテゴリの編集が終わった後に「サイトを再構築」などから再構築してやれば良い。
かなり応急的な処置で、何かしらコードを書けば手間を省けると思うんですがそこまで辿り着けないので、同じ問題で困っている方のヒントにでもなれば…と書き綴りました。
追記
window.operaというメソッドでoperaかどうか判別できるらしいので、editPlacementsを
function editPlacements () {
el = document.getElementById(‘multiple_cats’);
if (window.opera) {
window.open(‘<TMPL_VAR NAME=SCRIPT_URL>?__mode=edit_placements&entry_id=<TMPL_VAR NAME=ID>&blog_id=<TMPL_VAR NAME=BLOG_ID>’, ‘placements’, ‘width=550,height=520,resizable=yes’);
}else{
if (el) {
el.style.display = ‘block’;
el.style.visibility = ‘visible’;
} else {
window.open(‘<TMPL_VAR NAME=SCRIPT_URL>?__mode=edit_placements&entry_id=<TMPL_VAR NAME=ID>&blog_id=<TMPL_VAR NAME=BLOG_ID>’, ‘placements’, ‘width=550,height=520,resizable=yes’);
}
}
}
としてみた。
書き方は他にもあるだろうけど、ほんと応急処置なのでこれでいいということにしておく。
これよりもっと良い方法をご存知の方、是非ご一報下さい。本当に不便で困っています。
#MT3.3でタグ機能が追加されたら複数カテゴリの恩恵が少なくなるかもしれないけれど、それはそれ