class MyDataProvider extends DataProviderBase
{
private static $instance;
static function instance()
{
if (!self::$instance)
self::$instance = new MyDataProvider ();
return self::$instance;
}
protected function __construct()
{
$knownTables = array(
'MyPersonInfo' => 'persons',
'MyCompanyInfo' => 'companies',
'MyRelationInfo' => 'person2company'
);
parent::__construct($knownTables);
}
function GetPerson ($personId)
{
return $this->GetItem('MyPersonInfo', $personId);
}
function GetCompany ($companyId)
{
return $this->GetItem('MyCompanyInfo', $companyId);
}
function HireEmployee (MyCompanyInfo $company, MyPersonInfo $employee)
{
$key = new SearchKey('id_company', $company->ID());
$key->AddAndKey(new SearchKey('id_employee', $employee->ID()));
if (!$this->ListItems('MyRelationInfo', $key))
{
$rel = new MyRelationInfo ($employee->ID(), $company->ID());
$this->UpdateItem($rel);
return true;
}
}
function FireEmployee (MyCompanyInfo $company, MyPersonInfo $employee)
{
$key = new SearchKey('id_company', $company->ID());
$key->AddAndKey(new SearchKey('id_employee', $employee->ID()));
if ($list = $this->ListItems('MyRelationInfo', $key))
{
$this->DeleteItem($list[0]);
return true;
}
}
function ListEmployees (MyCompanyInfo $company)
{
$rel = new SearchRelation ('id', 'MyRelationInfo', 'id_person');
$key = new RelatedKey ($rel, 'id_company', $company->ID());
return $this->ListItems ('MyPersonInfo', $key);
}
function UpdatePerson (MyPersonInfo $person)
{
$trans = $this->BeginTransaction();
try
{
if ($person->isDirty)
$this->UpdateInfo ($person);
if ($company = $person->Company())
{
$this->UpdateCompany ($company);
$this->HireEmployee ($company, $person);
}
$this->CommitTransaction ($trans);
}
catch (Exception $ex)
{
$this->RollbackTransaction ($trans);
throw $ex;
}
}
function UpdateCompany (MyCompanyInfo $company)
{
if ($company->isDirty)
{
$trans = $this->BeginTransaction();
try
{
$this->UpdateItem($company);
$this->CommitTransaction ($trans);
}
catch (Exception $ex)
{
$this->RollbackTransaction ($trans);
throw $ex;
}
}
}