PEAK XOOPS - D3モジュールと言語処理(1) in englishin japanese

Archive | RSS |
XOOPS
XOOPS : D3モジュールと言語処理(1)
Poster : GIJOE on 2006-10-01 16:47:51 (8960 reads)

in englishin japanese
D3モジュールの言語処理ですが、基本的にはファイルベースのオーバーライドシステムを採用しています。

ただ、同じモジュールが複数読み込まれる可能性がある以上、言語定数の多重定義という問題が生じます。ここで大事なのは、言語定数ファイルには、複数回読み込まれる可能性があるものとそうでないものの2種類ある、ということです。

例えば、modinfo.php は、モジュールインストーラなどで、同じ型のモジュールインスタンスとして複数回呼ばれます。ですから、XOOPS_TRUST_PATH/modules/(trustdirname)/language/(lang)/modinfo.phpはこのような構造になります。


$constpref = '_MI_' . strtoupper( $mydirname ) ;

if( ! defined( $constpref.'_LOADED' ) ) {

	// a flag for this language file has already been read or not.
	define( $constpref.'_LOADED' , 1 ) ;

	define($constpref."_NAME","(name of the module)");
	define($constpref."_DESC","(desc of the module)");
}

利用する側(例えばxoops_version.php)も、このようになります。

$modversion['name'] = constant($constpref.'_NAME') ;
$modversion['description'] = constant($constpref.'_DESC') ;


これに対して、main.phpやadmin.phpは、基本的に1回しか呼ばれません。だから、上のような繁雑な処理は不要です。従来通り、
main.php

define('_MD_D3FORUM_ON','On');

admin.php

define('_MD_A_D3FORUM_LABEL_SELECTFORUM','Select Forum');

などとすればOKです。mainやadminは、たかだか1モジュールからしか呼ばれない、という仕様上の保証があるので、その仕様に違反するようなモジュールを使わない限り、二重定義問題は回避できます。もちろん、ユーザオーバーライドも可能です。

唯一複雑なのはブロックです。ブロックは、基本的に複数回呼ばれるのが仕様ですが、それは表示関係に限ります。ブロックオプションの編集フォームに利用される定数(1度しか利用されない)を、いちいち、constant($constpref."...") と書かなければならないのでは繁雑です。

というわけで、ブロック関連の定数に関しては2種類に分ける実装にしています。

XOOPS_TRUST_PATH/modules/(dirname)/language/(lang)/blocks_each.php
-- 従来通り、_MB_D3FORUM_* という定数を普通に定義する。ブロックオプションの編集関係のみ。
XOOPS_TRUST_PATH/modules/(dirname)/language/(lang)/blocks_common.php
-- $constpref で処理する。それらの定数は、Smartyにアサインする。

次回は、D3モジュールならではの、インスタンス毎の言語定数オーバーライドを説明します。

0 comments

Printer friendly page Send this story to a friend

Comments list

Login
Username or e-mail:

Password:

Remember Me

Lost Password?

Register now!