XOOPSレベルからXooNIpsの開発を行うために・・・

1.XOOPSモジュール作成の基礎

詳細な説明は省きますが、XOOPSモジュール作成に必要なファイルの一覧を以下にまとめます。

(モジュールのルートディレクトリ)
 |——xoopsversion.php //モジュールの基本設定を記述したもの。
 |——images/
    |——logo.jpg // モジュールのロゴ画像。
 |——language/
    |——japanese/
       |——modinfo.php // モジュール情報の言語定義ファイル。
 |——sql
    |——mysql.sql // モジュールインストール時に実行するSQLクエリを記述したもの。(DBを使わなければ必要ない)

以上は、最低限必要なファイルです。ブロックや管理者メニューを作成するには、対応した幾つかのファイルを他に必要とします。


2.XooNIpsの構成

(XooNIpsのインストールや使い方については、本家サイトを参照してください。)

XooNIpsはXOOPSモジュールとして開発されているため、そのファイル構造は一般のXOOPSモジュールと共通した点が多くあります。その一方で、XooNIpsに依存するモジュール(アイテムタイプモジュールなど)に利用されることを意図したclassディレクトリとincludeディレクトリが用意されています。

classディレクトリ - ファイル一覧

includeディレクトリ - ファイル一覧

以上のファイルを必要に応じて読み込むことで、対応したXooNIpsの関数を使うことができます。XooNIpsの関数については本家サイトのマニュアルを参照してください。(昨年から更新が止まっているため、一部情報が古いです)


3.nimgsearchにおけるXooNIps

nimgsearchで、XooNIpsの関数を必要とする処理は以下のとおりです。

3-1.検索フォームの表示

検索フォームの項目取得は、svr/getMetaSearchBlock.phpで行われています。このPHPファイルでは、冒頭でXOOPSのヘッダーに加え、XooNIpsのlib.phpおよびxnpnimgcenterのview.phpをインクルードしています。

require('../../../mainfile.php');
include(XOOPS_ROOT_PATH.'/header.php');
// XooNIps標準ライブラリのインクルード
include_once XOOPS_ROOT_PATH.'/modules/xoonips/include/lib.php';
include_once XOOPS_ROOT_PATH.'/modules/xnpnimgcenter/include/view.php';

lib.phpを読み込むことで、[アイテムタイプ名]GetAdvancedSearchBlock()という関数を使えるようにしています。これを実行すると、そのアイテムタイプの検索フォームに必要な項目を取得できます。

view.phpを読み込むことで、xnpnimgcenterGetSupportedItemTypes()という関数を使えるようにしています。これを実行することで、xnpnimgcenterが対応しているアイテムタイプの一覧を取得しています。

// 詳細検索ブロックを返す
$ItemTypes = xnpnimgcenterGetSupportedItemTypes();
if( isset($ItemTypes[$_POST['type']]) )  // ユーザが指定したアイテムが対応していれば、if文内を実行
{
	$search_var = array();
	$func = $ItemTypes[$_POST['type']].'GetAdvancedSearchBlock';
	// 指定されたアイテムのGetAdvancedSearchBlock関数を得る


	global $nimg_metasearch_encoding;
	global $xoopsConfig;

	if (isset($nimg_metasearch_encoding[$xoopsConfig['language']])){

		$enc = $nimg_metasearch_encoding[$xoopsConfig['language']];
		header('Content-Type: text/html; charset:'.$enc);
		echo mb_convert_encoding( $func( $search_var ), $enc, mb_internal_encoding() );

	} else echo $func( $search_var );
	// 検索フォームのHTMLソースを表示する
}

3-2.論文検索

論文検索は、svr/getArticle.phpで行われています。このPHPファイルでは、冒頭で次のようにファイルのインクルードを行っています。

require('../../../mainfile.php');
include_once XOOPS_ROOT_PATH.'/modules/xoonips/include/create_session.php';
include_once XOOPS_ROOT_PATH.'/modules/xoonips/include/lib.php';
include_once XOOPS_ROOT_PATH.'/modules/xoonips/condefs.php';
include_once XOOPS_ROOT_PATH.'/modules/xnpnimgcenter/include/view.php';

それぞれを読む込むことで使用している関数は、次のとおりです。

create_session.php
lib.php
condefs.php
view.php

実際には、以下のような形で使用されています。

// NIMGアイテムを検索する
function xnpnimgsearchNIMGItemSearch( &$nimg_iids, $andor, $base_ids )
{

	$search_var = array();
	$search_tab = '';

	/**
	 * 
	 * function xnpSearchExec( $op, $keyword, $search_itemtype, $private_flag,  &$msg, &$iids, &$search_var, &$search_cache_id, $search_tab )
	 * @param op 'quicksearch' 'advancedsearch' 'itemsubtypesearch' 'itemtypesearch'
	 * @param keyword 検索キーワード
	 * @param search_itemtype 検索方式('all', 'basic' or アイテムタイプ名(xnppaperなど) )
	 * @param private_flag Privateなインデックスだけを検索するときtrue
	 * @param msg エラーメッセージを受け取る変数のリファレンス
	 * @param iids 検索条件にマッチしたアイテムのIDを受け取る配列のリファレンス item_id or identifier 
	 * @param search_cache_id 検索cacheのID. in/out
	 * @param search_tab 'metadata' 'file' その他(tciとかいうテーブル)
	 * @return true search succeed.
	 * @return false search failed. make sure $msg for detail.
	 * this function needs $xoopsDB, $xoopsUser, $xoopsConfig, $_SESSION.
	 * 
	 */

	$result = xnpSearchExec( 'advancedsearch', '', 'xnpnimgcenter', false,  $msg, $nimg_iids, $search_var, $search_cache_id, $search_tab );
	// 検索条件に合致したアイテムID群が$nimg_iidsに格納される
	
	return $result;
}

function makeResponseXML( $idx )
{
	$basic = xnpGetBasicInformationArray( $idx );

	/* アイテムのタイトルを取得 */
	if( $basic != false )
		$title = implode( ',', $basic['titles'] );
	else
		$title = 'Unknown';

	/* タライラック座標を取得 */	
	$detail = xnpnimgcenterGetDetailInformation( $idx );
	$tal_ary = explode( ':', $detail['talairach'] );
	
	/* 元論文の情報を取得 */	
	$baseitembase = xnpGetBasicInformationArray( $detail['baseitem_id'] );
	if( ($basetype = xnpnimgcenterGetSupportedTypeName( $baseitembase['item_type'] )) == '' )
		continue;
	$func = $basetype.'GetDetailInformation';
	$baseitem_detail = $func( $detail['baseitem_id'] );
	$info = array_merge( $baseitembase, $baseitem_detail );
	
	/* ・・・中略:ここでXMLの出力処理が行われる・・・ */	
}