開発マトリョーシカ

a-blog cmsでユーザーによって表示を変える方法

2016.12.20CMS

a-blog cms Advent Calendar 2016の20日目の記事です。
a-blog cmsだとこんなこともできる! というネタを書いてみようと思います。
a-blog cmsって何? という方は、a-blog cms公式サイトをご覧ください。

今回は思いっきりa-blog cmsを使ってウェブ制作する人向けの話になりますので、それっぽいモードで書きます。
これでも、a-blog cmsの本に記事を書いているわけですし、ちょっとくらい開発者っぽい雰囲気を出してもいいかな、と。(そういえば開発マトリョーシカだった。)

この記事では、以下のことができるようになります。
・ユーザーに「日本語」や「英語」などの言語を設定して、自動的に言語を切り替えることができる。
・ユーザーに「管理職」や「一般職」や「アルバイト」などの権限を設定して、特定のユーザーにだけ見せる記事を作ることができる。

a-blog cmsは、ユーザーにもカスタムフィールドを設定できるので、これを使って何かしたくなりますよね。
ユーザーのカスタムフィールドの作り方と使い方は、ユーザーのカスタムフィールドで説明されています。

例えば、ログインして何かするサイトを作ったとします。
a-blog cmsの場合、そんなサイトもユーザー認証が必要なサイトを作りたいにある手順で簡単に作ることができます。今回の場合、シークレットブログで実現します。

シークレットブログを閲覧するには、そこにログインするためのユーザーアカウントが必要になります。
もちろん、記事を投稿したり編集したりできるユーザーでも閲覧できますが、「読者」という閲覧専用のユーザーを作ることもできます。
そのアカウントにカスタムフィールドを用意して、そのフィールドによって表示を変えることができます。

問題は、自分のカスタムフィールドを取得する方法は提供されていません。
ですので、今回は、以下のような方法で実現しました。

まず、config.server.phpを開きます。そして、

define('HOOK_ENABLE', 0);

define('HOOK_ENABLE', 1);

に書き換えます。これで、フックを使えるようになりました。フック処理については、フック処理をご覧ください。

Hook.phpを開いて、extendsGlobalVarsに以下のように書きます。

public function extendsGlobalVars($globalVars) { if (SUID) { $Field = loadUserField(SUID); $globalVars->setField('aaa', $Field->get('bbb')); } }

これで、自分のカスタムフィールドを取り出すための独自カスタムフィールドが作られました。
「aaa」には独自カスタムフィールドの名前を、「bbb」にはユーザーカスタムフィールドの名前を書いてください。
例えば、言語を設定した「lang」というカスタムフィールドを作った場合、「bbb」に「lang」と書きます。
「aaa」には「MY_LANG」などと書いておきましょう。

これで準備は整いました。
グローバル変数として取り出すことができますので、「%{MY_LANG}」といった変数で取り出すことができます。

たとえば、エントリーを日本語用と英語用の二種類で作っておいて、こちらにも「lang」というカスタムフィールドを用意します。
以下のようにして、日本語の場合と英語の場合を分けることができます。

<!-- BEGIN_MODULE Entry_Summary id="list" -->  : <!-- END_MODULE Entry_Summary -->

「list」というモジュールIDでは、フィールドに「lang/eq/%{MY_LANG}」と書いておきます。そうすると、日本語ユーザーでログインしている場合、カスタムフィールドが「japanese」となっているエントリーのみを表示することができます。

権限によって見せる記事を変える場合は、ユーザーの権限フィールドに数値でランクを設定します。
仮に、どの記事も見られる人を1、大部分の記事を見られる人を2、一部の記事しか見られない人を3とします。
そして、記事のカスタムフィールドにも同様に1、2、3という数値を設定します。
モジュールIDのフィールドに「auth/gte/%{MY_AUTH}」と書いておけば、権限によって見ることのできる記事が変わります。

※秘匿性のある記事を扱う場合は、これだけの対応では不十分です。個別ページにもIFブロックを埋め込むなどして、閲覧できるルートをすべてふさぐようにしてください。