19 declare(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);
342 foreach ($fields as $field_1) {
343 if ($field_1->getId() == $field_id) {
355 if ($field->getId()) {
356 $field_ids[] = $field->getId();
365 if (!$this->fields) {
367 =
"SELECT DISTINCT il_dcl_field.*, il_dcl_tfield_set.field_order 369 INNER JOIN il_dcl_tfield_set 370 ON ( il_dcl_tfield_set.field NOT IN ('owner', 375 AND il_dcl_tfield_set.table_id = il_dcl_field.table_id 376 AND il_dcl_tfield_set.field = " . $this->db->cast(
"il_dcl_field.id",
"text") .
") 377 WHERE il_dcl_field.table_id = %s 378 ORDER BY il_dcl_tfield_set.field_order ASC";
380 $set = $this->db->queryF($query, [
'integer'], [$this->
getId()]);
382 while ($rec = $this->db->fetchAssoc($set)) {
399 if (!$this->fields) {
414 foreach ($fields as $field) {
415 if (!$field->isStandardField()) {
416 $place = $field->getOrder() + 1;
436 if ($tableviews ==
null) {
441 foreach ($tableviews as $tableview) {
442 $tableview->setTableviewOrder($order);
443 $tableview->update();
455 if ($this->all_fields ==
null) {
465 $this->stdFields = $this->getStandardFields();
466 $fields = array_merge($this->fields, $this->stdFields);
494 if (!$with_active_detailedview || $page->getPageObject()->isActive()) {
495 $visible_views[] = $tableView;
500 return $visible_views;
506 $tableview = array_shift($array);
508 return $tableview?->getId();
517 $syntax_chars = array_merge(
518 array_map(
static fn(
Operators $function):
string => $function->value, Operators::cases()),
519 array_map(
static fn(
Functions $function):
string => $function->value, Functions::cases()),
524 foreach ($syntax_chars as $element) {
525 if (str_contains($field->getTitle(), $element)) {
541 public function getStandardFields(): array
543 if ($this->stdFields ==
null) {
548 foreach ($this->stdFields as $k => $field) {
549 if ($field->getId() ==
'comments') {
550 unset($this->stdFields[$k]);
578 $editableFields = [];
580 foreach ($fields as $field) {
581 $tableview_id = $this->
http->wrapper()->post()->retrieve(
585 if (!$field->getViewSetting($tableview_id)->isLocked($creation_mode)) {
586 $editableFields[] = $field;
590 return $editableFields;
600 $exportableFields = [];
601 foreach ($fields as $field) {
602 if ($field->getExportable()) {
603 $exportableFields[] = $field;
607 return $exportableFields;
729 if ($from <= $now && $now <= $to) {
732 if ($from <= $now && $to ==
null) {
735 if ($from ==
null && $now <= $to) {
739 return ($from <= $now && $now <= $to);
764 foreach ($fields as $field) {
765 $named[$field->getId()] = $field;
778 usort($array, [$this,
"compareOrder"]);
791 foreach ($fields as $field) {
792 if (!is_null($field->getOrder())) {
793 $field->setOrder($count);
794 $count = $count + $offset;
807 if ($field->getTitle() ==
$title) {
842 if ($edit_by_owner) {
860 if ($delete_by_owner) {
941 if (!in_array($default_sort_field_order, [
'asc',
'desc'])) {
942 $default_sort_field_order =
'asc';
964 $this->view_own_records_perm = (
int) $view_own_perm;
986 return count($this->fields) > 0;
1028 $default_sort_field = 0;
1030 $org_std_fields = $original->getStandardFields();
1031 foreach ($this->getStandardFields() as $element_key => $std_field) {
1032 $std_field->clone($org_std_fields[$element_key]);
1034 $default_sort_field = $std_field->
getId();
1040 foreach ($original->
getFields() as $orig_field) {
1041 if (!$orig_field->isStandardField()) {
1042 $class_name = get_class($orig_field);
1043 $new_field =
new $class_name();
1044 $new_field->setTableId($this->
getId());
1045 $new_field->cloneStructure((
int) $orig_field->getId());
1046 $new_fields[$orig_field->getId()] = $new_field;
1049 $default_sort_field = $new_field->getId();
1058 foreach ($original->
getRecords() as $orig_record) {
1060 $new_record->setTableId($this->
getId());
1061 $new_record->cloneStructure($orig_record->getId(), $new_fields);
1067 $new_tableview->setTableId($this->
getId());
1068 $new_tableview->cloneStructure($orig_tableview, $new_fields);
1077 foreach ($this->
getFields() as $field) {
1095 $this->all_fields[$field->
getId()] = $field;
1104 $ilDB = $DIC[
'ilDB'];
1106 $query =
"SELECT * FROM il_dcl_table WHERE id = " . $table_id;
1107 $result =
$ilDB->query($query);
1109 return $result->numRows() != 0;
1118 $ilDB = $DIC[
'ilDB'];
1120 $result =
$ilDB->query(
1121 'SELECT id FROM il_dcl_table WHERE title = ' .
$ilDB->quote($title,
'text') .
' AND obj_id = ' 1122 .
$ilDB->quote($obj_id,
'integer')
1125 while ($rec =
$ilDB->fetchAssoc($result)) {
1144 if (!$this->table_order) {
1153 $result = $this->db->query(
'SELECT MAX(table_order) AS table_order FROM il_dcl_table WHERE obj_id = ' . $this->db->quote(
1154 $this->getCollectionObject()->getId(),
1157 $this->table_order = $this->db->fetchObject($result)->table_order + 10;
1158 $this->db->query(
'UPDATE il_dcl_table SET table_order = ' . $this->db->quote(
1161 ) .
' WHERE id = ' . $this->db->quote($this->
getId(),
'integer'));
1187 $ilDB = $DIC[
'ilDB'];
1188 $result =
$ilDB->query(
1189 'SELECT * FROM il_dcl_field WHERE table_id = ' .
$ilDB->quote($obj_id,
'integer') .
' AND title = ' 1190 .
$ilDB->quote($title,
'text')
1193 return (
bool)
$ilDB->numRows($result);
1214 $direction = strtolower($direction);
1215 $direction = (in_array($direction, [
'desc',
'asc'])) ? $direction :
'asc';
1218 $sort_by_status =
false;
1219 if (substr($sort, 0, 8) ==
'_status_') {
1220 $sort_by_status =
true;
1224 if (is_null($sort_field)) {
1225 $sort_field = $this->
getField(
'id');
1228 $sort_query_object = $sort_field->getRecordQuerySortObject($direction, $sort_by_status);
1230 $select_str = ($sort_query_object !=
null) ? $sort_query_object->getSelectStatement() :
'';
1231 $join_str = ($sort_query_object !=
null) ? $sort_query_object->getJoinStatement() :
'';
1232 $where_str = ($sort_query_object !=
null) ? $sort_query_object->getWhereStatement() :
'';
1233 $order_str = ($sort_query_object !=
null) ? $sort_query_object->getOrderStatement() :
'';
1234 $group_str = ($sort_query_object !=
null) ? $sort_query_object->getGroupStatement() :
'';
1236 if (count($filter)) {
1237 foreach ($filter as $key => $filter_value) {
1238 $filter_field_id = substr($key, 7);
1239 $filter_field = $this->
getField($filter_field_id);
1240 $filter_record_query_object = $filter_field->getRecordQueryFilterObject($filter_value, $sort_field);
1242 if ($filter_record_query_object) {
1243 $select_str .= $filter_record_query_object->getSelectStatement();
1244 $join_str .= $filter_record_query_object->getJoinStatement();
1245 $where_str .= $filter_record_query_object->getWhereStatement();
1246 $group_str .= $filter_record_query_object->getGroupStatement();
1252 $sql =
"SELECT DISTINCT record.id, record.owner";
1259 $sql .= rtrim($select_str,
',') .
" FROM il_dcl_record $as record ";
1261 $sql .=
" WHERE record.table_id = " . $this->db->quote($this->
getId(),
'integer');
1263 if (strlen($where_str) > 0) {
1267 if (strlen($group_str) > 0) {
1268 $sql .=
" GROUP BY " . $group_str;
1271 if (strlen($order_str) > 0) {
1272 $sql .=
" ORDER BY " . $order_str;
1275 $set = $this->db->query($sql);
1276 $total_record_ids = [];
1279 while ($rec = $this->db->fetchAssoc($set)) {
1284 $total_record_ids[] = $rec[
'id'];
1290 if ($sort_query_object !=
null) {
1291 $total_record_ids = $sort_query_object->applyCustomSorting($sort_field, $total_record_ids, $direction);
1294 if ($sort ===
'n_comments') {
1297 foreach ($total_record_ids as $id) {
1298 $comments_nr[
$id] = $DIC->notes()->domain()->getNrOfCommentsForContext($DIC->notes()->data()->context($this->
getObjId(), $id,
'dcl'));
1300 uasort($comments_nr,
static fn(
$a,
$b) => ($direction ===
'asc' ? 1 : -1) * ($a <=>
$b));
1301 $total_record_ids = array_keys($comments_nr);
1305 $record_ids = array_slice($total_record_ids, $offset, $limit);
1308 foreach ($record_ids as $id) {
1312 return [
'records' =>
$records,
'total' => count($total_record_ids)];
1317 $this->show_invalid = $value;
getEditableFields(bool $creation_mode)
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...
static createOrGetStandardView(int $table_id)
sortByOrder(array &$array)
static hasAccessToTableView(ilDclTableView $tableview, ?int $user_id=0)
getPublicCommentsEnabled()
int $view_own_records_perm
True if user can only view his/her own entries in the table.
getFieldByTitle(string $title)
Get a field by title.
setIsVisible(bool $is_visible)
setId(int $a_id)
Set table id.
static preloadFieldProperties(array $fields)
Preloads field properties.
addField(ilDclBaseFieldModel $field)
static _getStandardFields(int $table_id)
deleteField(int $field_id)
getFieldsForFormula()
Returns all fields of this table including the standard fields, wich are supported for formulas...
ILIAS HTTP Services $http
hasPermissionToDeleteRecord(int $ref_id, ilDclBaseRecordModel $record)
static hasAddRecordAccess(int $ref, ?int $user_id=0)
array $all_fields
table fields and std fields combined
static getFieldCache(int $field_id=0)
ilDclDetailedViewDefinitionGUI: ilPageEditorGUI, ilEditClipboardGUI, ilMediaPoolTargetSelector ilDcl...
setEditByOwner(bool $edit_by_owner)
setDeleteByOwner(bool $delete_by_owner)
setEditPerm(bool $edit_perm)
getFields()
Returns all fields of this table including the standard fields.
setLimitStart(string $limit_start)
static _getTableIdByTitle(string $title, int $obj_id)
showInvalidFields(bool $value)
setDefaultSortFieldOrder(string $default_sort_field_order)
doesRecordBelongToUser(ilDclBaseRecordModel $record)
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
sortTableViews(?array $tableviews=null)
updateFields()
Update fields.
setOrder(int $table_order)
setTitle(string $a_title)
getVisibleTableViews(int $user_id=0, bool $with_active_detailedview=false)
getExportableFields()
Return all the fields that are marked as exportable.
static http()
Fetches the global http state from ILIAS.
sortFields(array &$fields)
sortFields
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, paging and filters.
cloneStructure(ilDclTable $original)
static getAllDatatype(bool $force=false)
Get all possible Datatypes.
ILIAS Refinery Factory $refinery
getFirstTableViewId(int $user_id=0, bool $with_detailed_view=false)
string $default_sort_field_order
Default sort-order (asc|desc)
getRecordFields()
Returns all fields of this table which are NOT standard fields.
static _lookupObjectId(int $ref_id)
static getCountForTableId(int $table_id)
setLimitEnd(string $limit_end)
static hasWriteAccess(int $ref, ?int $user_id=0)
static setCloneOf(int $old, int $new, string $type)
hasPermissionToViewRecord(int $ref_id, ilDclBaseRecordModel $record, int $user_id=0)
string $description
Description for this table displayed above records.
getDefaultSortFieldOrder()
bool $public_comments
True if users can add comments on each record of this table.
getField(string $field_id)
static _hasFieldByTitle(string $title, int $obj_id)
Checks if a table has a field with the given title.
string $default_sort_field
setExportEnabled(bool $export_enabled)
hasPermissionToEditRecord(int $ref_id, ilDclBaseRecordModel $record)
setSaveConfirmation(bool $save_confirmation)
static getRecordCache(?int $record_id)
setAddPerm(bool $add_perm)
compareOrder(ilDclBaseFieldModel $a, ilDclBaseFieldModel $b)
hasPermissionToDeleteRecords(int $ref_id)
static buildFieldFromRecord(array $rec)
$a
thx to https://mlocati.github.io/php-cs-fixer-configurator for the examples
static hasReadAccess(int $ref, ?int $user_id=0)
setDeletePerm(bool $delete_perm)
static getAllForTableId(int $table_id)
setImportEnabled(bool $import_enabled)
static hasEditAccess(int $ref, ?int $user_id=0)
buildOrderFields()
buildOrderFields orders the fields.
setDescription(string $description)
static _tableExists(int $table_id)
doCreate(bool $create_tablefield_setting=true, bool $create_standardview=true)
static set(string $a_var, $a_val)
Set a value.
setDefaultSortField(string $default_sort_field)
setViewOwnRecordsPerm(bool $view_own_perm)
setPublicCommentsEnabled(bool $public_comments)
setLimited(bool $limited)
getNewFieldOrder()
getNewOrder