自作コンポーネントにデータアクセス機能を追加する
前回の記事では、Delphi for PHPのコンポーネントを開発する手順を見てきました。今回は、CSSChartコンポーネントをDatasourceに接続させることにより、もう少しスパイス(機能)を追加してみようと思います。
これにより、作成したコンポーネントは、DatasourceコンポーネントにアタッチしたあらゆるDatasetからの情報を表現できるようになります。そのような情報を読み込み、それに対するインターフェースを提供するDatasetであれば、データベースやメモリ配列やXMLファイルなどから情報を得られます。
VCL for PHPのデータベースアクセススキームの開発では、VCL for Windowsに見られるものと同様のロジックに従いました。ですから、Delphi for Windowsのユーザーであれば、それらのコンセプトにはなじみがあるでしょう。
前回の記事
プロパティの追加
コンポーネントが動作するには、3つのプロパティを追加する必要があります。
- Datasource…あらゆる情報の提供元に接続します
- LabelsColumn…チャートのラベルを格納しているデータソースにおけるカラム名
- ValuesColumn…チャートの値を格納しているデータソースにおけるカラム名
[編集|Publishedプロパティの追加]を利用して、以下のコードが得られます。
protected $_datasource = null; function getDatasource() { return $this->_datasource; } function setDatasource($value) { $this->_datasource = $value; } function defaultDatasource() { return null; } protected $_labelscolumn = ""; function getLabelsColumn() { return $this->_labelscolumn; } function setLabelsColumn($value) { $this->_labelscolumn = $value; } function defaultLabelsColumn() { return ""; } protected $_valuescolumn = ""; function getValuesColumn() { return $this->_valuescolumn; } function setValuesColumn($value) { $this->_valuescolumn = $value; } function defaultValuesColumn() { return ""; }
オブジェクトプロパティと解決(Fixing Up)
オブジェクトプロパティとは、あるコンポーネントへの参照を行うプロパティです。PHPには、(簡単に言えば)データ型はありません。そのため、すべてのプロパティはIDEによって文字列として処理され、.xml.phpのリソースファイルに文字列として格納されます。
オブジェクトになり得るプロパティを文字列からオブジェクトへと変換するには、プロパティが適切な値を保持するのを保証する「解決(Fixing Up)」と呼ばれる追加の手順が必要になります。
最初に行うのは、その機能のためにセッター(setter)を変更することです。
function setDatasource($value) {
$this->_datasource = $this->fixupProperty($value); }
これにより、常に$this->_datasourceが適切な時点で適切な値を保持するようになります。また、このプロパティに適切な値を設定するために、フォームがロードされた時にこのメソッドを呼び出す必要があります。これは、loaded()メソッドをオーバーライドすることで可能です。
function loaded()
{
parent::loaded();
$this->setDataSource($this->_datasource);
}
ここで、パッケージをアンインストール/インストールすると、新しいプロパティがオブジェクトインスペクタに表示され、DatasourceプロパティにあらゆるDatasourceコンポーネントをアタッチできます。このコンポーネントにプロパティを追加するのに、これ以上のことは必要ありません。
Datasourceのデータを使用する
必要なコーディング
アタッチされたDatasetに格納されている情報を利用しますが、基本的に以下を行う必要があります。
- 情報が有効かどうか、プロパティをチェックする
- データセットを繰り返し処理する
- チャートに表示されるデータ配列を構築する
このコードを、前回の記事のdumpContents()メソッドの先頭付近で、データの代入の直後に追加します。すると、以下のようになります。
function dumpContents() { //Get the data to use $data = $this->_data; //If datasource is correctly assigned, we will use that data //instead the Data property //On design time, we don't have access to datasource objects, //so nothing to do if(($this->ControlState & csDesigning) != csDesigning) { //First, check if there is some value on the column properties if(($this->_labelscolumn != '') && ($this->_valuescolumn != '')) { //If there is a valid dataset attached if(($this->_datasource != null) && ($this->_datasource->Dataset != null)) { $ds = $this->_datasource->Dataset; //If dataset is active if($ds->Active) { $data=array(); //Iterate $ds->first(); while(!$ds->EOF) { //Add the item to the array $data[$ds->fieldget($this->_labelscolumn)] =$ds->fieldget($this->_valuescolumn); $ds->next(); } } } } } }
作成したコードの解説
コードを見てみましょう。まず、IDEの中か否かをチェックする必要があります。IDEの中では現在のコンポーネント以外のオブジェクトは利用できません。Datasourceへの参照がないので行うことは何もありませんが、実行時にはカラムプロパティに何らかの値があるかチェックする必要があります。最後に、Datasourceがアタッチされていて、そのDatasourceにDatasetがアタッチされていることを確認します。
これらすべての条件が揃えば、Datasetをオープンして作業を行えます。そして、データセットを繰り返し処理します。基本的なメソッドはfirst()とnext()で、データセットが最後の行に来た時にEOFがtrueを返します。
この処理の中における重要な行は、以下の行です。
$data[$ds->fieldget($this->_labelscolumn)] =$ds->fieldget($this->_valuescolumn);
この行では、$data配列に新たな要素を追加しています。そのキーは、LabelsColumnプロパティによって参照されるフィールドの値で、その要素の値は、ValuesColumnプロパティによって参照されるフィールドの値です。
完成です! データベースからの情報をチャートに収集するのに、もう何もすることはありません。
テスト
テストにはデータベース接続が必要です。データエクスプローラにデータベース接続を登録して、登録した項目をオープンします。そして、使用したいテーブルを選んでフォームにドラッグします。以上で、データに接続するために必要な次の3つのコンポーネントが作成されます。
- Database…データベースサーバへの接続をオープンする
- Table…特定のテープルへのSELECTクエリー文を発行する
- Datasource…コンポーネントを使い、データセットへの接続を可能にする
これらはすべてIDEによってセットアップされるので、設定を変更する必要はありません。次に、CSSChartを選択してDatasourceプロパティのドロップダウンリストを表示すると、今追加したDatasourceが表示されます。CSSChartを選択して、LabelsColumnプロパティとValuesColumnプロパティに使用したいフィールド名を設定します。
例えば、IDEは次のようになります。
アプリケーションを実行すると、次のようにブラウザに表示されます。
この過程は、データ機能を追加したいあらゆるコンポーネントに有効です。VCL for PHPフレームワークは、このようにデータアクセスのハンドリングに必要なすべての機能を提供します。