SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Delphi for PHPでコンポーネントを作成する(AD)

Delphi for PHP でコンポーネントを作成する(その2)

Delphi for PHPのビジュアル開発で利用できるコンポーネントを自作

  • このエントリーをはてなブックマークに追加

Delphi for PHPは、ドラッグ&ドロップのビジュアル操作でPHP Webアプリケーションを開発できるツール。前回の記事で作成した自作コンポーネントCSSChartに、データベースアクセス機能を追加します。

  • このエントリーをはてなブックマークに追加

自作コンポーネントにデータアクセス機能を追加する

 前回の記事では、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フレームワークは、このようにデータアクセスのハンドリングに必要なすべての機能を提供します。

関連情報
 

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2531 2008/08/20 13:35

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング