/** * @param $found * * @return string */ public function doExtReplace($found) { $ref_rec_ids = $this->record_obj->getRecordFieldValue($this->currentField->getId()); if (!is_array($ref_rec_ids)) { $ref_rec_ids = array($ref_rec_ids); } if (!count($ref_rec_ids) || !$ref_rec_ids) { return; } $ref_recs = array(); foreach ($ref_rec_ids as $ref_rec_id) { $ref_recs[] = ilDataCollectionCache::getRecordCache($ref_rec_id); } $field = $ref_recs[0]->getTable()->getFieldByTitle($found[1]); $tpl = new ilTemplate("tpl.reference_list.html", true, true, "Modules/DataCollection"); $tpl->setCurrentBlock("reference_list"); if (!$field) { if (ilObjDataCollectionAccess::_hasWriteAccess($this->dcl_gui_object->ref_id)) { ilUtil::sendInfo("Bad Viewdefinition at [ext tableOf=\"" . $found[1] . "\" ...]", true); } return; } foreach ($ref_recs as $ref_record) { $tpl->setCurrentBlock("reference"); $tpl->setVariable("CONTENT", $ref_record->getRecordFieldHTML($field->getId())); $tpl->parseCurrentBlock(); } //$ref_rec->getRecordFieldHTML($field->getId()) if ($field) { return $tpl->get(); } }
/** * Substitute field values in placehoders like [[Field Title]] from current record * * @param string $placeholder * * @throws ilException * @return string */ protected function substituteFieldValue($placeholder) { if (isset(self::$cache_fields[$placeholder])) { $field = self::$cache_fields[$placeholder]; } else { $table = ilDataCollectionCache::getTableCache($this->record->getTableId()); // TODO May need caching per table in future $field_title = preg_replace('#^\\[\\[(.*)\\]\\]#', "\$1", $placeholder); $field = $table->getFieldByTitle($field_title); if ($field === NULL) { // Workaround for standardfields - title my be ID $field = $table->getField($field_title); if ($field === NULL) { global $lng; /** * @var $lng ilLanguage */ $lng->loadLanguageModule('dcl'); // throw new ilException("Field with title '$field_title' not found"); throw new ilException(sprintf($lng->txt('dcl_err_formula_field_not_found'), $field_title)); } } self::$cache_fields[$placeholder] = $field; } return $this->record->getRecordFieldHTML($field->getId()); }
/** * @return bool */ public function executeCommand() { if ($_GET['mode']) { $this->ctrl->saveParameter($this, 'mode'); $this->ctrl->setParameterByClass("ildatacollectionrecordlistgui", "mode", $_GET['mode']); } $this->ctrl->saveParameter($this, 'redirect'); if ($this->record_id) { $this->record = ilDataCollectionCache::getRecordCache($this->record_id); if (!$this->record->hasPermissionToEdit($this->parent_obj->ref_id) or !$this->record->hasPermissionToView($this->parent_obj->ref_id)) { $this->accessDenied(); } $this->table = $this->record->getTable(); $this->table_id = $this->table->getId(); } else { $this->table = ilDataCollectionCache::getTableCache($this->table_id); if (!ilObjDataCollectionAccess::hasAddRecordAccess($_GET['ref_id'])) { $this->accessDenied(); } } $cmd = $this->ctrl->getCmd(); switch ($cmd) { default: $this->{$cmd}(); break; } return true; }
/** * Set value for record field * * @param mixed $value * @param bool $omit_parsing If true, does not parse the value and stores it in the given format */ public function setValue($value, $omit_parsing = false) { $this->loadValue(); if (!$omit_parsing) { $tmp = $this->field->getDatatype()->parseValue($value, $this); $old = $this->value; //if parse value fails keep the old value if ($tmp !== false) { $this->value = $tmp; //delete old file from filesystem // TODO Does not belong here, create separate class ilDataCollectionFileField and overwrite setValue method if ($old && $this->field->getDatatypeId() == ilDataCollectionDatatype::INPUTFORMAT_FILE) { $this->record->deleteFile($old); } } } else { $this->value = $value; } }
/** * @param ilDataCollectionRecord $record * * @return bool */ private function recordBelongsToCollection(ilDataCollectionRecord $record) { $table = $record->getTable(); $obj_id = $this->parent_obj->object->getId(); $obj_id_rec = $table->getCollectionObject()->getId(); return $obj_id == $obj_id_rec; }
static function passThroughFilter(ilDataCollectionRecord $record, ilDataCollectionField $field, $filter) { $pass = false; $type_id = $field->getDatatypeId(); $value = $record->getRecordFieldValue($field->getId()); switch ($type_id) { case ilDataCollectionDatatype::INPUTFORMAT_TEXT: if (!$filter || strpos(strtolower($value), strtolower($filter)) !== false) { $pass = true; } break; case ilDataCollectionDatatype::INPUTFORMAT_NUMBER: if ((!$filter['from'] || $value >= $filter['from']) && (!$filter['to'] || $value <= $filter['to'])) { $pass = true; } break; case ilDataCollectionDatatype::INPUTFORMAT_BOOLEAN: if ($filter == "checked" && $value == 1 || $filter == "not_checked" && $value == 0 || $filter == '' || !$filter) { $pass = true; } break; case ilDataCollectionDatatype::INPUTFORMAT_DATETIME: if ((!$filter['from'] || $value >= $filter['from']) && (!$filter['to'] || $value <= $filter['to'])) { $pass = true; } break; case ilDataCollectionDatatype::INPUTFORMAT_FILE: if (!ilObject2::_exists($value) || ilObject2::_lookupType($value, false) != "file") { $pass = true; break; } $file_obj = new ilObjFile($value, false); $file_name = $file_obj->getTitle(); if (!$filter || strpos(strtolower($file_name), strtolower($filter)) !== false) { $pass = true; } break; case ilDataCollectionDatatype::INPUTFORMAT_REFERENCE: $props = $field->getProperties(); if ($filter && $props[ilDataCollectionField::PROPERTYID_N_REFERENCE] && is_array($value) && in_array($filter, $value)) { $pass = true; } if (!$filter || $filter == $value) { $pass = true; } break; case ilDataCollectionDatatype::INPUTFORMAT_RATING: if (!$filter || $filter <= $value['avg']) { $pass = true; } break; case ilDataCollectionDatatype::INPUTFORMAT_ILIAS_REF: $obj_id = ilObject::_lookupObjId($value); if (!$filter || strpos(strtolower(ilObject::_lookupTitle($obj_id)), strtolower($filter)) !== false) { $pass = true; } break; case ilDataCollectionDatatype::INPUTFORMAT_MOB: $m_obj = new ilObjMediaObject($value, false); $file_name = $m_obj->getTitle(); if (!$filter || strpos(strtolower($file_name), strtolower($filter)) !== false) { $pass = true; } break; } //for the fields owner and last edit by, we check the name, not the ID if (($field->getId() == "owner" || $field->getId() == "last_edit_by") && $filter) { $pass = false; $user = new ilObjUser($value); if (strpos($user->getFullname(), $filter) !== false) { $pass = true; } } return $pass; }
/** * @param ilDataCollectionRecord $record * * @return bool */ protected function checkEditByOwner(ilDataCollectionRecord $record) { global $ilUser; if ($this->getEditByOwner() and $ilUser->getId() != $record->getOwner()) { return false; } return true; }
/** * @param ilDataCollectionRecord $record * * @return bool */ protected function checkEditByOwner(ilDataCollectionRecord $record) { global $ilUser; return $ilUser->getId() == $record->getOwner(); }
/** * @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; } }