RSS

まいあおPHPライブラリ(mlib.php)説明書

23 11月

[まいあおPHPライブラリ(mlib.php)説明書]

/My Document/Develop/Web/mlib.zip

*概要
まいあおPHPライブラリ(mlib.php)はPHPを使用したウェブアプリケーションをすばやく作成するために作成された。既存のpearライブラリなどもあるが汎用性を追求しているため大きく覚えて使いこなすのが困難なためである。
まいあおPHPライブラリはライブラリ本体(mlib.php)とユーザライブラリ(muser.php)からなる。ユーザライブラリは、繰り返し利用可能なコードやHTML文書のテンプレートを登録しておいて、ライブラリ本体から利用するもので、ユーザが内容を追加したり、変更・削除することを前提にしている。

*プログラムスタイル
まいあおPHPライブラリではプログラムの規模に応じてコーディング量をできるだけ減らせるようにいくつかのプログラムスタイルをサポートする。

!HTML埋め込み型
PHPファイルにHTML文書を含めるタイプである。PHPでHTMLエレメントを作成し、echoなどでそれをHTMLに埋め込む。

(例) test_BulletList.php
———————————————————————-
<?php
include “mlib.php”;

$data = array(‘その1’, ‘その2’, ‘その3’);
$tag = array(0=>'<ul>’, 1=>'<li style=”list-style: katakana”>’);

$list = new BulletList();
$list->listTag = “ol”;
$list->Add(‘東京’);
$list->Add(‘神田’);
$list->Add(‘お茶の水’);
$list->Add(‘四谷’);
$list->Add(‘新宿’);
?>
<html>
<head>
<title>test_BulletList</title>
<link rel=”stylesheet” type=”text/css” href=”night.css” />
</head>

<body>
<h1>test_BulletList.php</h1>
<hr  />
<p><a href=”index.html”>[ HOME ]</a></p>

<div>
<?php echo BulletList::FromData($data, $tag); ?>
</div>
<p>&nbsp;</p>
<div>
<?php echo $list->ToString(); ?>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</body>
</html>
———————————————————————-

!ユーザライブラリ利用のHTML分離型
ユーザライブラリ(muser.php)にあらかじめHTMLのテンプレートを用意しておき、それを読み込んでテンプレートに含まれるタグをPHPで作成したHTMLエレメントで置換する。

下の例はHTMLエレメントの埋込みとHTML出力を同時に行う関数(print_snippet)を使用している。

(例1)test_FileRead.php
———————————————–
<?php
include “mlib.php”;

$file = new File(“test_FileRead.php”);
$text = $file->ReadText(true);
$content = “<h1>test_FileRead.php</h1><br />\n”;
$content .= “<pre>$text</pre>”;

print_snippet(“HTML”, “simple1”,
array(
‘{%title%}’=>’test_FileRead.php’,
‘{%content%}’=>$content
)
);

?>

例1のHTMLテンプレートはmuser.phpで定義されており下のようになっている。

<html>
<head>
<title>{%title%}</title>
</head>

<body>
{%content%}
</body>
</html>
————————————————

下の例はキー’simple4’で指定されるHTMLテンプレートをユーザライブラリからロードし、タグ{%title%}、{%javascript%}、{%css%}、{%content%}をプログラムで作成した文字列で置き換えてから出力している。このうち、HTMLの主要部分はタグ{%content%}に相当する。

(例2)test_DataTable.php
———————————————–
<?php

include “mlib.php”;

$u = new UserLib();

class MyPage extends Page
{
var $table;

function MyPage()
{
parent::__construct();
$this->LoadTemplate(‘simple4’);    // テンプレートをロードする。

// テンプレート内のタグの内容を定義
$title = “test_DataTable.php”;
$javascript = “”;
$css = “flower.css”;
$content = “”;

// $content以外のテンプレート内のタグの内容を確定。
$this->Replace(‘{%title%}’, $title);
$this->Replace(‘{%javascript%}’, $javascript);
$this->Replace(‘{%css%}’, $css);

// $contentにHTMLテーブルを作成
$content .= tag(‘h1’, ‘<img src=”flower1.jpg” />&nbsp;’.$title);
$content .= ‘<hr />’;
$content .= “\n<p><a href=\”index.html\”>[ HOME ]</a></p>\n”;

$this->table = new DataTable();
$this->table->Header = array(‘A’, ‘B’, ‘C’);
$this->table->Add(array(1,2,3));
$this->table->Add(array(10,20,30));
$content .= $this->table->ToString();
$this->Replace(‘{%content%}’, $content);
}
}

// ページオブジェクト作成して出力する。
$page = new MyPage();
echo $page->ToString();

?>

例2のHTMLテンプレートはmuser.phpで定義されており下のようになっている。

<html>
<head>
<meta http-equiv=”content-type” content=”text/html;charset=utf-8″ />
<title>{%title%}</title>
<link rel=”stylesheet” type=”text/css” href=”{%css%}” />
<script type=”text/javascript”>
{%javascript%}
</script>
</head>

<body>
{%content%}
</body>
</html>

!テンプレートファイル利用のHTML分離型

次の例はHTMLテンプレートファイル(default2.html)をロードして、それに含まれるタグを置換してHTMLとして出力している。

(例) test_Page6.php
<?php

include “mlib.php”;

define(‘TEMPLATE’, ‘/var/www/html/test/default2.html’);

