「WordPressで学ぶPHP(2)データ構造(配列・オブジェクト)編」を発売しました。
本書は「WordPressで学ぶPHP(1)変数・制御構造編」の続編にあたり、PHPの「データ構造」(配列とオブジェクト)について解説します。
配列やオブジェクトは、頭の中で考えるだけでは、イメージがつかみにくいです。本書では図を多用して、配列やオブジェクトをなるべく分かりやすく解説することを心がけました。 
Kindle本で、定価250円です。
記事等の一覧画面で一部の記事等の編集リンクを消す
ユーザーの権限は「ウェブサイト」や「ブログ」でロールを設定できますが、「カテゴリ」や「ページ」ごとに設定することはできますか?
残念ながら、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 | 
|---|---|---|
| ウェブページ | 1 | 101と102 | 
| 2 | 103と104 | |
| カテゴリ | 1 | 201と202 | 
| 2 | 203と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ブラウザに直接に入力すれば、編集ページを開くことができてしまいます。
あくまでも、簡易的な編集禁止機能としてご利用ください。

 
  