4require_once 
"Services/ADT/classes/class.ilADTFactory.php";
 
   59        $this->
language = $DIC->language()->getLangKey();
 
   60        $this->logger = 
$DIC->logger()->amet();
 
   66        $this->
read($a_field_id);
 
   83            $set = 
$ilDB->query(
"SELECT field_type" .
 
   84                " FROM adv_mdf_definition" .
 
   85                " WHERE field_id = " . 
$ilDB->quote($a_field_id, 
"integer"));
 
   86            $a_type = 
$ilDB->fetchAssoc($set);
 
   87            $a_type = $a_type[
"field_type"];
 
   90        if (self::isValidType($a_type)) {
 
   92            require_once 
"Services/AdvancedMetaData/classes/Types/class." . $class . 
".php";
 
   93            return new $class($a_field_id, 
$language);
 
  104    public static function exists($a_field_id)
 
  110        $set = 
$ilDB->query(
"SELECT field_type" .
 
  111            " FROM adv_mdf_definition" .
 
  112            " WHERE field_id = " . 
$ilDB->quote($a_field_id, 
"integer"));
 
  113        if (
$ilDB->fetchAssoc($set)) {
 
  129            self::TYPE_TEXT => 
"Text",
 
  130            self::TYPE_SELECT => 
"Select",
 
  131            self::TYPE_DATE => 
"Date",
 
  132            self::TYPE_DATETIME => 
"DateTime",
 
  133            self::TYPE_FLOAT => 
"Float",
 
  134            self::TYPE_LOCATION => 
"Location",
 
  135            self::TYPE_INTEGER => 
"Integer",
 
  136            self::TYPE_SELECT_MULTI => 
"SelectMulti"    ,
 
  137            self::TYPE_EXTERNAL_LINK => 
'ExternalLink',
 
  138            self::TYPE_INTERNAL_LINK => 
'InternalLink',
 
  139            self::TYPE_ADDRESS => 
"Address" 
  141        $map = array_flip($map);
 
  142        if (array_key_exists($a_type, $map)) {
 
  162        $query = 
"SELECT * FROM adv_mdf_definition" .
 
  163            " WHERE record_id = " . 
$ilDB->quote($a_record_id, 
"integer");
 
  164        if ($a_only_searchable) {
 
  165            $query .= 
" AND searchable = " . 
$ilDB->quote(1, 
"integer");
 
  167        $query .= 
" ORDER BY position";
 
  169        while ($row = 
$ilDB->fetchAssoc($set)) {
 
  171            $field->import($row);
 
  172            $defs[$row[
"field_id"]] = $field;
 
  186        $query = 
"SELECT amf.* FROM adv_md_record_objs aro" .
 
  187            " JOIN adv_md_record amr ON aro.record_id = amr.record_id" .
 
  188            " JOIN adv_mdf_definition amf ON aro.record_id = amf.record_id" .
 
  189            " WHERE obj_type = " . 
$ilDB->quote($a_obj_type, 
'text');
 
  190        if ((
bool) $a_active_only) {
 
  191            $query .= 
" AND active = " . 
$ilDB->quote(1, 
"integer");
 
  193        $query .= 
" ORDER BY aro.record_id,position";
 
  197            $field->import($row);
 
  198            $defs[$row[
"field_id"]] = $field;
 
  215        $query = 
"SELECT field_id, field_type FROM adv_mdf_definition" .
 
  216            " WHERE import_id = " . 
$ilDB->quote($a_import_id, 
'text');
 
  218        if (
$ilDB->numRows($set)) {
 
  219            $row = 
$ilDB->fetchAssoc($set);
 
  235        $field_ids = array();
 
  237        $query = 
"SELECT field_id FROM adv_md_record amr" .
 
  238            " JOIN adv_mdf_definition amfd ON (amr.record_id = amfd.record_id)" .
 
  239            " WHERE active = " . 
$ilDB->quote(1, 
"integer") .
 
  240            " AND searchable = " . 
$ilDB->quote(1, 
"integer");
 
  242        while ($row = 
$ilDB->fetchAssoc($set)) {
 
  243            $field_ids[] = $row[
"field_id"];
 
  257        $group_def = 
$factory->getDefinitionInstanceByType(
"Group");
 
  258        foreach ($a_defs as $def) {
 
  259            $group_def->addElement($def->getFieldId(), $def->getADTDefinition());
 
  261        $group = 
$factory->getInstanceByDefinition($group_def);
 
  264        foreach ($group->getElements() as $element_id => $element) {
 
  265            $a_defs[$element_id]->setADT($element);
 
  300            self::TYPE_SELECT_MULTI,
 
  301            self::TYPE_EXTERNAL_LINK,
 
  302            self::TYPE_INTERNAL_LINK,
 
  315        return in_array((
int) $a_type, self::getValidTypes());
 
  333        if (self::isValidType($a_type)) {
 
  335                self::TYPE_TEXT => 
"Text",
 
  336                self::TYPE_SELECT => 
"Select",
 
  337                self::TYPE_DATE => 
"Date",
 
  338                self::TYPE_DATETIME => 
"DateTime",
 
  339                self::TYPE_FLOAT => 
"Float",
 
  340                self::TYPE_LOCATION => 
"Location",
 
  341                self::TYPE_INTEGER => 
"Integer",
 
  342                self::TYPE_SELECT_MULTI => 
"SelectMulti"        ,
 
  343                self::TYPE_EXTERNAL_LINK => 
'ExternalLink',
 
  344                self::TYPE_INTERNAL_LINK => 
'InternalLink',
 
  345                self::TYPE_ADDRESS => 
"Address" 
  347            return $map[$a_type];
 
  361        return strcmp($record->getDefaultLanguage(), 
$language) === 0;
 
  372        return "udf_type_" . strtolower(self::getTypeString($this->
getType()));
 
  408        if (!$this->adt instanceof 
ilADT) {
 
  422        if (!$this->adt instanceof 
ilADT) {
 
  438        $this->field_id = (int) $a_id;
 
  458        $this->record_id = (int) $a_id;
 
  478        if ($a_id_string !== 
null) {
 
  479            $a_id_string = trim($a_id_string);
 
  481        $this->import_id = $a_id_string;
 
  501        $this->position = (int) $a_pos;
 
  521        if ($a_title !== 
null) {
 
  522            $a_title = trim($a_title);
 
  524        $this->title = $a_title;
 
  544        if ($a_desc !== 
null) {
 
  545            $a_desc = trim($a_desc);
 
  547        $this->description = $a_desc;
 
  591        $this->searchable = (bool) $a_status;
 
  611        $this->required = (bool) $a_status;
 
  703        $title->setRequired(
true);
 
  715            $title->setDisabled(
true);
 
  724            $translations->modifyTranslationInfoForDescription($this->
getFieldId(), $a_form, $desc, 
$language);
 
  734            $desc->setDisabled(
true);
 
  745            $check->setDisabled(
true);
 
  781        $is_translation = (($active_language !== 
'') && ($active_language != $record->getDefaultLanguage()));
 
  782        if (!$a_form->
getItemByPostVar(
"title")->getDisabled() && !$is_translation) {
 
  785        if (!$a_form->
getItemByPostVar(
"description")->getDisabled() && !$is_translation) {
 
  819        if ($a_form->
getInput(
"searchable")) {
 
  821            $hidden->setValue(1);
 
  844        $sql = 
"SELECT max(position) pos" .
 
  845            " FROM adv_mdf_definition" .
 
  847        $set = 
$ilDB->query($sql);
 
  848        if (
$ilDB->numRows($set)) {
 
  849            $pos = 
$ilDB->fetchAssoc($set);
 
  850            return (
int) $pos[
"pos"];
 
  864        return 'il_' . 
IL_INST_ID . 
'_adv_md_field_' . $a_field_id;
 
  875            "field_type" => array(
"integer", $this->
getType()),
 
  876            "record_id" => array(
"integer", $this->
getRecordId()),
 
  877            "import_id" => array(
"text", $this->
getImportId()),
 
  878            "title" => array(
"text", $this->
getTitle()),
 
  880            "position" => array(
"integer", $this->
getPosition()),
 
  881            "searchable" => array(
"integer", $this->
isSearchable()),
 
  882            "required" => array(
"integer", $this->
isRequired())
 
  886        if (is_array($def)) {
 
  887            $fields[
"field_values"] = array(
"text", serialize($def));
 
  898    protected function import(array $a_data)
 
  909        $field_values = unserialize($a_data[
'field_values']);
 
  910        if ($a_data[
"field_values"] && is_array($field_values)) {
 
  918    protected function read($a_field_id)
 
  924        if (!(
int) $a_field_id) {
 
  928        $sql = 
"SELECT * FROM adv_mdf_definition" .
 
  929            " WHERE field_id = " . 
$ilDB->quote($a_field_id, 
"integer");
 
  930        $set = 
$ilDB->query($sql);
 
  931        if (
$ilDB->numRows($set)) {
 
  932            $row = 
$ilDB->fetchAssoc($set);
 
  940    public function save($a_keep_pos = 
false)
 
  950        $next_id = 
$ilDB->nextId(
"adv_mdf_definition");
 
  963        $fields[
"field_id"] = array(
"integer", $next_id);
 
  965        $ilDB->insert(
"adv_mdf_definition", $fields);
 
  980            return $this->
save();
 
  984            "adv_mdf_definition",
 
  986            array(
"field_id" => array(
"integer", $this->
getFieldId()))
 
  993    public function delete()
 
 1004        include_once(
"Services/AdvancedMetaData/classes/class.ilAdvancedMDValues.php");
 
 1007        $query = 
"DELETE FROM adv_mdf_definition" .
 
 1028            'searchable' => ($this->
isSearchable() ? 
'Yes' : 
'No'),
 
 1029            'fieldType' => self::getTypeString($this->
getType())));
 
 1036        foreach ($translations->getTranslations($this->getFieldId()) as $translation) {
 
 1037            $a_writer->
xmlStartTag(
'FieldTranslation', [
'language' => $translation->getLangKey()]);
 
 1038            $a_writer->
xmlElement(
'FieldTranslationTitle', [], (
string) $translation->getTitle());
 
 1039            $a_writer->
xmlElement(
'FieldTranslationDescription',[], (
string) $translation->getDescription());
 
 1040            $a_writer->
xmlEndTag(
'FieldTranslation');
 
 1042        $a_writer->
xmlEndTag(
'FieldTranslations');
 
 1167        foreach ($a_records as $record) {
 
 1168            if ($record[
"sub_type"] == 
"-") {
 
 1169                $obj_ids[] = $record[
"obj_id"];
 
 1173        $sql = 
"SELECT obj_id,type" .
 
 1174            " FROM object_data" .
 
 1175            " WHERE " . 
$ilDB->in(
"obj_id", $obj_ids, 
"", 
"integer") .
 
 1176            " AND " . 
$ilDB->in(
"type", $a_object_types, 
"", 
"text");
 
 1177        $set = 
$ilDB->query($sql);
 
 1178        while ($row = 
$ilDB->fetchAssoc($set)) {
 
 1187        include_once(
'Services/ADT/classes/ActiveRecord/class.ilADTActiveRecordByType.php');
 
 1192            $element_id = 
"loc";
 
 1198            if (
sizeof($objects)) {
 
 1200                foreach ($objects as $item) {
 
 1201                    if ($item[
"obj_id"] == $a_obj_id &&
 
 1202                        $item[
"sub_type"] == $sub_obj_type) {
 
 1203                        $res[] = $item[
"sub_id"];
 
 1226        include_once(
'Services/ADT/classes/ActiveRecord/class.ilADTActiveRecordByType.php');
 
 1230            if (
sizeof($objects)) {
 
 1266        $class = get_class($this);
 
 1267        $obj = 
new $class();
 
 1268        $obj->setRecordId($a_new_record_id);
 
An exception for terminatinating execution or to throw for unit testing.
static find($a_table, $a_type, $a_field_id, $a_condition, $a_additional_fields=null)
Find entries.
ADT definition base class.
static getInstance()
Get singleton.
ADT search bridge base class.
setSerializedValue($a_value)
Set current value(s) in serialized form (for easy persisting)
getSQLCondition($a_element_id)
Get SQL condition for current value(s)
getSerializedValue()
Get current value(s) in serialized form (for easy persisting)
AMD field abstract base class.
getLuceneSearchString($a_value)
Get search string in lucene syntax.
getLastPosition()
Get last position of record.
getImportId()
Get import id.
update()
Update field entry.
importXMLProperty($a_key, $a_value)
Import property from XML.
setRecordId($a_id)
Set record id.
setImportId($a_id_string)
Set import id.
static getInstanceByTypeString($a_type)
Get instance by type string (used by import)
importFromECS($a_ecs_type, $a_value, $a_sub_id)
Import meta data from ECS.
static getInstanceByImportId($a_import_id)
Get definition instance by import id.
isRequired()
Is required field.
addPropertiesToXML(ilXmlWriter $a_writer)
Add (type-specific) properties to xml export.
static exists($a_field_id)
Check if field exists.
importFieldDefinition(array $a_def)
Import (type-specific) field definition from DB.
getSearchValueSerialized(ilADTSearchBridge $a_adt_search)
Get value for search persistence.
static getInstance($a_field_id, $a_type=null, string $language='')
Get definition instance by type.
useDefaultLanguageMode(string $language)
Check if default language mode has to be used: no language given or language equals default language.
setTitle($a_title)
Get title.
static getADTGroupForDefinitions(array $a_defs)
Init ADTGroup for definitions.
setRequired($a_status)
Toggle required.
initADTDefinition()
Init adt instance.
setADT(ilADT $a_adt)
Set ADT instance.
static getInstancesByObjType($a_obj_type, $a_active_only=true)
isSearchSupported()
Is search supported at all.
parseSearchObjects(array $a_records, array $a_object_types)
Add object-data needed for global search to AMD search results.
getSearchQueryParserValue(ilADTSearchBridge $a_adt_search)
Get value for search query parser.
getFieldDefinitionForTableGUI(string $content_language)
Parse properties for table gui.
__construct($a_field_id=null, string $language='')
Constructor.
getFieldId()
Get field_id.
getDescription()
Get description.
getADTDefinition()
Get ADT definition instance.
getComplexOptionsOverview($a_parent_gui, string $parent_cmd)
getRecordId()
Get record id.
toXML(ilXmlWriter $a_writer)
To Xml.
static getValidTypes()
Get all valid types.
importCustomDefinitionFormPostValues(ilPropertyFormGUI $a_form, string $language='')
Import custom post values from definition form.
getFieldDefinition()
Get (type-specific) field definition.
setFieldId($a_id)
Set field_id.
read($a_field_id)
Read field definition.
setDescription($a_desc)
Set description.
getDBProperties()
Get all definition properties for DB.
searchSubObjects(ilADTSearchBridge $a_adt_search, $a_obj_id, $sub_obj_type)
setSearchValueSerialized(ilADTSearchBridge $a_adt_search, $a_value)
Set value from search persistence.
static getTypeString($a_type)
Get type string.
setSearchable($a_status)
Toggle searchable.
generateImportId($a_field_id)
Generate unique record id.
getPosition()
Get position.
_clone($a_new_record_id)
Clone field definition.
importValueFromXML($a_cdata)
Import value from xml.
prepareElementForSearch(ilADTSearchBridge $a_bridge)
Prepare search form elements.
static getSearchableDefinitionIds()
Get searchable definition ids (performance is key)
getADT()
Get ADT instance.
isFilterSupported()
Is search by filter supported.
importDefinitionFormPostValuesNeedsConfirmation()
searchObjects(ilADTSearchBridge $a_adt_search, ilQueryParser $a_parser, array $a_object_types, $a_locate, $a_search_type)
Search objects.
prepareElementForEditor(ilADTFormBridge $a_bridge)
Prepare editor form elements.
importDefinitionFormPostValues(ilPropertyFormGUI $a_form, ilAdvancedMDPermissionHelper $a_permissions, string $active_language)
Import post values from definition form.
addToFieldDefinitionForm(ilPropertyFormGUI $a_form, ilAdvancedMDPermissionHelper $a_permissions, string $language='')
Add input elements to definition form.
static getInstancesByRecordId($a_record_id, $a_only_searchable=false, string $language='')
Get definitions by record id.
prepareDefinitionFormConfirmation(ilPropertyFormGUI $a_form)
isSearchable()
Is searchable.
prepareCustomDefinitionFormConfirmation(ilPropertyFormGUI $a_form)
setPosition($a_pos)
Set position.
save($a_keep_pos=false)
Create new field entry.
getValueForXML(ilADT $element)
Parse ADT value for xml (export)
static isValidType($a_type)
Is given type valid.
getTypeTitle()
Get type title (lang id)
addCustomFieldToDefinitionForm(ilPropertyFormGUI $a_form, $a_disabled=false, string $language='')
Add custom input elements to definition form.
static getInstanceByRecordId(int $record_id)
Advanced metadata permission helper.
const SUBACTION_FIELD_SEARCHABLE
const SUBACTION_FIELD_DESCRIPTION
const ACTION_FIELD_EDIT_PROPERTY
const SUBACTION_FIELD_PROPERTIES
const SUBACTION_FIELD_TITLE
static _getInstanceByRecordId($a_record_id)
Get instance by record id.
static _deleteByFieldId($a_field_id, ilADT $a_adt)
Delete values by field_id.
hasPermission($a_context_type, $a_context_id, $a_action_id, $a_action_sub_id=null)
Check permission.
hasPermissions($a_context_type, $a_context_id, array $a_action_ids)
Check permissions.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This class represents a text area property in a property form.
This class represents a text property in a property form.
xmlEndTag($tag)
Writes an endtag.
xmlElement($tag, $attrs=null, $data=null, $encode=true, $escape=true)
Writes a basic element (no children, just textual content)
xmlStartTag($tag, $attrs=null, $empty=false, $encode=true, $escape=true)
Writes a starttag.
foreach($_POST as $key=> $value) $res