class MyPage extends Page
{
var $title = “test_Page6.php”;
var $home = “index.html”;
var $css = “mint.css”;

function MyPage()
{
parent::Page();

if ($this->Load(TEMPLATE) === FALSE)
{
$this->response = <<<EOS
<html>
<head>
<title>Error</title>
</head>

<body>
<h2>Error: Failed to load template file.</h2>
</body>
</html>
EOS;
}
else
{
$this->Replace(‘{%title%}’, $this->title);
$this->Replace(‘{%home%}’, $this->home);
$this->Replace(‘{%css%}’, $this->css);
$this->Replace(‘{%content%}’, ‘テンプレート(default2.html)で表示しています。’);
}
}
}

$page = new MyPage();
echo $page->ToString();

?>

*ログの取り方

mlib.phpでログを出力するのは、診断(Diagnosis)クラスだけです。ログは次のログ関数を使って出力される。この関数はユーザプログラムの任意の場所で使用できる。

function addLog($logfile, $message, $clear=false)

$LOG_DISABLE変数をtrueにしてこの関数を使う前に定義しておくと、ログ出力は行わない。なお、$LOG_DISABLE=falseはなくてもかまわない。
(例)
$LOG_DISABLE = true;

addLog(LOG, ‘…’);  // このログ出力は行われない。

$logfileはログを出力するファイルのパス名です。Diagnosisクラスではmlib.phpの定数LOGで指定したパスを使用する。したがって、このLOGの内容が不適切だとログが正しく取れない。
(例)
addLog(LOG, ‘エラー:****’);
この定数LOGはmlib.phpの最初の方でdefine()で定義されている。この値はユーザによってたいてい書き換える必要がある。このパス名は、apacheが書き込みできるパーミッションが必要である。

$messageはログに出力されるメッセージである。
$clearはtrueの場合、既存のログファイルがあったときそれを上書きする。$clearがfalseの場合は、メッセージがそのログファイルに追加される。
(例)
addLog(LOG, ‘MyApp start …’, true);

*HTMLタグの出力

HTMLタグの出力に便利な関数がある。

!function br($str, $lf=false);
この関数はパラメータ$strに<br />タグと\nを追加する。$lf=trueとすると$strの行末にLFがあるものとする。この場合、行末の1文字を削除してから”<br />\n”を追加します。結果(関数値)は文字列として返される。
(使用例)
print br(‘文字列’);
これは次のように出力される。
文字列<br />\n

!function print_br($str, $lf=false);
この関数は前述のbr関数と似ているが、関数値として文字列を返すのではなく、内部でprint関数によりHTMLの一部として出力する。
(使用例)
print_br(‘文字列’);

!function tag($tagname, $s, $attr=NULL);
この関数はパラメータ$tagnameで指定したタグで$sを囲みます。その際、$attrがNULLでなければ属性として$attrをタグ内に追加します。結果(関数値)は文字列として返されます。
(使用例)
print tag(‘a’, ‘HOME’, ‘href=”index.html”‘);
これは次のように文字列として返される。
<a href=”index.html”>HOME</a>\n

!function print_tag($tagname, $s, $attr=NULL);
この関数は前述のtag関数と似ているが、関数値として文字列を返すのではなく、内部でprint関数によりHTMLの一部として出力する。
(使用例)
print_tag(‘li’, ‘その1’);

!function linefeed($count=1);
行間を空けるときに使用する。<p>&nbsp;</p>を$count個出力する。
(使用例)
linefeed(4);
(注意)
この関数は内部でprint関数を使っている。

*Pageクラスを使ってウェブページを作成する
Pageクラスはウェブページのベースクラスとして使用する。

(例)
class MyPage extends Page
{
// コンストラクタ
function MyClass()
{
parent::__construct();
….
}

// このページのHTMLを返す。
function ToString()
{
return $this->response;  // responseは作成されたHTML。
}
}

