ウィジェットの動作

ウィジェットは、個々が独立したアプリケーションのように動作する、単にテキストを出力するだけのプログラムです。
規定としては、ウィジェット作成基準?に示す基準のみで、ほとんど制約のない仕様です。
ウィジェットは、Web画面上の任意の矩形の領域を描画します。
画面上のどの位置を描画するかは、管理機能の画面定義で決定します。
画面定義によって、ウィジェットをテンプレート上のポジションタグ位置に配置します。
テンプレート上のタグのある位置であれば、どの位置にでもマップ可能なので、実際上は画面上の任意の矩形領域を描画可能です。
画面定義の方法については、画面の作り方?のページを参考にしてください。
また、Magic3の画面生成についての理論面については、画面の生成方法のページを参考にしてください。
ここでは、ウィジェット作成基準?から一歩進んで、Magic3のクラスライブラリを使用したウィジェットの作り方を解説します。
サンプルとして、アクセスカウンターを作成します。

createwidget1.gif

ディレクトリ構成

アクセスカウンターウィジェットのルートディレクトリ名を「access_count」として、ディレクトリ以下を以下のように構成します。
ルートディレクトリ名はウィジェットIDです。

access_count
       + include 
            + container    - ウィジェットのメインプログラム格納ディレクトリ
            + db           - dbアクセス用プログラム格納ディレクトリ
            + template     - テンプレート格納ディレクトリ
       + images            - 画像格納ディレクトリ
       + index.php         - ウィジェット起動用スクリプト

Magic3フレームワーク全体のディレクトリ構成については、ディレクトリ構成を参考にしてください。

index.php

ウィジェット起動用のスクリプトは、統一的に以下の決まりパターンで完了です。(①)

<?php
// スクリプトの直接アクセスの防止
defined('M3_SYSTEM') or die('Access error: Direct access denied.');

// ウィジェット実行
global $gLaunchManager;
$gLaunchManager->goWidget(__FILE__);
?>

コンテナクラスの作成

コンテナクラスはウィジェットのメインの処理を行うクラスです。
BaseWidgetContainer?クラスを継承し、「ウィジェットID + WidgetContainer?」 の名前でクラスを作成し、
クラス名に「.php」を付加したファイルに保存します。ファイルは「container」ディレクトリに格納します。

require_once($gEnvManager->getContainerPath()       . '/baseWidgetContainer.php');
require_once($gEnvManager->getCurrentWidgetDbPath() . '/access_countDb.php'); //  DBアクセス用クラス

class access_countWidgetContainer extends BaseWidgetContainer
{

index.phpから起動されたウィジェットは、①で「起動マネージャー」に一旦制御を渡します。
「起動マネージャー」は、「ウィジェットID + WidgetContainer?」クラスの_setTemplate()、_assign()メソッドを順に呼び出します。
_setTemplate()メソッドでは、patTemplate用のテンプレートファイル名を指定し、_assign()で
テンプレートファイルにデータを書き出します。
(ここでの「テンプレート」は、Magic3の「デザインテンプレート」の意味ではなく、テキストの一部を置き換える
テキスト変換ライブラリの雛形テンプレートのことです。Magic3では、デフォルトでpatTemplateライブラリを使用しています。)

function _setTemplate($request, &$param)
{	
	return 'index.tmpl.html';
}

function _assign($request, &$param)
{
	// 作成したHTMLを出力
	$this->tmpl->addVar("_widget", "NUMBER_LIST", $this->createOutput());
}

テンプレートファイルは、「template」ディレクトリに保存します。
index.tmpl.htmlの内容。

<patTemplate:tmpl name="_widget">
{NUMBER_LIST}
</patTemplate:tmpl>

アクセスカウンターウィジェットでは、カウント数を表示する少し複雑なタグの生成を行うため、すべての出力を
コンテナクラス内で生成していますが、通常はテンプレートファイルの必要な箇所のみの変換を行います。

DBアクセスクラス

アクセスカウンターウィジェットは、アクセスカウント数をDBに保持しています。
DBにアクセスするためにBaseDb?クラスを継承したクラスを使用します。
SQL文はすべてBaseDb?継承クラス内に記述します。

require_once($gEnvManager->getDbPath() . '/baseDb.php');

class access_countDb extends BaseDb
{

例えば、DBにアクセスし、カウンタを更新する部分は以下のようになります。

function incrementCount($date)
{
	// トランザクション開始
	$this->startTransaction();

	$queryStr = 'select * from ac_count ';
	$queryStr .=  'where co_date = ?';
	$ret = $this->selectRecord($queryStr, array($date), $row);
	if ($ret){		// 存在している場合はカウンタを更新
		$count = $row['co_count'] + 1;
		$queryStr = 'UPDATE ac_count ';
		$queryStr .=  'SET co_count = ? ';
		$queryStr .=  'WHERE co_date = ?';
		$this->execStatement($queryStr, array($count, $date));
	} else {
		$queryStr = 'INSERT INTO ac_count ';
		$queryStr .=  '(co_date, co_count) ';
		$queryStr .=  'VALUES ';
		$queryStr .=  '(?, ?)';
		$this->execStatement($queryStr, array($date, 1));
	}
		
	// トランザクション確定
	$ret = $this->endTransaction();
	return $ret;
}

終わり

以上でMagic3の標準クラスを使用したウィジェットは完成です。
次に管理画面からウィジェットの登録作業(ウィジェットの登録?)を行います。