Delphi for PHPを使い倒す!

Delphi for PHPを使い倒す!(後編)

Delphi for PHPでExcel帳票を作ろう

はやしつとむ
アナハイムテクノロジー株式会社

2009/11/25

PHPExcel使用時の注意点

 今回のサンプルでもそうですが、PHPExcelを利用してExcelファイルを出力する際に、最終的にPHP入出力ストリームのphp://outputへファイルを書き出すことで処理を終えることになります。

 ところが、この場合にボタンのSubmitEventがクリアされずに残ってしまうという不具合が発生します。

 前編で取り上げたボタンクリック時のイベントに関連するJavaScritpラッパーの図を参照すると分かるとおり、ボタンのクリック時には各ボタンに対応したボタン名+'SubmitEvent'という名称のhiddenfieldに、ボタン名+ボタンのOnClickハンドラが値として設定されるようになっています。

●JavaScriptラッパー
JavaScriptラッパー

 この値は、ページが新しく生成される段階で初期化されますが、OnClickイベント中で処理が終了してしまう今回のようなケースでは、Showメソッドが呼ばれないために新しいページへの遷移が発生しないので古い値が保持されてしまいます。

 そのため、Excelファイルが出力されてページが表示し直されているように見えていても、実はボタンのOnClickハンドラの処理内でのphp://outuputで処理が終了しているために、同じページの別のボタンをクリックした際に再び先ほどの帳票出力のためのボタンのイベントがサーバに送信されてしまい、Excelファイルが出力されてしまうのです。

 これを回避するために、帳票出力ボタンのhiddenfieldに限って、フォームのJSSubmitイベントハンドラ内でJavaScriptでクリアをします。ボタンのJSClickイベントとフォームのJSSubmitが成功すると、ボタンのイベントハンドラがhiddenfieldに設定されるのですから、フォームのJSSubmitイベントで特定のボタンのイベントハンドラをクリアしたとしても、そのボタンがクリックされたのであれば、この後でイベントハンドラが再設定さるので問題ないのです。

 残念ながら、前編で筆者が提案したとおりにVCLに手を加えていない場合、この手法は使えません。以下のテストプログラムでは、イベントをクリアするコードを追加していますが、フォームのOnSubmit JavaScriptイベントを外してしまうと、自分自身を再表示するボタンでも再度Excelファイルが出力されてしまうのが分かります。

●ボタンのサブミットイベントをクリアする処理
       function Unit1JSSubmit($sender, $params)
       {
        ?>
       //Excel出力後の再出力をリセットする処理
       //
       //synaps_clear_submiiEventValue
       //
       document.getElementById("<?php echo $this->Button1->name.'SubmitEvent';?>").value = null;
       return true;
       //
       //function end;
     //<?php

       }

 これで駆け足ながら、Delphi for PHP2.0のコンポーネント作成方法、プロパティの実現方法、オブジェクトのシリアライズについて見てきました。PHPでありながら、ビジュアル開発とコンポーネント指向を実現したDelphi for PHP 2.0で、開発生産性と品質のさらなる向上にチャレンジしてみませんか。

 また、余談になりますがDelphi for PHPのメーリングリストを開設しました。Delphi for PHPを使ってみたけど分からない、困った、バグじゃないのかなど、相談窓口になれればと思います。ぜひご参加下さい。

Delphi for PHP Users
delphi4php@freeml.com
http://www.freeml.com/delphi4php

prev
4/4
 

Index
Delphi for PHPでExcel帳票を作ろう
  Page1
PHPExcelから帳票出力
コンポーネントの作成
  Page2
PHPExcelをコンポーネントに組み込む
  Page3
PublicプロパティとPublishedプロパティ
オブジェクトのシリアライズとアンシリアライズ
Page4
PHPExcel使用時の注意点

index Delphi for PHPを使い倒す!

 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の世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間