自分のモジュールにも組み込む

自分のモジュールにもワークフローを組み込みたい、と思ったら、以下のように修正してください。わりと簡単です。

(1)プリロードでデリゲートを登録する

XOOPS_TRUST_PATH/modules/biznews/preload/AssetPreload.class.php を参考に、以下のデリゲートを登録します。「Biznews」と書かれている部分は、適宜自分のモジュール名に読み替えてください。

$file = BIZNEWS_TRUST_PATH.'/class/DelegateFunctions.class.php';
$this->mRoot->mDelegateManager->add('Legacy_Progress.GetManagedModules','Biznews_DelegateFunctions::getManagedModules', $file);
$this->mRoot->mDelegateManager->add('Legacy_Progress.GetSourceUrl','Biznews_DelegateFunctions::getSourceUrl', $file);
$this->mRoot->mDelegateManager->add('Legacy_Progress.UpdateStatus','Biznews_DelegateFunctions::updateStatus', $file);

(2)modules/{modulename}/class/DelegateFunctions.class.php を作る

ファイル名や置き場所は変わっていてもかまいません(変える場合は、プリロードで指定しているファイル名も変えてください)。

XOOPS_TRUST_PATH/modules/biznews/class/DelegateFunctions.class.php を参考に、
Legacy_AbstractProgressClientDelegate
を継承したクラスを作成し、

  • getManagedModules()
  • getSourceUrl()
  • updateStatus()

の三つのメソッドを実装します。getManagedModules と getSourceUrl は、'biznews', 'story' あたりを自分のモジュールに置き換えればだいたい行けると思います。'biznews' がモジュールのディレクトリ名、'story' はテーブル名になっています。

複製のないモジュールの場合は、

public function getManagedModules(&$list)
{
  $list[] = array('dirname'=>'biznews', 'dataname'=>'story');
}
public function getSourceUrl(&$url, $dirname, $dataname, $id)
{
  if($dirname == 'biznews' && $dataname=='story'){
    $url = XOOPS_URL. '/modules/'.$dirname.'/index.php?action=StoryView&story_id='.$id;
  }
}

でいいでしょう('biznews', 'story' は自分のモジュールに合わせて変えてください)。

updateStatus では、自分のモジュールのテーブルのステータスを更新する処理を書いてください。もし、ステータス用のフィールドがない場合は、増やしてやらないといけません(現モジュールになければ、ステータスによる公開・非公開などの処理分けも必要になります)。
この処理は、モジュールによって色々変わるかもしれません。

public function updateStatus(&$result, $dirname, $dataname, $id, $status)
{
  if($dirname == $biznewsDirname && $dataname=='story'){
    $handler = Legacy_Utils::getModuleHandler('story', $dirname);
    $obj = $handler->get($id);
    $obj->set('status', $status);
    $result = $handler->insert($obj);
  }
}

$status には、modules/legacy/class/Enum.class.php の Legacy_ProgressStatus で規定されている値が入ってきます。

  • DELETED = 0;
  • REJECTED = 2;
  • PROGRESS = 5;
  • FINISHED = 9;

正常にワークフローが完了したのであれば、「9」(FINISHED)が入っているはずです。

各モジュールでのステータスの値は、modules/legacy/class/Enum.class.php の Legacy_Status で規定されている値を使うことを推奨します。

  • DELETED = 0;
  • REJECTED = 2;
  • PROGRESS = 5;
  • PUBLISHED = 9;


(3)データ追加時の処理

自分のモジュールでワークフローに載せたいデータが追加された時の Legacy_Progress.AddItem デリゲート呼び出しの処理を書きます。

XOOPS_TRUST_PATH/modules/biznews/actions/StoryEditAction.class.php の _doExecute() を参考に、自分のモジュールでデータ追加処理が成功した後に、以下のようなコードを追加します。

XCube_DelegateUtils::call('Legacy_Progress.AddItem', $this->mObject->getShow('story_title'), $this->mAsset->mDirname, 'story', $this->mObject->get('story_id'));

引数は順番に、データの件名、モジュールのディレクトリ名(trust ではなく、public 側のディレクトリ名です)、テーブル名、データのプリマリキーの値 を入れます。

以上です。
どうでしょう、割と簡単ではないでしょうか。コーディングが必要になりそうなのは実質、(2)の updateStatus と (3) のみですし、どちらも数行のコードで済むかと思います。
なお、インタフェースはまだ変更になる可能性もありますので、もしそうなったらゴメンナサイです m(__)m。