GAE on PHPにおけるSmartyの連携方法
リトルソフトでは、SmartyおよびQuercusを独自にエンハンスして、GAE上でのテンプレートエンジン使用を実現しました。PHP4Gでは、Smartyがコンパイルを行ったコンパイル済みソースを、BigTable上に保存、展開します。
保存部分は、Smartyのコンパイル部分やファイル保存部分を独自に書き換えて、コンパイル済みソースをGAEのBigTable上に書き込めるように修正しました。展開部分では、BigTableから読み込んだコンパイル済みソースを直接PHPプロセッサに通す独自PHP命令文を新規作成しました。
BigTableに書き込まれたコンパイル済みソースを読み込むこと自体は、書き込み同様、容易に実現できました。しかし、それをPHPプロセッサに通す部分について、それを実現する方法がなかったのです。
具体的にいうと、PHPのInclude命令文などの外部リソースの読み込みは、その外部リソースが実在することが絶対的な条件なので、BigTableからコンパイル済みソースが読み込めただけでは、そのソースをPHPプロセッサに通す(PHPソースとして実行する)ことはできません。
なお、新規に追加した独自命令文は、Smarty内部処理でcallされるため、開発者がそれを意識する必要はありません。
Smartyの実際のソースを見てみましょう。
<html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>Smartyサンプル</title> </head> body> {$value} </body> </html>
テンプレートでは、{$value}と定義していますが、これは、変数valueの内容を表示させるsmartyの記述ルールです。
<html> <head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>Smartyサンプル</title> </head> body> {$value} </body> </html>
以上のように、テンプレート側、php側ともに、GAE環境であることを意識せず、いままでと同様の手順で、Smatyを使用できました。
Pear::DBを活用したデータアクセス
Pear::DBを活用することにより、データベースの差異をフレームワーク層(Pear::DB)が吸収するので、プログラマーはそれを意識することなく、統一的な手段でデータベースへのアクセスができます。
具体的には、Pear::DBのデータアクセス基底クラスのDB_commonを継承し、SQL4Gへのインターフェイスの役割を行う子クラスを新規作成します。SQL4Gへのアクセスは、そのクラスを通じてデータの取得、永続化を行います。
実際のPHPソースを見てみましょう。
<?php // Pear::DBの基底ソースをincludeします。 include $_SERVER["DOCUMENT_ROOT"]."/phplibs/inc.php"; include_once "DB.php"; // 接続情報の配列を作成。そのときphptypeにはSQL4Gと指定します。 $dsn = array( 'phptype' => 'SQL4G', 'database' => 'DB1', 'user' => 'sa', 'password' => 'sa' ); // sql4gへ接続 $db = DB::connect($dsn); // エラーがないか確認 if (PEAR::isError($db)) { die($db->getMessage()); } // SQL (SELECT DEPT_NAME FROM M_DEPT) を発行し、結果セットを設定 $ret = $db->query("SELECT DEPT_NAME FROM M_DEPT;"); // 結果セットの件数分、カラム[DEPT_NAME]を出力 while ($ret->fetchInto($row,DB_FETCHMODE_ASSOC)) { print($row["DEPT_NAME"].'<br>'); } // sql4gから切断 $db->disconnect(); ?>
いかがでしょうか。PHPをよく知る方なら、一度はお目にかかったことがあるコードだと思います。PHPからSQL4Gへのアクセスは、ほかのリレーショナルデータベースと同じ手順で、簡単に実現できます。
ここからは、シンプルながらも実際の業務で必要となる機能を網羅したPHPアプリケーションを作成し、実際にGAE上で動作させてみましょう。手順で以下のとおりです。
- アプリケーションの仕様決定
- PHP4Gでのアプリケーション作成
アプリケーションの仕様
GAE上に格納されている社員データの検索を行い、その結果を表示して編集を行うアプリケーションをPHPで作成します。
今回作成する画面イメージを見てみましょう。このアプリケーションは以下の3つの画面を作成します。
- 社員条件設定/社員登録画面:社員検索条件の設定や、入力した社員の登録を行う画面
- 社員検索結果表示画面:社員検索の結果を表示する画面
- 社員編集/社員削除画面:検索結果表示画面で選択した社員の情報を編集/削除を行う画面
続いて、アプリケーションのデータモデルを見てみましょう。社員の情報を格納するテーブル(T_EMP)とマスタテーブルとして社員の所属(M_DEPT)、社員の勤務体系(M_WORK_TYPE)の3テーブルが存在します。
データモデルのDDL文を見てみましょう。DataBase名称はDB1、UserNameとPasswordはsaとします。
CREATE TABLE T_EMP ( EMP_ID BIGINT NOT NULL, DEPT_CODE INTEGER NOT NULL, WORK_TYPE_CODE INTEGER NOT NULL, NAME VARCHAR(50) NOT NULL, ENTER_DATE DATE NOT NULL, SEX SMALLINT NOT NULL, CREATE_DATETIME TIMESTAMP NOT NULL, UPDATE_DATETIME TIMESTAMP NOT NULL ); CREATE TABLE M_DEPT ( DEPT_CODE INTEGER NOT NULL, DEPT_NAME VARCHAR(50) NOT NULL ); CREATE TABLE M_WORK_TYPE ( WORK_TYPE_CODE SMALLINT NOT NULL, WORK_TYPE_NAME VARCHAR(50) NOT NULL );
このDDLを、SQL4G Database Adminから実行します。SQL4G Database Adminのコンソールの詳細な説明は、http://www.littlesoft.jp/sql4g/を参照してください。また、 今回使用するDDLおよびデータをダウンロードしてください。
2/3 |
Index | |
PHPでGAE上に社員検索アプリを作る | |
Page1 ライブラリの説明 GAE上でファイル保存方法とSmartyのミスマッチ |
|
Page2 GAE on PHPにおけるSmartyの連携方法 Pear::DBを活用したデータアクセス |
|
Page3 GAE WebApplication Projectの作成と各種設定 ソースコードの説明 PHP4Gのよくある質問 |
GAE+PHP/Rubyで拓く新世界 |
Coding Edgeお勧め記事 |
いまさらアルゴリズムを学ぶ意味 コーディングに役立つ! アルゴリズムの基本(1) コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう |
|
Zope 3の魅力に迫る Zope 3とは何ぞや?(1) Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか? |
|
貧弱環境プログラミングのススメ 柴田 淳のコーディング天国 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く? |
|
Haskellプログラミングの楽しみ方 のんびりHaskell(1) 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう |
|
ちょっと変わったLisp入門 Gaucheでメタプログラミング(1) Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|