ILIAS  trunk Revision v11.0_alpha-2638-g80c1d007f79
class.ilDclFieldFactory.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 {
23  public static string $field_base_path_patter = ILIAS_ABSOLUTE_PATH . "/components/ILIAS/DataCollection/classes/Fields/%s/";
24  public static string $default_prefix = "ilDcl";
25  public static string $record_field_class_patter = "%sRecordFieldModel";
26  public static string $field_class_patter = "%sFieldModel";
27  public static string $record_representation_class_pattern = "%sRecordRepresentation";
28  public static string $field_representation_class_pattern = "%sFieldRepresentation";
29  protected static array $record_field_cache = [];
30 
38  public static function getRecordFieldInstance(object $field, object $record): ilDclBaseRecordFieldModel
39  {
40  if (!empty(self::$record_field_cache[$field->getId()][$record->getId()])) {
41  return self::$record_field_cache[$field->getId()][$record->getId()];
42  }
43 
44  $path = self::getClassPathByInstance($field, self::$record_field_class_patter);
45  if (file_exists($path)) {
46  $class = self::getClassByInstance($field, self::$record_field_class_patter);
47  $instance = new $class($record, $field);
48  if ($instance instanceof ilDclBaseRecordFieldModel) {
49  if (!$instance->getFieldRepresentation()) {
50  $instance->setFieldRepresentation(self::getFieldRepresentationInstance($field));
51  }
52 
53  if (!$instance->getRecordRepresentation()) {
54  $instance->setRecordRepresentation(self::getRecordRepresentationInstance($instance));
55  }
56  self::$record_field_cache[$field->getId()][$record->getId()] = $instance;
57 
58  return $instance;
59  }
60 
61  throw new RuntimeException("instance is no base field " . $instance->getField()->getTitle());
62  }
63 
64  throw new RuntimeException("file not found " . $path);
65  }
66 
67  protected static array $field_class_cache = [];
68 
72  public static function getFieldClass(string $datatype, string $class_pattern): string
73  {
74  if (!empty(self::$field_class_cache[$datatype . $class_pattern])) {
75  return self::$field_class_cache[$datatype . $class_pattern];
76  }
77 
78  $fieldtype = $datatype;
79 
80  $class = sprintf($class_pattern, $fieldtype);
81  self::$field_class_cache[$datatype . $class_pattern] = $class;
82 
83  return $class;
84  }
85 
86  public static function getFieldClassFile(string $datatype, string $class_pattern): string
87  {
88  return "class." . self::getFieldClass($datatype, $class_pattern) . ".php";
89  }
90 
91  protected static array $field_representation_cache = [];
92 
94  {
95  // when the datatype overview is generated no field-models are available, so an empty instance is used => no caching there
96  if (!empty($field->getId()) && !empty(self::$field_representation_cache[$field->getId()])) {
97  return self::$field_representation_cache[$field->getId()];
98  }
99 
100  $class_path = self::getClassPathByInstance($field, self::$field_representation_class_pattern);
101 
102  if (file_exists($class_path)) {
103  $class = self::getClassByInstance($field, self::$field_representation_class_pattern);
104  $instance = new $class($field);
105  } else {
106  throw new ilDclException("Path for FieldRepresentation with file " . $class_path . " does not exists!");
107  }
108 
109  if ($instance == null) {
110  throw new ilDclException("Could not create FieldRepresentation of " . $class . " with file " . $class_path);
111  }
112 
113  if ($field->getId() != null) {
114  self::$field_representation_cache[$field->getId()] = $instance;
115  }
116 
117  return $instance;
118  }
119 
120  protected static array $record_representation_cache = [];
121 
126  public static function getRecordRepresentationInstance(
127  ilDclBaseRecordFieldModel $record_field
129  // there are some field types which have no recordFieldModel object (e.g rating) => no caching
130  if ($record_field->getId() != null && !empty(self::$record_representation_cache[$record_field->getId()])) {
131  return self::$record_representation_cache[$record_field->getId()];
132  }
133 
134  $class_path = self::getClassPathByInstance(
135  $record_field->getField(),
136  self::$record_representation_class_pattern
137  );
138 
139  if (file_exists($class_path)) {
140  $class = self::getClassByInstance($record_field->getField(), self::$record_representation_class_pattern);
141  } else {
142  $class = self::getFieldClass(self::$default_prefix . "Base", self::$record_representation_class_pattern);
143  }
144 
145  $instance = new $class($record_field);
146 
147  if ($instance == null) {
148  throw new ilDclException("Could not create RecordRepresentation of " . $class_path . " " . $record_field->getField()->getDatatype()->getTitle());
149  }
150 
151  if ($record_field->getId() != null) {
152  self::$record_representation_cache[$record_field->getId()] = $instance;
153  }
154 
155  return $instance;
156  }
157 
162  public static function getFieldModelInstance(int $field_id, ?int $datatype = null): ilDclBaseFieldModel
163  {
164  $base = new ilDclBaseFieldModel($field_id);
165  if ($datatype != null) {
166  $base->setDatatypeId($datatype);
167  }
168 
169  return self::getFieldModelInstanceByClass($base, $field_id);
170  }
171 
172  protected static array $field_model_cache = [];
173 
179  public static function getFieldModelInstanceByClass(
180  ilDclBaseFieldModel $field,
181  ?int $field_id = null
183  if ($field->getId() != null && !empty(self::$field_model_cache[$field->getId()])) {
184  return self::$field_model_cache[$field->getId()];
185  }
186 
187  $path_type = self::getClassPathByInstance($field, self::$field_class_patter);
188 
189  if (file_exists($path_type)) {
190  $class = self::getClassByInstance($field, self::$field_class_patter);
191  } else {
192  $class = self::getFieldClass(self::$default_prefix . "Base", self::$field_class_patter);
193  }
194 
195  if ($field_id) {
196  $instance = new $class($field_id);
197  } else {
198  $instance = new $class();
199  }
200 
201  if ($instance == null) {
202  throw new ilDclException("Could not create FieldModel of " . $class);
203  }
204  $instance->setDatatypeId($field->getDatatypeId());
205 
206  if ($field->getId() != null) {
207  self::$field_model_cache[$field->getId()] = $instance;
208  }
209 
210  return $instance;
211  }
212 
213  protected static array $field_type_cache = [];
214 
215  public static function getFieldTypeByInstance(ilDclBaseFieldModel $field): string
216  {
217  global $DIC;
218  $datatype = $field->getDatatype();
219 
220  if (!empty(self::$field_type_cache[$datatype->getId()])) {
221  return self::$field_type_cache[$datatype->getId()];
222  }
223 
224  if (ilDclFieldTypePlugin::isPluginDatatype($datatype->getTitle())) {
225  $plugin_id = ilDclFieldTypePlugin::getPluginId($datatype->getTitle());
226  if ($DIC["component.repository"]->hasActivatedPlugin($plugin_id)) {
227  $fieldtype = 'il' . $DIC["component.repository"]->getPluginById($plugin_id)->getName();
228  } else {
229  $fieldtype = '';
230  }
231  } elseif ($field->getDatatypeId() == ilDclDatatype::INPUTFORMAT_FILEUPLOAD) {
232  // This is for legacy reasons. The fileupload field was replaced with ilDclDatatype::INPUTFORMAT_FILE in
233  // ILIAS 9, but must be available for one more release, since there might be records with this field type
234  // which have not et been migrated.
235  $fieldtype = self::$default_prefix . ucfirst('Fileupload');
236  } else {
237  $fieldtype = self::$default_prefix . ucfirst(self::parseDatatypeTitle($datatype->getTitle()));
238  }
239  self::$field_type_cache[$datatype->getId()] = $fieldtype;
240  return $fieldtype;
241  }
242 
243  public static function getClassByInstance(ilDclBaseFieldModel $field, string $class_pattern): string
244  {
245  $fieldtype = self::getFieldTypeByInstance($field);
246 
247  return self::getFieldClass($fieldtype, $class_pattern);
248  }
249 
250  protected static array $class_path_cache = [];
251 
255  public static function getClassPathByInstance(ilDclBaseFieldModel $field, string $class_pattern): string
256  {
257  global $DIC;
258  $datatype = $field->getDatatype();
259 
260  if ($field->getId() != null && !empty(self::$class_path_cache[$field->getId()][$class_pattern])) {
261  return self::$class_path_cache[$field->getId()][$class_pattern];
262  }
263 
264  if (ilDclFieldTypePlugin::isPluginDatatype($datatype->getTitle())) {
265  $plugin_id = ilDclFieldTypePlugin::getPluginId($datatype->getTitle());
266  if ($DIC["component.repository"]->hasActivatedPlugin($plugin_id)) {
267  $class_path = $DIC["component.repository"]->getPluginById($plugin_id)->getPath() . '/classes/';
268  } else {
269  return '';
270  }
271  } elseif ($field->getDatatypeId() == ilDclDatatype::INPUTFORMAT_FILEUPLOAD) {
272  // This is for legacy reasons. The fileupload field was replaced with ilDclDatatype::INPUTFORMAT_FILE in
273  // ILIAS 9, but must be available for one more release, since there might be records with this field type
274  // which have not et been migrated.
275  $class_path = sprintf(
276  self::$field_base_path_patter,
277  ucfirst(self::parseDatatypeTitle('Fileupload'))
278  );
279 
280  $class_name = sprintf(
281  'class.' . self::$default_prefix . '%s.php',
282  sprintf(
283  $class_pattern,
284  ucfirst('Fileupload'),
285  )
286  );
287 
288  $return = $class_path . $class_name;
289  if ($field->getId() != null) {
290  self::$class_path_cache[$field->getId()][$class_pattern] = $return;
291  }
292 
293  return $return;
294  } else {
295  $class_path = sprintf(
296  self::$field_base_path_patter,
297  ucfirst(self::parseDatatypeTitle($datatype->getTitle()))
298  );
299  }
300 
301  $return = $class_path . self::getFieldClassFile(self::getFieldTypeByInstance($field), $class_pattern);
302 
303  if ($field->getId() != null) {
304  self::$class_path_cache[$field->getId()][$class_pattern] = $return;
305  }
306 
307  return $return;
308  }
309 
314  public static function parseDatatypeTitle(string $title): string
315  {
316  $parts = explode("_", $title);
317  $func = function ($value) {
318  return ucfirst($value);
319  };
320 
321  $parts = array_map($func, $parts);
322  return implode("", $parts);
323  }
324 
325  public static function getRecordModelInstance(?int $record_id): ilDclBaseRecordModel
326  {
327  return new ilDclBaseRecordModel($record_id);
328  }
329 
330  public static function getPluginNameFromFieldModel(ilDclBaseFieldModel $object): string
331  {
332  $class_name = get_class($object);
333  return substr($class_name, 2, -(strlen(self::$field_class_patter) - 2));
334  }
335 }
static array $record_representation_cache
static getFieldClass(string $datatype, string $class_pattern)
Concatenates Classname from datatype and pattern.
if($clientAssertionType !='urn:ietf:params:oauth:client-assertion-type:jwt-bearer'|| $grantType !='client_credentials') $parts
Definition: ltitoken.php:61
static getClassPathByInstance(ilDclBaseFieldModel $field, string $class_pattern)
static getFieldTypeByInstance(ilDclBaseFieldModel $field)
static getFieldRepresentationInstance(ilDclBaseFieldModel $field)
static getRecordModelInstance(?int $record_id)
static isPluginDatatype(string $datatype)
static getClassByInstance(ilDclBaseFieldModel $field, string $class_pattern)
static getPluginId(string $datatype)
static string $field_class_patter
static string $field_base_path_patter
static string $record_representation_class_pattern
$path
Definition: ltiservices.php:29
static parseDatatypeTitle(string $title)
Parse string to FieldClass format Replaces _ with camelcase-notation.
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
static getFieldModelInstanceByClass(ilDclBaseFieldModel $field, ?int $field_id=null)
Gets the correct instance of a fieldModel class Checks if a field is a plugin a replaces the fieldMod...
static getFieldModelInstance(int $field_id, ?int $datatype=null)
Get FieldModel from field-id and datatype.
global $DIC
Definition: shib_login.php:26
static getRecordFieldInstance(object $field, object $record)
Creates a RecordField instance and loads the field and record representation.
static getRecordRepresentationInstance(ilDclBaseRecordFieldModel $record_field)
Get RecordRepresentation from RecordFieldModel.
static array $field_representation_cache
static string $record_field_class_patter
static getFieldClassFile(string $datatype, string $class_pattern)
static getPluginNameFromFieldModel(ilDclBaseFieldModel $object)
getDatatypeId()
Get datatype_id.
static string $field_representation_class_pattern