ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
class.ilAdvancedMDFieldDefinitionSelect.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4require_once "Services/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php";
5
15{
16 protected $options = [];
17 protected $confirm_objects = [];
18 protected $confirmed_objects; // [array]
19
20 const REMOVE_ACTION_ID = "-iladvmdrm-";
21
22
23 //
24 // generic types
25 //
26
27 public function getType()
28 {
29 return self::TYPE_SELECT;
30 }
31
32
33 //
34 // ADT
35 //
36
37 protected function initADTDefinition()
38 {
39 $def = ilADTFactory::getInstance()->getDefinitionInstanceByType("Enum");
40 $def->setNumeric(false);
41
42 $options = $this->getOptions();
43 $def->setOptions(array_combine($options, $options));
44
45 return $def;
46 }
47
48
49 //
50 // properties
51 //
52
58 public function setOptions(array $a_values = null)
59 {
60 if ($a_values !== null) {
61 foreach ($a_values as $idx => $value) {
62 $a_values[$idx] = trim($value);
63 if (!$a_values[$idx]) {
64 unset($a_values[$idx]);
65 }
66 }
67 $a_values = array_unique($a_values);
68 // sort($a_values);
69 }
70 $this->options = $a_values;
71 }
72
78 public function getOptions()
79 {
80 return $this->options;
81 }
82
83
84 //
85 // definition (NOT ADT-based)
86 //
87
88 protected function importFieldDefinition(array $a_def)
89 {
90 $this->setOptions($a_def);
91 }
92
93 protected function getFieldDefinition()
94 {
95 return $this->options;
96 }
97
99 {
100 global $DIC;
101
102 $lng = $DIC['lng'];
103
104 return array($lng->txt("meta_advmd_select_options") => implode(",", $this->getOptions()));
105 }
106
113 public function addCustomFieldToDefinitionForm(ilPropertyFormGUI $a_form, $a_disabled = false)
114 {
115 global $DIC;
116
117 $lng = $DIC['lng'];
118
119 $field = new ilTextInputGUI($lng->txt("meta_advmd_select_options"), "opts");
120 $field->setRequired(true);
121 $field->setMulti(true, true);
122 $field->setMaxLength(255); // :TODO:
123 $a_form->addItem($field);
124
125 $options = $this->getOptions();
126 if ($options) {
127 $field->setMultiValues($options);
128 $field->setValue(array_shift($options));
129 }
130
131 if ($a_disabled) {
132 $field->setDisabled(true);
133 }
134 }
135
141 protected function buildConfirmedObjects(ilPropertyFormGUI $a_form)
142 {
143 // #15719
144 $recipes = $a_form->getInput("conf_det");
145 if (is_array($recipes[$this->getFieldId()])) {
146 $recipes = $recipes[$this->getFieldId()];
147 $sum = $a_form->getInput("conf_det_act");
148 $sum = $sum[$this->getFieldId()];
149 $sgl = $a_form->getInput("conf");
150 $sgl = $sgl[$this->getFieldId()];
151
152 $res = array();
153 foreach ($recipes as $old_option => $recipe) {
154 $sum_act = $sum[$old_option];
155 $sgl_act = $sgl[$old_option];
156
157 if ($recipe == "sum") {
158 // #18885
159 if (!$sum_act) {
160 return;
161 }
162
163 foreach (array_keys($sgl_act) as $obj_idx) {
164 if ($sum_act == self::REMOVE_ACTION_ID) {
165 $sum_act = "";
166 }
167 $res[$old_option][$obj_idx] = $sum_act;
168 }
169 } else {
170 // #18885
171 foreach ($sgl_act as $sgl_index => $sgl_item) {
172 if (!$sgl_item) {
173 return;
174 } elseif ($sgl_item == self::REMOVE_ACTION_ID) {
175 $sgl_act[$sgl_index] = "";
176 }
177 }
178
179 $res[$old_option] = $sgl_act;
180 }
181 }
182
183 return $res;
184 }
185 }
186
193 {
194 $old = $this->getOptions();
195 $new = $a_form->getInput("opts");
196
197 $missing = array_diff($old, $new);
198 if (sizeof($missing)) {
199 $this->confirmed_objects = $this->buildConfirmedObjects($a_form);
200 if (!is_array($this->confirmed_objects)) {
202 $primary = array(
203 "field_id" => array("integer", $this->getFieldId()),
204 ilADTActiveRecordByType::SINGLE_COLUMN_NAME => array("text", $missing)
205 );
206 $in_use = ilADTActiveRecordByType::readByPrimary("adv_md_values", $primary, "Enum");
207 if ($in_use) {
208 $this->confirm_objects = [];
209 foreach ($in_use as $item) {
210 $this->confirm_objects[$item[ilADTActiveRecordByType::SINGLE_COLUMN_NAME]][] = array($item["obj_id"], $item["sub_type"], $item["sub_id"]);
211 }
212 }
213 }
214 }
215
216 $this->setOptions($new);
217 }
218
220 {
221 return is_array($this->confirm_objects) && count($this->confirm_objects) > 0;
222 }
223
225 {
226 global $DIC;
227
228 $lng = $DIC['lng'];
229 $objDefinition = $DIC['objDefinition'];
230
231 $a_form->getItemByPostVar("opts")->setDisabled(true);
232 if (is_array($this->confirm_objects) && count($this->confirm_objects) > 0) {
233 $new_options = $a_form->getInput("opts");
234
235 $sec = new ilFormSectionHeaderGUI();
236 $sec->setTitle($lng->txt("md_adv_confirm_definition_select_section"));
237 $a_form->addItem($sec);
238
239 foreach ($this->confirm_objects as $old_option => $items) {
240 $details = new ilRadioGroupInputGUI($lng->txt("md_adv_confirm_definition_select_option") . ': "' . $old_option . '"', "conf_det[" . $this->getFieldId() . "][" . $old_option . "]");
241 $details->setRequired(true);
242 $details->setValue("sum");
243 $a_form->addItem($details);
244
245 // automatic reload does not work
246 if (isset($_POST["conf_det"][$this->getFieldId()][$old_option])) {
247 $details->setValue($_POST["conf_det"][$this->getFieldId()][$old_option]);
248 }
249
250 $sum = new ilRadioOption($lng->txt("md_adv_confirm_definition_select_option_all"), "sum");
251 $details->addOption($sum);
252
253 $sel = new ilSelectInputGUI(
254 $lng->txt("md_adv_confirm_definition_select_option_all_action"),
255 "conf_det_act[" . $this->getFieldId() . "][" . $old_option . "]"
256 );
257 $sel->setRequired(true);
258 $options = array(
259 "" => $lng->txt("please_select"),
260 self::REMOVE_ACTION_ID => $lng->txt("md_adv_confirm_definition_select_option_remove")
261 );
262 foreach ($new_options as $new_option) {
263 $options[$new_option] = $lng->txt("md_adv_confirm_definition_select_option_overwrite") . ': "' . $new_option . '"';
264 }
265 $sel->setOptions($options);
266 $sum->addSubItem($sel);
267
268 // automatic reload does not work
269 if (isset($_POST["conf_det_act"][$this->getFieldId()][$old_option])) {
270 if ($_POST["conf_det_act"][$this->getFieldId()][$old_option]) {
271 $sel->setValue($_POST["conf_det_act"][$this->getFieldId()][$old_option]);
272 } elseif ($_POST["conf_det"][$this->getFieldId()][$old_option] == "sum") {
273 $sel->setAlert($lng->txt("msg_input_is_required"));
274 ilUtil::sendFailure($lng->txt("form_input_not_valid"));
275 }
276 }
277 $single = new ilRadioOption($lng->txt("md_adv_confirm_definition_select_option_single"), "sgl");
278 $details->addOption($single);
279 foreach ($items as $item) {
280 $obj_id = $item[0];
281 $sub_type = $item[1];
282 $sub_id = $item[2];
283
284 $item_id = $obj_id . "_" . $sub_type . "_" . $sub_id;
285
286 $type = ilObject::_lookupType($obj_id);
287 $type_title = $lng->txt("obj_" . $type);
288 $title = ' "' . ilObject::_lookupTitle($obj_id) . '"';
289
290 if ($sub_id) {
291 $class = "ilObj" . $objDefinition->getClassName($type);
292 $class_path = $objDefinition->getLocation($type);
293 include_once $class_path . "/class." . $class . ".php";
294 $ints = class_implements($class);
295 if (isset($ints["ilAdvancedMetaDataSubItems"])) {
296 $sub_title = $class::getAdvMDSubItemTitle($obj_id, $sub_type, $sub_id);
297 if ($sub_title) {
298 $title .= ' (' . $sub_title . ')';
299 }
300 }
301 }
302
303 $sel = new ilSelectInputGUI(
304 $type_title . ' ' . $title,
305 "conf[" . $this->getFieldId() . "][" . $old_option . "][" . $item_id . "]"
306 );
307 $sel->setRequired(true);
308 $options = array(
309 "" => $lng->txt("please_select"),
310 self::REMOVE_ACTION_ID => $lng->txt("md_adv_confirm_definition_select_option_remove")
311 );
312 foreach ($new_options as $new_option) {
313 $options[$new_option] = $lng->txt("md_adv_confirm_definition_select_option_overwrite") . ': "' . $new_option . '"';
314 }
315 $sel->setOptions($options);
316
317 // automatic reload does not work
318 if (isset($_POST["conf"][$this->getFieldId()][$old_option][$item_id])) {
319 if ($_POST["conf"][$this->getFieldId()][$old_option][$item_id]) {
320 $sel->setValue($_POST["conf"][$this->getFieldId()][$old_option][$item_id]);
321 } elseif ($_POST["conf_det"][$this->getFieldId()][$old_option] == "sgl") {
322 $sel->setAlert($lng->txt("msg_input_is_required"));
323 ilUtil::sendFailure($lng->txt("form_input_not_valid"));
324 }
325 }
326
327 $single->addSubItem($sel);
328 }
329 }
330 }
331 }
332
333
334 //
335 // definition CRUD
336 //
337
338 public function update()
339 {
341
342 if (is_array($this->confirmed_objects) && count($this->confirmed_objects) > 0) {
344 foreach ($this->confirmed_objects as $old_option => $item_ids) {
345 foreach ($item_ids as $item => $new_option) {
346 $item = explode("_", $item);
347 $obj_id = $item[0];
348 $sub_type = $item[1];
349 $sub_id = $item[2];
350
351 if (!$new_option) {
352 // remove existing value
353 $primary = array(
354 "obj_id" => array("integer", $obj_id),
355 "sub_type" => array("text", $sub_type),
356 "sub_id" => array("integer", $sub_id),
357 "field_id" => array("integer", $this->getFieldId())
358 );
359 ilADTActiveRecordByType::deleteByPrimary("adv_md_values", $primary, "Enum");
360 } else {
361 // update existing value
362 $primary = array(
363 "obj_id" => array("integer", $obj_id),
364 "sub_type" => array("text", $sub_type),
365 "sub_id" => array("integer", $sub_id),
366 "field_id" => array("integer", $this->getFieldId())
367 );
368 ilADTActiveRecordByType::writeByPrimary("adv_md_values", $primary, "Enum", $new_option);
369 }
370
371 if ($sub_type == "wpg") {
372 // #15763 - adapt advmd page lists
373 include_once "Modules/Wiki/classes/class.ilPCAMDPageList.php";
374 ilPCAMDPageList::migrateField($obj_id, $this->getFieldId(), $old_option, $new_option);
375 }
376 }
377 }
378 }
379 }
380
381
382 //
383 // export/import
384 //
385
386 protected function addPropertiesToXML(ilXmlWriter $a_writer)
387 {
388 foreach ($this->getOptions() as $value) {
389 $a_writer->xmlElement('FieldValue', null, $value);
390 }
391 }
392
393 public function importXMLProperty($a_key, $a_value)
394 {
395 $this->options[] = $a_value;
396 }
397
398
399 //
400 // import/export
401 //
402
403 public function getValueForXML(ilADT $element)
404 {
405 return $element->getSelection();
406 }
407
408 public function importValueFromXML($a_cdata)
409 {
410 $this->getADT()->setSelection($a_cdata);
411 }
412
413
414 //
415 // presentation
416 //
417
419 {
420 assert($a_enum instanceof ilADTEnumFormBridge);
421
422 $a_enum->setAutoSort(false);
423 }
424}
$_POST["username"]
An exception for terminatinating execution or to throw for unit testing.
static writeByPrimary($a_table, array $a_primary, $a_type, $a_value)
Write directly.
static deleteByPrimary($a_table, array $a_primary, $a_type=null)
Delete values by (partial) primary key.
static readByPrimary($a_table, array $a_primary, $a_type=null)
Read directly.
static getInstance()
Get singleton.
static initActiveRecordByType()
Init active record by type.
ADT form bridge base class.
ADT base class.
Definition: class.ilADT.php:12
prepareElementForEditor(ilADTFormBridge $a_enum)
Prepare editor form elements.
importXMLProperty($a_key, $a_value)
Import property from XML.
getFieldDefinitionForTableGUI()
Parse properties for table gui.
importCustomDefinitionFormPostValues(ilPropertyFormGUI $a_form)
Import custom post values from definition form.
importFieldDefinition(array $a_def)
Import (type-specific) field definition from DB.
getValueForXML(ilADT $element)
Parse ADT value for xml (export)
addCustomFieldToDefinitionForm(ilPropertyFormGUI $a_form, $a_disabled=false)
Add input elements to definition form.
getFieldDefinition()
Get (type-specific) field definition.
buildConfirmedObjects(ilPropertyFormGUI $a_form)
Process custom post values from definition form.
addPropertiesToXML(ilXmlWriter $a_writer)
Add (type-specific) properties to xml export.
This class represents a section header in a property form.
static _lookupTitle($a_id)
lookup object title
static _lookupType($a_id, $a_reference=false)
lookup object type
static migrateField($a_obj_id, $a_field_id, $old_option, $new_option, $a_is_multi=false)
Migrate search/filter values on advmd change.
This class represents a property form user interface.
addItem($a_item)
Add Item (Property, SectionHeader).
getInput($a_post_var, $ensureValidation=true)
Returns the value of a HTTP-POST variable, identified by the passed id.
getItemByPostVar($a_post_var)
Get Item by POST variable.
This class represents a property in a property form.
This class represents an option in a radio group.
This class represents a selection list property in a property form.
This class represents a text property in a property form.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
XML writer class.
xmlElement($tag, $attrs=null, $data=null, $encode=true, $escape=true)
Writes a basic element (no children, just textual content)
$def
Definition: croninfo.php:21
update($pash, $contents, Config $config)
$type
global $DIC
Definition: saml.php:7
$lng
foreach($_POST as $key=> $value) $res