最小限のコードとはいえないかもしれないけれど、ここまで突き止めた。
コンポーネントの使い方に間違いがあるのでしょうか?
問題の再現手順。
新規にプロジェクトを作成して、プロジェクトにフォーム(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) の最新版について」をご覧ください。
Pingback: RadPHP XEでコンポーネントの復元でエラー?(その2) « 山本隆の開発日誌