RadPHP XEでコンポーネントの復元でエラー?

最小限のコードとはいえないかもしれないけれど、ここまで突き止めた。

コンポーネントの使い方に間違いがあるのでしょうか?

問題の再現手順。

新規にプロジェクトを作成して、プロジェクトにフォーム(unit2.php)とデータモジュール(unit3.php)を追加する。

データモジュール(unit3.php)にDatabaseコンポーネント・Tableコンポーネント・DataSourceコンポーネントを配置する。
DatabaseコンポーネントのDatabaseName・Host・UserName・UserPasswordプロパティを設定する。
TableコンポーネントのDatabaseプロパティにDatabaseコンポーネントを指定し、TableNameプロパティを設定する。

Unit1(unit1.php)にDBGridコンポーネントとLabelコンポーネントを配置する。

unit1.phpに次のコードを追加する。

require_once("unit3.php");

Unit1のOnCreateイベントに次のコードを追加する。

function Unit1Create($sender, $params)
{
  global $Unit3;
  $this->DBGrid1->DataSource = $Unit3->Datasource1;
  $Unit3->Table1->open();
  $this->Label1->Link = 'unit2.php';
}

これで、unit1.phpにアクセスすると、Tableコンポーネントに指定したテーブルのデータが表示される。

require_once("rpcl/rpcl.inc.php");
require_once("unit3.php");
//Includes
use_unit("forms.inc.php");
use_unit("extctrls.inc.php");
use_unit("stdctrls.inc.php");
use_unit("dbgrids.inc.php");

//Class definition
class Unit1 extends Page
{
    public $Label1 = null;
    public $DBGrid1 = null;
    function Unit1Create($sender, $params)
    {
      global $Unit3;
      $this->DBGrid1->DataSource = $Unit3->Datasource1;
      $Unit3->Table1->open();
      $this->Label1->Link = 'unit2.php';
    }
}

global $application;

global $Unit1;

//Creates the form
$Unit1=new Unit1($application);

//Read from resource file
$Unit1->loadResource(__FILE__);

//Shows the form
$Unit1->show();

Unit2(unit2.php)にLabelコンポーネントを配置する。

Unit2のOnCreateイベントに次のコードを追加する。

function Unit2Create($sender, $params)
{
  $this->Label1->Link = 'unit1.php';
}

require_once("rpcl/rpcl.inc.php");
//Includes
use_unit("forms.inc.php");
use_unit("extctrls.inc.php");
use_unit("stdctrls.inc.php");

//Class definition
class Unit2 extends Page
{
    public $Label1 = null;
    function Unit2Create($sender, $params)
    {
      $this->Label1->Link = 'unit1.php';
    }
}

global $application;

global $Unit2;

//Creates the form
$Unit2=new Unit2($application);

//Read from resource file
$Unit2->loadResource(__FILE__);

//Shows the form
$Unit2->show();

以上で、準備完了。

問題の発生手順。

最初にunit1.phpにアクセスする。
Tableコンポーネントに指定したテーブルのデータがDBGridに表示される。

Unit1のLabelコンポーネントをクリックする。
unit2.phpを表示する。

Unit2のLabelコンポーネントをクリックして、unit1.phpを表示する。
ここでエラーが発生する。

Application raised an exception class EPropertyNotFound with message ‘Trying to access non-existant property Unit1->Datasource1 in classes.inc.php, line 1451.’

回避方法。

コンポーネントの復元でエラーが発生していると考えられる。
コンポーネントの情報はセッションに登録されているので、セッションの情報をクリアすることで回避できる。

具体的にはunit2.phpのOnCreateイベントに次のコードを記述する。

function Unit2Create($sender, $params)
{
  $this->Label1->Link = 'unit1.php';
  session_destroy(); // この行を追加する
}

こうするとエラーは発生しない。

なお、RPCLは現時点での最新版を使っています。

2010年11月2日追記
RPCL Rev.289で修正されました。
RPCLを最新版に更新する方法は、「Team Japan » RPCL(RadPHP Component Library) の最新版について」をご覧ください。

コメント

  1. Pingback: RadPHP XEでコンポーネントの復元でエラー?(その2) « 山本隆の開発日誌

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください