ILIAS  release_7 Revision v7.30-3-g800a261c036
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
13abstract 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}
An exception for terminatinating execution or to throw for unit testing.
ADT based-object base class.
initActiveRecordInstance()
Init active record helper for current table, primary and properties.
initProperties()
Init properties (aka set ADT definition)
__call($a_method, $a_value)
Get property magic method ("get<PropertyName>()")
createPrimaryKey()
Create new primary key, e.g.
translateDBErrorCodes(array $a_codes)
Translate DB error codes.
initDBBridge(ilADTGroupDBBridge $a_adt_db)
Init (properties) DB bridge.
getDBErrors()
Get DB errors.
getAllTranslatedErrors($delimiter="\n")
Get translated error codes (DB, Validation)
hasPrimary()
Check if currently has primary.
parsePrimary(array $a_args)
Parse incoming primary key.
update()
Update record (only if valid)
create()
Create record (only if valid)
getProperties()
Get all properties.
static getInstance()
Get singleton.
global $DIC
Definition: goto.php:24
$factory
Definition: metadata.php:58
$type
$lng
foreach($_POST as $key=> $value) $res
global $ilDB