protected function getLinkHTML($link_name = NULL, $value)
 {
     global $ilCtrl;
     if (!$value || $value == "-") {
         return "";
     }
     $record_field = $this;
     $ref_record = ilDataCollectionCache::getRecordCache($value);
     $objRefField = ilDataCollectionCache::getFieldCache($record_field->getField()->getFieldRef());
     $objRefTable = ilDataCollectionCache::getTableCache($objRefField->getTableId());
     if (!$link_name) {
         $link_name = $ref_record->getRecordFieldHTML($record_field->getField()->getFieldRef());
     }
     $ilCtrl->setParameterByClass("ildatacollectionrecordviewgui", "record_id", $ref_record->getId());
     $html = "<a href='" . $ilCtrl->getLinkTargetByClass("ilDataCollectionRecordViewGUI", "renderRecord") . "'>" . $link_name . "</a>";
     return $html;
 }
 /**
  * Constructor
  *
  * @param	object	$a_parent_obj
  * @param	int $table_id We need a table_id if no field_id is set (creation mode). We ignore the table_id by edit mode
  * @param	int $field_id The field_id of a existing fiel (edit mode) 
  */
 public function __construct(ilObjDataCollectionGUI $a_parent_obj, $table_id, $field_id)
 {
     global $ilCtrl;
     $this->obj_id = $a_parent_obj->obj_id;
     $this->parent_obj = $a_parent_obj;
     $this->table_id = $table_id;
     if (!$table_id) {
         $table_id = $_GET["table_id"];
     }
     if (!isset($field_id)) {
         $this->field_id = $_GET['field_id'];
     }
     if (isset($field_id)) {
         $this->field_obj = ilDataCollectionCache::getFieldCache($field_id);
     } else {
         $this->field_obj = ilDataCollectionCache::getFieldCache();
         if (!$table_id) {
             $ilCtrl->redirectByClass("ilDataCollectionGUI", "listFields");
         }
         $this->field_obj->setTableId($table_id);
         $ilCtrl->saveParameter($this, "table_id");
     }
     $this->table = ilDataCollectionCache::getTableCache($table_id);
 }
 /**
  * @param $field ilDataCollectionField
  * @param $value
  *
  * @return int
  */
 public function getReferenceFromValue($field, $value)
 {
     $field = ilDataCollectionCache::getFieldCache($field->getFieldRef());
     $table = ilDataCollectionCache::getTableCache($field->getTableId());
     $record_id = 0;
     foreach ($table->getRecords() as $record) {
         if ($record->getRecordField($field->getId())->getValue() == $value) {
             $record_id = $record->getId();
         }
     }
     return $record_id;
 }
 public function cloneStructure($original_id)
 {
     $original = ilDataCollectionCache::getFieldCache($original_id);
     $this->setTitle($original->getTitle());
     $this->setDatatypeId($original->getDatatypeId());
     $this->setDescription($original->getDescription());
     $this->setEditable($original->isEditable());
     $this->setLocked($original->getLocked());
     $this->setFilterable($original->isFilterable());
     $this->setVisible($original->isVisible());
     $this->setOrder($original->getOrder());
     $this->setRequired($original->getRequired());
     $this->setUnique($original->isUnique());
     $this->doCreate();
     $this->cloneProperties($original);
 }
 /**
  * @param ilDataCollectionField $a_set
  */
 public function fillRow(ilDataCollectionField $a_set)
 {
     global $lng, $ilCtrl;
     if (!$a_set->isStandardField()) {
         $this->tpl->setVariable('FIELD_ID', $a_set->getId());
     }
     $this->tpl->setVariable('NAME', 'order[' . $a_set->getId() . ']');
     $this->tpl->setVariable('VALUE', $this->order);
     $this->tpl->setVariable('CHECKBOX_VISIBLE', 'visible[' . $a_set->getId() . ']');
     if ($a_set->isVisible()) {
         $this->tpl->setVariable('CHECKBOX_VISIBLE_CHECKED', 'checked');
     }
     /* Don't enable setting filter for MOB fields or reference fields that reference a MOB field */
     $show_filter = true;
     $show_exportable = true;
     if ($a_set->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_MOB || $a_set->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_FILE) {
         $show_filter = false;
     }
     if ($a_set->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_REFERENCE) {
         $ref_field = ilDataCollectionCache::getFieldCache((int) $a_set->getFieldRef());
         if ($ref_field && ($ref_field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_MOB || $ref_field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_FILE)) {
             $show_filter = false;
         }
     }
     if ($a_set->getId() == 'comments') {
         $show_filter = false;
         $show_exportable = false;
     }
     if ($show_filter) {
         $this->tpl->setVariable('CHECKBOX_FILTERABLE', 'filterable[' . $a_set->getId() . ']');
         if ($a_set->isFilterable()) {
             $this->tpl->setVariable('CHECKBOX_FILTERABLE_CHECKED', 'checked');
         }
     } else {
         $this->tpl->setVariable('NO_FILTER', '');
     }
     if ($show_exportable) {
         $this->tpl->setVariable('CHECKBOX_EXPORTABLE', 'exportable[' . $a_set->getId() . ']');
         if ($a_set->getExportable()) {
             $this->tpl->setVariable('CHECKBOX_EXPORTABLE_CHECKED', 'checked');
         }
     } else {
         $this->tpl->setVariable('NO_FILTER_EXPORTABLE', '');
     }
     if (!$a_set->isStandardField()) {
         $this->tpl->setVariable('CHECKBOX_NAME_LOCKED', 'locked[' . $a_set->getId() . ']');
         if ($a_set->getLocked()) {
             $this->tpl->setVariable('CHECKBOX_CHECKED_LOCKED', 'checked');
         }
     } else {
         $this->tpl->setVariable('NOT_LOCKED', '');
     }
     $this->order = $this->order + 10;
     $this->tpl->setVariable('ORDER_NAME', 'order[' . $a_set->getId() . ']');
     $this->tpl->setVariable('ORDER_VALUE', $this->order);
     $this->tpl->setVariable('TITLE', $a_set->getTitle());
     $this->tpl->setVariable('DESCRIPTION', $a_set->getDescription());
     $this->tpl->setVariable('DATATYPE', $a_set->getDatatypeTitle());
     if (!$a_set->isStandardField()) {
         switch ($a_set->getRequired()) {
             case 0:
                 $required = ilUtil::getImagePath('icon_not_ok.svg');
                 break;
             case 1:
                 $required = ilUtil::getImagePath('icon_ok.svg');
                 break;
         }
         switch ($a_set->isUnique()) {
             case 0:
                 $uniq = ilUtil::getImagePath('icon_not_ok.svg');
                 break;
             case 1:
                 $uniq = ilUtil::getImagePath('icon_ok.svg');
                 break;
         }
         $this->tpl->setVariable('REQUIRED', $required);
         $this->tpl->setVariable('UNIQUE', $uniq);
     } else {
         $this->tpl->setVariable('NO_REQUIRED', '');
         $this->tpl->setVariable('NO_UNIQUE', '');
     }
     $ilCtrl->setParameterByClass('ildatacollectionfieldeditgui', 'field_id', $a_set->getId());
     if (!$a_set->isStandardField()) {
         include_once './Services/UIComponent/AdvancedSelectionList/classes/class.ilAdvancedSelectionListGUI.php';
         $alist = new ilAdvancedSelectionListGUI();
         $alist->setId($a_set->getId());
         $alist->setListTitle($lng->txt('actions'));
         if ($this->table->hasPermissionToFields($this->parent_obj->parent_obj->ref_id)) {
             $alist->addItem($lng->txt('edit'), 'edit', $ilCtrl->getLinkTargetByClass('ildatacollectionfieldeditgui', 'edit'));
             $alist->addItem($lng->txt('delete'), 'delete', $ilCtrl->getLinkTargetByClass('ildatacollectionfieldeditgui', 'confirmDelete'));
         }
         $this->tpl->setVariable('ACTIONS', $alist->getHTML());
     }
 }
 /**
  * init Form
  *
  * @param string $a_mode values: create | edit
  */
 public function initForm()
 {
     global $lng, $ilCtrl;
     //table_id
     $hidden_prop = new ilHiddenInputGUI("table_id");
     $hidden_prop->setValue($this->table_id);
     $this->form->addItem($hidden_prop);
     $ilCtrl->setParameter($this, "record_id", $this->record_id);
     $this->form->setFormAction($ilCtrl->getFormAction($this));
     $allFields = $this->table->getRecordFields();
     foreach ($allFields as $field) {
         $item = ilDataCollectionDatatype::getInputField($field);
         if ($field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_REFERENCE) {
             $fieldref = $field->getFieldRef();
             $reffield = ilDataCollectionCache::getFieldCache($fieldref);
             $options = array();
             if (!$field->isNRef()) {
                 $options[""] = '--';
             }
             $reftable = ilDataCollectionCache::getTableCache($reffield->getTableId());
             foreach ($reftable->getRecords() as $record) {
                 // If the referenced field is MOB or FILE, we display the filename in the dropdown
                 if ($reffield->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_FILE) {
                     $file_obj = new ilObjFile($record->getRecordFieldValue($fieldref), false);
                     $options[$record->getId()] = $file_obj->getFileName();
                 } else {
                     if ($reffield->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_MOB) {
                         $media_obj = new ilObjMediaObject($record->getRecordFieldValue($fieldref), false);
                         $options[$record->getId()] = $media_obj->getTitle();
                     } else {
                         $options[$record->getId()] = $record->getRecordFieldValue($fieldref);
                     }
                 }
             }
             $item->setOptions($options);
         }
         if ($this->record_id) {
             $record = ilDataCollectionCache::getRecordCache($this->record_id);
         }
         $item->setRequired($field->getRequired());
         //WORKAROUND. If field is from type file: if it's required but already has a value it is no longer required as the old value is taken as default without the form knowing about it.
         if ($field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_FILE || $field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_MOB && ($this->record_id && $record->getId() != 0 && ($record->getRecordFieldValue($field->getId()) != "-" || $record->getRecordFieldValue($field->getId()) != ""))) {
             $item->setRequired(false);
         }
         if (!ilObjDataCollection::_hasWriteAccess($this->parent_obj->ref_id) && $field->getLocked()) {
             $item->setDisabled(true);
         }
         $this->form->addItem($item);
     }
     // Add possibility to change the owner in edit mode
     if ($this->record_id) {
         $ownerField = $this->table->getField('owner');
         $inputfield = ilDataCollectionDatatype::getInputField($ownerField);
         $this->form->addItem($inputfield);
     }
     // save and cancel commands
     if (isset($this->record_id)) {
         $this->form->setTitle($lng->txt("dcl_update_record"));
         $this->form->addCommandButton("save", $lng->txt("dcl_update_record"));
         $this->form->addCommandButton("cancelUpdate", $lng->txt("cancel"));
     } else {
         $this->form->setTitle($lng->txt("dcl_add_new_record"));
         $this->form->addCommandButton("save", $lng->txt("save"));
         $this->form->addCommandButton("cancelSave", $lng->txt("cancel"));
     }
     $ilCtrl->setParameter($this, "table_id", $this->table_id);
     $ilCtrl->setParameter($this, "record_id", $this->record_id);
 }
 /**
  * Attention only use this for objects who have not yet been created (use like: $x = new ilObjDataCollection; $x->cloneStructure($id))
  *
  * @param $original_id The original ID of the dataselection you want to clone it's structure
  */
 public function cloneStructure($original_id)
 {
     $original = new ilObjDataCollection($original_id);
     $this->setApproval($original->getApproval());
     $this->setNotification($original->getNotification());
     $this->setPublicNotes($original->getPublicNotes());
     $this->setRating($original->getRating());
     // delete old tables.
     foreach ($this->getTables() as $table) {
         $table->doDelete(true);
     }
     // add new tables.
     foreach ($original->getTables() as $table) {
         $new_table = new ilDataCollectionTable();
         $new_table->setObjId($this->getId());
         $new_table->cloneStructure($table);
         if ($table->getId() == $original->getMainTableId()) {
             $this->setMainTableId($new_table->getId());
         }
     }
     // update because maintable id is now set.
     $this->doUpdate();
     // Set new field-ID of referenced fields
     foreach ($original->getTables() as $origTable) {
         foreach ($origTable->getRecordFields() as $origField) {
             if ($origField->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_REFERENCE) {
                 $newRefId = NULL;
                 $origFieldRefObj = ilDataCollectionCache::getFieldCache($origField->getFieldRef());
                 $origRefTable = ilDataCollectionCache::getTableCache($origFieldRefObj->getTableId());
                 // Lookup the new ID of the referenced field in the actual DC
                 $tableId = ilDataCollectionTable::_getTableIdByTitle($origRefTable->getTitle(), $this->getId());
                 $fieldId = ilDataCollectionField::_getFieldIdByTitle($origFieldRefObj->getTitle(), $tableId);
                 $field = ilDataCollectionCache::getFieldCache($fieldId);
                 $newRefId = $field->getId();
                 // Set the new refID in the actual DC
                 $tableId = ilDataCollectionTable::_getTableIdByTitle($origTable->getTitle(), $this->getId());
                 $fieldId = ilDataCollectionField::_getFieldIdByTitle($origField->getTitle(), $tableId);
                 $field = ilDataCollectionCache::getFieldCache($fieldId);
                 $field->setPropertyvalue($newRefId, ilDataCollectionField::PROPERTYID_REFERENCE);
                 $field->doUpdate();
             }
         }
     }
 }
 /**
  * init Form
  */
 public function initForm()
 {
     $this->form = new ilPropertyFormGUI();
     $prefix = $this->ctrl->isAsynch() ? 'dclajax' : 'dcl';
     // Used by datacolleciton.js to select input elements
     $this->form->setId($prefix . $this->table_id . $this->record_id);
     $hidden_prop = new ilHiddenInputGUI("table_id");
     $hidden_prop->setValue($this->table_id);
     $this->form->addItem($hidden_prop);
     if ($this->record_id) {
         $hidden_prop = new ilHiddenInputGUI("record_id");
         $hidden_prop->setValue($this->record_id);
         $this->form->addItem($hidden_prop);
     }
     $this->ctrl->setParameter($this, "record_id", $this->record_id);
     $this->form->setFormAction($this->ctrl->getFormAction($this));
     $allFields = $this->table->getRecordFields();
     $inline_css = '';
     foreach ($allFields as $field) {
         $item = ilDataCollectionDatatype::getInputField($field);
         if ($item === NULL) {
             continue;
             // Fields calculating values at runtime, e.g. ilDataCollectionFormulaField do not have input
         }
         if ($field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_REFERENCE) {
             $fieldref = $field->getFieldRef();
             $reffield = ilDataCollectionCache::getFieldCache($fieldref);
             $options = array();
             if (!$field->isNRef()) {
                 $options[""] = $this->lng->txt('dcl_please_select');
             }
             $reftable = ilDataCollectionCache::getTableCache($reffield->getTableId());
             foreach ($reftable->getRecords() as $record) {
                 // If the referenced field is MOB or FILE, we display the filename in the dropdown
                 switch ($reffield->getDatatypeId()) {
                     case ilDataCollectionDatatype::INPUTFORMAT_FILE:
                         $file_obj = new ilObjFile($record->getRecordFieldValue($fieldref), false);
                         $options[$record->getId()] = $file_obj->getFileName();
                         break;
                     case ilDataCollectionDatatype::INPUTFORMAT_MOB:
                         $media_obj = new ilObjMediaObject($record->getRecordFieldValue($fieldref), false);
                         $options[$record->getId()] = $media_obj->getTitle();
                         break;
                     case ilDataCollectionDatatype::INPUTFORMAT_DATETIME:
                         $options[$record->getId()] = $record->getRecordFieldSingleHTML($fieldref);
                         break;
                     default:
                         $options[$record->getId()] = $record->getRecordFieldValue($fieldref);
                         break;
                 }
             }
             asort($options);
             $item->setOptions($options);
             if ($field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_REFERENCE) {
                 // FSX use this to apply to MultiSelectInputGUI
                 //					if (!$field->isNRef()) { // addCustomAttribute only defined for single selects
                 if ($reftable->hasPermissionToAddRecord($_GET['ref_id'])) {
                     $item->addCustomAttribute('data-ref="1"');
                     $item->addCustomAttribute('data-ref-table-id="' . $reftable->getId() . '"');
                     $item->addCustomAttribute('data-ref-field-id="' . $reffield->getId() . '"');
                 }
                 //					}
             }
             if ($item instanceof ilMultiSelectInputGUI) {
                 $item->setWidth(400);
                 $item->setHeight(100);
                 $inline_css .= 'div#' . $item->getFieldId() . '{resize:both;} ';
             }
         }
         if ($this->record_id) {
             $record = ilDataCollectionCache::getRecordCache($this->record_id);
         }
         $item->setRequired($field->getRequired());
         //WORKAROUND. If field is from type file: if it's required but already has a value it is no longer required as the old value is taken as default without the form knowing about it.
         if ($field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_FILE || $field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_MOB) {
             if ($this->record_id and $record->getId()) {
                 $field_value = $record->getRecordFieldValue($field->getId());
                 if ($field_value) {
                     $item->setRequired(false);
                 }
             }
             // If this is an ajax request to return the form, input files are currently not supported
             if ($this->ctrl->isAsynch()) {
                 $item->setDisabled(true);
             }
         }
         if (!ilObjDataCollection::_hasWriteAccess($this->parent_obj->ref_id) && $field->getLocked()) {
             $item->setDisabled(true);
         }
         $this->form->addItem($item);
     }
     $this->tpl->addInlineCss($inline_css);
     // Add possibility to change the owner in edit mode
     if ($this->record_id) {
         $ownerField = $this->table->getField('owner');
         $inputfield = ilDataCollectionDatatype::getInputField($ownerField);
         $this->form->addItem($inputfield);
     }
     // save and cancel commands
     if ($this->record_id) {
         $this->form->setTitle($this->lng->txt("dcl_update_record"));
         $this->form->addCommandButton("save", $this->lng->txt("dcl_update_record"));
         if (!$this->ctrl->isAsynch()) {
             $this->form->addCommandButton("cancelUpdate", $this->lng->txt("cancel"));
         }
     } else {
         $this->form->setTitle($this->lng->txt("dcl_add_new_record"));
         $this->form->addCommandButton("save", $this->lng->txt("save"));
         if (!$this->ctrl->isAsynch()) {
             $this->form->addCommandButton("cancelSave", $this->lng->txt("cancel"));
         }
     }
     $this->ctrl->setParameter($this, "table_id", $this->table_id);
     $this->ctrl->setParameter($this, "record_id", $this->record_id);
 }
 /**
  * addFilterInputFieldToTable This function adds the according filter item to the table gui passed as argument.
  * @param $field ilDataCollectionField The field which should be filterable.
  * @param &$table ilTable2GUI The table you want the filter to be added to.
  */
 static function addFilterInputFieldToTable(ilDataCollectionField $field, ilTable2GUI &$table)
 {
     global $lng;
     $type_id = $field->getDatatypeId();
     $input = NULL;
     switch ($type_id) {
         case ilDataCollectionDatatype::INPUTFORMAT_TEXT:
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_TEXT, false, $field->getId());
             $input->setSubmitFormOnEnter(true);
             break;
         case ilDataCollectionDatatype::INPUTFORMAT_NUMBER:
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_NUMBER_RANGE, false, $field->getId());
             $input->setSubmitFormOnEnter(true);
             break;
         case ilDataCollectionDatatype::INPUTFORMAT_BOOLEAN:
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_SELECT, false, $field->getId());
             $input->setOptions(array("" => $lng->txt("dcl_any"), "not_checked" => $lng->txt("dcl_not_checked"), "checked" => $lng->txt("dcl_checked")));
             break;
         case ilDataCollectionDatatype::INPUTFORMAT_DATETIME:
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_DATE_RANGE, false, $field->getId());
             $input->setSubmitFormOnEnter(true);
             $input->setStartYear(date("Y") - 100);
             break;
         case ilDataCollectionDatatype::INPUTFORMAT_FILE:
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_TEXT, false, $field->getId());
             $input->setSubmitFormOnEnter(true);
             break;
         case ilDataCollectionDatatype::INPUTFORMAT_REFERENCE:
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_SELECT, false, $field->getId());
             $ref_field_id = $field->getFieldRef();
             $ref_field = ilDataCollectionCache::getFieldCache($ref_field_id);
             $ref_table = ilDataCollectionCache::getTableCache($ref_field->getTableId());
             $options = array();
             foreach ($ref_table->getRecords() as $record) {
                 $options[$record->getId()] = $record->getRecordFieldValue($ref_field_id);
             }
             // Sort by values ASC
             asort($options);
             $options = array('' => $lng->txt('dcl_any')) + $options;
             $input->setOptions($options);
             break;
         case ilDataCollectionDatatype::INPUTFORMAT_RATING:
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_SELECT, false, $field->getId());
             $options = array("" => $lng->txt("dcl_any"), 1 => ">1", 2 => ">2", 3 => ">3", 4 => ">4", 5 => "5");
             $input->setOptions($options);
             break;
         case ilDataCollectionDatatype::INPUTFORMAT_MOB:
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_TEXT, false, $field->getId());
             $input->setSubmitFormOnEnter(true);
             break;
         case ilDataCollectionDatatype::INPUTFORMAT_ILIAS_REF:
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_TEXT, false, $field->getId());
             $input->setSubmitFormOnEnter(true);
             break;
         case ilDataCollectionDatatype::INPUTFORMAT_REFERENCELIST:
             //FIXME
             $input = $table->addFilterItemByMetaType("filter_" . $field->getId(), ilTable2GUI::FILTER_SELECT, false, $field->getId());
             $ref_field_id = $field->getFieldRef();
             $ref_field = ilDataCollectionCache::getFieldCache($ref_field_id);
             $ref_table = ilDataCollectionCache::getTableCache($ref_field->getTableId());
             $options = array();
             foreach ($ref_table->getRecords() as $record) {
                 $options[$record->getId()] = $record->getRecordFieldValue($ref_field_id);
             }
             // Sort by values ASC
             asort($options);
             $options = array('' => $lng->txt('dcl_any')) + $options;
             $input->setOptions($options);
             break;
     }
     if ($input != NULL) {
         $input->setTitle($field->getTitle());
     }
     return $input;
 }
 /**
  * @param ilDataCollectionRecordListGUI $a_parent_obj
  * @param string                        $a_parent_cmd
  * @param ilDataCollectionTable         $table
  * @param int                           $mode
  */
 public function __construct(ilDataCollectionRecordListGUI $a_parent_obj, $a_parent_cmd, ilDataCollectionTable $table, $mode = ilDataCollectionRecordListGUI::MODE_VIEW)
 {
     global $lng, $ilCtrl;
     $identifier = 'dcl_rl' . $table->getId();
     $this->setPrefix($identifier);
     $this->setFormName($identifier);
     $this->setId($identifier);
     parent::__construct($a_parent_obj, $a_parent_cmd);
     $this->table = $table;
     $this->parent_obj = $a_parent_obj;
     $this->setRowTemplate("tpl.record_list_row.html", "Modules/DataCollection");
     $this->mode = $mode;
     // Setup columns and sorting columns
     if ($this->mode == ilDataCollectionRecordListGUI::MODE_MANAGE) {
         // Add checkbox columns
         $this->addColumn("", "", "1", true);
         $this->setSelectAllCheckbox("record_ids[]");
         $this->addMultiCommand("confirmDeleteRecords", $lng->txt('dcl_delete_records'));
     }
     if (ilDataCollectionRecordViewGUI::hasTableValidViewDefinition($this->table)) {
         $this->addColumn("", "_front", '15px');
     }
     $this->numeric_fields = array();
     foreach ($this->table->getVisibleFields() as $field) {
         $title = $field->getTitle();
         $sort_field = $title;
         if ($field->getId() == 'comments') {
             $sort_field = 'n_comments';
             $this->numeric_fields[] = $title;
         }
         $this->addColumn($title, $sort_field);
         if ($field->getLearningProgress()) {
             $this->addColumn($lng->txt("dcl_status"), "_status_" . $field->getTitle());
         }
         if ($field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_NUMBER) {
             $this->numeric_fields[] = $title;
         }
     }
     $this->addColumn($lng->txt("actions"), "", "30px");
     $this->setTopCommands(true);
     $this->setEnableHeader(true);
     $this->setShowRowsSelector(true);
     $this->setShowTemplates(true);
     $this->setEnableHeader(true);
     $this->setEnableTitle(true);
     $this->setDefaultOrderDirection($this->table->getDefaultSortFieldOrder());
     // Set a default sorting?
     $default_sort_title = 'id';
     if ($fieldId = $this->table->getDefaultSortField()) {
         if (ilDataCollectionStandardField::_isStandardField($fieldId)) {
             /** @var $stdField ilDataCollectionStandardField */
             foreach (ilDataCollectionStandardField::_getStandardFields($this->table->getId()) as $stdField) {
                 if ($stdField->getId() == $fieldId) {
                     $default_sort_title = $stdField->getTitle();
                     break;
                 }
             }
         } else {
             $default_sort_title = ilDataCollectionCache::getFieldCache($fieldId)->getTitle();
         }
         $this->setDefaultOrderField($default_sort_title);
     }
     $this->setFormAction($ilCtrl->getFormAction($a_parent_obj, "applyFilter"));
     $this->initFilter();
     $this->setStyle('table', $this->getStyle('table') . ' ' . 'dcl_record_list');
 }
 /**
  * Confirm deletion of multiple fields
  */
 public function confirmDeleteFields()
 {
     $this->tabs->clearSubTabs();
     $conf = new ilConfirmationGUI();
     $conf->setFormAction($this->ctrl->getFormAction($this));
     $conf->setHeaderText($this->lng->txt('dcl_confirm_delete_fields'));
     $field_ids = isset($_POST['dcl_field_ids']) ? $_POST['dcl_field_ids'] : array();
     foreach ($field_ids as $field_id) {
         /** @var ilDataCollectionField $field */
         $field = ilDataCollectionCache::getFieldCache($field_id);
         $conf->addItem('dcl_field_ids[]', $field_id, $field->getTitle());
     }
     $conf->setConfirm($this->lng->txt('delete'), 'deleteFields');
     $conf->setCancel($this->lng->txt('cancel'), 'listFields');
     $this->tpl->setContent($conf->getHTML());
 }
 public function deleteField($field_id)
 {
     $field = ilDataCollectionCache::getFieldCache($field_id);
     $records = $this->getRecords();
     foreach ($records as $record) {
         $record->deleteField($field_id);
     }
     $field->doDelete();
 }
 /**
  * Return only the needed subset of record objects for the table, according to sorting, paging and filters
  *
  * @param string $sort      Title of a field where the ilTable2GUI is sorted
  * @param string $direction 'desc' or 'asc'
  * @param int    $limit     Limit of records
  * @param int    $offset    Offset from records
  * @param array  $filter    Containing the filter values
  *
  * @return array Array with two keys: 'record' => Contains the record objects, 'total' => Number of total records (without slicing)
  */
 public function getPartialRecords($sort, $direction, $limit, $offset, array $filter = array())
 {
     global $ilDB, $ilUser, $rbacreview;
     $sort_field = $sort ? $this->getFieldByTitle($sort) : $this->getField('id');
     $direction = strtolower($direction);
     $direction = in_array($direction, array('desc', 'asc')) ? $direction : 'asc';
     // Sorting by a status from an ILIAS Ref field. This column is added dynamically to the table, there is no field model
     $sort_by_status = false;
     if (substr($sort, 0, 8) == '_status_') {
         $sort_by_status = true;
         $sort_field = $this->getFieldByTitle(substr($sort, 8));
     }
     if (is_null($sort_field)) {
         $sort_field = $this->getField('id');
     }
     $id = $sort_field->getId();
     $stl = $sort_field->getStorageLocation();
     $select_str = '';
     $join_str = '';
     $where_additions = '';
     $has_nref = false;
     if ($sort_field->isStandardField()) {
         if ($id == 'owner' || $id == 'last_edit_by') {
             $join_str .= "LEFT JOIN usr_data AS sort_usr_data_{$id} ON (sort_usr_data_{$id}.usr_id = record.{$id})";
             $select_str .= " sort_usr_data_{$id}.login AS field_{$id},";
         } else {
             $select_str .= " record.{$id} AS field_{$id},";
         }
     } else {
         switch ($sort_field->getDatatypeId()) {
             case ilDataCollectionDatatype::INPUTFORMAT_RATING:
                 $join_str .= "LEFT JOIN (SELECT AVG(sort_avg_rating.rating) AS avg_rating, sort_avg_rating.obj_id AS obj_id FROM il_rating as sort_avg_rating WHERE sort_avg_rating.sub_obj_id = {$sort_field->getId()} GROUP BY sort_avg_rating.obj_id) AS sort_avg_rating on sort_avg_rating.obj_id = record.id ";
                 $select_str .= " sort_avg_rating.avg_rating AS field_{$id},";
                 break;
             case ilDataCollectionDatatype::INPUTFORMAT_ILIAS_REF:
                 $join_str .= "LEFT JOIN il_dcl_record_field AS sort_record_field_{$id} ON (sort_record_field_{$id}.record_id = record.id AND sort_record_field_{$id}.field_id = " . $ilDB->quote($sort_field->getId(), 'integer') . ") ";
                 $join_str .= "LEFT JOIN il_dcl_stloc{$stl}_value AS sort_stloc_{$id} ON (sort_stloc_{$id}.record_field_id = sort_record_field_{$id}.id) ";
                 $join_str .= "LEFT JOIN object_reference AS sort_object_reference_{$id} ON (sort_object_reference_{$id}.ref_id = sort_stloc_{$id}.value AND sort_object_reference_{$id}.deleted IS NULL)";
                 $join_str .= "LEFT JOIN object_data AS sort_object_data_{$id} ON (sort_object_data_{$id}.obj_id = sort_object_reference_{$id}.obj_id)";
                 if ($sort_by_status) {
                     global $ilUser;
                     $join_str .= "LEFT JOIN ut_lp_marks AS ut ON (ut.obj_id = sort_object_data_{$id}.obj_id AND ut.usr_id = " . $ilDB->quote($ilUser->getId(), 'integer') . ") ";
                 }
                 $select_str .= !$sort_by_status ? " sort_object_data_{$id}.title AS field_{$id}," : " ut.status AS field_{$id}";
                 break;
             case ilDataCollectionDatatype::INPUTFORMAT_FILE:
             case ilDataCollectionDatatype::INPUTFORMAT_MOB:
                 $join_str .= "LEFT JOIN il_dcl_record_field AS sort_record_field_{$id} ON (sort_record_field_{$id}.record_id = record.id AND sort_record_field_{$id}.field_id = " . $ilDB->quote($sort_field->getId(), 'integer') . ") ";
                 $join_str .= "LEFT JOIN il_dcl_stloc{$stl}_value AS sort_stloc_{$id} ON (sort_stloc_{$id}.record_field_id = sort_record_field_{$id}.id) ";
                 $join_str .= "LEFT JOIN object_data AS sort_object_data_{$id} ON (sort_object_data_{$id}.obj_id = sort_stloc_{$id}.value) ";
                 $select_str .= " sort_object_data_{$id}.title AS field_{$id},";
                 break;
             case ilDataCollectionDatatype::INPUTFORMAT_REFERENCE:
                 $prop = $sort_field->getPropertyvalues();
                 $ref_field = ilDataCollectionCache::getFieldCache($sort_field->getFieldRef());
                 $n_ref = $prop[ilDataCollectionField::PROPERTYID_N_REFERENCE];
                 if ($n_ref) {
                     $has_nref = true;
                 }
                 $select_str .= $n_ref ? " GROUP_CONCAT(stloc_{$id}_joined.value) AS field_{$id}" : "stloc_{$id}_joined.value AS field_{$id},";
                 $join_str .= "LEFT JOIN il_dcl_record_field AS record_field_{$id} ON (record_field_{$id}.record_id = record.id AND record_field_{$id}.field_id = " . $ilDB->quote($sort_field->getId(), 'integer') . ") ";
                 $join_str .= "LEFT JOIN il_dcl_stloc{$stl}_value AS stloc_{$id} ON (stloc_{$id}.record_field_id = record_field_{$id}.id) ";
                 $join_str .= "LEFT JOIN il_dcl_record_field AS record_field_{$id}_joined ON (record_field_{$id}_joined.record_id = stloc_{$id}.value AND record_field_{$id}_joined.field_id = " . $ilDB->quote($ref_field->getId(), 'integer') . ") ";
                 $join_str .= "LEFT JOIN il_dcl_stloc{$ref_field->getStorageLocation()}_value AS stloc_{$id}_joined ON (stloc_{$id}_joined.record_field_id = record_field_{$id}_joined.id) ";
                 break;
             case ilDataCollectionDatatype::INPUTFORMAT_DATETIME:
             case ilDataCollectionDatatype::INPUTFORMAT_TEXT:
             case ilDataCollectionDatatype::INPUTFORMAT_BOOLEAN:
             case ilDataCollectionDatatype::INPUTFORMAT_NUMBER:
                 $select_str .= " sort_stloc_{$id}.value AS field_{$id},";
                 $join_str .= "LEFT JOIN il_dcl_record_field AS sort_record_field_{$id} ON (sort_record_field_{$id}.record_id = record.id AND sort_record_field_{$id}.field_id = " . $ilDB->quote($sort_field->getId(), 'integer') . ") ";
                 $join_str .= "LEFT JOIN il_dcl_stloc{$stl}_value AS sort_stloc_{$id} ON (sort_stloc_{$id}.record_field_id = sort_record_field_{$id}.id) ";
                 break;
         }
     }
     if (count($filter)) {
         foreach ($filter as $key => $filter_value) {
             $filter_field_id = substr($key, 7);
             $filter_field = $this->getField($filter_field_id);
             switch ($filter_field->getDatatypeId()) {
                 case ilDataCollectionDatatype::INPUTFORMAT_RATING:
                     $join_str .= "INNER JOIN (SELECT AVG(avg_rating.rating) AS avg_rating, avg_rating.obj_id AS obj_id FROM il_rating as avg_rating WHERE avg_rating.sub_obj_id = {$filter_field_id} GROUP BY avg_rating.obj_id) AS avg_rating on avg_rating.avg_rating >= " . $ilDB->quote($filter_value, 'integer') . " AND avg_rating.obj_id = record.id ";
                     break;
                 case ilDataCollectionDatatype::INPUTFORMAT_ILIAS_REF:
                     $join_str .= "INNER JOIN il_dcl_record_field AS filter_record_field_{$filter_field_id} ON (filter_record_field_{$filter_field_id}.record_id = record.id AND filter_record_field_{$filter_field_id}.field_id = " . $ilDB->quote($filter_field_id, 'integer') . ") ";
                     $join_str .= "INNER JOIN il_dcl_stloc{$filter_field->getStorageLocation()}_value AS filter_stloc_{$filter_field_id} ON (filter_stloc_{$filter_field_id}.record_field_id = filter_record_field_{$filter_field_id}.id) ";
                     $join_str .= "INNER JOIN object_reference AS filter_object_reference_{$filter_field_id} ON (filter_object_reference_{$filter_field_id}.ref_id = filter_stloc_{$filter_field_id}.value ) ";
                     $join_str .= "INNER JOIN object_data AS filter_object_data_{$filter_field_id} ON (filter_object_data_{$filter_field_id}.obj_id = filter_object_reference_{$filter_field_id}.obj_id AND filter_object_data_{$filter_field_id}.title LIKE " . $ilDB->quote("%{$filter_value}%", 'text') . ") ";
                     break;
                 case ilDataCollectionDatatype::INPUTFORMAT_MOB:
                 case ilDataCollectionDatatype::INPUTFORMAT_FILE:
                     $join_str .= "INNER JOIN il_dcl_record_field AS filter_record_field_{$filter_field_id} ON (filter_record_field_{$filter_field_id}.record_id = record.id AND filter_record_field_{$filter_field_id}.field_id = " . $ilDB->quote($filter_field_id, 'integer') . ") ";
                     $join_str .= "INNER JOIN il_dcl_stloc{$filter_field->getStorageLocation()}_value AS filter_stloc_{$filter_field_id} ON (filter_stloc_{$filter_field_id}.record_field_id = filter_record_field_{$filter_field_id}.id) ";
                     $join_str .= "INNER JOIN object_data AS filter_object_data_{$filter_field_id} ON (filter_object_data_{$filter_field_id}.obj_id = filter_stloc_{$filter_field_id}.value AND filter_object_data_{$filter_field_id}.title LIKE " . $ilDB->quote("%{$filter_value}%", 'text') . ") ";
                     break;
                 case ilDataCollectionDatatype::INPUTFORMAT_DATETIME:
                     $date_from = isset($filter_value['from']) && is_object($filter_value['from']) ? $filter_value['from'] : NULL;
                     $date_to = isset($filter_value['to']) && is_object($filter_value['to']) ? $filter_value['to'] : NULL;
                     if ($filter_field->isStandardField()) {
                         if ($date_from) {
                             $where_additions .= " AND (record.{$filter_field_id} >= " . $ilDB->quote($date_from, 'date') . ")";
                         }
                         if ($date_to) {
                             $where_additions .= " AND (record.{$filter_field_id} <= " . $ilDB->quote($date_to, 'date') . ")";
                         }
                     } else {
                         $join_str .= "INNER JOIN il_dcl_record_field AS filter_record_field_{$filter_field_id} ON (filter_record_field_{$filter_field_id}.record_id = record.id AND filter_record_field_{$filter_field_id}.field_id = " . $ilDB->quote($filter_field_id, 'integer') . ") ";
                         $join_str .= "INNER JOIN il_dcl_stloc{$filter_field->getStorageLocation()}_value AS filter_stloc_{$filter_field_id} ON (filter_stloc_{$filter_field_id}.record_field_id = filter_record_field_{$filter_field_id}.id ";
                         if ($date_from) {
                             $join_str .= "AND filter_stloc_{$filter_field_id}.value >= " . $ilDB->quote($date_from, 'date') . " ";
                         }
                         if ($date_to) {
                             $join_str .= "AND filter_stloc_{$filter_field_id}.value <= " . $ilDB->quote($date_to, 'date') . " ";
                         }
                         $join_str .= ") ";
                     }
                     break;
                 case ilDataCollectionDatatype::INPUTFORMAT_NUMBER:
                     $from = isset($filter_value['from']) ? (int) $filter_value['from'] : NULL;
                     $to = isset($filter_value['to']) ? (int) $filter_value['to'] : NULL;
                     if ($filter_field->isStandardField()) {
                         if (!is_null($from)) {
                             $where_additions .= " AND record.{$filter_field_id} >= " . $ilDB->quote($from, 'integer');
                         }
                         if (!is_null($to)) {
                             $where_additions .= " AND record.{$filter_field_id} <= " . $ilDB->quote($to, 'integer');
                         }
                     } else {
                         $join_str .= "INNER JOIN il_dcl_record_field AS filter_record_field_{$filter_field_id} ON (filter_record_field_{$filter_field_id}.record_id = record.id AND filter_record_field_{$filter_field_id}.field_id = " . $ilDB->quote($filter_field_id, 'integer') . ") ";
                         $join_str .= "INNER JOIN il_dcl_stloc{$filter_field->getStorageLocation()}_value AS filter_stloc_{$filter_field_id} ON (filter_stloc_{$filter_field_id}.record_field_id = filter_record_field_{$filter_field_id}.id";
                         if (!is_null($from)) {
                             $join_str .= " AND filter_stloc_{$filter_field_id}.value >= " . $ilDB->quote($from, 'integer');
                         }
                         if (!is_null($to)) {
                             $join_str .= " AND filter_stloc_{$filter_field_id}.value <= " . $ilDB->quote($to, 'integer');
                         }
                         $join_str .= ") ";
                     }
                     break;
                 case ilDataCollectionDatatype::INPUTFORMAT_BOOLEAN:
                     if ($filter_value == "checked") {
                         $join_str .= "INNER JOIN il_dcl_record_field AS filter_record_field_{$filter_field_id} ON (filter_record_field_{$filter_field_id}.record_id = record.id AND filter_record_field_{$filter_field_id}.field_id = " . $ilDB->quote($filter_field_id, 'integer') . ") ";
                         $join_str .= "INNER JOIN il_dcl_stloc{$filter_field->getStorageLocation()}_value AS filter_stloc_{$filter_field_id} ON (filter_stloc_{$filter_field_id}.record_field_id = filter_record_field_{$filter_field_id}.id";
                         $join_str .= " AND filter_stloc_{$filter_field_id}.value = " . $ilDB->quote(1, 'integer');
                     } else {
                         $join_str .= "INNER JOIN il_dcl_record_field AS filter_record_field_{$filter_field_id} ON (filter_record_field_{$filter_field_id}.record_id = record.id AND filter_record_field_{$filter_field_id}.field_id = " . $ilDB->quote($filter_field_id, 'integer') . ") ";
                         $join_str .= "LEFT JOIN il_dcl_stloc{$filter_field->getStorageLocation()}_value AS filter_stloc_{$filter_field_id} ON (filter_stloc_{$filter_field_id}.record_field_id = filter_record_field_{$filter_field_id}.id";
                         $where_additions .= " AND (filter_stloc_{$filter_field_id}.value <> " . $ilDB->quote(1, 'integer') . " OR filter_stloc_{$filter_field_id}.value is NULL)";
                     }
                     $join_str .= " ) ";
                     break;
                 case ilDataCollectionDatatype::INPUTFORMAT_TEXT:
                     if ($filter_field->isStandardField()) {
                         $join_str .= "INNER JOIN usr_data AS filter_usr_data_{$filter_field_id} ON (filter_usr_data_{$filter_field_id}.usr_id = record.{$filter_field_id} AND filter_usr_data_{$filter_field_id}.login LIKE " . $ilDB->quote("%{$filter_value}%", 'text') . ") ";
                     } else {
                         $join_str .= " INNER JOIN il_dcl_record_field AS filter_record_field_{$filter_field_id} ON (filter_record_field_{$filter_field_id}.record_id = record.id AND filter_record_field_{$filter_field_id}.field_id = " . $ilDB->quote($filter_field_id, 'integer') . ") ";
                         $join_str .= " INNER JOIN il_dcl_stloc{$filter_field->getStorageLocation()}_value AS filter_stloc_{$filter_field_id} ON (filter_stloc_{$filter_field_id}.record_field_id = filter_record_field_{$filter_field_id}.id AND filter_stloc_{$filter_field_id}.value LIKE " . $ilDB->quote("%{$filter_value}%", 'text') . ") ";
                     }
                     break;
                 case ilDataCollectionDatatype::INPUTFORMAT_REFERENCE:
                     $join_str .= " INNER JOIN il_dcl_record_field AS filter_record_field_{$filter_field_id} ON (filter_record_field_{$filter_field_id}.record_id = record.id AND filter_record_field_{$filter_field_id}.field_id = " . $ilDB->quote($filter_field_id, 'integer') . ") ";
                     $prop = $filter_field->getPropertyvalues();
                     $n_ref = $prop[ilDataCollectionField::PROPERTYID_N_REFERENCE];
                     if ($n_ref) {
                         $join_str .= " INNER JOIN il_dcl_stloc{$filter_field->getStorageLocation()}_value AS filter_stloc_{$filter_field_id} ON (filter_stloc_{$filter_field_id}.record_field_id = filter_record_field_{$filter_field_id}.id AND filter_stloc_{$filter_field_id}.value LIKE " . $ilDB->quote("%{$filter_value}%", 'text') . ") ";
                     } else {
                         $join_str .= " INNER JOIN il_dcl_stloc{$filter_field->getStorageLocation()}_value AS filter_stloc_{$filter_field_id} ON (filter_stloc_{$filter_field_id}.record_field_id = filter_record_field_{$filter_field_id}.id AND filter_stloc_{$filter_field_id}.value = " . $ilDB->quote($filter_value, 'integer') . ") ";
                     }
                     break;
             }
         }
     }
     // Build the query string
     $sql = "SELECT DISTINCT record.id, record.owner, ";
     $sql .= rtrim($select_str, ',') . " FROM il_dcl_record AS record ";
     $sql .= $join_str;
     $sql .= " WHERE record.table_id = " . $ilDB->quote($this->getId(), 'integer') . $where_additions;
     if ($has_nref) {
         $sql .= " GROUP BY record.id";
     }
     $sql .= " ORDER BY field_{$id} {$direction}";
     $set = $ilDB->query($sql);
     $total_record_ids = array();
     // Save record-ids in session to enable prev/next links in detail view
     $_SESSION['dcl_record_ids'] = array();
     $is_allowed_to_view = $this->getCollectionObject()->getOwner() == $ilUser->getId() || $rbacreview->isAssigned($ilUser->getId(), 2);
     while ($rec = $ilDB->fetchAssoc($set)) {
         // Quick check if the current user is allowed to view the record
         if (!$is_allowed_to_view && ($this->getViewOwnRecordsPerm() && $ilUser->getId() != $rec['owner'])) {
             continue;
         }
         $total_record_ids[] = $rec['id'];
         $_SESSION['dcl_record_ids'][] = $rec['id'];
     }
     // Now slice the array to load only the needed records in memory
     $record_ids = array_slice($total_record_ids, $offset, $limit);
     $records = array();
     foreach ($record_ids as $id) {
         $records[] = ilDataCollectionCache::getRecordCache($id);
     }
     return array('records' => $records, 'total' => count($total_record_ids));
 }
 /**
  * @param string          $a_entity
  * @param                 $a_types
  * @param array           $a_rec
  * @param ilImportMapping $a_mapping
  * @param string          $a_schema_version
  */
 public function importRecord($a_entity, $a_types, $a_rec, $a_mapping, $a_schema_version)
 {
     switch ($a_entity) {
         case 'dcl':
             // Calling new_obj->create() will create the main table for us
             $new_obj = new ilObjDataCollection();
             $new_obj->setTitle($a_rec['title']);
             $new_obj->setDescription($a_rec['description']);
             $new_obj->setApproval($a_rec['approval']);
             $new_obj->setPublicNotes($a_rec['public_notes']);
             $new_obj->setNotification($a_rec['notification']);
             $new_obj->setPublicNotes($a_rec['public_notes']);
             $new_obj->setOnline(false);
             $new_obj->setRating($a_rec['rating']);
             $new_obj->create();
             $this->import_dc_object = $new_obj;
             $a_mapping->addMapping('Modules/DataCollection', 'dcl', $a_rec['id'], $new_obj->getId());
             break;
         case 'il_dcl_table':
             // If maintable, update. Other tables must be created as well
             $table = $this->count_imported_tables > 0 ? new ilDataCollectionTable() : ilDataCollectionCache::getTableCache($this->import_dc_object->getMainTableId());
             $table->setTitle($a_rec['title']);
             $table->setObjId($this->import_dc_object->getId());
             $table->setDescription($a_rec['description']);
             $table->setAddPerm($a_rec['add_perm']);
             $table->setEditPerm($a_rec['edit_perm']);
             $table->setDeletePerm($a_rec['delete_perm']);
             $table->setEditByOwner($a_rec['edit_by_owner']);
             $table->setLimited($a_rec['limited']);
             $table->setLimitStart($a_rec['limit_start']);
             $table->setLimitEnd($a_rec['limit_end']);
             $table->setIsVisible($a_rec['is_visible']);
             $table->setExportEnabled($a_rec['export_enabled']);
             $table->setDefaultSortField($a_rec['default_sort_field_id']);
             $table->setDefaultSortFieldOrder($a_rec['default_sort_field_order']);
             $table->setPublicCommentsEnabled($a_rec['public_comments']);
             $table->setViewOwnRecordsPerm($a_rec['view_own_records_perm']);
             if ($this->count_imported_tables > 0) {
                 $table->doCreate(false);
                 // false => Do not create views! They are imported later
             } else {
                 $table->doUpdate();
                 $this->count_imported_tables++;
                 // Delete views from maintable because we want to import them from the xml data
                 $set = $this->db->query('SELECT * FROM il_dcl_view WHERE table_id = ' . $this->db->quote($table->getId(), 'integer'));
                 $view_ids = array();
                 while ($row = $this->db->fetchObject($set)) {
                     $view_ids[] = $row->id;
                 }
                 if (count($view_ids)) {
                     $this->db->manipulate("DELETE FROM il_dcl_viewdefinition WHERE view_id IN (" . implode(',', $view_ids) . ")");
                 }
                 $this->db->manipulate("DELETE FROM il_dcl_view WHERE table_id = " . $this->db->quote($table->getId(), 'integer'));
             }
             $a_mapping->addMapping('Modules/DataCollection', 'il_dcl_table', $a_rec['id'], $table->getId());
             break;
         case 'il_dcl_field':
             $new_table_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_table', $a_rec['table_id']);
             if ($new_table_id) {
                 $field = new ilDataCollectionField();
                 $field->setTableId($new_table_id);
                 $field->setDatatypeId($a_rec['datatype_id']);
                 $field->setTitle($a_rec['title']);
                 $field->setDescription($a_rec['description']);
                 $field->setRequired($a_rec['required']);
                 $field->setUnique($a_rec['is_unique']);
                 $field->setLocked($a_rec['is_locked']);
                 $field->doCreate();
                 $a_mapping->addMapping('Modules/DataCollection', 'il_dcl_field', $a_rec['id'], $field->getId());
                 // Check if this field was used as default order by, if so, update to new id
                 $table = ilDataCollectionCache::getTableCache($new_table_id);
                 if ($table && $table->getDefaultSortField() == $a_rec['id']) {
                     $table->setDefaultSortField($field->getId());
                     $table->doUpdate();
                 }
             }
             break;
         case 'il_dcl_record':
             $new_table_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_table', $a_rec['table_id']);
             if ($new_table_id) {
                 $record = new ilDataCollectionRecord();
                 $record->setTableId($new_table_id);
                 $datetime = new ilDateTime(time(), IL_CAL_UNIX);
                 $record->setCreateDate($datetime);
                 $record->setLastUpdate($datetime);
                 $record->setOwner($this->user->getId());
                 $record->setLastEditBy($this->user->getId());
                 $record->doCreate();
                 $a_mapping->addMapping('Modules/DataCollection', 'il_dcl_record', $a_rec['id'], $record->getId());
             }
             break;
         case 'il_dcl_view':
             $new_table_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_table', $a_rec['table_id']);
             if ($new_table_id) {
                 if ($a_rec['type'] == 0 && $a_rec['formtype'] == 0) {
                     // RecordViewViewDefinition: Create a new RecordViewViewdefinition. Note that the associated Page object is NOT created.
                     // Creation of the Page object is handled by the import of Services/COPage
                     $definition = new ilDataCollectionRecordViewViewdefinition();
                     $definition->setTableId($new_table_id);
                     $definition->create(true);
                     // DO not create DB entries for page object
                     // This mapping is needed for the import handled by Services/COPage
                     $a_mapping->addMapping('Services/COPage', 'pg', 'dclf:' . $a_rec['id'], 'dclf:' . $definition->getId());
                     $a_mapping->addMapping('Modules/DataCollection', 'il_dcl_view', $a_rec['id'], $definition->getId());
                 } else {
                     // Other definitions - grab next ID from il_dcl_view
                     $view_id = $this->db->nextId("il_dcl_view");
                     $sql = "INSERT INTO il_dcl_view (id, table_id, type, formtype) VALUES (" . $this->db->quote($view_id, "integer") . ", " . $this->db->quote($new_table_id, "integer") . ", " . $this->db->quote($a_rec['type'], "integer") . ", " . $this->db->quote($a_rec['formtype'], "integer") . ")";
                     $this->db->manipulate($sql);
                     $a_mapping->addMapping('Modules/DataCollection', 'il_dcl_view', $a_rec['id'], $view_id);
                 }
             }
             break;
         case 'il_dcl_viewdefinition':
             $new_view_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_view', $a_rec['view_id']);
             $new_field_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_field', $a_rec['field']);
             $field = $new_field_id ? $new_field_id : $a_rec['field'];
             if ($new_view_id) {
                 $sql = 'INSERT INTO il_dcl_viewdefinition (view_id, field, field_order, is_set) VALUES (' . $this->db->quote($new_view_id, 'integer') . ', ' . $this->db->quote($field, 'text') . ', ' . $this->db->quote($a_rec['field_order'], 'integer') . ', ' . $this->db->quote($a_rec['is_set'], 'integer') . ')';
                 $this->db->manipulate($sql);
             }
             break;
         case 'il_dcl_field_prop':
             $new_field_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_field', $a_rec['field_id']);
             if ($new_field_id) {
                 $prop = new ilDataCollectionFieldProp();
                 $prop->setFieldId($new_field_id);
                 $prop->setDatatypePropertyId($a_rec['datatype_prop_id']);
                 // For field references, we need to get the new field id of the referenced field
                 // If the field_id does not yet exist (e.g. referenced table not yet created), store temp info and fix before finishing import
                 $value = $a_rec['value'];
                 $refs = array(ilDataCollectionField::PROPERTYID_REFERENCE, ilDataCollectionField::PROPERTYID_N_REFERENCE);
                 $fix_refs = false;
                 if (in_array($prop->getDatatypePropertyId(), $refs)) {
                     $new_field_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_field', $a_rec['value']);
                     if ($new_field_id === false) {
                         $value = NULL;
                         $fix_refs = true;
                     }
                 }
                 $prop->setValue($value);
                 $prop->doCreate();
                 $a_mapping->addMapping('Modules/DataCollection', 'il_dcl_field_prop', $a_rec['id'], $prop->getId());
                 if ($fix_refs) {
                     $this->import_temp_refs_props[$prop->getId()] = $a_rec['value'];
                 }
             }
             break;
         case 'il_dcl_record_field':
             $record_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_record', $a_rec['record_id']);
             $field_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_field', $a_rec['field_id']);
             if ($record_id && $field_id) {
                 $record = ilDataCollectionCache::getRecordCache($record_id);
                 $field = ilDataCollectionCache::getFieldCache($field_id);
                 $record_field = new ilDataCollectionRecordField($record, $field);
                 // Created in constructor if not existing
                 $a_mapping->addMapping('Modules/DataCollection', 'il_dcl_record_field', $a_rec['id'], $record_field->getId());
                 $this->import_record_field_cache[$record_field->getId()] = $record_field;
             }
             break;
         case 'il_dcl_stloc1_value':
         case 'il_dcl_stloc2_value':
         case 'il_dcl_stloc3_value':
             $new_record_field_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_record_field', $a_rec['record_field_id']);
             if ($new_record_field_id) {
                 /** @var ilDataCollectionRecordField $record_field */
                 $record_field = $this->import_record_field_cache[$new_record_field_id];
                 if (is_object($record_field)) {
                     // Need to rewrite internal references and lookup new objects if MOB or File
                     // For some fieldtypes it's better to reset the value, e.g. ILIAS_REF
                     switch ($record_field->getField()->getDatatypeId()) {
                         case ilDataCollectionDatatype::INPUTFORMAT_MOB:
                             // Check if we got a mapping from old object
                             $new_mob_id = $a_mapping->getMapping('Services/MediaObjects', 'mob', $a_rec['value']);
                             $value = $new_mob_id ? (int) $new_mob_id : NULL;
                             $this->import_temp_new_mob_ids[] = $new_mob_id;
                             break;
                         case ilDataCollectionDatatype::INPUTFORMAT_FILE:
                             $new_file_id = $a_mapping->getMapping('Modules/File', 'file', $a_rec['value']);
                             $value = $new_file_id ? (int) $new_file_id : NULL;
                             break;
                         case ilDataCollectionDatatype::INPUTFORMAT_REFERENCE:
                         case ilDataCollectioNDatatype::INPUTFORMAT_REFERENCELIST:
                             // If we are referencing to a record from a table that is not yet created, return value is always false because the record does exist neither
                             // Solution: Temporary store all references and fix them before finishing the import.
                             $new_record_id = $a_mapping->getMapping('Modules/DataCollection', 'il_dcl_record', $a_rec['value']);
                             if ($new_record_id === false) {
                                 $this->import_temp_refs[$new_record_field_id] = $a_rec['value'];
                             }
                             $value = $new_record_id ? (int) $new_record_id : NULL;
                             break;
                         case ilDataCollectionDatatype::INPUTFORMAT_ILIAS_REF:
                             $value = NULL;
                             break;
                         default:
                             $value = $a_rec['value'];
                             if ($a_entity == 'il_dcl_stloc3_value' && (is_null($value) || empty($value))) {
                                 $value = '0000-00-00 00:00:00';
                             }
                     }
                     $record_field->setValue($value, true);
                     $record_field->doUpdate();
                 }
             }
             break;
     }
 }