19declare(strict_types=1);
26 protected int $id = 0;
87 $this->
http = $DIC->http();
89 $this->db =
$DIC->database();
90 $this->
user = $DIC->user();
103 $query =
"SELECT * FROM il_dcl_table WHERE id = " . $this->db->quote($this->
getId(),
"integer");
104 $set = $this->db->query($query);
105 $rec = $this->db->fetchAssoc($set);
108 if (
null !== $rec[
"title"]) {
115 if (
null !== $rec[
"export_enabled"]) {
123 if (
null !== $rec[
'description']) {
132 if (
null !== $rec[
'table_order']) {
133 $this->
setOrder($rec[
'table_order']);
142 public function doDelete(
bool $delete_only_content =
false,
bool $omit_notification =
false): void
145 $record->doDelete($omit_notification);
152 if (!$delete_only_content) {
153 $query =
"DELETE FROM il_dcl_table WHERE id = " . $this->db->quote($this->
getId(),
"integer");
154 $this->db->manipulate($query);
158 public function doCreate(
bool $create_tablefield_setting =
true,
bool $create_standardview =
true): void
160 $id = $this->db->nextId(
"il_dcl_table");
162 $query =
"INSERT INTO il_dcl_table (" .
"id" .
", obj_id" .
", title" .
", add_perm" .
", edit_perm" .
", delete_perm" .
", edit_by_owner"
163 .
", limited" .
", limit_start" .
", limit_end" .
", is_visible" .
", export_enabled" .
", import_enabled" .
", default_sort_field_id"
164 .
", default_sort_field_order" .
", description" .
", public_comments" .
", view_own_records_perm"
165 .
", delete_by_owner, save_confirmation , table_order ) VALUES (" . $this->db->quote(
169 . $this->db->quote($this->
getObjId(),
"integer") .
"," . $this->db->quote($this->
getTitle(),
"text") .
","
170 . $this->db->quote($this->
getAddPerm() ? 1 : 0,
"integer") .
"," . $this->db->quote(
177 ) .
"," . $this->db->quote($this->
getEditByOwner() ? 1 : 0,
"integer") .
","
178 . $this->db->quote($this->
getLimited() ? 1 : 0,
"integer") .
"," . $this->db->quote(
182 . $this->db->quote($this->
getLimitEnd(),
"timestamp") .
"," . $this->db->quote(
189 ) .
"," . $this->db->quote($this->
getImportEnabled() ? 1 : 0,
"integer") .
","
194 . $this->db->quote($this->
getDescription(),
"text") .
"," . $this->db->quote(
201 ) .
"," . $this->db->quote($this->
getDeleteByOwner() ? 1 : 0,
'integer') .
","
202 . $this->db->quote($this->
getSaveConfirmation() ? 1 : 0,
'integer') .
"," . $this->db->quote(
207 $this->db->manipulate($query);
209 if ($create_standardview) {
214 if ($create_tablefield_setting) {
224 "obj_id" => [
"integer", $this->
getObjId()],
225 "title" => [
"text", $this->
getTitle()],
226 "add_perm" => [
"integer", (
int) $this->
getAddPerm()],
227 "edit_perm" => [
"integer", (
int) $this->
getEditPerm()],
230 "limited" => [
"integer", $this->
getLimited()],
232 "limit_end" => [
"timestamp", $this->
getLimitEnd()],
233 "is_visible" => [
"integer", $this->
getIsVisible() ? 1 : 0],
243 'table_order' => [
'integer', $this->
getOrder()],
246 "id" => [
"integer", $this->
getId()],
254 public function setId(
int $a_id): void
269 $this->objId = $a_id;
279 $this->title = $a_title;
296 if ($this->obj ==
null) {
306 if ($this->records ==
null) {
316 $query =
"SELECT id FROM il_dcl_record WHERE table_id = " . $this->db->quote($this->
id,
"integer");
317 $set = $this->db->query($query);
319 while ($rec = $this->db->fetchAssoc($set)) {
331 foreach ($records as $record) {
332 $record->deleteField($field_id);
346 foreach (
$fields as $field_1) {
347 if ($field_1->getId() == $field_id) {
359 if ($field->getId()) {
360 $field_ids[] = $field->getId();
369 if (!$this->fields) {
371 =
"SELECT DISTINCT il_dcl_field.*, il_dcl_tfield_set.field_order
373 INNER JOIN il_dcl_tfield_set
374 ON ( il_dcl_tfield_set.field NOT IN ('owner',
379 AND il_dcl_tfield_set.table_id = il_dcl_field.table_id
380 AND il_dcl_tfield_set.field = " . $this->db->cast(
"il_dcl_field.id",
"text") .
")
381 WHERE il_dcl_field.table_id = %s
382 ORDER BY il_dcl_tfield_set.field_order ASC";
384 $set = $this->db->queryF($query, [
'integer'], [$this->
getId()]);
386 while ($rec = $this->db->fetchAssoc($set)) {
403 if (!$this->fields) {
419 if (!$field->isStandardField()) {
420 $place = $field->getOrder() + 1;
434 if ($this->all_fields ==
null) {
444 $this->stdFields = $this->getStandardFields();
445 $fields = array_merge($this->fields, $this->stdFields);
473 if (!$with_active_detailedview || $page->getPageObject()->isActive()) {
474 $visible_views[] = $tableView;
479 return $visible_views;
485 $tableview = array_shift($array);
487 return $tableview?->getId();
496 $syntax_chars = array_merge(
497 array_map(
static fn(
Operators $function):
string => $function->value, Operators::cases()),
498 array_map(
static fn(
Functions $function):
string => $function->value, Functions::cases()),
503 foreach ($syntax_chars as $element) {
504 if (str_contains($field->getTitle(), $element)) {
520 public function getStandardFields(): array
522 if ($this->stdFields ==
null) {
527 foreach ($this->stdFields as $k => $field) {
528 if ($field->getId() ==
'comments') {
529 unset($this->stdFields[$k]);
557 $editableFields = [];
560 $tableview_id = $this->
http->wrapper()->post()->retrieve(
564 if (!$field->getViewSetting($tableview_id)->isLocked($creation_mode)) {
565 $editableFields[] = $field;
569 return $editableFields;
579 $exportableFields = [];
581 if ($field->getExportable()) {
582 $exportableFields[] = $field;
586 return $exportableFields;
705 if ($from ==
null && $to ==
null) {
708 if ($from <= $now && $now <= $to) {
711 if ($from <= $now && $to ==
null) {
714 if ($from ==
null && $now <= $to) {
718 return ($from <= $now && $now <= $to);
744 $named[$field->getId()] = $field;
757 usort($array, [$this,
"compareOrder"]);
771 if (!is_null($field->getOrder())) {
772 $field->setOrder($count);
773 $count = $count + $offset;
786 if ($field->getTitle() ==
$title) {
943 $this->view_own_records_perm = (
int) $view_own_perm;
965 return count($this->fields) > 0;
970 if (is_null(
$a->getOrder() ==
null) && is_null(
$b->getOrder() ==
null)) {
973 if (is_null(
$a->getOrder())) {
976 if (is_null(
$b->getOrder())) {
980 return $a->getOrder() <
$b->getOrder() ? -1 : 1;
1007 $default_sort_field = 0;
1009 $org_std_fields = $original->getStandardFields();
1010 foreach ($this->getStandardFields() as $element_key => $std_field) {
1011 $std_field->clone($org_std_fields[$element_key]);
1019 foreach ($original->
getFields() as $orig_field) {
1020 if (!$orig_field->isStandardField()) {
1021 $class_name = get_class($orig_field);
1022 $new_field =
new $class_name();
1023 $new_field->setTableId($this->
getId());
1024 $new_field->cloneStructure((
int) $orig_field->getId());
1025 $new_fields[$orig_field->getId()] = $new_field;
1037 foreach ($original->
getRecords() as $orig_record) {
1039 $new_record->setTableId($this->
getId());
1040 $new_record->cloneStructure($orig_record->getId(), $new_fields);
1046 $new_tableview->setTableId($this->
getId());
1047 $new_tableview->cloneStructure($orig_tableview, $new_fields);
1056 foreach ($this->
getFields() as $field) {
1074 $this->all_fields[$field->
getId()] = $field;
1085 $query =
"SELECT * FROM il_dcl_table WHERE id = " . $table_id;
1086 $result =
$ilDB->query($query);
1088 return $result->numRows() != 0;
1099 $result =
$ilDB->query(
1100 'SELECT id FROM il_dcl_table WHERE title = ' .
$ilDB->quote(
$title,
'text') .
' AND obj_id = '
1101 .
$ilDB->quote($obj_id,
'integer')
1104 while ($rec =
$ilDB->fetchAssoc($result)) {
1123 if (!$this->table_order) {
1132 $result = $this->db->query(
'SELECT MAX(table_order) AS table_order FROM il_dcl_table WHERE obj_id = ' . $this->db->quote(
1133 $this->getCollectionObject()->getId(),
1136 $this->table_order = $this->db->fetchObject($result)->table_order + 10;
1137 $this->db->query(
'UPDATE il_dcl_table SET table_order = ' . $this->db->quote(
1140 ) .
' WHERE id = ' . $this->db->quote($this->getId(),
'integer'));
1167 $result =
$ilDB->query(
1168 'SELECT * FROM il_dcl_field WHERE table_id = ' .
$ilDB->quote($obj_id,
'integer') .
' AND title = '
1172 return (
bool)
$ilDB->numRows($result);
1193 $direction = strtolower($direction);
1194 $direction = (in_array($direction, [
'desc',
'asc'])) ? $direction :
'asc';
1197 $sort_by_status =
false;
1198 if (substr($sort, 0, 8) ==
'_status_') {
1199 $sort_by_status =
true;
1203 if (is_null($sort_field)) {
1204 $sort_field = $this->
getField(
'id');
1207 $sort_query_object = $sort_field->getRecordQuerySortObject($direction, $sort_by_status);
1209 $select_str = ($sort_query_object !=
null) ? $sort_query_object->getSelectStatement() :
'';
1210 $join_str = ($sort_query_object !=
null) ? $sort_query_object->getJoinStatement() :
'';
1211 $where_str = ($sort_query_object !=
null) ? $sort_query_object->getWhereStatement() :
'';
1212 $order_str = ($sort_query_object !=
null) ? $sort_query_object->getOrderStatement() :
'';
1213 $group_str = ($sort_query_object !=
null) ? $sort_query_object->getGroupStatement() :
'';
1215 if (count($filter)) {
1216 foreach ($filter as $key => $filter_value) {
1217 $filter_field_id = substr($key, 7);
1218 $filter_field = $this->
getField($filter_field_id);
1219 $filter_record_query_object = $filter_field->getRecordQueryFilterObject($filter_value, $sort_field);
1221 if ($filter_record_query_object) {
1222 $select_str .= $filter_record_query_object->getSelectStatement();
1223 $join_str .= $filter_record_query_object->getJoinStatement();
1224 $where_str .= $filter_record_query_object->getWhereStatement();
1225 $group_str .= $filter_record_query_object->getGroupStatement();
1231 $sql =
"SELECT DISTINCT record.id, record.owner";
1238 $sql .= rtrim($select_str,
',') .
" FROM il_dcl_record $as record ";
1240 $sql .=
" WHERE record.table_id = " . $this->db->quote($this->
getId(),
'integer');
1242 if (strlen($where_str) > 0) {
1246 if (strlen($group_str) > 0) {
1247 $sql .=
" GROUP BY " . $group_str;
1250 if (strlen($order_str) > 0) {
1251 $sql .=
" ORDER BY " . $order_str;
1254 $set = $this->db->query($sql);
1255 $total_record_ids = [];
1258 while ($rec = $this->db->fetchAssoc($set)) {
1263 $total_record_ids[] = $rec[
'id'];
1269 if ($sort_query_object !=
null) {
1270 $total_record_ids = $sort_query_object->applyCustomSorting($sort_field, $total_record_ids, $direction);
1273 if ($sort ===
'n_comments') {
1276 foreach ($total_record_ids as
$id) {
1277 $comments_nr[
$id] =
$DIC->notes()->domain()->getNrOfCommentsForContext(
$DIC->notes()->data()->context($this->getObjId(),
$id,
'dcl'));
1279 uasort($comments_nr,
static fn(
$a,
$b) => ($direction ===
'asc' ? 1 : -1) * ($a <=>
$b));
1280 $total_record_ids = array_keys($comments_nr);
1284 $record_ids = array_slice($total_record_ids, $offset, $limit);
1287 foreach ($record_ids as
$id) {
1291 return [
'records' =>
$records,
'total' => count($total_record_ids)];
1296 $this->show_invalid = $value;
@classDescription Date and time handling
static getRecordCache(?int $record_id)
static getFieldCache(int $field_id=0)
static buildFieldFromRecord(array $rec)
static preloadFieldProperties(array $fields)
Preloads field properties.
static setCloneOf(int $old, int $new, string $type)
static getAllDatatype(bool $force=false)
Get all possible Datatypes.
@ilCtrl_Calls ilDclDetailedViewDefinitionGUI: ilPageEditorGUI, ilEditClipboardGUI,...
static _getStandardFields(int $table_id)
static createOrGetStandardView(int $table_id)
static getAllForTableId(int $table_id)
hasPermissionToDeleteRecords(int $ref_id)
int $view_own_records_perm
True if user can only view his/her own entries in the table.
updateFields()
Update fields.
setDefaultSortField(string $default_sort_field)
getFieldsForFormula()
Returns all fields of this table including the standard fields, wich are supported for formulas.
setEditByOwner(bool $edit_by_owner)
getRecordFields()
Returns all fields of this table which are NOT standard fields.
setDeletePerm(bool $delete_perm)
addField(ilDclBaseFieldModel $field)
setSaveConfirmation(bool $save_confirmation)
static _tableExists(int $table_id)
buildOrderFields()
buildOrderFields orders the fields.
setEditPerm(bool $edit_perm)
string $default_sort_field
doesRecordBelongToUser(ilDclBaseRecordModel $record)
setDeleteByOwner(bool $delete_by_owner)
getDefaultSortFieldOrder()
showInvalidFields(bool $value)
getExportableFields()
Return all the fields that are marked as exportable.
getFirstTableViewId(int $user_id=0, bool $with_detailed_view=false)
setIsVisible(bool $is_visible)
sortByOrder(array &$array)
deleteField(int $field_id)
setLimitStart(string $limit_start)
getNewFieldOrder()
getNewOrder
setOrder(int $table_order)
getField(string $field_id)
array $all_fields
table fields and std fields combined
sortFields(array &$fields)
sortFields
hasPermissionToEditRecord(int $ref_id, ilDclBaseRecordModel $record)
cloneStructure(ilDclTable $original)
setImportEnabled(bool $import_enabled)
compareOrder(ilDclBaseFieldModel $a, ilDclBaseFieldModel $b)
setTitle(string $a_title)
hasPermissionToDeleteRecord(int $ref_id, ilDclBaseRecordModel $record)
setId(int $a_id)
Set table id.
getPartialRecords(string $ref_id, string $sort, string $direction, ?int $limit, int $offset, array $filter=[])
Return only the needed subset of record objects for the table, according to sorting,...
setDescription(string $description)
doCreate(bool $create_tablefield_setting=true, bool $create_standardview=true)
string $default_sort_field_order
Default sort-order (asc|desc)
getFields()
Returns all fields of this table including the standard fields.
getEditableFields(bool $creation_mode)
setDefaultSortFieldOrder(string $default_sort_field_order)
setPublicCommentsEnabled(bool $public_comments)
setAddPerm(bool $add_perm)
getFieldByTitle(string $title)
Get a field by title.
setLimited(bool $limited)
ILIAS Refinery Factory $refinery
static _getTableIdByTitle(string $title, int $obj_id)
string $description
Description for this table displayed above records.
static _hasFieldByTitle(string $title, int $obj_id)
Checks if a table has a field with the given title.
doDelete(bool $delete_only_content=false, bool $omit_notification=false)
Delete table Attention this does not delete the maintable of it's the maintable of the collection.
ILIAS HTTP Services $http
setLimitEnd(string $limit_end)
getPublicCommentsEnabled()
hasPermissionToViewRecord(int $ref_id, ilDclBaseRecordModel $record, int $user_id=0)
setExportEnabled(bool $export_enabled)
bool $public_comments
True if users can add comments on each record of this table.
setViewOwnRecordsPerm(bool $view_own_perm)
getVisibleTableViews(int $user_id=0, bool $with_active_detailedview=false)
static hasWriteAccess(int $ref, ?int $user_id=0)
static hasReadAccess(int $ref, ?int $user_id=0)
static hasAccessToTableView(ilDclTableView $tableview, ?int $user_id=0)
static hasEditAccess(int $ref, ?int $user_id=null)
static hasAddRecordAccess(int $ref, ?int $user_id=0)
static _lookupObjectId(int $ref_id)
static set(string $a_var, $a_val)
Set a value.
static http()
Fetches the global http state from ILIAS.
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples