From 73d84f8b522649328276f2c6d2f005bb8fcb8eb0 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Tue, 13 Oct 2026 18:34:28 +0200 Subject: [PATCH 1/5] refactor metadata address field table to kitchen sink --- .../ComplexOptions/Table/DataRetrieval.php | 78 ++++++++++++++++ .../ComplexOptions/Table/TableBuilder.php | 89 +++++++++++++++++++ ....ilAdvancedMDFieldDefinitionGroupBased.php | 24 +++-- ...AdvancedMDFieldDefinitionGroupTableGUI.php | 83 ----------------- .../class.ilAdvancedMDFieldDefinition.php | 8 ++ .../classes/class.ilAdvancedMDSettingsGUI.php | 29 ++++-- .../default/tpl.edit_complex_row.html | 13 --- 7 files changed, 215 insertions(+), 109 deletions(-) create mode 100644 components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/DataRetrieval.php create mode 100644 components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php delete mode 100755 components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupTableGUI.php delete mode 100755 components/ILIAS/AdvancedMetaData/templates/default/tpl.edit_complex_row.html diff --git a/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/DataRetrieval.php b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/DataRetrieval.php new file mode 100644 index 000000000000..dc45b4748869 --- /dev/null +++ b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/DataRetrieval.php @@ -0,0 +1,78 @@ +definition->getOptions(); + foreach ($options as $option) { + $item = ["option" => (string) $option]; + $this->definition->exportOptionToTableGUI($option, $item); + $data[md5((string) $option)] = $item; + } + + $order_field = array_keys($order->get())[0] ?? 'option'; + $order_direction = $order->get()[$order_field] ?? Order::ASC; + + uasort($data, function ($a, $b) use ($order_field) { + return strnatcasecmp((string) ($a[$order_field] ?? ''), (string) ($b[$order_field] ?? '')); + }); + + if ($order_direction === Order::DESC) { + $data = array_reverse($data, true); + } + + $data = array_slice($data, $range->getStart(), $range->getLength(), true); + + foreach ($data as $id => $datum) { + yield $row_builder->buildDataRow($id, $datum); + } + } + + public function getTotalRowCount( + mixed $additional_viewcontrol_data, + mixed $filter_data, + mixed $additional_parameters + ): int { + return count($this->definition->getOptions()); + } +} diff --git a/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php new file mode 100644 index 000000000000..ffc72ef8408f --- /dev/null +++ b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php @@ -0,0 +1,89 @@ +ui_factory->table()->column()->text( + $this->lng->txt('option') + )->withIsSortable(true); + + foreach ($this->definition->getTitles() as $element => $title) { + $columns[$element] = $this->ui_factory->table()->column()->text( + $title + )->withIsSortable(true); + } + + $actions = []; + list($url_builder, $id_token) = $this->getTableActionURLBuilder(); + + $actions['edit'] = $this->ui_factory->table()->action()->single( + $this->lng->txt('edit'), + $url_builder, + $id_token + ); + + return $this->ui_factory->table()->data( + $this->data_retrieval, + $this->definition->getTitle(), + $columns + )->withActions($actions)->withRequest($this->http->request()) + ->withId('advanced_metadata_address_field_options_table'); + } + + public function getTableActionURLBuilder(): array + { + $link = ILIAS_HTTP_PATH . '/' . $this->ctrl->getLinkTargetByClass( + ilAdvancedMDSettingsGUI::class, + 'editComplexOption' + ); + $url_builder = new URLBuilder(new URI($link)); + + return $url_builder->acquireParameters(['advmd'], 'oid'); + } +} diff --git a/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php b/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php index 7a7965dd97dc..c3e1921a317c 100755 --- a/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php +++ b/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php @@ -18,6 +18,9 @@ declare(strict_types=1); +use ILIAS\AdvancedMetaData\Types\Group\ComplexOptions\Table\DataRetrieval; +use ILIAS\AdvancedMetaData\Types\Group\ComplexOptions\Table\TableBuilder; + /** * AMD field type address * @author Jörg Lützenkirchen @@ -191,13 +194,22 @@ protected function getADTForOption(string $a_option): ilADT return $adt; } - /** - * @inheritdoc - */ - public function getComplexOptionsOverview(object $a_parent_gui, string $a_parent_cmd): ?string + + public function getComplexOptionsOverview(object $a_parent_gui, string $parent_cmd): ?string { - $tbl = new ilAdvancedMDFieldDefinitionGroupTableGUI($a_parent_gui, $a_parent_cmd, $this); - return $tbl->getHTML(); + $data_retrieval = new DataRetrieval($this); + $table_builder = new TableBuilder( + $data_retrieval, + $this->lng, + $this->ui_factory, + $this->http, + $this->ctrl, + $this + ); + + $table = $table_builder->get(); + + return $this->ui_renderer->render($table); } public function exportOptionToTableGUI($a_option, array &$a_item): void diff --git a/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupTableGUI.php b/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupTableGUI.php deleted file mode 100755 index d0430a7f4acc..000000000000 --- a/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupTableGUI.php +++ /dev/null @@ -1,83 +0,0 @@ - - * @version $Id$ - * @ingroup ServicesAdvancedMetaData - */ -class ilAdvancedMDFieldDefinitionGroupTableGUI extends ilTable2GUI -{ - protected ilAdvancedMDFieldDefinition $def; - - public function __construct($a_parent_obj, $a_parent_cmd, ilAdvancedMDFieldDefinition $a_def) - { - $this->def = $a_def; - - parent::__construct($a_parent_obj, $a_parent_cmd); - - $this->addColumn($this->lng->txt("option"), "option"); - - foreach ($this->def->getTitles() as $element => $title) { - $this->addColumn($title, $element); - } - - $this->addColumn($this->lng->txt("action"), ""); - - $this->setFormAction($this->ctrl->getFormAction($a_parent_obj)); - $this->setRowTemplate("tpl.edit_complex_row.html", "components/ILIAS/AdvancedMetaData"); - $this->setDefaultOrderField("option"); - $this->initItems($a_def); - } - - protected function initItems(ilAdvancedMDFieldDefinition $a_def): void - { - $data = array(); - - foreach ($a_def->getOptions() as $option) { - $item = array("option" => $option); - - $a_def->exportOptionToTableGUI($option, $item); - - $data[] = $item; - } - - $this->setData($data); - } - - protected function fillRow(array $a_set): void - { - $this->tpl->setVariable("OPTION", $a_set["option"]); - - $this->tpl->setCurrentBlock("field_bl"); - foreach (array_keys($this->def->getTitles()) as $element) { - $this->tpl->setVariable("FIELD", trim($a_set[$element])); - $this->tpl->parseCurrentBlock(); - } - - // action - $this->ctrl->setParameter($this->getParentObject(), "oid", md5($a_set["option"])); - $url = $this->ctrl->getLinkTarget($this->getParentObject(), "editComplexOption"); - $this->ctrl->setParameter($this->getParentObject(), "oid", ""); - - $this->tpl->setVariable("ACTION_URL", $url); - $this->tpl->setVariable("ACTION_TXT", $this->lng->txt("edit")); - } -} diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php index 9e00e4a979ba..a607aaba11bf 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php @@ -25,6 +25,8 @@ use ILIAS\AdvancedMetaData\Data\FieldDefinition\GenericData\GenericData; use ILIAS\AdvancedMetaData\Data\FieldDefinition\GenericData\GenericDataImplementation; use ILIAS\AdvancedMetaData\Repository\FieldDefinition\GenericData\DatabaseGatewayImplementation; +use ILIAS\UI\Factory as UIFactory; +use ILIAS\UI\Renderer as UIRenderer; /** * AMD field abstract base class @@ -74,6 +76,9 @@ abstract class ilAdvancedMDFieldDefinition protected ilLogger $logger; protected GlobalHttpState $http; protected RefineryFactory $refinery; + protected UIFactory $ui_factory; + protected UIRenderer $ui_renderer; + protected ilCtrl $ctrl; public function __construct(GenericData $generic_data, string $language = '') { @@ -83,6 +88,9 @@ public function __construct(GenericData $generic_data, string $language = '') $this->language = $DIC->language()->getLangKey(); $this->refinery = $DIC->refinery(); $this->http = $DIC->http(); + $this->ui_factory = $DIC->ui()->factory(); + $this->ui_renderer = $DIC->ui()->renderer(); + $this->ctrl = $DIC->ctrl(); if ($language) { diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php index 20b4df7c6d8d..0c904e730059 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php @@ -204,13 +204,25 @@ protected function getFieldTypeFromPost(): ?int protected function getOidFromQuery(): ?string { - if ($this->http->wrapper()->query()->has('oid')) { - return $this->http->wrapper()->query()->retrieve( - 'oid', - $this->refinery->kindlyTo()->string() - ); + $name = 'advmd_oid'; + $oid = null; + $transformation = $this->refinery->byTrying([ + $this->refinery->kindlyTo()->string(), + $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) + ]); + if ($this->http->wrapper()->query()->has($name)) { + $oid = $this->http->wrapper()->query()->retrieve($name, $transformation); } - return null; + + if ($this->http->wrapper()->post()->has($name)) { + $oid = $this->http->wrapper()->post()->retrieve($name, $transformation); + } + + if (is_array($oid) && !empty($oid)) { + return (string) $oid[0]; + } + + return (string) $oid ?? null; } /** @@ -2002,13 +2014,16 @@ protected function initComplexOptionForm(ilAdvancedMDFieldDefinition $a_def): il { $this->ctrl->saveParameter($this, "record_id"); $this->ctrl->saveParameter($this, "field_id"); - $this->ctrl->saveParameter($this, "oid"); $form = new ilPropertyFormGUI(); $form->setTitle($this->lng->txt("md_adv_edit_complex_option")); $form->setFormAction($this->ctrl->getFormAction($this, "updateComplexOption")); $oid = $this->getOidFromQuery(); + $hidden_oid = new ilHiddenInputGUI("advmd_oid"); + $hidden_oid->setValue((string) $oid); + $form->addItem($hidden_oid); + $a_def->initOptionForm($form, $oid); $form->addCommandButton("updateComplexOption", $this->lng->txt("save")); diff --git a/components/ILIAS/AdvancedMetaData/templates/default/tpl.edit_complex_row.html b/components/ILIAS/AdvancedMetaData/templates/default/tpl.edit_complex_row.html deleted file mode 100755 index a16d813e330e..000000000000 --- a/components/ILIAS/AdvancedMetaData/templates/default/tpl.edit_complex_row.html +++ /dev/null @@ -1,13 +0,0 @@ - - - {OPTION} - - - - {FIELD} - - - - {ACTION_TXT} - - \ No newline at end of file From 41fe0521cbccf6f3660ec6bf090fec136c933bc3 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Wed, 14 Oct 2026 17:32:30 +0200 Subject: [PATCH 2/5] fix storing advmd_oid in post --- .../classes/class.ilAdvancedMDSettingsGUI.php | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php index 0c904e730059..916c6c2aae27 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php @@ -214,10 +214,6 @@ protected function getOidFromQuery(): ?string $oid = $this->http->wrapper()->query()->retrieve($name, $transformation); } - if ($this->http->wrapper()->post()->has($name)) { - $oid = $this->http->wrapper()->post()->retrieve($name, $transformation); - } - if (is_array($oid) && !empty($oid)) { return (string) $oid[0]; } @@ -2015,15 +2011,13 @@ protected function initComplexOptionForm(ilAdvancedMDFieldDefinition $a_def): il $this->ctrl->saveParameter($this, "record_id"); $this->ctrl->saveParameter($this, "field_id"); + $oid = $this->getOidFromQuery(); + $this->ctrl->setParameter($this, "advmd_oid", (string) $oid); + $form = new ilPropertyFormGUI(); $form->setTitle($this->lng->txt("md_adv_edit_complex_option")); $form->setFormAction($this->ctrl->getFormAction($this, "updateComplexOption")); - $oid = $this->getOidFromQuery(); - $hidden_oid = new ilHiddenInputGUI("advmd_oid"); - $hidden_oid->setValue((string) $oid); - $form->addItem($hidden_oid); - $a_def->initOptionForm($form, $oid); $form->addCommandButton("updateComplexOption", $this->lng->txt("save")); From 239490dd3b867c175e904325054b8bbbcc95ec7c Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Mon, 2 Nov 2026 08:57:30 +0100 Subject: [PATCH 3/5] adjust refactoring of ComplexOptions table in custom metadata --- .../ComplexOptions/Table/DataRetrieval.php | 7 +++--- .../ComplexOptions/Table/TableBuilder.php | 5 ++-- ....ilAdvancedMDFieldDefinitionGroupBased.php | 7 +++--- .../class.ilAdvancedMDFieldDefinition.php | 5 ++-- .../classes/class.ilAdvancedMDSettingsGUI.php | 25 +++++++++++-------- 5 files changed, 25 insertions(+), 24 deletions(-) diff --git a/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/DataRetrieval.php b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/DataRetrieval.php index dc45b4748869..9765c4547fed 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/DataRetrieval.php +++ b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/DataRetrieval.php @@ -24,12 +24,13 @@ use ILIAS\Data\Range; use ILIAS\Data\Order; use Generator; -use ilAdvancedMDFieldDefinition; +use ilAdvancedMDFieldDefinitionGroupBased; +use ILIAS\UI\Component\Table\DataRetrieval as BaseDataRetrieval; -class DataRetrieval implements \ILIAS\UI\Component\Table\DataRetrieval +class DataRetrieval implements BaseDataRetrieval { public function __construct( - protected ilAdvancedMDFieldDefinition $definition + protected ilAdvancedMDFieldDefinitionGroupBased $definition ) { } diff --git a/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php index ffc72ef8408f..b471613fc52c 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php +++ b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php @@ -25,8 +25,7 @@ use ilLanguage; use ILIAS\HTTP\Services as HTTP; use ILIAS\UI\URLBuilder; -use ILIAS\Refinery\Factory as Refinery; -use ilAdvancedMDFieldDefinition; +use ilAdvancedMDFieldDefinitionGroupBased; use ilAdvancedMDSettingsGUI; use ilCtrl; use ILIAS\Data\URI; @@ -42,7 +41,7 @@ public function __construct( protected UIFactory $ui_factory, protected HTTP $http, protected ilCtrl $ctrl, - protected ilAdvancedMDFieldDefinition $definition + protected ilAdvancedMDFieldDefinitionGroupBased $definition ) { } diff --git a/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php b/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php index c3e1921a317c..899d1b682ad7 100755 --- a/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php +++ b/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php @@ -20,6 +20,7 @@ use ILIAS\AdvancedMetaData\Types\Group\ComplexOptions\Table\DataRetrieval; use ILIAS\AdvancedMetaData\Types\Group\ComplexOptions\Table\TableBuilder; +use ILIAS\UI\Component\Component; /** * AMD field type address @@ -195,7 +196,7 @@ protected function getADTForOption(string $a_option): ilADT } - public function getComplexOptionsOverview(object $a_parent_gui, string $parent_cmd): ?string + public function getComplexOptionsOverview(): ?Component { $data_retrieval = new DataRetrieval($this); $table_builder = new TableBuilder( @@ -207,9 +208,7 @@ public function getComplexOptionsOverview(object $a_parent_gui, string $parent_c $this ); - $table = $table_builder->get(); - - return $this->ui_renderer->render($table); + return $table_builder->get(); } public function exportOptionToTableGUI($a_option, array &$a_item): void diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php index a607aaba11bf..8a727c6788d4 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php @@ -27,6 +27,7 @@ use ILIAS\AdvancedMetaData\Repository\FieldDefinition\GenericData\DatabaseGatewayImplementation; use ILIAS\UI\Factory as UIFactory; use ILIAS\UI\Renderer as UIRenderer; +use ILIAS\UI\Component\Component; /** * AMD field abstract base class @@ -1044,11 +1045,9 @@ public function hasComplexOptions(): bool } /** - * @param object $a_parent_gui - * @param string $parent_cmd * @return null */ - public function getComplexOptionsOverview(object $a_parent_gui, string $parent_cmd): ?string + public function getComplexOptionsOverview(): ?Component { return null; } diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php index 916c6c2aae27..113f1197a95d 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php @@ -205,20 +205,20 @@ protected function getFieldTypeFromPost(): ?int protected function getOidFromQuery(): ?string { $name = 'advmd_oid'; - $oid = null; - $transformation = $this->refinery->byTrying([ - $this->refinery->kindlyTo()->string(), - $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) - ]); if ($this->http->wrapper()->query()->has($name)) { + $transformation = $this->refinery->byTrying([ + $this->refinery->kindlyTo()->string(), + $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) + ]); $oid = $this->http->wrapper()->query()->retrieve($name, $transformation); - } - if (is_array($oid) && !empty($oid)) { - return (string) $oid[0]; + if (is_array($oid) && !empty($oid)) { + return (string) $oid[0]; + } + return (string) $oid; } - return (string) $oid ?? null; + return null; } /** @@ -1259,9 +1259,12 @@ public function editField(?ilPropertyFormGUI $a_form = null): void $this->showLanguageSwitch($this->record->getRecordId(), 'editField'); $a_form = $this->initFieldForm($field_definition); } - $table = null; + $table = ''; if ($field_definition->hasComplexOptions()) { - $table = $field_definition->getComplexOptionsOverview($this, "editField"); + $table_obj = $field_definition->getComplexOptionsOverview(); + if ($table_obj !== null) { + $table = $this->ui_renderer->render($table_obj); + } } $this->tpl->setContent($a_form->getHTML() . $table); } From 782f7d51a526ba54a9f972367ea1ce01059bd094 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Mon, 2 Nov 2026 18:54:50 +0100 Subject: [PATCH 4/5] refactor oid handliing --- .../ComplexOptions/Table/TableBuilder.php | 2 +- ....ilAdvancedMDFieldDefinitionGroupBased.php | 11 +++--- .../class.ilAdvancedMDFieldDefinition.php | 3 +- .../classes/class.ilAdvancedMDSettingsGUI.php | 38 ++++++++++++------- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php index b471613fc52c..8cc873f9ecbd 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php +++ b/components/ILIAS/AdvancedMetaData/classes/Types/Group/ComplexOptions/Table/TableBuilder.php @@ -83,6 +83,6 @@ public function getTableActionURLBuilder(): array ); $url_builder = new URLBuilder(new URI($link)); - return $url_builder->acquireParameters(['advmd'], 'oid'); + return $url_builder->acquireParameters(['advmd'], 'oid_table'); } } diff --git a/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php b/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php index 899d1b682ad7..49e795c713c8 100755 --- a/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php +++ b/components/ILIAS/AdvancedMetaData/classes/Types/class.ilAdvancedMDFieldDefinitionGroupBased.php @@ -18,9 +18,10 @@ declare(strict_types=1); -use ILIAS\AdvancedMetaData\Types\Group\ComplexOptions\Table\DataRetrieval; -use ILIAS\AdvancedMetaData\Types\Group\ComplexOptions\Table\TableBuilder; +use ILIAS\AdvancedMetaData\Types\Group\ComplexOptions\Table\DataRetrieval as ComplexOptionsDataRetrieval; +use ILIAS\AdvancedMetaData\Types\Group\ComplexOptions\Table\TableBuilder as ComplexOptionsTableBuilder; use ILIAS\UI\Component\Component; +use ILIAS\UI\Component\Table\Data as DataTable; /** * AMD field type address @@ -196,10 +197,10 @@ protected function getADTForOption(string $a_option): ilADT } - public function getComplexOptionsOverview(): ?Component + public function getComplexOptionsOverview(): ?DataTable { - $data_retrieval = new DataRetrieval($this); - $table_builder = new TableBuilder( + $data_retrieval = new ComplexOptionsDataRetrieval($this); + $table_builder = new ComplexOptionsTableBuilder( $data_retrieval, $this->lng, $this->ui_factory, diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php index 8a727c6788d4..f82b7765179e 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDFieldDefinition.php @@ -28,6 +28,7 @@ use ILIAS\UI\Factory as UIFactory; use ILIAS\UI\Renderer as UIRenderer; use ILIAS\UI\Component\Component; +use ILIAS\UI\Component\Table\Data as DataTable; /** * AMD field abstract base class @@ -1047,7 +1048,7 @@ public function hasComplexOptions(): bool /** * @return null */ - public function getComplexOptionsOverview(): ?Component + public function getComplexOptionsOverview(): ?DataTable { return null; } diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php index 113f1197a95d..94412e4c7167 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php @@ -206,16 +206,24 @@ protected function getOidFromQuery(): ?string { $name = 'advmd_oid'; if ($this->http->wrapper()->query()->has($name)) { - $transformation = $this->refinery->byTrying([ - $this->refinery->kindlyTo()->string(), - $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) - ]); - $oid = $this->http->wrapper()->query()->retrieve($name, $transformation); + return $this->http->wrapper()->query()->retrieve( + $name, + $this->refinery->kindlyTo()->string() + ); + } - if (is_array($oid) && !empty($oid)) { - return (string) $oid[0]; - } - return (string) $oid; + return null; + } + + protected function getOidFromTable(): ?string + { + $name = 'advmd_oid_table'; + if ($this->http->wrapper()->query()->has($name)) { + $oids = $this->http->wrapper()->query()->retrieve( + $name, + $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) + ); + return (string) ($oids[0] ?? ''); } return null; @@ -2003,19 +2011,21 @@ public function editComplexOption(?ilPropertyFormGUI $a_form = null): void } if (!$a_form) { - $a_form = $this->initComplexOptionForm($field_definition); + $oid = $this->getOidFromTable(); + $a_form = $this->initComplexOptionForm($field_definition, $oid); } $this->tpl->setContent($a_form->getHTML()); } - protected function initComplexOptionForm(ilAdvancedMDFieldDefinition $a_def): ilPropertyFormGUI + protected function initComplexOptionForm(ilAdvancedMDFieldDefinition $a_def, ?string $oid = null): ilPropertyFormGUI { $this->ctrl->saveParameter($this, "record_id"); $this->ctrl->saveParameter($this, "field_id"); - $oid = $this->getOidFromQuery(); - $this->ctrl->setParameter($this, "advmd_oid", (string) $oid); + if ($oid !== null) { + $this->ctrl->setParameter($this, "advmd_oid", $oid); + } $form = new ilPropertyFormGUI(); $form->setTitle($this->lng->txt("md_adv_edit_complex_option")); @@ -2036,7 +2046,7 @@ public function updateComplexOption(): void $oid = $this->getOidFromQuery(); if ($field_definition->hasComplexOptions()) { - $form = $this->initComplexOptionForm($field_definition); + $form = $this->initComplexOptionForm($field_definition, $oid); if ($form->checkInput() && $field_definition->updateComplexOption($form, $oid)) { $field_definition->update(); From 9b282d9e6695255c1aa83f9bd2017e16a977ea0d Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Tue, 3 Nov 2026 17:10:28 +0100 Subject: [PATCH 5/5] adjust initComplexOptionForm signature --- .../AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php index 94412e4c7167..890362731cde 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php @@ -2018,7 +2018,7 @@ public function editComplexOption(?ilPropertyFormGUI $a_form = null): void $this->tpl->setContent($a_form->getHTML()); } - protected function initComplexOptionForm(ilAdvancedMDFieldDefinition $a_def, ?string $oid = null): ilPropertyFormGUI + protected function initComplexOptionForm(ilAdvancedMDFieldDefinition $a_def, string $oid): ilPropertyFormGUI { $this->ctrl->saveParameter($this, "record_id"); $this->ctrl->saveParameter($this, "field_id");