【B6】PHPテクニカルセッション「Delphi for PHPによるフォトギャラリの作成と運用」
CodeGear
エヴァンジェリスト
高橋智宏

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

1

アジェンダ
• 作成するWebアプリケーションの概要• ファイルのアップロードを行うには？
• サムネイル(縮小)画像を生成するには？
• カスタムコンポーネントを作成するには？
• 作成したWebアプリケーションを配布するには？

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

2

1

作成するWebアプリケーションの概要

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

3

必要な機能
• JPEGファイルをアップロードする• サムネイルを生成する• サムネイルをテーブル形式でリスト表示する• サムネイルをクリックすると、オリジナル画像が表示される

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

42

ファイルのアップロードを行うには？
Uploadコンポーネント
アップロードされたファイルを取得する
php.ini の設定項目

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

5

Uploadコンポーネント• [Additional]カテゴリの Upload• ファイルのフルパス• 一時的なもの。ページの処理後は自動的に消える• $this->Upload1->FileTmpName プロパティ• 別ファイルとして残すには• move_uploaded_file(移動元パス, 移動先パス);
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

63

php.ini の設定項目• file_uploads = On
• ;upload_tmp_dir =• 指定しない場合はシステムデフォルト• upload_max_filesize = 2M
• post_max_size = 8M
• memory_limit = 32M
memory_limit > post_max_size > upload_max_filesize
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

7

サムネイル(縮小)画像を生成するには？
アップロードされたJPEG画像の読み込み
サムネイル用(最大100x100)の画像リソース生成
サンプリングによる縮小コピー
JPEGリソースをファイルへの書き出す

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

84

アップロードされたJPEG画像の読み込み• $imgsize = getimagesize(ファイル名);• $imgsize[0]は幅, $imgsize[1]は高さ• $imgdata = imagecreatefromjpeg(ファイル名);• $imgdataはresource型• 元の画像サイズが、サムネイルのサイズ以下（縮小が不要）の場合は、サムネイルの生成処理は行わない
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

9function Button1Click($sender, $params){...
$imgfile = $this->GetImageFileName($imgindex);
move_uploaded_file($this->Upload1->FileTmpName, $imgfile);$imgsize = getimagesize($imgfile);$imgdata = imagecreatefromjpeg($imgfile);$thumbfile = $this->GetThumbFileName($imgindex);$thumb_w= 100;$thumb_h= 100;if( $imgsize[0] <= $thumb_w || $imgsize[1] <= $thumb_h ){imagejpeg($imgdata, $thumbfile);
return;}...
}Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

105

サムネイル画像(最大100x100)の生成• $thumbdata = imagecreatetruecolor(幅, 高さ);
• 適切な幅と高さを、元画像の幅と高さから算出• $thumbdataはresource型• imagecopyresampled(コピー先resource, コピー元resource,0, 0, 0, 0,コピー先幅, コピー先高さ,コピー元幅, コピー元高さ);• 今回はコピー元からコピー先へと縮小を行う• imagejpeg(画像resource, 出力先ファイル名);• JPEG形式でサムネイルを生成
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

11

function Button1Click($sender, $params){...
$thumb_w= 100;$thumb_h= 100;...
...
if( $imgsize[0] >= $imgsize[1] ) // w >= h$thumb_h = $thumb_h * ($imgsize[1] / $imgsize[0]);else$thumb_w = $thumb_w * ($imgsize[0] / $imgsize[1]);整数の除算と乗算
だけど、大丈夫？

$thumbdata = imagecreatetruecolor($thumb_w, $thumb_h);
imagecopyresampled($thumbdata, $imgdata, 0, 0, 0, 0,$thumb_w, $thumb_h, $imgsize[0], $imgsize[1]);imagejpeg($thumbdata, $thumbfile);}
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

126

カスタムコンポーネントを作成するには？
<table>…</table>コンポーネントが無い!!!!!!!!!!!!!!!
カスタムコンポーネントの作成
プロパティの作成
イベントの作成

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

13<table>…</table>コンポーネント• VCL for PHP には、<table>を生成するコンポーネントが無い!!
• サードパーティのコンポーネントにはあるが…

• カスタムコンポーネントを設計してみよう!!
• 親クラスは、VCL for PHP の「CustomControl」• 列数プロパティ, 行数プロパティ• セル(<td>…</td>)の中身を生成するイベント• function dumpContents() { … } のオーバーライド
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

147

カスタムコンポーネントの作成• UTF-8は未サポート 重要!!
• パッケージとコンポーネントの新規作成

コンポーネント作成時だけ一時的にOFF
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

15

カスタムコンポーネントの作成（続き…）• CustomControl は、ビジュアル系コンポーネントのベースとなるクラス
vcl• パッケージのファイル名• xxxx.package.php• コンポーネントのファイル名• yyy.inc.php…

mypack
xxx.package.php
compo
yyy.inc.php
icons
yyy.bmp• パッケージおよびコンポーネントは、必ずVCLのサブディレクトリに配置 重要!!
• 例:C:¥DelphiPHP¥1.0¥vcl¥mypack
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

