階層サブメニューの提唱

Date 2007-03-08 03:43:25 | Category: XOOPS

in englishin japanese
X2のサブメニューは、アクセスの都度 xoops_version.php をパースして得られる、$modversion['sub'] を利用する、という仕組みになってます。

そういう仕組みで良いのかどうか、非常に難しいところではありますが、現実にそう実装されてしまっている以上、その枠組みの中でどう最善を期すか考えてみました。

今回、サブメニューにつけたいと思ったのは、やはり階層構造です。というわけで、こんな形のツリー型再帰構造を提唱します。

array(
	'name' => (リンク文字列)
	'url' => (モジュールディレクトリからの相対URL)
	'sub' => (この構造体の配列/インデックスは数値の連番)
) ,

これは、$modversion['sub'] の1段目とまったく同じ構造です。
モジュール側のxoops_version.phpがこの形式で返すことで、テーマから自由にUL構造などにアサインすることが出来ます。

ただし、テーマ側でのサブメニューの取り出し方は重要です。subLink() だと、nameとurlしか返してくれないので、getInfo('sub') で取得する必要があります。

$module->subLink()
$module->getInfo('sub')


なお、X2には、同じモジュールのインスタンスをいくつも作ってしまうバグがあるので、サブメニューで階層構造を取得するようなロジックを組んでしまうと、それらが何度も呼び出されて無駄なオーバーヘッドになってしまいます。

xoops_version.php

$modversion['sub'] = array() ;
if( is_object( @$GLOBALS['xoopsModule'] ) && $GLOBALS['xoopsModule']->getVar('dirname') == dirname ) {
	require_once dirname(__FILE__).'/include/common_functions.php' ;
	$modversion['sub'] = dirname_get_submenu( $mydirname ) ;
}

などとすることで、必要な時にだけ、サブメニュー取得用関数が呼び出されるようにして、さらに、その関数内にstatic変数を用意して、サブメニュー結果をキャッシュするのが良いでしょう。

実は現時点で、d3forumおよびpicoは、このタイプの階層サブメニューに対応してたりします。対応テーマがいっぱい出るといいですね。




You can read more news at PEAK XOOPS.
http://xoops.peak.ne.jp

The URL for this story is:
http://xoops.peak.ne.jp/md/news/index.php?page=article&storyid=408