記事等の一覧画面で一部の記事等の編集リンクを消す

MTQに以下のような質問がありました。

ユーザーの権限は「ウェブサイト」や「ブログ」でロールを設定できますが、「カテゴリ」や「ページ」ごとに設定することはできますか?

残念ながら、Movable Typeでは権限はウェブサイト単位かブログ単位でしか設定することができません。
ウェブページやカテゴリの単位で権限を指定できるようにするには、システムの改修が必要になると思います。

そこで、ごく簡易的な対応として、MTAppjQueryを使って記事等の一覧画面で一部の記事等の編集リンクを消し、特定のユーザーだけが編集できるようにするという方法を考えてみました。

1.user.jsファイルの書き換え

MTAppjQueryのuser.jsファイルを、以下のように書き換えます。

(function($){
  $(window).on('listReady', function() {
    var forbidden = {
      'タイプ': {
        ユーザーID : { オブジェクトID: 1, オブジェクトID: 1, ..., オブジェクトID: 1 },
        ユーザーID : { オブジェクトID: 1, オブジェクトID: 1, ..., オブジェクトID: 1 },
        ...
        ユーザーID : { オブジェクトID: 1, オブジェクトID: 1, ..., オブジェクトID: 1 },
      },
      'タイプ': {
        ユーザーID : { オブジェクトID: 1, オブジェクトID: 1, ..., オブジェクトID: 1 },
        ユーザーID : { オブジェクトID: 1, オブジェクトID: 1, ..., オブジェクトID: 1 },
        ...
        ユーザーID : { オブジェクトID: 1, オブジェクトID: 1, ..., オブジェクトID: 1 },
      },
      ...
      'タイプ': {
        ユーザーID : { オブジェクトID: 1, オブジェクトID: 1, ..., オブジェクトID: 1 },
        ユーザーID : { オブジェクトID: 1, オブジェクトID: 1, ..., オブジェクトID: 1 },
        ...
        ユーザーID : { オブジェクトID: 1, オブジェクトID: 1, ..., オブジェクトID: 1 },
      },
    };
    if (mtappVars.mode == 'list' &&
      forbidden[mtappVars.type] &&
      forbidden[mtappVars.type][mtappVars.author_id]) {
      var forbidden_ids = forbidden[mtappVars.type][mtappVars.author_id];
      var objs;
      if (mtappVars.type == 'category' || mtappVars.type == 'folder') {
        objs = $('span.item-label');
      }
      else if (mtappVars.type == 'website' || mtappVars.type == 'blog' ||
           mtappVars.type == 'tag') {
        objs = $('td.name');
      }
      else {
        objs = $('span.title');   
      }
      for (var i = 0, j = objs.length; i < j; i++) {
        var obj = $(objs[i]);
        var id;
        var anc = obj.children(0);
        var href = anc.prop('href');
        var q = href.substr(href.search(/\?(.*?)$/) + 1);
        var params = q.split('&');
        for (var k = 0, l = params.length; k < l; k++) {
          var kv = params[k].split('=');
          if (kv[0] == 'id' ||
            ((mtappVars.type == 'website' || mtappVars.type == 'blog') &&
             kv[0] == 'blog_id') 
            ) {
            id = kv[1];
            break;
          }
          else if (mtappVars.type == 'tag' && kv[0] == 'blog_id') {
            id = kv[1].split('-')[1];
            break;
          }
        }
        if (forbidden_ids[id]) {
          obj.html(anc.html());
          if (mtappVars.type == 'category' || mtappVars.type == 'folder') {
            obj.parent().find('span.item-ctrl').remove();
          }
          else if (mtappVars.type == 'website' || mtappVars.type == 'blog' ||
               mtappVars.type == 'tag') {
            obj.parent().find('.cb').children('input[type="checkbox"]').remove();
          }
          else {
            obj.parent().parent().find('.cb').children('input[type="checkbox"]').remove();
          }
        }
      }
    }
  })
  その他の処理
})(jQuery);

「var forbidden = { ... };」の部分で、オブジェクトのタイプと、編集を禁止したいユーザーのID、そしてユーザー毎に編集を禁止するオブジェクトのIDを指定します。

オブジェクトのタイプには、以下の文字列を指定します。

オブジェクトの種類文字列
ウェブサイトwebsite
ブログblog
記事entry
ウェブページpage
カテゴリcategory
フォルダfolder
アイテムasset

また、「ユーザーID」で、編集を禁止したいユーザーのIDを指定します。
そして、「オブジェクトID」で、編集を禁止するオブジェクトのIDを指定します。

2.例

以下のように編集を禁止したいとします。

オブジェクト禁止するユーザーのID禁止するオブジェクトのID
ウェブページ1101と102
2103と104
カテゴリ1201と202
2203と204

この場合、「var forbidden = { ... };」の部分を以下のように書きます。

var forbidden = {
  'page': {
    1 : { 101: 1, 102: 1 },
    2 : { 103: 1, 104: 1 }
  },
  'category': {
    1 : { 201: 1, 202: 1 },
    2 : { 203: 1, 204: 1 }
  }
};

3.問題点

このJavaScriptは、オブジェクト一覧のページで、各オブジェクトを編集するリンクを削除するだけです。
編集ページのアドレスをWebブラウザに直接に入力すれば、編集ページを開くことができてしまいます。
あくまでも、簡易的な編集禁止機能としてご利用ください。