blogID の異なる環境で user.js を共通利用する方法を考えてみた

Movable Type で管理画面をカスタマイズするにあたって、いつもお世話になっている MTAppjQuery。
その設定ファイルである user.js について2つの興味深い記事を見かけました。

環境によってblogIDが違う場合にuser.jsを共通利用するためのblogIDの持たせ方検討 | bit part blog:
http://bit-part.net/blog/2015/02/blogid.html

テスト環境と本番環境でブログIDが異なるときのuser.js(MTAppjQuery)の安全な書き方 | riatw.me:
http://riatw.me/blog/mtappjquery_problem.html

普段は mersy さんが書かれている各テンプレートで読み込む共通モジュールに blogID をセットして、それを利用するようにしているのですが、本番環境のみ新しいブログが追加され、blogID がズレてしまうこともままあります。データベースにアクセスできれば、本番環境の最新データを反映すれば良いものの、場合によりけり・・・ですよね。

そこで、blogID が変化してもテンプレートの修正なしで user.js を共通利用する方法について、考えみることにしました。

前提条件

まず、前提となる条件を決めておきます。

  • 開発/本番環境で、ホスト名(または、ポート番号)と blogID が異なる
  • user.js はウェブサイトごとに設置する
  • 親ウェブサイトと同じ出力パスを指定したブログが存在する

注意が必要なのは、このくらいでしょうか?

当初、出力パスに含まれる最下層のディレクトリ名を user.js 内で定義するオブジェクトのキーに利用する方法を頭に浮かべましたが、3つめの条件に該当すると重複してしまうため、ブログのカスタムフィールドで一意の名称(例.「ニュース」ブログなら「news」など)をセットする想定とします。

ブログ数が少ない場合

ブログ数が少ない場合は、ほぼ mersy さんの手法と同じです。

ただ、面倒くさがりな BUN としては管理画面で MTAppjQuery のプラグイン設定を調整する手間を省きたいので、user.js 内で分岐してしまおうと思います。

// 本番環境の blogID
var pubServer = {
  website_id: 1,
  blog_id:    2
};

// 開発環境の blogID
var devServer = {
  website_id: 3,
  blog_id:    4
};

var locationHost = location.host,
    pattern      = /:3000$/,
    configVars   = ( pattern.test( locationHost ) ) ? devServer : pubServer;

// blogID による分岐
if( mtappVars.blog_id == configVars.website_id ){
  // ウェブサイト向けの処理
} else if( mtappVars.blog_id == configVars.blog_id ){
  // ブログ向けの処理
}

このサンプルでは、開発サーバ(ポート番号:3000)かどうかで configVars の内容を切り替えています。

ブログ数が多い場合

ブログ数が多い場合、前提条件で触れた通りブログのカスタムフィールドをキーの接頭辞として利用します。

var configVars = {
  website_id: <mt:WebsiteID />,
<mt:Blogs include_blogs="children">
  <mt:BlogCFBasename />_id: <mt:BlogID /><mt:If name="__last__"><mt:Else>,</mt:Else></mt:If>
</mt:Blogs>
};

// blogID による分岐
if( mtappVars.blog_id == configVars.website_id ){
  // ウェブサイト向けの処理
} else if( mtappVars.blog_id == configVars.news_id ){
  // カスタムフィールドに「news」とセットされたブログ向けの処理
}

カスタムフィールドの文字列はサーバを問わず共通にできるハズなので、新しいブログを追加した際に設定を忘れなければ問題なさそうです。

やってみて

実際に使うかどうかは別として、普段やらないことを考えてみるのはとても勉強になりますね。
また面白そうな話題を見かけたら、自分ならどうするか?を試してみようと思いました。

余談

管理画面からカスタムフィールドを設定するには大変なブログ数で、かつ、phpMyAdmin などを利用できる状況であれば、下記のような SQL 文でまとめてセットしてもよいかもしれません。

INSERT INTO `mt_blog_meta` (`blog_meta_blog_id`, `blog_meta_type`, `blog_meta_vchar`, `blog_meta_vchar_idx`, `blog_meta_vdatetime`, `blog_meta_vdatetime_idx`, `blog_meta_vinteger`, `blog_meta_vinteger_idx`, `blog_meta_vfloat`, `blog_meta_vfloat_idx`, `blog_meta_vblob`, `blog_meta_vclob`) VALUES
(2, 'field.foo', NULL, 'news', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL),
(3, 'field.foo', NULL, 'products', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

なお、上記をコピペして利用いただいた際に万一データベースが破損しても責任は持てませんので、あらかじめご了承ください。