PukiWiki Plus! プラグイン開発チュートリアル

Top > PluginDev > TutorialPlus
First Edition. 12/31/2007
Last Modified. 12/31/2007
Tag: PukiWiki PluginDev

PukiWiki Plus! プラグイン開発チュートリアル

Table of Contents

概要

PukiWiki Plus! i18n の追加機能を利用したプラグイン開発チュートリアルです。 本家、PukiWiki Plus! i18n 両共通のプラグイン開発の基礎は PluginDev/Tutorial を参照してください。

ここでは、PukiWiki Plus! i18n 独自の機能を使用しつつ、本家でも使用できるようなプラグイン開発を目指します (本家での使用を考えないのならば簡略化できますが・・・)。

基礎

プラグイン拡張ディレクトリ

PukiWiki Plus! i18n ではプラグインを plugin ディレクトリではなく、extend/plugin ディレクトリに置くことが可能です。 同名のプラグインが両ディレクトリに存在する場合 extend/plugin ディレクトリにあるファイルが優先されます。 ユーザは extend/plugin ディレクトリを積極的に利用することで、自分がインストール、改造したプラグインをデフォルトで梱包されているプラグインと区別しやすくなります。参照 plus:開発日記/2006-04-30

ちなみに、そのプラグインがどちらのディレクトリに存在しているのは、

dirname(__FILE__)

のようにすることで判別できるでしょう。

ユーザ設定

PukiWiki Plus! i18n では init/プラグイン名.ini.php に各種プラグインの設定項目を記述した php ファイルを置くことにより、設定をプラグイン本体から分離し、保守性を高める(プラグインのアップデートを楽にできる)機能があります。 参照 plus:Documents/Plugin/How To Set Initial Value

技術的には init/プラグイン名.ini.php 実行→ プラグイン.inc.php 実行という順番になっているだけなので、 プラグイン本体のほうでこの機能に対するサポートが必要になります。

従来のプラグイン設定の部分を

-define('PLUGIN_プラグイン名_設定項目', 値);
+defined('PLUGIN_プラグイン名_設定項目') or define('PLUGIN_プラグイン名_設定項目', 値);

のように変更します。グローバル変数を使用していたとしたら同様に

-$GLOBALS['PLUGIN_プラグイン名_設定項目'] = 値;
+isset($GLOBALS['PLUGIN_プラグイン名_設定項目']) or $GLOBALS['PLUGIN_プラグイン名_設定項目'] = 値;

のように変更します*1

こうすることで プラグイン名.ini.php ファイルで

<?php
define('PLUGIN_プラグイン名_設定項目', 値);
$GLOBALS['PLUGIN_プラグイン名_設定項目'] = 値;
?>

と書いてもらえば、プラグイン名.ini.php ファイル中の設定が勝るようになります*2

もしも、PukiWiki 本家でも同様に init/プラグイン名.ini.php ファイルを使用してもらいたい場合は、プラグインファイルの先頭に

if (! defined('INIT_DIR')) // if not Plus!
    if (file_exists(DATA_HOME . 'init/プラグイン名.ini.php'))
        include_once(DATA_HOME . 'init/プラグイン名.ini.php');

を書いてきます。拙作のプラグインでは書くことにしていますが、必ずしも必要ではないでしょう。

メッセージ国際化

PukiWiki 本家では、英語メッセージ、日本語メッセージに両対応するには、en.lang.php, ja.lang.php という全プラグイン共有のファイルにメッセージ用変数を記述する必要がありました。プラグインファイルのインストールだけでは済まなくなるため、実質的にはデフォルトプラグイン以外ではその仕組みを使用することほとんどありませんでした。

PukiWiki Plus! i18n では gettext を使用することでメッセージの国際化が容易にできるようになっています。 gettext というのはプログラミングの知識はないが、語学の知識があるような方が用意に翻訳メッセージを作成できる仕組みで、php 以外にも多くのプログラミング言語で採用されています。 参照 plus:Documents/Tech/I18N plus:Documents/How to translate message

gettext を使用するには、メッセージが必要な場所で

_('Message');

のように関数 _() を使用します。国際化対応が容易なだけではなく、プログラミングとしても一々メッセージ用変数を用意しなくてすむので楽です。翻訳メッセージを用意したい場合は plus:Documents/How to translate message を参考に、.pot, .po, .mo ファイルを用意し、配布します。

gettext そのものは PukiWiki によるものではないので、PukiWiki 本家でもとりあえず動作はします(ただし、翻訳ファイルの置き場所が用意されていないので恩恵が受けられない)。 しかし、環境によっては gettext そのものがインストールされていない場合があるので、やはり少量の対応が必要になります。

if (! function_exists('_')) {
    function _($str) {
        return $str;
    }
}

プラグインに中に記述しておきます(ちなみに、PukiWiki Plus! には gettext がインストールされていない場合の対策がすでに施されているので、やはり PukiWiki 本家用対策と言えるかもしれません)。

PukiWiki 本家 EUC 版、UTF-8 版、PukiWiki Plus! EUC 版、i18n 版すべてに対応するためには、プラグイン中では

_('Message');

のように英語メッセージを使用するのが一番楽です。 EUC 版、UTF-8 版を用意したり、ユーザに文字コード変換をお願いする必要がありません。 そこはプラグイン作者次第ですが、拙作のプラグインは、国際化、ということも考慮にいれてデフォルトはすべて英語メッセージにしています。

PukiWiki Plus! 独自関数

PukiWiki Plus! には PukiWiki 本家にはない追加関数が用意されています。 lib/*plus.php なファイルや、lib/auth*.php なファイル中の関数が主に相当します。

例えば auth.cls.php には auth::get_existpages() 関数が用意されており、 get_existpages() 関数が全てのページをリストするのに対して、 アクセスしているユーザにとって参照権限のあるページだけをリストすることができるようになっています。

この関数を使用し、かつ PukiWiki 本家にも対応できるようにするには

if (! class_exists('auth')) {
    class auth
    {
        function get_existpages($dir = DATA_DIR, $ext = '.txt')
        {
            return get_existpages($dir, $ext);
        }
    }
}

というコードを書いておきます。


*1 ただし、isset は NULL に対して FALSE を返すので、'値'に NULL を使用するような場合は array_key_exists('PLUGIN_プラグイン名_設定項目', $GLOBALS); を使用してみてください
*2 正確には、define 値は元々上書きされないので、define('...') or はエラーメッセージを極力少なくするための措置です