PHPのメインプログラムはいつも次のような感じになる。つまり、ページクラスをインスタンス化し、ToString(メソッドを呼び出してそのHTMLをprintする。

(例)
$page = new MyPage();
print $page->ToString();

HTMLを作成するとき、直接PHPプログラムの中でHTMLを記述しても構まわないが、長いHTMLだとわかりづらくなるので、ユーザライブラリまたはファイルからテンプレートをロードしてその中に含まれる専用タグ({%title%}などHTML文書内に普通、現れない文字列を使用する)をPHPプログラムで置換する。
テンプレートのロードには、LoadメソッドまたはLoadTemplateメソッドを使用する。前者はファイルから、後者はユーザライブラリ(muser.phpで定義する)からテンプレートをロードする。ロードされた文字列はresponseプロパティに格納される。

function Load($filename)
$filenameはHTMLテンプレートファイルのパス名である。

function LoadTemplate($key)
$keyはユーザライブラリHTMLセクションのキーである。

また、タグの置換には、メソッドReplaceが利用される。

function Replace($tag, $value)

$tagが専用タグ(例:{%title%})、$valueがそのタグを置き換える文字列である。

(例)
$this->Replace(‘{%title%}’, ‘テストページ’);

テキストをresponseプロパティに追加するには、

$this->response .= $str;

としてもよいが、Write()メソッドを使っても同じ効果がある。

$this->Write($str);

!ポストバック
フォームを持つページでポストバックかどうかを判別するには、IsPostBack()メソッドを使用できる。IsPostBack()は、$_GET、$_POSTおよび$_FILESに変数が存在するかどうかを判別してポストバックかを判別している。

(例)
class MyPage extends Page
{
// コンストラクタ
function MyClass()
{
parent::__construct();
….
if ($this->IsPostBack())
{
// ポストバック時の処理
}
else
{
// 非ポストバック時の処理
}
}
}

!外部から来る変数
外部からくる変数はParams配列で取得できる。Params配列は$_REQUESTの参照である。
つまり、
$this->Params = &$_REQUEST;

(例)
$text1 = $this->Params[‘text1’];

!セッション変数
セッション変数はSessionオブジェクトで管理される。SessionオブジェクトはSessionクラスのインスタンスである。
$this->Session = new Session();

Sessionオブジェクトからセッション変数を得るには、getメソッドを使用する。

(例)
$count =$this->Session->get(‘count’);

セッション変数をセットするには、putメソッドを使用する。
(例)
$this->Session->put(‘count’, 0);

!ページのリダイレクト
他のページへRedirectするにはRedirectメソッドを使用する。

(例)
$this->Redirect(‘login.php’);

このメソッドを実行すると、メソッドからは戻らないので注意が必要である。

!ファイルのアップロード
アップロードされたファイルの情報はFilesプロパティに含まれる。これは$_FILESの参照である。つまり
$this->Files = &$_FILES;

アップロードされたファイルを特定のディレクトリに移動するには、FileUpload($savedir, $userfile)メソッドを使用する。$savedirは移動先のディレクトリで、$userfileはフォームのinputタグのnameフィールドの値である。

(例)
$this->FileUpload(‘/var/www/data’, ‘file1’);

アップロードされたファイル名は、UploadFileプロパティで知ることができる。したがって、上の例でそのパス名は

$filename = ‘/var/www/data/’.$this->UploadFile;

となる。

$savedirはapacheが書き込めるパーミッションが必要である。
mlib構成ファイル(iniファイル)には、uploaddirキーがあり通常、この値を保存先ディレクトリとして使用する。uploaddirキーの値は以下のように取得できる。

(例)
$conf = Configuration();
$uploaddir = $conf->get(‘uploaddir’);

!フォームのイベント処理

フォームのイベント処理はDispatchメソッドをオーバーライドして行う。フォームでhiddenコントロール(name属性は’Event’)を定義し、その値でイベントハンドラ名を設定するものとする。(このメカニズムを使うと複雑な場合は、無理に使う必要はないがプログラムの見やすさのため使用を推奨する)

(例)Dispatchメソッドの例
function Dispatch()
{
$event = $this->Params[‘Event’];

switch ($event)
{
case ‘Handler1’:
$this->Handler1();
break;

case ‘Handler2’:
$this->Handler2();
break;

default:
break;
}
}

(例)フォームの例
<form method=”post” name=”form1″>
フォーム1<br />
<input type=”text” name=”text1″ size=”40″ /><br />
<input type=”submit” value=”submit” /><br/>
<input type=”hidden” name=”Event” value=”Handler1″ />
</form>
<form method=”post” name=”form2″>
フォーム2<br />
<input type=”text” name=”text1″ size=”40″ /><br />
<input type=”submit” value=”submit” /><br/>
<input type=”hidden” name=”Event” value=”Handler2″ />
</form>

Dispatchメソッドはコンストラクタでポストバックの時コールする。

(例)
class MyPage extends Page
{
function MyPage()
{
parent::__construct();

if ($this->IsPostBack())
{
$this->Dispatch()
}

}

function Dispatch()
{
….
}
}

*フォーム
ウェブページ内でフォームを使うことがしばしばある。mlibにはフォームのHTMLを簡単に作成するためのクラスHtmlFormが用意されている。ただし、フォームのスタイルは自由ではないので注意が必要である。つまり、列数2の表に表題とHTMLコントロールを埋め込む形になる。

(例)
お名前
住所
電話番号
登録する

列2のコントロールは必ずしも1つだけでなくてもよいので次のようなことは可能である。
(例)
お名前
住所
電話番号
登録する リセット

HtmlFormクラスは直接使用するのでなく、必ずHtmlFormを基本クラスとするユーザクラスを作成して使用する。controlsプロパティは、「表題=>HTMLコントロール」形式の連想配列で、これを初期化しておくとHtmlForm::ToString()メソッドでフォームに変換する。フォームの属性はFormAttrプロパティで設定する。デフォルトだとmethod属性がGETなので、たいてい例のようにpostformプロパティ(クラス内で’method=”POST”と定義されている)で初期化する。
ファイルアップロードを行う場合、FormAttrはpostmethodでなくfileuploadプロパティ(これもクラス内で定義済みプロパティ)で初期化する必要がある。

(例)
class MyForm extends HtmlForm
{
// コンストラクタ
function MyForm()
{
parent::HtmlForm();

$this->controls = array(
‘お名前’=>'<input type=”text” name=”Name” size=”25″ value=”” />’,
‘住所’=>'<input type=”text” name=”Address” size=”45″ />’,
‘電話番号’=>'<input type=”text” name=”Tel” size=”25″ value=”03-0000-0000″ />’,
‘2’=>'<input type=”submit” value=”送る” />’
);

$this->FormAttr = $this->postform;    // method=”POST”
}
}

$form1 = new MyForm();

Pageクラスと併用する場合は、ロードしたHTMLテンプレート内にフォームのタグを作っておき、それをReplaceメソッドを使って置換する。上の例のsubmitボタンのように、コントロールだけ表示し、表題を表示したくないときは、表題に番号(1,2,3 ..)を指定する。

(例)
class MyForm extends HtmlForm
{

}

class MyPage extends Page
{
var $form;

function MyPage()
{
parent::__construct();

$this->form = new MyForm();
$this->LoadItempalte(‘form1’);

$this->form = new MyForm();

$this->Replace(‘{%form%}’, $this->form->ToString());
}


}

*構成ファイルを使う
アプリケーションの設定情報を保存したiniファイルを読み込むには、Configurationクラスを使用する。

(例)
$conf = new Configuration(CONF);
$uploaddir = $conf->get(‘uploaddir’);

CONFはmlib.phpで定義されている定数でiniファイルのパス名である(環境によりユーザが変更する必要がある)。
Configurationクラスは、Dictionaryクラスから派生しているので、Dictionaryクラスとその基本クラスの_Listクラスのメソッドやプロパティが使用できる。

*HTMLテーブルを簡単に作成する
HTMLテーブルを作成するためにHtmlTableクラスが用意されている。HtmlTableクラスはたいていユーザクラスの基本クラスとして使用する。

(例)
class MyTable extends HtmlTable
{
// コンストラクタ
function MyTable()
{
parent::HtmlTable(4, 5, array(‘A’, ‘B’, ‘C’, ‘D’));
}
}

$table1 = new MyTable();
$table1->SetValue(1, 1, 1);
$table1->SetValue(1, 2, 2);
$table1->SetValue(1, 3, 3);
$table1->SetValue(2, 1, 4);
$table1->SetValue(3, 1, 5);
$table1->SetValue(4, 1, 6);

?>

HTMLに変換するには他のクラスと同じようにToString()メソッドを使用する。

(例)
$table1 = new MyTable();
echo $table1->ToString();

テーブルには行を追加できる。これにはAddRowメソッドを使う。

(例)
$table1->AddRow();

行の内容をあらかじめセットしたいときは、AddRowのパラメータにその配列を指定する。
(例)
$table1->AddRow(array(10, ‘AAA’, ‘BBB’));

テーブル全体の属性はTableAttrプロパティに設定しておく。

(例)
$table1->TableAttr = ‘style=”border-style: solid; border-width: 1px; border-color: black”‘;

セルの属性は個別に変更できる。これにはSetAttrメソッドを使う。

(例)
$row = 1; $col = 2;
$table1->SetAttr($row, $col, ‘class=”td1″‘);

テーブルの1行目を表題として使う場合は、Headerプロパティに表題を設定しておく。

(例)
$table1->Header = array(‘番号’, ‘名前’, ‘性別’, ‘年齢’);

HTMLテーブルを簡単に作成するためのスタティックメソッド(FromData)が用意されている。このメソッドを使うと、配列から直接HTMLテーブルを作成できるが、個別にセルのスタイルの指定などはできない。

(例)
echo HtmlTable::FromData(array(array(‘A’, ‘B’), array(‘C’, ‘D’)));

*箇条書きを簡単に作成する
箇条書きを簡単に作成するためにBulletListクラスが用意されている。このクラスは、_Listクラスから派生されているので、_Listクラスのメソッドやプロパティが利用できる。簡単な使用例を下に示す。

(例)
$list = new BulletList();
$list->listTag = “ol”;
$list->Add(‘AAA’);
$list->Add(‘BBB’);
$list->Add(‘CCC’);

echo $list->ToString();

listTagプロパティは箇条書きのタグでデフォルトは’ul’である。

次のようにすると一度に項目を設定できる。

(例)
$list = new BulletList();
$list->AddRange(array(‘AAA’, ‘BBB’, ‘CCC’));

ulやolの属性を変更するには、listAttrプロパティを変更する。

(例)
$list->listAttr = ‘id=”ul1″‘;

箇条書き項目の属性を変更するには、itemAttrプロパティを変更する。

(例)
$list->itemAttr = ‘class=”itemstyle”‘;

スタティックなメソッドFromDataを使用するとクラスをインスタンス化せず、直接、配列から箇条書きHTMLを作成できる。

(例)
echo BulletList::FromData(array(‘AAA’, ‘BBB’, ‘CCC’));

BulletListクラスは_Listクラスを継承しているので、項目の削除、挿入、並べ替えも可能である。

(例)
$list->Remove(‘AAA’);
$list->RemoveAt(2);
$list->Insert(1, ‘DDD’);
$list->Sort();

*段落を簡単に作成する
段落を簡単に作成するためにDefineListクラスが用意されている。このクラスは、_Listクラスから派生されているので、_Listクラスのメソッドやプロパティが利用できる。簡単な使用例を下に示す。このクラスの使用法はBulletListクラスと似ている。

(例)
$list = new DefineList(‘中央線’);
$list->dtAttr = ‘style=”font-size: larger; color: cyan;”‘;
$list->Add(‘東京’);
$list->Add(‘神田’);
$list->Add(‘お茶の水’);
$list->Add(‘四谷’);
$list->Add(‘新宿’);

echo $list->ToString();

このクラスは、_Listクラスを継承しているので、AddRangeメソッドを使うと一括して段落項目を登録できる。

(例)
$list->AddRange(array(‘その1’, ‘その2’));

*ドロップダウンリスト(select)を簡単に作成する
ドロップダウンリストを簡単に作成するためにHtmlSelectクラスが用意されている。このクラスは、Dictionaryクラスから派生されているので、Dictionaryクラスや_Listクラスのメソッドやプロパティが利用できる。
簡単な使用例を下に示す。

(例)
$sel = new HtmlSelect();
$sel->Add(‘0’, ‘Item0’);
$sel->Add(‘1’, ‘Item1’);
$sel->Add(‘2’, ‘Item2’);
$sel->Add(‘3’, ‘Item3’);
echo $sel->ToString();

Addメソッドの最初のパラメータが連想配列のキーでHTMLに変換したときoptionタグのvalue属性として使用される。2番目のパラメータがoptionタグで挟まれ、ドロップダウンリスト内に表示される。

ドロップダウンリストの属性は、SelAttrプロパティを変更することにより変更できる。

(例)
$sel->SelAttr = ‘width=”30″, size=”4″‘;

optionタグの属性は、OptAttrプロパティ変更することにより変更できる。

(例)
$sel->OptAttr = ‘selected=”selected”‘;

このクラスは、_Listクラスを継承しているので、AddRangeメソッドを使うと一括してoption項目を登録できる。

(例)
$sel->AddRange(array(‘0’=>’item1’, ‘1’=>’item2′));

*ラジオボタンを簡単に利用する
ラジオボタンをまとめて作成するためにRadioListクラスが用意されている。このクラスは、Dictionaryクラスから派生されているので、Dictionaryクラスや_Listクラスのメソッドやプロパティが利用できる。
簡単な使用例を下に示す。

(例)
$this->rl = new RadioList(‘radioList1’);
$this->rl->Add(‘v0’, ‘RadioButton1’);
$this->rl->Add(‘v1’, ‘RadioButton2’);
$this->rl->Add(‘v2’, ‘RadioButton3’);
$this->rl->Check(‘v1’);

$content .= $this->rl->ToString();

この例で、コンストラクタのパラメータがラジオボタンのname属性、Addメソッドの第1パラメータがラジオボタンのvalue属性、第2パラメータがHTMLに表示されるラベルになる。
Checkメソッドはどのラジオボタンをチェック状態にするかを指定する。このメソッドを実行しないとどれも未チェックになるので注意すること。

このクラスは、_Listクラスを継承しているので、AddRangeメソッドを使うと一括してラジオボタンを登録できる。

(例)
$radios = array(‘v0’=>’RadioButton1’, ‘v1’=>’RadioButton2’);
$this->rl->AddRange($radios);

*イメージをまとめて管理する
よく使うイメージを管理し、簡単な操作でHTMLに変換できると便利である。ImageListを使うと登録してあるイメージを簡単にimgタグに変換できる。ImageListクラスはDictionaryクラスを継承しているので、Dictionaryクラスと_Listクラスのメソッドやプロパティが使用できる。

(例)
class MyPage extends Page
{
var $images;

function MyPage()
{
parent::__construct();

…..
$this->images = new ImageList();
$this->images->Attr = ‘border=”0″‘;
$this->images->Add(‘folder’, ‘/icons/folder.png’);
$this->images->Add(‘image1’, ‘/icons/image1.png’);
$this->images->Add(‘left’, ‘/icons/left.png’);
…..
$this->Write($this->images->ToString(‘folder’));
}
}

この例では、Writeメソッドによりresponseプロパティに<img src=”/icons/folder.png”  alt=”folder” />が追加される。

一括してイメージを登録するには次のようにする。

(例)
$this->images->AddRange(array(
‘folder’=>’/icons/folder.png’,
‘image1’=>’/icons/image1.png’,
‘left’=>’/icons/left.png’
));

imgタグの属性はToStringメソッドの第2パラメータで個別に指定できる。

(例)
$this->Write($this->images->ToString(‘folder’), ‘id=”folder”‘);

また、Attrプロパティに属性を設定するとすべてのimgタグにその属性が適用される。

(例)
$this->Attr = ‘border=”0″‘;

(注意) alt属性は自動的に追加されるので設定しないこと。

ShowAllメソッドを使うと、イメージリストに登録された画像を一括表示できる。デフォルトでは単純に画像を表示するだけである。必要に応じてオーバーライドして使用する。

*リンクをまとめて管理する
よく使うリンクを管理し、簡単な操作でHTMLに変換できると便利である。UrlListを使うと登録してあるリンクを簡単にaタグに変換できる。UrlListクラスはDictionaryクラスを継承しているので、Dictionaryクラスと_Listクラスのメソッドやプロパティが使用できる。

(例)
$this->url = new UrlList();
$this->url->Add(‘folder’, ‘/icons/folder.png’);
$this->url->Add(‘home’, ‘../index.html’);

foreach ($this->url->Keys() as $key)
{
$content .= $this->url->ToString($key);
$content .= ‘ ‘;
}

$content .= $this->url->ToString(‘home’, ‘[ TOP ]’);

一括してURLを登録するには次のようにする。

(例)
$this->images->AddRange(array(
”=>’/icons/folder.png’,
‘home’=>’../index.html’
));

ToStringメソッドの第2パラメータにimgタグを使用すると、文字列の代わりにイメージが表示できる。

(例)
$content .= $this->url->ToString(‘home’, ‘<img src=”/icons/home.gif” alt=”home” />’);

ToStringメソッドの第3パラメータを使用するとaタグの属性を指定できる。

(例)
$content .= $this->url->ToString(‘home’, ‘www’, ‘target=”_blank”‘);

*コレクションの応用
コレクションを扱うためのクラスとして

_List (名前の衝突を避けるため先頭に_が付くことに注意)
Dictionaryクラス

がある。
これらは直接、使用することもあるが、他のクラスの基本クラスとしても使用される。
また、コレクションのナビゲーションを行うときに使用できる

_Iteratorクラス (名前の衝突を避けるため先頭に_が付くことに注意)

もある。使用例を下に示す。

(例)
$c = “”;
$ar = array(‘black’=>0, ‘white’=>0xffffff, ‘yellow’=>0x00ffff, ‘blue’=>0xff, ‘red’=>0xff0000);
$list = new _List($ar);
$c .= br($list->ToString());

$it = new _Iterator($ar);

$c .= br(“getCurrent() = “.Scalar::ToString($it->getCurrent(), “%06x”));
$v = $it->MoveNext();
$c .= br(“MoveNext() = “.Scalar::ToString($v, “%06x”));

while ($v !== FALSE)
{
$v = $it->MoveNext();
$c .= br(“MoveNext() = “.Scalar::ToString($v, “%06x”));
}
$c .= tag(“p”, “MoveNext() end.”);

_ListやDictionaryクラスは他のクラスの基本クラスとして使用するだけでなく単独でも利用できる。これらのクラスを使うと要素の追加、挿入、置き換え、削除、並べ替えなどのメソッドが利用できる。

(例)
function testList1()
{
$c = “”;
$ar = new _List();

// Add
$ar->Add(1);
$ar->Add(-2);
$ar->Add(3);
$ar->Add(-4);
$c .= “<p>&nbsp;</p>\n”;
$c .= br(“getCount() = “.$ar->getCount());
$c .= br(“array = “.$ar->ToString());

// AddRange
$ar->AddRange(array(0, 5, 6, 7, 8));
$c .= tag(“p”, “AddRage(0,5,6,7,8) = “.$ar->ToString());

// RemoveAt
$ar->RemoveAt(3);
$c .= br(“RemoveAt(3) = “.$ar->ToString());

// Remove
$ar->Remove(0);
$c .= br(“Remove(0) = “.$ar->ToString());

// Insert
$ar->Insert(1000, 0);
$c .= br(“Insert(0, 1000) = “.$ar->ToString());
$ar->Insert(3000, 3);
$c .= br(“Insert(3, 3000) = “.$ar->ToString());

// IndexOf
$n = $ar->IndexOf(5);
$c .= br(“IndexOf(5) = “.(string)$n);

return $c;
}

function testDic()
{
$c = “”;
$ar = new Dictionary(array(‘black’=>0, ‘white’=>0xffffff, ‘yellow’=>0x00ffff, ‘blue’=>0xff, ‘red’=>0xff0000));
$c .= br($ar->ToString());

// get
$v = $ar->get(‘yellow’);
$c .= tag(“p”, “get(‘yellow’) = “.Scalar::ToString($v, “%06x”));

// Add
$v = $ar->Add(‘green’, 0x8800);
$c .= “Add(‘green’, 0x8800) = “.br($ar->ToString());

// put
$v = $ar->put(‘green’, 0xff00);
$c .= “put(‘green’, 0xff00) = “.br($ar->ToString());

// Keys
$keys = new _List($ar->Keys());
$c .= “Keys() = “.br($keys->ToString());

// KeySort()
$ar->KeySort();
$c .= “KeySort() = “.br($ar->ToString());
$ar->KeySort(true);
$c .= “KeySort(true) = “.br($ar->ToString());

return $c;
}

*データテーブル(2次元配列)を使う
DataTableクラスはデータの2次元配列である。このクラスは主にデータベースのクエリー結果などを保持するのに使用される。DataTableクラスは_Listクラスを継承している。

下の例は、データテーブルオブジェクトを作成して内容を表示するものである。ToStringメソッドは、データテーブルの内容を自動的にHTMLテーブルに変換する。

(例)
$this->table = new DataTable();
$this->table->Header = array(‘A’, ‘B’, ‘C’);
$this->table->Add(array(1,2,3));
$this->table->Add(array(10,20,30));
$content .= $this->table->ToString();
$this->Replace(‘{%content%}’, $content);

*MySQLの操作
MySQLデータベースを操作するためにMySQLクラスが用意されている。このクラスは、Databaseクラスを継承している。これは、他のデータベースの操作と共通性を持たせるためのものである。Databaseクラスの殆どのメソッドは空(何もしない)である。

MySQLクラスの使用例を下に示す。

(例)
$this->db = new MySQL(‘test’, ‘localhost’, ‘user’, ‘password’);

// test.test1テーブルの内容を取得する。
$table = $this->db->Query(‘select * from test1’);
if (is_null($table))
{
$this->content .= br(‘クエリー結果がNULLです。’);
}
else
{
$this->content .= $table->ToString();
}
$this->Replace(‘{%content%}’, $this->content);

上の例でQueryメソッドの戻り値の型はDataTableである。DataTableクラスのToStringメソッドを使って結果をHTMLに変換している。

QueryメソッドはDataTable型を返すが、クエリー結果のデータ量が大きい場合は、OpenReaderメソッドを使った方が良い。このメソッドは戻り値にDataReaderクラスを返す。
DataReaderクラスではクエリー結果を1行づつ取得できる。

(例)
$reader = $this->db->OpenReader(‘select * from test1’);
if (is_null($reader))
{
$this->content .= ‘OpenReader()がnullを返しました。’;
return;
}

$row = $reader->Read();
while (isset($row))
{
for ($i = 0; $i < count($row); $i++)
{
$this->content .= $row[$i];
$this->content .= ‘, ‘;
}

$this->content .= ‘<br />’;

$row = $reader->Read();
}
$reader->Close();

(注意)
クエリーの際、問い合わせ条件にシングルクォートが含まれているとエラーになるので注意すること。qq関数を使うと、シングルクオートを”に変換してくれる。

SQLのINSERTコマンドやDELETEコマンドを実行するときは、Executeメソッドを使用する。下の例でInsertCommandメソッドは、配列からINSERT文を作成するメソッドで、Databaseクラスに実装されている。同様なメソッドにUpdateCommandメソッドがある。

(例) ExecuteとInsertCommandメソッドの使用例

$sql = $this->db->InsertCommand(‘test1’, array(
‘n’=>$this->Params[‘n’],
‘str’=>$this->Params[‘str’],
‘dt’=>$this->Params[‘dt’]
)
);

if ($this->db->Execute($sql))
{
$this->Replace(‘{%status%}’, ‘新しいデータを挿入しました。’);
}
else
{
$this->Replace(‘{%status%}’, ‘新しいデータの挿入に失敗しました。’);
}

SQLファイルを実行するには、ExecSQLメソッドを使用する。

(例)
$r = $this->db->ExecSQL($sqlfile);

*XMLの操作
XMLファイルの読み書きはEasyXMLクラスで限定的にサポートしている。つまり、次のようなXMLについて利用できる。

設定項目の一覧
(例)
<?xml version=”1.0″ ?>
<root>
<filename>*.zip</filename>
<savedir>/home/user/warehouse</savedir>
</root>

このようなXMLを読むメソッドとしてLoadSimpleXMLメソッドが用意されている。

(例)
$items = array();
if (! EasyXml::LoadSimpleXML($file, $items))
{
echo “XMLファイルの読み込みに失敗しました。”;
}
else
{
echo br(“XMLファイルの読み込みに成功しました。”);
if (isset($items))
{
echo br(‘data=>’.$items->data);
echo br(‘html=>’.$items->html);
echo br(‘cgi=>’.$items->cgi);
}
else
{
echo br(“要素がありません。”);
}

selectタグなどで使用できる連想配列
(例)
<?xml version=”1.0″ ?>
<root>
<item value=”0″>さくら</item>
<item value=”1″>きく</item>
<item value=”2″>ひまわり</item>
</root>

このようなXMLを読むメソッドとしてLoadDictionaryメソッドが、また書き込み用メソッドとしてSaveDictionaryメソッドが用意されている。

(例) LoadDictionary
$items = array();
if (! EasyXml::LoadDictionary($file, $items))
{
echo br(“XMLファイルの読み込みに失敗しました。”);
}
else
{
echo br(“XMLファイルの読み込みに成功しました。”);
if (count($items) > 0)
{
echo br(“要素の数=”.count($items));

foreach (array_keys($items) as $key)
{
echo br($key.”=>”.$items[$key]);
$max = $key;
}

}
else
{
echo br(“要素がありません。”);
}

(例) SaveDictionary
$key = (string)($max + 1);
$items[$key] = “item”.$key;
if (EasyXml::SaveDictionary($file, $items))
{
echo br(“XMLファイルの保存に成功しました。”);
}
else
{
echo br(“XMLファイルの保存に失敗しました。”);
}

*ファイルシステム
ファイル一覧の取得やファイル属性の取得などを行うFileSystemクラスが用意されている。FileSystemクラスのメソッドはスタティックでたいていはPHP関数のラッパーである。

(例)
$files = FileSystem::GetFiles(‘/var/www/cgi-bin’);
$box1 .= “<ul>\n”;
foreach ($files as $f)
{
$box1 .= tag(‘li’, $f);
}
$box1 .= “<ul>\n”;

$box2 = ”;
$ret = FileSystem::Exists(‘/etc/httpd’);
$box2 .= br(“Exists(‘/etc/httpd’) = “.Scalar::ToString($ret));
$ret = FileSystem::Exists(‘/etc/php’);

*ファイル
テキストファイルの読み書きを簡単に行うためのFileクラスが用意されている。これにはCSVファイル用のメソッドも含まれる。

(例)
$file = new File(‘/var/www/data/data.csv’);
if ($file->IsReadable())
{
$content = $file->ReadText(true);
}
$box1 .= tag(“pre”, $content);

$file = new File(‘/var/www/data/data.csv’);
if ($file->WriteText($content))
{
$box2 = “書き込み成功。”;
}
else
{
$box2 = “書き込み失敗。”;
}

*仮想ディレクトリ
VirtualPathsクラスを使用すると、リアルパスと仮想パスの相互変換ができる。

(例) リアルパスと仮想パスの相互変換
$vp = new VirtualPaths();
$vp->Add(‘/data/’, ‘/var/www/data/’);
$vp->Add(‘/icons/’, ‘/var/www/icons/’);
$vp->Add(‘/cgi-bin/’, ‘/var/www/cgi-bin/’);

$p1 = $vp->GetVirtual(‘/var/www/icons/home.gif’);
if (is_null($p1))
{
$box1 .= tag(‘p’, “GetVirtual failed.”);
}
else
{
$box1 .= tag(‘p’, “GetVirtual(‘/var/www/icons/home.gif’) = “.$p1);
}

$p2 = $vp->GetReal(‘/data/data.csv’);
if (is_null($p2))
{
$box1 .= tag(‘p’, “GetReal failed.”);
}
else
{
$box1 .= tag(‘p’, “GetReal(‘/data/data.csv’) = “.$p2);
}

*ユーザ管理
UserInfoクラスはユーザ管理ファイルに基づいたユーザ情報の管理を行うクラスである。ユーザ管理ファイルのパス名は、構成ファイル(iniファイル)の項目(キーはuseradmin)に含まれるものとする。

(例) 構成ファイルの記述例
useradmin=/var/www/data/useradmin.csv

ユーザ管理ファイルは下のようなCSVファイルである。
フィールド1がユーザID、フィールド2がMD5で暗号化されたパスワード、フィールド3が特権レベル、フィールド4がユーザ情報である。

(例) ユーザ管理ファイル

admin,81dc9bdb52d04dc20036dbd8313ed055,2,Administrator
user,81dc9bdb52d04dc20036dbd8313ed055,1,Users
guest,,0,Guest

下の例はユーザ一覧を表示するものである。

(例) ユーザ一覧を表示

// ユーザ一覧
function userList()
{
$table = new DataTable();
$table->Header = array(‘User ID’, ‘Password’, ‘Privilege’, ‘Information’);
$table->array = $this->user->users;
for ($i = 0; $i < count($this->user->users); $i++)
{
addLog(LOG, $this->user->users[$i][0].”, “.$this->user->users[$i][1].”, “.$this->user->users[$i][2].”, “.$this->user->users[$i][3]);
}
$this->Replace(‘{%table%}’, ‘ユーザ一覧<br />’.$table->ToString());
}

ユーザが有効などうかはIsValidメソッドで判断する。

// 構成ファイルからuseradmin(ユーザ管理ファイル)のパスを取得
$conf = new Configuration(CONF);
$useradmin = $conf->get(‘useradmin’);

// ユーザ情報オブジェクトを構築
$users = new UserInfo($useradmin);

// PostBackされたuseridとpasswordをユーザ管理情報と比較する。
if ($users->IsValid($this->Params[‘userid’], $this->Params[‘password’]))
{
$message = ‘<p style=”font-size:larger; font-weight:bold; text-align:center”>ログインしました。</p>’;
$message .= ‘<p style=”text-align:center”><a href=”SessionPage.php”>TOPページへ</a></p>’;
$this->Replace(‘{%message%}’, $message);
$this->Session->Add(‘userid’, $this->Params[‘userid’]);
}
else
{
$this->Replace(‘{%message%}’, ‘ログインに失敗しました。ユーザが存在しないかパスワードが誤っています。’);
}

*プロセス
プロセスを起動するためのクラスProcessが利用できます。コンストラクタでコマンドとパラメータを指定してStartメソッドを実行する。

(例)
$proc = new Process(‘cp’, array(‘/var/www/html/test/mlib.ini’, ‘~/temp’));
$ret = Scalar::ToString($proc->Start());

パラメータはコンストラクタの第2パラメータで指定し、これは配列型である。
パラメータをコマンドと分けないで次のようにすることもできる。

(例)
$proc = new Process(‘cp -v /var/www/html/test/mlib.ini ~/temp’, NULL);
$ret = Scalar::ToString($proc->Start());

*スカラークラス
Scalarクラスは文字列変換と型の判別を行うスタティックなメソッドからなる。

(例) ToString
print_tag(“li”, “Scalar::ToString(0xa) = “.Scalar::ToString(0xa));
print_tag(“li”, “Scalar::ToString(100, ‘%04x’) = “.Scalar::ToString(100, ‘%04x’));

(例) IsDouble
print_tag(“li”, “Scalar::IsDouble(1.0) = “.Scalar::ToString(Scalar::IsDouble(1.0)));
print_tag(“li”, “Scalar::IsDouble(NULL) = “.Scalar::ToString(Scalar::IsDouble(NULL)));

*日時クラス
DateTimeクラスは日時を得るためのスタティックメソッドを実装している。

(例) メソッドの使用例
$c .= tag(“li”, “Now() = “._DateTime::Now());
$c .= tag(“li”, “Today() = “._DateTime::Today());
$c .= tag(“li”, “Time() = “._DateTime::Time());

*文字列クラス
Stringクラスは主にPHP文字列関数のラッパーであり、スタティックなメソッドとして実装されている。

(例) メソッドの使用例
$content .= tag(“p”, “ToLower() = “.$str3->ToLower());
$content .= tag(“p”, “ToUpper() = “.$str3->ToUpper());
$content .= tag(“p”, “IsAlpha(‘A’) = “.Scalar::ToString(String::IsAlpha(‘A’)));
$content .= tag(“p”, “IsAlpha(‘1xx’) = “.Scalar::ToString(String::IsAlpha(‘1xx’)));
$content .= tag(“p”, “IsDigit(‘1xx’) = “.Scalar::ToString(String::IsDigit(‘1xx’)));
$content .= tag(“p”, “IsDigit(‘x000’) = “.Scalar::ToString(String::IsDigit(‘x000’)));
$content .= tag(“p”, “IsHexDigit(‘1’) = “.Scalar::ToString(String::IsHexDigit(‘1’)));
$content .= tag(“p”, “IsHexDigit(‘ax’) = “.Scalar::ToString(String::IsHexDigit(‘ax’)));
$content .= tag(“p”, “IsHexDigit(‘s1’) = “.Scalar::ToString(String::IsHexDigit(‘s1’)));
$b64 = String::Base64_Encode(‘あいうえお’);
$content .= tag(“p”, “Base64_Encode(‘あいうえお’) = “.$b64);
$s = String::Base64_Decode($b64);
$content .= tag(“p”, “Base64_Decode() = “.$s);
$s = String::GetMD5(‘ABC’);
$content .= tag(“p”, “GetMD5(‘ABC’) = “.$s);

*環境のチェック
動作環境のチェックを行うためのクラスDiagnosisが用意されています。
以下のチェックを行うことができます。

ログが取れるか
PHPのバージョンが5以上か。
構成ファイル(iniファイル)の設定項目が問題ないか
PHPの必要な拡張モジュールがインストールされているか

*JPEGファイルの操作
gd拡張モジュールを使ったクラスJpegが用意されています。
ファイルから読み込んだり、作成したJPEG画像を直接ブラウザへ送ることが可能です。

(例)
include “mlib.php”;

if (isset($_GET[‘file’]))
{
$jpeg = new Jpeg($_GET[‘file’]);
$jpeg->Write();
}

 
コメントする

投稿者: : 2010/11/23 投稿先 PHP

 

タグ: ,

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中