1<?php
2
3/**
4 * Class ilDclTextFieldRepresentation
5 *
6 * @author  Michael Herren <mh@studer-raimann.ch>
7 * @version 1.0.0
8 */
9class ilDclReferenceFieldRepresentation extends ilDclBaseFieldRepresentation
10{
11    const REFERENCE_SEPARATOR = " -> ";
12
13
14    public function getInputField(ilPropertyFormGUI $form, $record_id = 0)
15    {
16        if (!$this->getField()->getProperty(ilDclBaseFieldModel::PROP_N_REFERENCE)) {
17            $input = new ilSelectInputGUI($this->getField()->getTitle(), 'field_' . $this->getField()->getId());
18        } else {
19            $input = new ilMultiSelectInputGUI($this->getField()->getTitle(), 'field_' . $this->getField()->getId());
20            $input->setWidth(100);
21            $input->setWidthUnit('%');
22        }
23
24        $this->setupInputField($input, $this->getField());
25
26        $fieldref = $this->getField()->getProperty(ilDclBaseFieldModel::PROP_REFERENCE);
27
28        $reffield = ilDclCache::getFieldCache($fieldref);
29        $options = array();
30        if (!$this->getField()->getProperty(ilDclBaseFieldModel::PROP_N_REFERENCE)) {
31            $options[""] = $this->lng->txt('dcl_please_select');
32        }
33        $reftable = ilDclCache::getTableCache($reffield->getTableId());
34        foreach ($reftable->getRecords() as $record) {
35            // If the referenced field is MOB or FILE, we display the filename in the dropdown
36            switch ($reffield->getDatatypeId()) {
37                case ilDclDatatype::INPUTFORMAT_FILE:
38                    $file_obj = new ilObjFile($record->getRecordFieldValue($fieldref), false);
39                    $options[$record->getId()] = $file_obj->getFileName();
40                    break;
41                case ilDclDatatype::INPUTFORMAT_MOB:
42                    $media_obj = new ilObjMediaObject($record->getRecordFieldValue($fieldref), false);
43                    $options[$record->getId()] = $media_obj->getTitle();
44                    break;
45                case ilDclDatatype::INPUTFORMAT_DATETIME:
46                    $options[$record->getId()] = strtotime($record->getRecordFieldSingleHTML($fieldref));
47                    // TT #0019091: options2 are the actual values, options the timestamp for sorting
48                    $options2[$record->getId()] = $record->getRecordFieldSingleHTML($fieldref);
49                    break;
50                case ilDclDatatype::INPUTFORMAT_TEXT:
51                    $value = $record->getRecordFieldValue($fieldref);
52                    if ($record->getRecordField($fieldref)->getField()->hasProperty(ilDclBaseFieldModel::PROP_URL)) {
53                        if (!is_array($value)) {
54                            $value = array('title' => '', 'link' => $value);
55                        }
56                        $value = $value['title'] ? $value['title'] : $value['link'];
57                    }
58                    $options[$record->getId()] = $value;
59                    break;
60                case ilDclDatatype::INPUTFORMAT_ILIAS_REF:
61                    $options[$record->getId()] = $record->getRecordFieldRepresentationValue($fieldref);
62                    break;
63                default:
64                    $options[$record->getId()] = $record->getRecordFieldExportValue($fieldref);
65                    break;
66            }
67        }
68        asort($options);
69
70        // TT #0019091: restore the actual values after sorting with timestamp
71        if ($reffield->getDatatypeId() == ilDclDatatype::INPUTFORMAT_DATETIME) {
72            foreach ($options as $key => $opt) {
73                $options[$key] = $options2[$key];
74            }
75            // the option 'please select' messes with the order, therefore we reset it
76            unset($options[""]);
77            $options = array("" => $this->lng->txt('dcl_please_select')) + $options;
78        }
79
80        $input->setOptions($options);
81
82        if (ilObjDataCollectionAccess::hasPermissionToAddRecord($_GET['ref_id'], $reftable->getId())) {
83            $input->addCustomAttribute('data-ref="1"');
84            $input->addCustomAttribute('data-ref-table-id="' . $reftable->getId() . '"');
85            $input->addCustomAttribute('data-ref-field-id="' . $reffield->getId() . '"');
86        }
87
88        return $input;
89    }
90
91
92    public function addFilterInputFieldToTable(ilTable2GUI $table)
93    {
94        $input = $table->addFilterItemByMetaType("filter_" . $this->getField()->getId(), ilTable2GUI::FILTER_SELECT, false, $this->getField()->getId());
95        $ref_field_id = $this->getField()->getProperty(ilDclBaseFieldModel::PROP_REFERENCE);
96        $ref_field = ilDclCache::getFieldCache($ref_field_id);
97        $ref_table = ilDclCache::getTableCache($ref_field->getTableId());
98        $options = array();
99        foreach ($ref_table->getRecords() as $record) {
100            $options[$record->getId()] = $record->getRecordFieldPlainText($ref_field_id);
101        }
102        // Sort by values ASC
103        asort($options);
104        $options = array('' => $this->lng->txt('dcl_all_entries'))
105            + $options
106            + array('none' => $this->lng->txt('dcl_no_entry'));
107        $input->setOptions($options);
108
109        $this->setupFilterInputField($input);
110
111        return $this->getFilterInputFieldValue($input);
112    }
113
114
115    public function passThroughFilter(ilDclBaseRecordModel $record, $filter)
116    {
117        $value = $record->getRecordFieldValue($this->getField()->getId());
118
119        $pass = false;
120        if ($filter && $this->getField()->getProperty(ilDclBaseFieldModel::PROP_N_REFERENCE) && is_array($value) && in_array($filter, $value)) {
121            $pass = true;
122        }
123        if (!$filter || $filter == $value) {
124            $pass = true;
125        }
126
127        return $pass;
128    }
129
130
131    /**
132     * @inheritDoc
133     */
134    public function buildFieldCreationInput(ilObjDataCollection $dcl, $mode = 'create')
135    {
136        $opt = parent::buildFieldCreationInput($dcl, $mode);
137
138        $options = array();
139        // Get Tables
140        $tables = $dcl->getTables();
141        foreach ($tables as $table) {
142            foreach ($table->getRecordFields() as $field) {
143                //referencing references may lead to endless loops.
144                if ($field->getDatatypeId() != ilDclDatatype::INPUTFORMAT_REFERENCE) {
145                    $options[$field->getId()] = $table->getTitle() . self::REFERENCE_SEPARATOR . $field->getTitle();
146                }
147            }
148        }
149        $prop_table_selection = new ilSelectInputGUI($this->lng->txt('dcl_reference_title'), 'prop_' . ilDclBaseFieldModel::PROP_REFERENCE);
150        $prop_table_selection->setOptions($options);
151
152        $opt->addSubItem($prop_table_selection);
153
154        $prop_ref_link = new ilDclCheckboxInputGUI($this->lng->txt('dcl_reference_link'), 'prop_' . ilDclBaseFieldModel::PROP_REFERENCE_LINK);
155        $prop_ref_link->setInfo($this->lng->txt('dcl_reference_link_info'));
156        $opt->addSubItem($prop_ref_link);
157
158        $prop_multi_select = new ilDclCheckboxInputGUI($this->lng->txt('dcl_multiple_selection'), 'prop_' . ilDclBaseFieldModel::PROP_N_REFERENCE);
159        $opt->addSubItem($prop_multi_select);
160
161        return $opt;
162    }
163}
164