168

パッケージファイル<?php
require_once("vcl/vcl.inc.php");
use_unit("designide.inc.php");

パッケージの説明文

setPackageTitle("Ken Components");

ツールパレットアイコンのフォルダ名

setIconPath("./icons");

registerComponents("Ken",array("KenTable"),"ken/compo/kentable.inc.php");?>

ツールパレットのカテゴリ名

コンポーネントのパス(vcl/ は省く)コンポーネントのクラス名
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

17

コンポーネントの基本的な書式
<?php
...
class クラス名 extends 親クラス {function __construct($aowner = null) {parent::__construct($aowner);}function dumpContents() {...
}

コンストラクタ
HTMLデータを出力するためメソッドをオーバーライド

protected $_xxx=デフォルト値;
function getプロパティ名() { return $this->_xxx; }function setプロパティ名($value) { $this->_xxx=$value; }プロパティ

function defaultプロパティ名() { return デフォルト値; }protected $_yyy=null;function getOnイベント名() { return $this->_yyy; }function setOnイベント名($value) { $this->_yyy=$value; }イベント

function defaultOnイベント名() { return null; }}Copyright ©2008 ?>CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

189

<table>コンポーネントの実装<?php
require_once("vcl/vcl.inc.php");
use_unit("stdctrls.inc.php");
class KenTable extends CustomControl {...
protected $_col=5;function getCol() { return $this->_col; }function setCol($value) { $this->_col=$value; }function defaultCol() { return 5; }protected $_row=5;

デフォルトは5列x5行のテーブル

function getRow() { return $this->_row; }function setRow($value) { $this->_row=$value; }function defaultRow() { return 5; }protected $_ondrawcell=null;function getOnDrawCell() { return $this->_ondrawcell; }function setOnDrawCell($value) { $this->_ondrawcell=$value; }OnDrawCellイベント

function defaultOnDrawCell() { return null; }}?> CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。
Copyright ©2008

19<table>コンポーネントの実装（続き…）...
function dumpContents() {echo "<table id=¥"{$this->_name}_table¥" border=¥"1¥">¥n";for($r = 0; $r < $this->_row; $r++) {echo "<tr>¥n";for($c = 0; $c < $this->_col; $c++) {echo "<td>¥n";if( ($this->ControlState & csDesigning) != csDesigning &&$this->_ondrawcell != null ) {// index = 0..N-1

実行時か判定イベントハンドラのnullチェック$this->callEvent('ondrawcell', array("index" => ($r*$this->_row)+$c));}
else {
echo "TestData¥n"; // デザイン時のダミー表示

イベントハンドラ( _ondrawcell )を起動
パラメータはハッシュテーブル

}echo "</td>¥n";}echo "</tr>¥n";}echo "</table>¥n";} CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。
Copyright ©2008

20

10

パッケージのインストールと利用

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

21

イベントハンドラの実装 - <td>の中身を出力
function KenTable1DrawCell($sender, $params) {$rb = new RadioButton();$rb->Name= 'RadioButtonX' . $params["index"];$rb->Caption = $params["index"];$rb->Group= 'imgindex';$rb->dumpContents();$imgfile

Tips
コンポーネントを動的に一時生成してdumpContentsメソッドを呼び出してHTMLを出力させる= $this->GetImageFileName($params["index"]);$thumbfile = $this->GetThumbFileName($params["index"]);if( is_file($thumbfile) ) {$image = new Image();$image->Name= 'ImageX' . $params["index"];$image->Width= 100; // for <div> element$image->Height= 100; // for <div> element$image->ImageSource = $thumbfile;$image->Link= $imgfile;$image->LinkTarget= '_blank';$image->dumpContents();}} CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。
Copyright ©200822

11

作成したWebアプリケーションを配布するには？
LinuxにXAMPPをインストール
php.iniの確認とXAMPPの起動
アプリケーションを転送
VCL for PHP 1.2 と カスタムコンポーネントを転送

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

23

LinuxにXAMPPをインストール• XAMPP for Linux 1.6.5a• http://www.apachefriends.org/download.php?xamp
p-linux-1.6.5a.tar.gz をダウンロード• sudo tar xvfz xampp-linux-1.6.5a.tar.gz -C /opt

• Windows向けには…
• XAMPP for Windows• WampServer 2.0• http://www.wampserver.com/en/
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

2412

php.iniの確認とXAMPPの起動• /opt/lampp/etc/php.ini を編集• 起動: sudo /opt/lampp/lampp start• 終了: sudo /opt/lampp/lampp stop

Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

25

ファイルを転送• *.php と *.xml.php をFTPで転送• カスタムコンポーネントを含め、vcl/ 以下すべてのファイルをFTPで転送• 注意点!!
• vcl/ はアプリケーションのサブフォルダに配置する[vcl-bin サブディレクトリは、どこにありますか ?]http://support.codegear.com/article/37402• classes.inc.php を更新[Delphi for PHP Update 2 での EPropertyNotFound エラーについて]
http://support.codegear.com/article/36967
Copyright ©2008 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

2613