Xcat モジュール概略

できてきたので、紹介しながら整理(自分の中で)していこうと思います。

テーブルの構成

上の図が、Xcat モジュールの構成です。カテゴリの親子関係やカテゴリ名を管理する「カテゴリ」テーブル(xcat_cat)があり、それに紐づく権限テーブル(xcat_perm)がユーザグループごとにあります。

カテゴリの上にある「カテゴリグループ」は、サイトに複数のカテゴリ群を持たせたいときに使う入れ物です。フォーラムにはカテゴリグループ X を、ニュースにはカテゴリグループ Y を、といったように使います。

カテゴリグループではまた、カテゴリで使う権限の種類(編集権限、閲覧権限、削除権限など)を設定し、カテゴリの深さの限界を設定します。たとえば、カテゴリの深さの限界を「1」にすれば、階層構造を持たないことになります。「0」は無制限を意味します。

権限の設定

権限は、カテゴリ・ユーザグループ・種類ごとに設定されます。

「種類」は、編集権限、閲覧権限などで、カテゴリグループごとにどのような種類をもたせるか決めます。

あるカテゴリの権限が設定されていない場合、親カテゴリの設定を継承します。親カテゴリも権限が設定されていない場合はさらにその親、というようにどんどん遡って設定されている権限を参照します。一番上のカテゴリにも権限が設定されていない場合は、カテゴリグループを作るときに設定したデフォルト権限が適用されます。

なお、権限の継承発生はカテゴリ単位に判断されます。それ以上の細かい単位、ユーザグループや権限ごとではありません。
たとえば、"カテゴリ:A" - "groupid:1" - "VIEW" という権限の設定があれば、"カテゴリ:A" - groupid:2" - "VIEW" や "カテゴリA" - groupid:1" - "CREATE" について、権限の継承は発生しません。もしこれらの権限が設定されていなければ、「不可」として扱われます。

デリゲート

今のところ用意しているデリゲートは3種類です。しかし、そのうち1種類は作ってみたけど「使うところあるのか?」という感じなので実質的には2種類かもしれません(その1種類は今回紹介しません)。

  • カテゴリマネージャ取得(Module.xcat.Event.GetCatManager)
  • カテゴリツリー取得(Module.xcat.Event.GetCatTree)

カテゴリマネージャ取得は、カテゴリオブジェクト(Xcat_Cat)を取得します。このオブジェクトは、特定カテゴリにおける権限のチェックなどを行います。View や Edit などで、コンテンツを操作(閲覧、編集、etc.)する権限を持っているかどうかに使います。

カテゴリツリー取得は、カテゴリツリーオブジェクト(Xcat_Tree)を取得します。このオブジェクトは、カテゴリの一覧をツリー形式で表示するための配列を組み立てます。XoopsTree がベースになっています。

サンプルコード

xcat を利用する側のモジュールで、どのようなコードを書くかのサンプルです。

Xcat_Tree は XoopsTree をベースにしているのですが、なんかオブジェクト指向的にいけていない気がするので作り直すかもしれません。

使用例 1

カテゴリオブジェクト(Xcat_Cat)を使って、そのカテゴリに属するコンテンツを閲覧する権限があるかどうかをチェックします。

//デリゲートで Xcat_Cat オブジェクトを取得
XCube_DelegateUtils::call(
'Module.xcat.Event.GetCatManager', 
new XCube_Ref($cat), 
$this->mObject->get('cat_id')
);

//取得した Xcat_Cat オブジェクトを使い、開こうとしているカテゴリについて、
//そのユーザが “VIEW” の権限を持っているかをチェック
//もっていなければ、エラーを表示しリダイレクト
if(! $cat->checkPermUser($uid, 'VIEW')){
$this->mRoot->mController->executeRedirect(
"./index.php?action=CqList", 1, _MD_CQA_ERROR_NOT_PERMITTED
);
}
使用例 2

カテゴリツリーオブジェクト(Xcat_Tree)を使って、そのユーザが CREATE 権限を持っているカテゴリツリーを表示します。

$treeObj = null;
//デリゲートで Xcat_Tree オブジェクトを取得
XCube_DelegateUtils::call(
'Module.xcat.Event.GetCatTree', new XCube_Ref($treeObj)
);

//取得した Xcat_Tree オブジェクトを使い、
//カテゴリグループid =1 のカテゴリツリーを取得。
$tree = $treeObj->getGrTreeArray(1, 'weight');

//カテゴリツリーから、ユーザが ’CREATE’ の権限を持たないカテゴリを除外
$treeFiltered = $treeObj->filterCatByUser($tree, 'CREATE', 1);

このあと、render(表示)にまわします。$treeに対し、ブロック表示用と、select 表示用の二つの smarty が用意されています。