【B6】Delphi for PHPテクニカルセッション「ビジュアルPHP開発、基本から応用までの60分」

ボーランド株式会社
エヴァンジェリスト
高橋智宏

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

1

Delphi for PHP 1.0（英語版） の入手方法• CodeGearのWebサイト• 製品版• パッケージ新規購入• パッケージ優待販売• ESD（Electronic Software Distribution）• トライアル版• 14日間試用できます• http://www.codegear.com/jp/downloads/free/delphiphp

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

2

1

Update 1（Version 1.0.1.415）• 5月上旬にリリース• http://support.codegear.com/article/36410• トライアル版は Update 1 適用済み
• Update 1 は、インストーラそのもの• 差分パッチではない• d4php_install.exe は、約29MB• http://downloads.codegear.com/default.aspx?productid=2701• バージョン番号は、Version 1.0.1.415• Update 2 も準備中…
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

3

Update 1 のインストール• サポート環境• Windows 2000 (Professional, Server)• Windows XP Professional• Windows Server 2003
• Windows Vista• データベースクライアントライブラリ（.DLL）• MySQL 5.0 – libmySQL.dll• InterBase 2007 – gds32.dll

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

4

2

Update 1 のインストール（続き）• Apache 2.0.52• PHP 5.1.3• デバッガ （NuSphere DBG Listener 2.13.1）• gettext 拡張• ヘルプ• .chm形式 （製品に同梱）• PDF形式 （ http://dn.codegear.com/jp/article/34356 ）• VCL for PHP Ver1.0 改• サンプル
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

5

ライセンスの登録• 従来のアクティベート方式• ダイレクトに• Webページ,EMailを使って手動で• Vista 上でダイレクトにアクティベートする際の問題• http://support.codegear.com/article/36295

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

63

初期設定
• ソースはUTF-8で• フォームのソース(.php)• フォームのデザイン情報のファイル(.xml.php)• 予約語の Bold, Italic を OFFに• エディタのフォントを変更• PHPをUTF-8用に設定変更• IDE Æ php.ini.template Æ php.ini• 起動するWebブラウザの設定
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

7プロジェクトの構成• メインフォームは？
• フォーム• ユニット名.php• ユニット名.xml.php• ユニット• ユニット名.php• ローカライズ向け• フォーム（Pageクラス）のLanguageプロパティで切り替え• ユニット名. Languageプロパティ.xml.php
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

84日本語を表示• フォーム（Pageクラス）の Encoding プロパティを「utf-8」に• <meta http-equiv="Content-Type" content="text/html;charset=utf-8">• コントロールを配置• ユニット名.xml.php は UTF-8• PHPのソースコード• UTF-8 で記述

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

9使い方• プロジェクトの作成• フォームの追加• コンポーネントの配置• 起動• デバッグ• ブレークポイント• 変数のウォッチ
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

105

イベントハンドラの記述• コンポーネントの[Events]のイベントハンドラ• 例：Buttonコンポーネントの[Events] - [OnClick]• PHPコードのみを記述<?php...
class Unit1 extends Page{
public $Label1 = null;public $Edit1 = null;public $Button1 = null;function Button1Click($sender, $params){$this->Label1->Caption = $this->Edit1->Text . ‘さん、こんにちは’;}
}
...
...
?>

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

11

イベントハンドラの記述（続き）• コンポーネントの[Javascript]のイベントハンドラ• 例：Pageコンポーネントの[Javascript] - [OnLoad]• PHPコードと、クライアント側向けJavaScriptソースの両方を記述可能 <?php...
class Unit1 extends Page{
public $Edit1 = null;function Unit1JSLoad($sender, $params){?>
var fullname = "<?php echo $this->Edit1->Text; ?>";
if( fullname.length > 0 ) {var msg = fullname + "さん、こんにちは";alert(msg);}
return true;<?php}}...
?>
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

JavaScriptとPHPが混在

126

モーダルなメッセージボックスの記述• JavaScriptのalert(“…”);の代替手段• Windowコンポーネントを[Javascript]のOnLoadで Window1.show();• Modalプロパティをtrueclass Unit1 extends Page{
public $Label1 = null;public $Window1 = null;function Button2JSClick($sender, $params){?>
Window1.close();<?php}
function Unit1JSLoad($sender, $params){if( mb_strlen($this->Label1->Caption) > 0 ) {echo 'Window1.show();';}}
function Button1Click($sender, $params){$this->Label1->Caption = $this->Edit1->Text;}}

すべてPHPで記述

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

13

Buttonクリック時のイベントハンドラの呼び出し順
1.

Button の [Javascript] - [OnClick]※Webブラウザ側でJavaScriptコードが実行される

2.

Page の [Events] - [OnCreate]3.

Button の [Events] - [OnClick]

4.

Page の [Events] - [OnShow]

5.

Page の [Events] - [OnShowHeader]

6.

PageやButton等 の [Javascript] - [OnXXXX]※PageのOnLoad, ButtonのOnClick の PHPコードが実行される

