XCat 対応モジュールの作り方(1)編集

現在、biznews, bizforum という二つの XCat 対応モジュールをリリースしていますが、せっかくなので他のモジュール作者の方にも使っていただけたらと思い、bizforum のコードを見ながら使い方の解説をしていきたいと思います。

bizforum のダウンロード
※バージョンアップにより、下記解説のコードと違いが出てくる可能性があります。

モジュールを作り始めたばかり、という方だとちょっと厳しいかもしれません。ベースとなっているのが Cubson(Tubson) の生成したコードなので、これらを知っているとより理解しやすいと思いますが、知らなくてもたぶん問題ないと思います。

大雑把に分けて、XCat のサービスには三つの機能があります。

  • カテゴリIDに対して、カテゴリ名を返す
  • カテゴリ一覧をまとめて返す
  • ユーザ・カテゴリ・アクションに対して、権限の有無を返す

まずはじめに、編集のプログラムから見ていきます。ファイルは、actions/TopicEdit.class.php です。
このプログラムは、新規投稿時の投稿フォームの表示、投稿内容の編集時の編集フォーム表示(新規投稿時と同じフォームですが、前に登録したデータでフォームが埋められています)、フォームから送られてきた投稿内容の処理(データベースへの書き込み)を行っています。

編集のプログラムでは、以下の3箇所で XCat が使われています。

  • 新規投稿時の、「投稿者権限」チェック
  • 編集時の「編集者権限」チェック
  • 投稿フォームのカテゴリ選択ボックス用のカテゴリ一覧の取得

では、それぞれコードを見ていきます。

新規投稿時の、「投稿者権限」チェック

function _getCatId()
{
  if(! $this->mRoot->mContext->mRequest->getRequest('cat_id')){
    return 0;
  }
  $xcatHandler = new Bizforum_Xcathandler($this->mAsset->mDirname);
  if($xcatHandler->checkPermit(
    $this->mRoot->mContext->mRequest->getRequest('cat_id'), 
    $xcatHandler->getPermitTitle('poster'))){
    return intval($this->mRoot->mContext->mRequest->getRequest('cat_id'));
  }
  else{	//unpermitted category request
    $this->mRoot->mController->executeRedirect(
      './index.php?action=TopicList', 1, _MD_BIZFORUM_ERROR_NOT_PERMITTED);
  }
}

この function は、新規投稿フォームを開くときにリクエストされたカテゴリIDを返しますが、ただ返すのではなく、カテゴリに対して投稿する権限を持っているかチェックを行っています。
Bizforum_Xcathandler は、XCube_Service を利用する際のお決まりのコードを書く手間を省いたり、コードをすっきり書けるようにしている補助的なクラスです。bizforum から XCat のサービスを利用する場合は、このクラスを通して使います(直接 XCat サービスを呼び出して使ってもいいですが、たぶんこのほうが楽でメンテナンスもしやすいと思います)。このクラスの中身については後日解説します。

Bizforum_Xcathandler クラスのオブジェクトを作り、checkPermit メソッドでリクエストされたカテゴリの権限を持っているかチェックしています。xcat モジュールがこのチェックを行い、権限があれば true, なければ false を返します。
この function では、その返り値を見て true なら素直にリクエストされた cat_id を返します。false なら、リクエストされたカテゴリIDに対して投稿する権限がないということですから、別のURLに送り返しています。

編集時の「編集者権限」チェック

function prepare()

//Is this user the topic poster ?
if($this->mObject->get('uid')!=$this->mRoot->mContext->mXoopsUser->get('uid')){
  $xcatHandler = new Bizforum_Xcathandler($this->mAsset->mDirname);
  //Is this user has editor's permission ?
  if(! $xcatHandler->checkPermit(
    $this->mObject->get('cat_id'), $xcatHandler->getPermitTitle('editor'))){
    $this->mRoot->mController->executeRedirect(
      './index.php?action=StoryList', 1, _MD_BIZFORUM_ERROR_NOT_PERMITTED);
  }
}

この function は、以前の投稿を編集する場合の権限チェックを行っています。
仕様としては、投稿者と、編集しようとしているユーザが同一ユーザIDを持っていれば許可、あるいは「編集者権限(editor)」を持っていれば許可としています。つまり「編集者権限」は他人の投稿を修正できるかなり強い権限といえます。
コードの内容的には、さきほどの「新規投稿時の、「投稿権限」チェック」とほぼ同じであることが分かるかと思います。
Bizforum_Xcathandler オブジェクトを作り、checkPermit() メソッドで権限の有無をチェックしています。ただし先ほどとは違い、'poster' ではなく 'editor' の権限を調べています。

投稿フォームのカテゴリ選択ボックス用のカテゴリ一覧の取得

function executeViewInput()

//get category trees
$xcatHandler = new Bizforum_XcatHandler($this->mAsset->mDirname);
$cat = $xcatHandler->getCatList($xcatHandler->getPermitTitle('poster'));
(中略)
$render->setAttribute('cat', $cat);

この function では、フォームの select で選ばせるためのカテゴリのリストを取得しています。
最初に、前の二つと同じく Bizforum_Xcathandler オブジェクトを生成しています。
そのあと、getCatList メソッドで、カテゴリのリストを取得します。その際、「投稿者権限(poster)」を指定していますが、これによって poster 権限のあるカテゴリだけを select フィールドに表示するようにできます。

さて、ここで setAttribute した 'cat' は、テンプレートファイルに次のように記述することで select フィールドとして表示されます。

<select name="cat_id">
<{xcatsvc_catselect tree=$cat selectedValue=$object->get('cat_id')}>
</select>

編集時のコードは以上です。どうでしょうか、意外と簡単ではないでしょうか?