XooNIpsプラットフォーム 基 盤 システムの 実 装 と 拡 張 理 化 学 研 究 所 脳 科 学 総 合 研 究 センター 神 経 情 報 基 盤 センター 奥 村 嘉 宏 2015 年 7 月 16 日 Brain Atlas Hackathon 2015 ブレインアトラスアイデアソン
XooNIps とは インターネット 上 で 多 様 な 電 子 データ(ファイル,URL, 書 籍 論 文 等 )をメタデータと 供 に 共 有 を 図 るためのWebデータベース 基 盤 シ ステム 運 用 ポリシー 設 定 XooNIps 概 観 詳 細 表 示 一 覧 表 示 ファイルダウンロード 2
システム 概 要 アカウントを 持 つユーザ データの 登 録 公 開 を 行 う 検 索 閲 覧 登 録 ユーザ 検 索 閲 覧 インデックスツリー 編 集 アイテム 登 録 編 集 外 部 DB メタデータ 交 換 個 人 利 用 個 人 領 域 個 人 領 域 個 人 領 域 インデックスツリー インデックスツリー アイテム 情 報 インデックスツリー アイテム データファイル 情 報 アイテム データファイル 情 報 電 子 ファイル アイテム 公 開 公 開 承 認 データ 公 開 公 開 領 域 インデックスツリー アイテム 情 報 電 子 ファイル 自 動 生 成 自 動 生 成 メタデータ 情 報 ランキング 情 報 研 究 者 情 報 検 索 閲 覧 通 常 のユーザ データを 閲 覧 する アイテム 共 有 検 索 閲 覧 共 有 承 認 グループ 共 有 グループ 共 有 領 域 グループ 共 有 領 域 グループ 共 有 インデックスツリー 領 域 インデックスツリー アイテム 情 報 インデックスツリー アイテム データファイル 情 報 アイテム データファイル 情 報 電 子 ファイル インデックスツリー 編 集 インデックスツリー 編 集 アカウント 情 報 編 集 グループメンバー 管 理 グループ 管 理 システム 設 定 ユーザ 情 報 アカウント 情 報 グループ 情 報 システム 情 報 サイトポリシー アクセスログ 自 動 生 成 アカウント 申 請 アカウント 承 認 ユーザ 管 理 インポート エクスポート ゲスト サイト 全 体 の システムの 設 定 を 行 う アクセスログ 解 析 サイトポリシー 設 定 グループ 共 有 情 報 を 管 理 する グループ 管 理 者 モデレータ システム 管 理 者 公 開 する 情 報 やサイトの ユーザ 情 報 を 管 理 する 3
XOOPS Cube Legacy ベース システム 構 築 運 用 コストの 削 減 無 償 利 用 可 能 なオープン ソースソフトウェア 容 易 な 機 能 拡 張 XOOPS の 既 存 モジュールと 組 み 合 わせて 多 種 多 彩 なサ イトを 構 築 可 能 デザインの 変 更 XOOPS のテーマを 変 更 する ことでレイアウトなどの 概 観 を 自 由 に 変 更 可 能 XOOPS General Modules Web browser PHP Apache Data Item type XooNIps Module Legacy (XOOPS 互 換 レイヤー) XOOPS Cube RDBMS (MySQL) User Interface Web Application Database 4
XooNIps と XOOPS Cube Legacy XooNIpsはXOOPS Cube Legacy(XCL)というCMSの 上 に 実 装 されたモ ジュール XooNIpsを 導 入 することにより 追 加 される 機 能 ユーザ 管 理 機 能 を 拡 張 メタデータとファイル 管 理 インデックスによる 整 理 とアクセス 権 の 制 御 承 認 のためのワークフロー 外 部 システム 連 携 のためのAPIなどなど 最 新 版 では 上 記 を 基 盤 となるXCLの 仕 組 みを 活 用 して 機 能 ごとに 複 数 のモジュールに 分 割 して 実 装 一 つの 見 方 として XooNIpsとは 上 記 の 機 能 を 持 つCMSであると 捉 えて もらったほうがわかりやすいかも プラットフォーム 基 盤 システム XooNIps XCL + XooNIps 機 能 追 加 モジュール 群 5
ここでは XOOPS Cube Legacy の 仕 組 みを 中 心 に 紹 介 XooNIps の 機 能 を 実 装 する 上 で XCL の 仕 組 みは 重 要 Webブラウザで 操 作 できる 機 能 にはあまり 触 れずにその 裏 側 を 覗 き 見 る 6
XOOPS Cube Legacy 7
主 なディレクトリ 構 成 html/: Webからアクセスできる 領 域 index.php: サイトトップ mainfile.php:サイト 設 定 ファイル theme/:サイトテーマ images/, uploads/ common/, js/ : 静 的 データ 用 フォルダ kernel/, include/, language/: XOOPSシステム 関 連 フォルダ(XOOPS 互 換 性 のために 残 存 ) core/, preload/: XOOPS Cube システム 関 連 フォルダ modules/: モジュール 群 legacy/, legacyrender/, stdcache/, user/:legacy XOOPS 互 換 レイヤー 実 体 profile/, message/ : Legacy で 追 加 されたモジュール xoonips/ : XooNIps モジュール xworkflow/ : 承 認 ワークフロー rest/ : XooNIps REST API (その 他 割 愛 ) xoops_trust_path/: Webから 直 接 アクセスできないところ cache/, libs/, settings/, templates_c/ :システム 関 連 ファイル (XCL 2.2~) modules/: モジュール 群 (XOOPS_TRUST_PATH 対 応 モジュールの 本 体 を 配 置 ) xoonips/ : XooNIps モジュール 本 体 xworkflow/ : 承 認 ワークフロー 本 体 rest/ : XooNIps REST API 本 体 (その 他 割 愛 ) html 側 にはブラウザで 直 接 アクセスするファイルのみ 配 置 アクセスされたら xoops_trust_path 側 の 本 体 を 呼 び 出 す 8
サイトテーマ サイト 全 体 の 配 置 やCSSなどのデザインを 決 める 左 カラム 中 央 カラム( 中 央 ) 中 央 カラム( 左 ) 中 央 カラム( 右 ) 右 カラム 左 カラム 中 央 カラム 中 央 右 カラム 各 モジュールの 機 能 単 位 の 全 ての 出 力 は 並 び 順 と 共 にいずれかに 属 す 左 右 html/themes/ 以 下 に 配 置 し 設 定 画 面 から 利 用 する テーマを 選 ぶ 9
モジュールテンプレート モジュールの 画 面 出 力 の 際 の 見 た 目 を 定 義 テンプレートの 仕 組 みを 利 用 するか 否 かはモジュールの 実 装 による 機 能 の 出 力 やさらにその 構 成 要 素 単 位 で 存 在 html/modules/{modname}/templates/*.html モジュールインストール 時 にDBの 中 にdefaultテンプレート セットとして 複 製 される 独 自 のテンプレートセットを 作 成 可 能 で 設 定 画 面 から 利 用 す るテンプレートセットを 選 択 できる 管 理 画 面 からDBに 複 製 された 各 テンプレートを 編 集 できる テンプレートファイル 本 体 を 書 き 換 えなくてもよい XoopsTpl : Smarty エンジンの 派 生 クラスで 実 装 テンプレートの 中 に PHP のコードを 埋 め 込 めるので レンダリン グの 際 に 独 自 の 処 理 を 実 行 可 能 10
データの 永 続 化 XOOPS DataMapperパターン モデル(データ)とデータベースの 間 をとりなす 仕 組 み XoopsObject:モデル 基 底 クラス 一 連 のデータの 名 前 型 属 性 ( 必 須 データ 長 など) 値 などを 保 持 get(), set() で 値 を 出 し 入 れ 継 承 して 各 モデルを 扱 うクラスを 定 義 XoopsUser, XoopsGroup, XoopsMembership など Name Type Required Length Value uid INT true 10 桁 1 uname STRING true 32 文 字 admin XoopsObjectHandler:マッパー 基 底 クラス( 実 質 インターフェースのみ) データベースと XoopsObject を 結 びつける create(), get(), insert(), delete() で 出 し 入 れ 継 承 して 上 記 モデルを 操 作 するマッパークラスを 定 義 XoopsUserHandler, XoopsGroupHandler など 11
データの 永 続 化 XOOPS Cube Legacy 互 換 性 のために 古 いORMは 残 す モデルとDB 内 テーブルを1:1で 結 びつける 際 の 典 型 的 なSQL 処 理 を 基 底 クラスとして 実 装 する ことで 派 生 クラスの 実 装 を 容 易 かつ 安 全 に 12
データの 永 続 化 サンプルコード 例 えば ユーザ 管 理 管 理 番 号 1 番 のアカウントID(uname)と 表 示 名 (name)を 取 得 $userhandler = xoops_gethandler( user ); $userid = 1; $userobj = $userhandler->get ($userid); $uname = $userobj->get( uname ); $name = $userobj->get( name ); ユーザの 名 前 を 変 更 $userobj->set( name, 神 経 基 盤 太 郎 ); $userhandler->insert ($userobj, true); user を 操 作 するマッパーハンドラを 取 得 通 常 POSTの 時 しかDBに 書 き 込 めないが true だとGETの 時 にも 強 制 的 に 書 き 込 む userobj にDB 内 のユーザテーブルの 主 キーとなる 管 理 番 号 が 指 定 されているため insert () は 新 規 追 加 ではなくて 更 新 処 理 となる 13
Action Frame Action Formを 統 一 的 にコントロールするMVCな 仕 組 み 例 : html/modules/user/index.php 1. システムの 初 期 化 2. ActionFrame を 生 成 3. ActionFrame に 実 行 したい 処 理 名 (アクション)を 設 定 4. XOOPS Cube の MVC コントローラに 登 録 5. XOOPS Cube の MVC コントローラ 実 行 1 2 3 4 5 require_once "../../mainfile.php"; require_once XOOPS_ROOT_PATH. "/header.php"; require_once XOOPS_MODULE_PATH. "/user/class/actionframe.class.php"; $root =& XCube_Root::getSingleton(); $actionname = isset($_get['action'])? trim($_get['action']) : "UserList"; $modulerunner = new User_ActionFrame(false); $modulerunner->setactionname($actionname); $root->mcontroller->mexecute->add(array(&$modulerunner, 'execute')); $root->mcontroller->execute(); require_once XOOPS_ROOT_PATH. "/footer.php"; 14
Action Frame execute 動 作 概 念 1. 操 作 対 象 となるオブジェクトを 用 意 2. 設 定 された 処 理 名 (アクション)に 対 応 するAction Formの 準 備 3. DB 内 の 既 存 のデータをオブジェクト へ 読 み 込 み 4. GETだったら 入 力 フォームを 表 示 5. POSTだったら 前 のページから 送 信 さ れたデータを 取 得 6. 取 得 したデータをチェック 7. エラーだったら 入 力 フォームをエラー 内 容 と 一 緒 に 表 示 8. エラーでなければ 取 得 した 値 をオ ブジェクトに 反 映 9. オブジェクトをDBに 保 存 4 7 1 2 3 5 6 8 9 15
Action Frame って XooNIps では 旧 版 : 3.4 系 Action Frameを 使 ってない html/modules/xoonips/ 以 下 の 各 ファイルでDB 読 み 込 み フォームリクエスト 値 取 得 条 件 分 岐 表 示 等 のプロシージャをそれぞれ 実 装 新 版 : 4.0 系 一 部 の 処 理 は Action Frame 化 xoops_trust_path/modules/xoonips/actions, xoops_trust_path/modules/xoonips/admin/actions 以 下 に ActonFormをそれぞれ 実 装 その 他 処 理 実 体 をクラス 化 してあるものの やって いることは3.4 系 と 似 たような 動 作 16
プリロード mainfile.php 内 のシステム 初 期 化 プロ セス 途 中 (common 処 理 実 行 時 )に 呼 び 出 される( 右 リスト) 自 動 的 にプリロードファイルが 読 み 込 まれ 特 定 のタイミングで 実 行 される 読 み 込 み 直 後 : prefilter データベース 起 動 後 : preblockfilter 初 期 化 の 最 終 段 階 :postfilter 大 別 して2 種 類 サイトプリロード:システム 全 体 で 利 用 可 能 html/preload/ モジュールプリロード:モジュールが 有 効 な 時 のみ html/modules/{module}/preload/ 1. サイトプリロードの 読 み 込 み 2. prefilter の 実 行 3. エラーハンドラの 初 期 化 4. 全 体 の 環 境 の 初 期 化 5. ロガーの 初 期 化 6. データベースへの 接 続 7. 言 語 の 初 期 化 8. テキストフィルタの 初 期 化 9. 一 般 設 定 の 初 期 化 10. htmlヘッダ 等 のスクリプト 初 期 化 11. デバッガの 初 期 化 12. インターフェイスクラスの 読 み 込 み 13. モジュールプリロードの 読 み 込 み 14. preblockfilter の 実 行 15. セッションの 初 期 化 16. ユーザの 初 期 化 17. モジュールの 初 期 化 18. postfilterの 実 行 17
プリロード 例 : 特 定 の 接 続 元 のログインを 遮 断 html/preload/denyloginfromnijc.class.php <?php class DenyLoginFromNIJC extends XCube_ActionFilter { public function postfilter() { $userid = Legacy_Utils::getUid(); if ($userid!= UID_GUEST && $_SERVER["REMOTE_ADDR"] == "134.160.172.20") die("go away!"); } } 18
デリゲート 特 定 の 処 理 実 行 の 一 部 を 他 のプログラムに 委 譲 するための 仕 組 み 特 定 のイベントのフックと 実 行 $delegate = new XCube_Delegate(); $event = MyDelegate.Hook.Event ; $delegate->register($event); 1 イベントの 登 録 $callbackfunction = function() { // something to do.. }; $root = XCube_Root::getSingleton(); $root->mdelegatemanager->add($event, $callbackfunction, XCUBE_DELEGATE_PRIORITY_FIRST); 2 イベントへのコールバック 関 数 の 登 録 ( 実 行 優 先 度 最 高 ) $delegate->call(); 3 イベントの 実 行 19
プリロードとデリゲート XCLで 利 用 されている 登 録 済 みイベントは100 以 上! 右 表 :ほんの 一 例 プリロード 実 行 時 preblockfilter 等 コールバック 関 数 登 録 メイン 処 理 実 行 時 イベント 登 録 ( 遅 延 登 録 ) イベント 呼 び 出 し モジュール 間 を 渡 る 処 理 の 連 携 疎 な 結 合 Legacypage.Register.Access Legacypage.Search.Access Legacypage.Top.Access Legacypage.User.Access Legacypage.Userinfo.Access Legacypage.Viewpmsg.Access Site.CheckLogin Site.CheckLogin.Fail Site.CheckLogin.Success Site.JQuery.AddFunction Site.Logout Site.Logout.Fail Site.Logout.Success 20
デリゲート 利 用 例 : 承 認 機 能 ユーザ 登 録 XooNIps Private 領 域 公 開 申 請 Public / Group 領 域 承 認 モデレータ グループ 管 理 者 XCL 2.2 で 進 捗 管 理 のためのデリゲートインター フェースが 定 義 Legacy_Workflow.AddItem : 新 規 に 承 認 タスクを 追 加 Legacy_Workflow.DeleteItem : 登 録 されている 承 認 タスクを 削 除 Legacy_Workflow.GetHistory : 承 認 履 歴 を 取 得 Legacy_WorkflowClient.GetClientList : 待 ち 受 けたいワークフロー 種 類 一 覧 を 返 す Legacy_WorkflowClient.UpdateStatus : 対 象 のワークフローの 状 態 を 更 新 21
承 認 機 能 :Xworkflowモジュール 承 認 機 能 を 実 現 するモジュール 対 象 ワークフロー 別 に 承 認 者 を 多 段 で 設 定 可 能 XooNIpsにおける 対 象 ワークフロー ユーザ 承 認,アイテム 公 開,アイテム 公 開 取 り 下 げ グループ 作 成,グループ 削 除,グループ 公 開 グループ 参 加,グループ 脱 退,など 承 認 者 特 定 のユーザ グループ グループ 管 理 者 多 段 承 認 ステップ 標 準 インターフェースの 実 装 なためXooNIps 以 外 のワークフローでも 管 理 可 能 22
承 認 機 能 : 申 請 から 承 認 まで 2 公 開 インデックスに 登 録 (Pending 状 態 ) 8 状 態 ステータスを 公 開 に 4 3の 内 容 をタスク 一 覧 へ 登 録 進 捗 管 理 開 始 6 審 査 結 果 を 履 歴 に 追 加 全 員 の 審 査 が 完 了 したら7へ 3 デリゲート 実 行 /タスク 登 録 Legacy_Workflow.AddItem XooNIps Xworkflow 1 アイテムを 公 開 インデックス へ 登 録 公 開 申 請 7 デリゲート 実 行 / 状 態 更 新 Legacy_WorkflowClient.UpdateStatus 5 査 読 審 査 承 認 ユーザ モデレータ グループ 管 理 者 23
まとめ XooNIpsサイトを 拡 張 するためには XOOPS Cube Legacyの 仕 組 みを 知 れば 意 外 と 拡 張 方 法 が 豊 富 なことに 気 付 く テンプレートで 機 能 要 素 単 位 の 見 た 目 を 変 更 デリゲート 使 えば 簡 単 に 特 定 の 処 理 だけをフックできる プリロードはどこからでも 呼 ばれるので 何 でもできる 実 際 にXooNIpsではユーザ 管 理 機 能 を 拡 張 するために 標 準 のuser モジュールの 管 理 画 面 の 一 部 をこれで 乗 っ 取 っている オリジナルのソースコードを 改 変 しなくても 済 む XooNIpsは 発 展 途 上 全 てが ActionFrame で 綺 麗 に 実 装 されているわけではないが アクションを 新 規 追 加 するのは 簡 単 (かも) 新 しくアクション 用 ファイルを 追 加 して 配 置 すればいい 新 バージョンは 動 作 実 績 が 少 ないので 人 柱 が 欲 しい 24
引 用 元 参 考 文 献 など 1. XOOPS Cube Legacy デベロッパーズバイブル Marijuana( 宇 津 木 おさむ) chatnoir( 内 水 はるか),2007,ソフトバンククリエイ ティブ 2. XOOPS Cube Legacy でつくる 最 強 のCMSサイト 鈴 木 宗 人, 2008, ソーテック 3. XOOPS Cube 日 本 公 式 サイト http://xoopscube.jp/ 4. XOOPS Cube @ WikiPedia https://ja.wikipedia.org/wiki/xoops_cube 5. XOOPSのデータ 永 続 化 アーキテクチャの 概 要 http://qiita.com/suin/items/766c91cf21d903e73aa6 6. XOOPSの 起 動 処 理 順 序 http://qiita.com/suin/items/1c288d396b48699dae2b 7. XOOPS Cubeのプリロードとデリゲートの 解 説 http://qiita.com/suin/items/6859401972c568056694 25
ありがとうございました 26