プラグインの作成方法

プラグインの作成方法

プラグインとは、アプリケーションに機能を追加するための小さなプログラムの事です。この仕組みを利用すれば、本体のプログラムを編集することなく、ある程度の機能追加が可能です。

プラグインの仕組みが実装されているプログラムは、各プログラムの Professional 版のみです。また、プラグインを作成するにはPerl5の知識が必須になります。
「パッケージ」とか「コンストラクタ」とか「モジュール」とか、用語が解らなければ オブジェクト指向の基礎 Perl講座Perlオブジェクト指向プログラミング など、解説サイトを参考にしてください。(オブジェクト指向は、僕自身も勉強中…。)

動作の概要

プラグインは、lib/webliberty/Plugin/ 内に格納したPerlモジュールを、必要に応じて実行する仕組みにしています。初期状態で Sample.pm が入っていますが、これは文字通りプラグインのサンプルとして作成したものです。diary.cgi?plugin=Sample で呼び出すと「ページ表示サンプル。」と表示され、任意のスキンに ${Sample} と記述して実行すると「埋め込み表示サンプル。」と表示されます。

プラグインの具体例

lib/webliberty/Plugin/ 内にあるPerlモジュールをプラグインとして実行しますが、実行時に以下のメソッドが実行されます。

run メソッドは、「処理結果をページに埋め込む」場合や「処理結果を専用ページに出力する」場合や「クエリに応じた処理を行う」場合に利用すると有効です。
complete メソッドは、「ページ表示処理完了後に処理を行う」場合や「投稿処理完了時に処理を行う」場合に利用すると有効です。
article メソッドは、「各記事ごとに特定の内容を表示させる」場合、つまり、プラグインから入力項目を追加した際に、その内容を表示する場合に有効です。

runcompletearticle の各メソッドは、一つのプラグインに同時に実装する事も可能です。また、各メソッドの実行前にプラグインの new メソッド(コンストラクタ)が実行されます。

以下では、実際にプラグインを作成する方法を紹介します。

引数から受け取る内容の詳細

コンストラクタでは、initconfigquery という値で、初期設定内容、環境設定内容、クエリー文字をそれぞれ受け取っています。これにより、プラグイン内からログファイル名や環境設定内容を取得する事ができます。

プラグイン以外のプログラム部分でも同じ方法で値を渡しているので、lib/webliberty/App/ 内のプログラムなども参考にしてください。

初期設定内容

初期設定内容とは、プログラムのバージョンやログファイル名など、管理者ページから変更できないシステム情報の事です。これらは $self->{init} 内に格納されます。

取得できる初期設定内容は lib/webliberty/App/Init.pm_set_init 内にある項目一覧です。例えば $self->{init}->{data_diary_dir} には ./data/diary/ という値が格納されています。

環境設定内容

環境設定内容とは、リンクの戻り先やログの表示件数など、環境設定ページから変更できるシステム情報の事です。これらは $self->{config} 内に格納されます。

取得できる環境設定内容は ./data/init.cgi に保存されている項目一覧です。例えば $self->{config}->{site_description} には 日々の生活を気ままにつづった日記帳。 という値が格納されています。

環境設定内容は、管理者ページの環境設定画面のソースコードからも調べる事ができます。例えば「日記帳からの戻り先」を入力するためのフォームには env_back_url というname属性が割り振られていますが、これは項目名の先頭に env_ を付加した値です。なので、プラグイン内では $self->{config}->{back_url} という名前で取得する事ができます。

クエリー文字

クエリー文字とは、プログラムを呼び出す際にブラウザから送られる文字列の事です。これらは $self->{query} 内に格納されます。

例えば diary.cgi?mode=admin というようにプログラムを呼び出した場合、$self->{query}->{mode} には admin が格納され、diary.cgi?plugin=Sample というようにプログラムを呼び出した場合、$self->{query}->{plugin} には Sample が格納さます。

Web Liberty 製のモジュールを呼び出す

エラー画面表示処理、スキン解析処理、メール送信処理、Cookieを扱う処理など、頻繁に使用する処理は汎用性の高いモジュールとして実装しています。(実装したつもり…。)

自前でメール送信処理などを記述する事は可能ですが、これらのモジュールを使用すれば簡単に処理を行う事ができます。

以下はモジュールを使用したメール送信プログラムの記述例。各モジュールの詳しい解説はまたそのうちに。

use webliberty::Sendmail;

my $sendmail_ins = new webliberty::Sendmail($self->{config}->{sendmail_path});
my($flag, $message) = $sendmail_ins->sendmail(
  send_to => 'your@mail.addr',
  subject => 'メール送信サンプル',
  name    => '匿名希望',
  message => 'メール送信モジュールのテストです。'
);
if (!$flag) {
  print "Content-Type: text/html; charset=utf-8\n\n";
  print $message;
  exit;
}

なお、プラグインは基本的には普通のPerlプログラムなので、CPANモジュールなどを利用する事も可能です。

Sample.pm の詳細解説

以上の内容を踏まえて、初期状態で付属している Sample モジュールのコードを解説します。Sample.pm の内容は以下のとおりです。

#Sampleプラグイン Ver 1.00 (2006/06/11)
#Copyright(C) 2002-2006 Knight, All rights reserved.

package webliberty::Plugin::Sample;

use strict;
use base qw(webliberty::Basis);

### コンストラクタ
sub new {
  my $class = shift;

  my $self = {
    init   => shift,
    config => shift,
    query  => shift
  };
  bless $self, $class;

  return $self;
}

### メイン処理
sub run {
  my $self = shift;

  my $result;

  if ($self->{query}->{plugin}) {
    print $self->header;
    print "<html>\n";
    print "<head><title>サンプル</title></head>\n";
    print "<body>\n";
    print "<p>ページ表示サンプル。</p>\n";
    print "</body>\n";
    print "</html>\n";
    exit;
  } else {
    $result = '埋め込み表示サンプル。';
  }

  return $result;
}

1;

プログラムの最初にコメントを記述していますが、ここにプログラムのバージョンや更新日時を記載しています。実際の処理内容には特に影響しません。

プログラムの名前は Sample とし、パッケージ宣言を行っています。

use base qw(webliberty::Basis); の部分で webliberty::Basis を継承しています。これは Web Liberty 製のモジュールで、CGIプログラム作成時に必要な基本機能を提供します。この宣言により、後で紹介する $self->header が使用可能になっています。

このプログラムは「処理結果をページに埋め込む」と「処理結果を専用ページに出力する」の両方に対応させています。これは $self->{query}->{plugin} を調べる事によって可能です。
「処理結果を専用ページに出力する」場合、必ず ?plugin=XXX のように plugin というクエリーが送られてくるので、これによって「処理結果をページに埋め込む」のか「処理結果を専用ページに出力する」のかを判断しています。

$self->header はヘッダ用文字列を返すメソッドです。webliberty::Basis を継承した事によって使用可能になっています。もちろん、自前で "Content-Type: text/html; charset=utf-8\n\n" と記述しても問題ありません。