7.

Page の [Events] - [OnShowBody]

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

147

ページの遷移方法• redirect 関数を使用 - VCL for PHP のランタイム rtl.inc.php/*** Redirects the browser to a project file
* @param string $file File to redirect to*/function redirect( $file ){$host = $_SERVER[ 'HTTP_HOST' ];$uri = rtrim( dirname( $_SERVER[ 'PHP_SELF' ] ), '/¥¥' );header( 'Location: http://' . $host . $uri . '/' . $file );exit();}• リダイレクト先のURLにリクエストを埋め込む – ‘xxx.php?id=123’• $_SESSION 変数でデータを共有...
class Unit1 extends Page{
public $Edit1 = null;function Button1Click($sender, $params){$_SESSION['fullname'] = $this->Edit1->Text;redirect("unit2.php");}}...
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

15

PHPのfilter機能•

入力文字列のサニタイズ - VCL for PHP のランタイム system.inc.php
例：EditコンポーネントのTextプロパティ•1.

“Æ&#34;

2.

‘

Æ

&#39;

3.

&, > Æ&, >4.

<< 以降を削除!!

Æ

生の入力データを取得する方法...
function Button1Click($sender, $params){//$inputparam = $this->Edit1->input->{$this->Edit1->Name};
global $input;$inputparam = $input->{$this->Edit1->Name};if( is_object($inputparam) ){$raw_str = $inputparam->stream[$this->Edit1->Name];}}...

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

168

gettext 拡張• 文字列データのハードコードを防ぐ• PHP の gettext 拡張モジュール - php_gettext.dll• gettext(“xxx”) または _(“xxx”)
<?php
...
class Unit1 extends Page{
public $Label1 = null;public $Edit1 = null;function Button1Click($sender, $params){// gettext(“xxx”)$this->Label1->Caption = $this->Edit1->Text . gettext(“msg1”);// _(“xxx”)$this->Label1->Caption = $this->Edit1->Text . _(“msg1”);}}?>

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

17

gettext 拡張（続き）• [Tools] - [Internationalization Wizard]• <プロジェクト>¥locale¥Japanese¥LC_MESSAGES¥messages.po• poEdit 1.3.6• poEdit is cross-platform gettext catalogs (.po files) editor.
• MIT license• .moファイルの生成• 文字符号化法は UTF-8

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

189

gettext 拡張（続き）• PageコンポーネントのLanguageプロパティ• bind_textdomain_codeset 関数<?php...
class Unit1 extends Page{
public $Label1 = null;public $Edit1 = null;public $Button1 = null;function Unit1Create($sender, $params){$this->Language = 'Japanese';bind_textdomain_codeset("messages", "UTF-8");}function Button1Click($sender, $params){$this->Label1->Caption = $this->Edit1->Text . _("msg1");
}
}
...
?>

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

19

コンポーネントの作成• [Component] - [New Conponent…]• パッケージ名.package.php• パッケージのタイトル文字列• アイコンのパス• コンポーネントの登録• カテゴリ名• コンポーネントクラス名• コンポーネントの実装ファイル(“フォルダ名/コンポーネント名.inc.php”)• コンポーネント名.inc.php
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

20

10

コンポーネントの登録• [Component] - [Packages…] - [Add]• カスタムコンポーネントは、vclフォルダの下に置く• コンポーネント名.bmp• ソースファイルに、BOM（UTF-8の）があると×• エディタでBOMを削除する!!

• ソースの末尾に、余分な空白スペースがあると×• エディタでスペースを削除する!!
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

21

コンポーネント• ビジュアルコンポーネント – Control• 非ビジュアルコンポーネント – Component• プロパティ• readXXX, writeXXX, defaultXXX• getXXX, setXXX• 実装 – dumpHeaderCode(), dumpContents()• プロパティエディタ
• registerPropertyEditor関数
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

2211

VCL for PHP Ver1.0• Sourceforgeで公開されるオープンソース• http://vcl4php.sourceforge.net/• http://www.qadram.com/vcl4php/• ライセンスは、LGPL• ビルド• Latest stable - vcl_for_php_1_0.tar.gz• Daily builds - vcl_for_php_07_05_22.tar.gz

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

23

PHP と デバッガ を最新にする方法• 最新の環境• PHP 5.2.2• DBG Listener 2.15.5• How to update debugger and php version usedby Delphi for PHP ?
• http://support.codegear.com/article/36440

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

24

12

Delphi for PHP（VCL for PHP）の情報• 英語のみ• Quality Central• http://qc.codegear.com/wc/qcmain.aspx?p=360• Sourceforge Bug Tracking• https://sourceforge.net/tracker/?group_id=189419&atid=929250• 米Borlandのニュースグループ( newsgroups.borland.com )• 国際化対応済み（日本語など）• CDN（CodeGear Developer Network）• http://dn.codegear.com/• ナレッジベース• http://support.codegear.com/php
Copyright ©2007 CodeGear. All Rights Reserved.本文書の一部または全部の転載を禁止します。

2513