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