ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilADTBasedObject.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2009 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
13 abstract class ilADTBasedObject
14 {
15  protected $properties = array(); // [array]
16  protected $db_errors = array(); // [array]
17 
25  public function __construct()
26  {
27  $this->properties = $this->initProperties();
28 
29  // :TODO: to keep constructor "open" we COULD use func_get_args()
30  $this->parsePrimary(func_get_args());
31  $this->read();
32  }
33 
34 
35  //
36  // properties
37  //
38 
44  abstract protected function initProperties();
45 
51  public function getProperties()
52  {
53  return $this->properties;
54  }
55 
61  public function isValid()
62  {
63  return $this->properties->isValid();
64  }
65 
76  public function __call($a_method, $a_value)
77  {
78  $type = substr($a_method, 0, 3);
79  switch ($type) {
80  case "get":
81  $parsed = strtolower(preg_replace("/([A-Z])/", " $1", substr($a_method, 3)));
82  $parsed = str_replace(" ", "_", trim($parsed));
83  if (!$this->properties->hasElement($parsed)) {
84  throw new Exception("ilADTObject unknown property " . $parsed);
85  }
86  return $this->properties->getElement($parsed);
87 
88  default:
89  throw new Exception("ilADTObject unknown method " . $parsed);
90  }
91  }
92 
93 
94  //
95  // CRUD / active record
96  //
97 
104  abstract protected function parsePrimary(array $a_args);
105 
111  abstract protected function hasPrimary();
112 
118  abstract protected function createPrimaryKey();
119 
125  abstract protected function initDBBridge(ilADTGroupDBBridge $a_adt_db);
126 
132  protected function initActiveRecordInstance()
133  {
134  global $DIC;
135 
136  $ilDB = $DIC['ilDB'];
137 
138  if (!$this->hasPrimary()) {
139  throw new Exception("ilADTBasedObject no primary");
140  }
141 
143  $this->adt_db = $factory->getDBBridgeForInstance($this->properties);
144  $this->initDBBridge($this->adt_db);
145 
146  // use custom error handling
147  include_once "Services/ADT/classes/class.ilADTDBException.php";
148  $ilDB->exception = "ilADTDBException";
149 
150  return $factory->getActiveRecordInstance($this->adt_db);
151  }
152 
158  public function read()
159  {
160  if ($this->hasPrimary()) {
161  $rec = $this->initActiveRecordInstance();
162  return $rec->read();
163  }
164  return false;
165  }
166 
172  public function create()
173  {
174  if ($this->hasPrimary()) {
175  return $this->update();
176  }
177 
178  if ($this->isValid()) {
179  if ($this->createPrimaryKey()) {
180  try {
181  $rec = $this->initActiveRecordInstance();
182  $rec->create();
183  } catch (ilADTDBException $e) {
184  $this->db_errors[$e->getColumn()][] = $e->getCode();
185  return false;
186  }
187  return true;
188  }
189  }
190  return false;
191  }
192 
198  public function update()
199  {
200  if (!$this->hasPrimary()) {
201  return $this->create();
202  }
203 
204  if ($this->isValid()) {
205  try {
206  $rec = $this->initActiveRecordInstance();
207  $rec->update();
208  } catch (ilADTDBException $e) {
209  $this->db_errors[$e->getColumn()][] = $e->getCode();
210  return false;
211  }
212  return true;
213  }
214  return false;
215  }
216 
222  public function delete()
223  {
224  if ($this->hasPrimary()) {
225  $rec = $this->initActiveRecordInstance();
226  $rec->delete();
227  return true;
228  }
229  return false;
230  }
231 
237  public function getDBErrors()
238  {
239  return $this->db_errors;
240  }
241 
248  public function translateDBErrorCodes(array $a_codes)
249  {
250  global $DIC;
251 
252  $lng = $DIC['lng'];
253 
254  $res = array();
255 
256  foreach ($a_codes as $code) {
257  switch ($code) {
258  case MDB2_ERROR_CONSTRAINT:
259  $res[] = $lng->txt("adt_error_db_constraint");
260  break;
261 
262  default:
263  $res[] = "Unknown ADT error code " . $code;
264  break;
265  }
266  }
267 
268  return $res;
269  }
270 
277  public function getAllTranslatedErrors($delimiter = "\n")
278  {
279  $tmp = array();
280 
281  foreach ($this->getProperties()->getValidationErrorsByElements() as $error_code => $element_id) {
282  $tmp[] = $element_id . " [validation]: " . $this->getProperties()->translateErrorCode($error_code);
283  }
284 
285  foreach ($this->getDBErrors() as $element_id => $codes) {
286  $tmp[] = $element_id . " [db]: " . implode($delimiter, $this->translateDBErrorCodes($codes));
287  }
288 
289  if (sizeof($tmp)) {
290  return get_class($this) . $delimiter . implode($delimiter, $tmp);
291  }
292  }
293 }
$delimiter
Definition: showstats.php:16
$type
global $DIC
Definition: saml.php:7
initActiveRecordInstance()
Init active record helper for current table, primary and properties.
$code
Definition: example_050.php:99
hasPrimary()
Check if currently has primary.
createPrimaryKey()
Create new primary key, e.g.
$factory
Definition: metadata.php:43
translateDBErrorCodes(array $a_codes)
Translate DB error codes.
initProperties()
Init properties (aka set ADT definition)
static getInstance()
Get singleton.
__construct()
Constructor.
parsePrimary(array $a_args)
Parse incoming primary key.
getDBErrors()
Get DB errors.
initDBBridge(ilADTGroupDBBridge $a_adt_db)
Init (properties) DB bridge.
foreach($_POST as $key=> $value) $res
$lng
update()
Update record (only if valid)
__call($a_method, $a_value)
Get property magic method ("get<PropertyName>()")
getProperties()
Get all properties.
global $ilDB
getAllTranslatedErrors($delimiter="\)
Get translated error codes (DB, Validation)
ADT based-object base class.
create()
Create record (only if valid)