From 14d504718453bbdb0b302bef00708d5d23190c5f Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Tue, 27 Oct 2026 10:15:10 +0100 Subject: [PATCH 1/7] combined classes to ilAdvancedMDRecordTranslationGUI and refactor multilingualism table in metadata to KS --- .../Record/Multilingualism/DataRetrieval.php | 158 +++++++++ .../Record/Multilingualism/TableBuilder.php | 127 +++++++ ...ass.ilAdvancedMDRecordLanguageTableGUI.php | 158 --------- ...class.ilAdvancedMDRecordTranslationGUI.php | 321 ++++++++++++++++-- .../class.ilAdvancedMDTranslationGUI.php | 160 --------- .../classes/class.ilAdvancedMDSettingsGUI.php | 3 +- .../tpl.record_language_selection_row.html | 21 -- 7 files changed, 578 insertions(+), 370 deletions(-) create mode 100644 components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php create mode 100644 components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php delete mode 100755 components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordLanguageTableGUI.php delete mode 100755 components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDTranslationGUI.php delete mode 100755 components/ILIAS/AdvancedMetaData/templates/default/tpl.record_language_selection_row.html diff --git a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php new file mode 100644 index 000000000000..552f2488db7e --- /dev/null +++ b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php @@ -0,0 +1,158 @@ +record = $record; + $this->lng = $lng; + $this->record_translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId( + $this->record->getRecordId() + ); + } + + public function getRows( + DataRowBuilder $row_builder, + array $visible_column_ids, + Range $range, + Order $order, + mixed $additional_viewcontrol_data, + mixed $filter_data, + mixed $additional_parameters + ): Generator { + $data = $this->getRawData(); + + $order_field = array_keys($order->get())[0] ?? TableBuilder::COL_LANGUAGE; + $order_direction = $order->get()[$order_field] ?? Order::ASC; + + uasort($data, static 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() ?? 50, true); + + foreach ($data as $lang_code => $row) { + $data_row = $row_builder->buildDataRow($lang_code, $row); + + $data_row = $data_row->withDisabledAction( + TableBuilder::ACTION_ACTIVATE, + $row[TableBuilder::COL_ACTIVE] + ); + + $data_row = $data_row->withDisabledAction( + TableBuilder::ACTION_DEACTIVATE, + !$row[TableBuilder::COL_ACTIVE] || $row[TableBuilder::COL_DEFAULT] + ); + + $data_row = $data_row->withDisabledAction( + TableBuilder::ACTION_SET_DEFAULT, + !$row[TableBuilder::COL_ACTIVE] || $row[TableBuilder::COL_DEFAULT] + ); + + yield $data_row; + } + } + + public function getTotalRowCount( + mixed $additional_viewcontrol_data, + mixed $filter_data, + mixed $additional_parameters + ): ?int { + return count($this->readLanguages()); + } + + /** + * @return string[] + */ + public function resolveIDs(array|string $ids): array + { + if ($ids === ['ALL_OBJECTS'] || $ids === 'ALL_OBJECTS') { + return $this->getAllIDs(); + } + if (is_array($ids)) { + return array_values(array_filter($ids, 'is_string')); + } + if (is_string($ids)) { + return [$ids]; + } + return []; + } + + public function getAllIDs(): array + { + return $this->readLanguages(); + } + + protected function getRawData(): array + { + $all_languages = $this->readLanguages(); + $installed_languages = ilLanguage::_getInstalledLanguages(); + + $record_translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId( + $this->record->getRecordId() + ); + + $default_language = $this->record->getDefaultLanguage(); + + $data = []; + foreach ($all_languages as $lang_code) { + $data[$lang_code] = [ + TableBuilder::COL_LANGUAGE => $this->lng->txt('meta_l_' . $lang_code), + TableBuilder::COL_DEFAULT => ($lang_code === $default_language), + TableBuilder::COL_ACTIVE => $record_translations->isConfigured($lang_code), + TableBuilder::COL_INSTALLED => in_array($lang_code, $installed_languages) + ]; + } + return $data; + } + + protected function readLanguages(): array + { + $languages = ilObject::_getObjectsByType('lng'); + $parsed_languages = []; + foreach ($languages as $language) { + $parsed_languages[] = $language['title']; + } + return array_values(array_filter($parsed_languages, fn($lang) => is_string($lang) && strlen($lang) >= 2 && strlen($lang) <= 10 && $lang !== 'ALL_OBJECTS')); + } +} diff --git a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php new file mode 100644 index 000000000000..7018059d8d0c --- /dev/null +++ b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php @@ -0,0 +1,127 @@ +getTableActionURLBuilder(); + + $columns = []; + $columns[self::COL_LANGUAGE] = $this->ui_factory->table()->column()->text( + $this->lng->txt('md_adv_record_lng_table_lng') + )->withIsSortable(true); + + $icon_ok = $this->ui_factory->symbol()->icon()->custom('assets/images/standard/icon_ok.svg', 'ok'); + $icon_not_ok = $this->ui_factory->symbol()->icon()->custom('assets/images/standard/icon_not_ok.svg', 'not ok'); + + $columns[self::COL_DEFAULT] = $this->ui_factory->table()->column()->boolean( + $this->lng->txt('md_adv_record_lng_table_default'), + $icon_ok, + $icon_not_ok + ); + + $columns[self::COL_ACTIVE] = $this->ui_factory->table()->column()->boolean( + $this->lng->txt('md_adv_record_lng_table_active'), + $icon_ok, + $icon_not_ok + ); + + $columns[self::COL_INSTALLED] = $this->ui_factory->table()->column()->boolean( + $this->lng->txt('md_adv_record_lng_table_inst'), + $icon_ok, + $icon_not_ok + ); + + $actions = []; + $actions[self::ACTION_ACTIVATE] = $this->ui_factory->table()->action()->standard( + $this->lng->txt('md_adv_record_lng_table_activate'), + $url_builder->withParameter($action_token, self::ACTION_ACTIVATE), + $id_token + ); + + $actions[self::ACTION_DEACTIVATE] = $this->ui_factory->table()->action()->standard( + $this->lng->txt('md_adv_record_lng_table_deactivate'), + $url_builder->withParameter($action_token, self::ACTION_DEACTIVATE), + $id_token + ); + + $actions[self::ACTION_SET_DEFAULT] = $this->ui_factory->table()->action()->single( + $this->lng->txt('md_adv_record_lng_table_set_default'), + $url_builder->withParameter($action_token, self::ACTION_SET_DEFAULT), + $id_token + ); + + return $this->ui_factory->table()->data( + $this->data_retrieval, + $this->lng->txt('md_adv_record_lng_table'), + $columns + )->withActions($actions) + ->withRequest($this->http->request()) + ->withId('advanced_metadata_record_translations_table'); + } + + public function getTableActionURLBuilder(): array + { + $link = ILIAS_HTTP_PATH . '/' . $this->ctrl->getLinkTargetByClass( + ilAdvancedMDRecordTranslationGUI::class, + 'handleTableAction' + ); + $url_builder = new URLBuilder($this->data_factory->uri($link)); + + return $url_builder->acquireParameters(['advmd_ml'], 'table_ids', 'table_action'); + } +} diff --git a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordLanguageTableGUI.php b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordLanguageTableGUI.php deleted file mode 100755 index 7567a14708fc..000000000000 --- a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordLanguageTableGUI.php +++ /dev/null @@ -1,158 +0,0 @@ - - */ -class ilAdvancedMDRecordLanguageTableGUI extends ilTable2GUI -{ - private const RECORD_LANGUAGE_TABLE_ID_PREFIX = 'adv_md_record_language_'; - - private const COL_LANGUAGE = 'language'; - private const COL_LANGUAGE_CODE = 'code'; - private const COL_DEFAULT = 'default'; - private const COL_ACTIVE = 'active'; - private const COL_INSTALLED = 'installed'; - - private const CMD_SAVE_ACTION = 'saveTranslations'; - - private Factory $ui_factory; - private Renderer $ui_renderer; - private ilAdvancedMDRecord $record; - private ilAdvancedMDRecordTranslations $record_translation; - - public function __construct(ilAdvancedMDRecord $record, object $a_parent_obj, string $a_parent_cmd = "") - { - global $DIC; - - $this->ui_factory = $DIC->ui()->factory(); - $this->ui_renderer = $DIC->ui()->renderer(); - - $this->record = $record; - $this->record_translation = ilAdvancedMDRecordTranslations::getInstanceByRecordId($this->record->getRecordId()); - parent::__construct($a_parent_obj, $a_parent_cmd); - $this->setId( - self::RECORD_LANGUAGE_TABLE_ID_PREFIX . $this->record->getRecordId() - ); - } - - /** - * Init table - */ - public function init(): void - { - $this->lng->loadLanguageModule('meta'); - $this->setTitle($this->lng->txt('md_adv_record_lng_table')); - - $this->addColumn('', 'f', '1px'); - $this->addColumn($this->lng->txt('md_adv_record_lng_table_lng'), self::COL_LANGUAGE, '25%'); - $this->addColumn($this->lng->txt('md_adv_record_lng_table_default'), self::COL_DEFAULT, '25%'); - $this->addColumn($this->lng->txt('md_adv_record_lng_table_active'), self::COL_ACTIVE, '25%'); - $this->addColumn($this->lng->txt('md_adv_record_lng_table_inst'), self::COL_INSTALLED, '25%'); - - $this->addMultiCommand(self::CMD_SAVE_ACTION, $this->lng->txt('md_adv_record_activate_languages')); - $this->setSelectAllCheckbox('active_languages'); - $this->enable('select_all'); - - $this->setRowTemplate('tpl.record_language_selection_row.html', 'components/ILIAS/AdvancedMetaData'); - $this->setDefaultOrderField(self::COL_LANGUAGE); - $this->setDefaultOrderDirection('asc'); - - $this->setLimit(9999); - $this->setShowRowsSelector(false); - - $this->setFormAction($this->ctrl->getFormAction($this->getParentObject())); - } - - /** - * Parse content - */ - public function parse(): void - { - $all_languages = $this->readLanguages(); - $installed_languages = ilLanguage::_getInstalledLanguages(); - - $rows = []; - foreach ($all_languages as $language_code) { - $row = []; - $row[self::COL_LANGUAGE_CODE] = $language_code; - $row[self::COL_LANGUAGE] = $this->lng->txt('meta_l_' . $language_code); - $row[self::COL_INSTALLED] = in_array($language_code, $installed_languages); - if ($this->record_translation->isConfigured($language_code)) { - $row[self::COL_ACTIVE] = true; - $translation = $this->record_translation->getTranslation($language_code); - $row[self::COL_DEFAULT] = ($translation->getLangKey() == $this->record->getDefaultLanguage()); - } else { - $row[self::COL_ACTIVE] = false; - $row[self::COL_DEFAULT] = false; - } - $rows[] = $row; - } - $this->setMaxCount(count($rows)); - $this->setData($rows); - } - - protected function fillRow(array $a_set): void - { - $this->tpl->setVariable('VAL_ID', $a_set[self::COL_LANGUAGE_CODE]); - - if ($a_set[self::COL_ACTIVE]) { - $this->tpl->setVariable('ACTIVATION_CHECKED', 'checked="checked"'); - } - - $this->tpl->setVariable('TXT_LANGUAGE', $a_set[self::COL_LANGUAGE]); - if ($a_set[self::COL_DEFAULT]) { - $this->tpl->setVariable('DEFAULT_CHECKED', 'checked="checked"'); - } - if ($a_set[self::COL_ACTIVE]) { - $this->tpl->setVariable( - 'GLYPH_ACTIVE', - $this->ui_renderer->render( - $this->ui_factory->symbol()->glyph()->apply() - ) - ); - } - if ($a_set[self::COL_INSTALLED]) { - $this->tpl->setVariable( - 'GLYPH_INSTALLED', - $this->ui_renderer->render( - $this->ui_factory->symbol()->glyph()->apply() - ) - ); - } - } - - /** - * @return array - */ - private function readLanguages(): array - { - $languages = ilObject::_getObjectsByType('lng'); - $parsed_languages = []; - foreach ($languages as $language) { - $parsed_languages[] = $language['title']; - } - return $parsed_languages; - } -} diff --git a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php index 67453a21ba17..582208301203 100755 --- a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php @@ -18,58 +18,319 @@ declare(strict_types=1); -/** - * Class ilAdvancedMDRecordTranslationGUI - * @ilCtrl_isCalledBy ilAdvancedMDRecordTranslationGUI: ilAdvancedMDSettingsGUI - * @ingroup ServicesAdvancedMetaData - */ -class ilAdvancedMDRecordTranslationGUI extends ilAdvancedMDTranslationGUI +use ilLanguage; +use ilSelectInputGUI; +use Psr\Http\Message\RequestInterface; +use ILIAS\HTTP\Services as HTTP; +use ILIAS\Data\Factory as DataFactory; + +use ILIAS\UI\Factory as UIFactory; +use ILIAS\UI\Renderer as UIRenderer; +use ILIAS\Refinery\Factory as RefineryFactory; +use ILIAS\AdvancedMetaData\Record\Multilingualism\DataRetrieval; +use ILIAS\AdvancedMetaData\Record\Multilingualism\TableBuilder; + +class ilAdvancedMDRecordTranslationGUI { + protected TableBuilder $table_builder; + + protected const CMD_DEFAULT = 'translations'; + protected const CMD_ADD_TRANSLATION = 'addTranslations'; + protected const CMD_SAVE_ADDITIONAL_TRANSLATIONS = 'saveAdditionalTranslations'; + protected const CMD_ACTIVATE = 'activate'; + protected const CMD_DEACTIVATE = 'deactivate'; + protected const CMD_SET_DEFAULT = 'setDefault'; + + protected ilCtrl $ctrl; + protected ilGlobalTemplateInterface $tpl; + protected ilToolbarGUI $toolbar; + protected ilTabsGUI $tabs; + protected ilLanguage $language; + protected RequestInterface $request; + protected ilAdvancedMDRecord $record; + protected UIFactory $ui_factory; + protected UIRenderer $ui_renderer; + protected HTTP $http; + protected RefineryFactory $refinery; + protected DataFactory $data_factory; + + public function __construct(ilAdvancedMDRecord $record) + { + global $DIC; + + $this->ctrl = $DIC->ctrl(); + $this->tpl = $DIC->ui()->mainTemplate(); + $this->toolbar = $DIC->toolbar(); + $this->tabs = $DIC->tabs(); + $this->language = $DIC->language(); + $this->language->loadLanguageModule('obj'); + $this->request = $DIC->http()->request(); + $this->record = $record; + $this->ui_factory = $DIC->ui()->factory(); + $this->ui_renderer = $DIC->ui()->renderer(); + $this->http = $DIC->http(); + $this->refinery = $DIC->refinery(); + $this->data_factory = new \ILIAS\Data\Factory(); + } + + /** + * Execute command and save parameter record id + */ + public function executeCommand(): void + { + $this->ctrl->setParameterByClass( + strtolower(get_class($this)), + 'record_id', + $this->record->getRecordId() + ); + + $next_class = $this->ctrl->getNextClass($this); + $cmd = $this->ctrl->getCmd(self::CMD_DEFAULT); + + switch ($next_class) { + default: + $this->$cmd(); + } + } + + protected function setTabs(string $active_tab) + { + $this->tabs->activateTab($active_tab); + } + protected function translations(): void { $this->setTabs(self::CMD_DEFAULT); - $language_table = new ilAdvancedMDRecordLanguageTableGUI( + $data_retrieval = new DataRetrieval( $this->record, - $this, - self::CMD_DEFAULT + $this->language + ); + + $this->table_builder = new TableBuilder( + $data_retrieval, + $this->language, + $this->ui_factory, + $this->http, + $this->ctrl, + $this->data_factory ); - $language_table->init(); - $language_table->parse(); - $this->tpl->setContent($language_table->getHTML()); + $table = $this->table_builder->get(); + + $this->tpl->setContent($this->ui_renderer->render($table)); } - /** - * @todo use kindlyTo for input parameters - */ - protected function saveTranslations(): void + protected function getLanguageCodes(): array { - $languages = (array) ($this->request->getParsedBody()['active_languages'] ?? []); - $default = (string) $this->request->getParsedBody()['default']; + $this->ensureTableBuilder(); - if (!in_array($default, $languages)) { - $this->tpl->setOnScreenMessage('failure', $this->language->txt('err_check_input'), true); - $this->tpl->setOnScreenMessage('info', $this->language->txt('md_adn_int_error_no_default'), true); - $this->ctrl->redirect($this, self::CMD_DEFAULT); + list($url_builder, $id_token, $action_token) = $this->table_builder->getTableActionURLBuilder(); + + $data_retrieval = new DataRetrieval($this->record, $this->language); + $parameter_name = $id_token->getName(); + + $raw_ids = $this->getParameter($parameter_name); + if ($raw_ids === null) { + return []; } - $translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId($this->record->getRecordId()); - foreach ($translations->getTranslations() as $translation) { - if (!in_array($translation->getLangKey(), $languages)) { - $translation->delete(); - } + return $data_retrieval->resolveIDs($raw_ids); + } + + protected function getParameter(string $name): mixed + { + if ($this->http->wrapper()->post()->has($name)) { + return $this->http->wrapper()->post()->retrieve( + $name, + $this->refinery->identity() + ); + } + + if ($this->http->wrapper()->query()->has($name)) { + return $this->http->wrapper()->query()->retrieve( + $name, + $this->refinery->identity() + ); } - foreach ($languages as $lang_key) { + + return null; + } + + public function handleTableAction(): void + { + $this->ensureTableBuilder(); + + list($url_builder, $id_token, $action_token) = $this->table_builder->getTableActionURLBuilder(); + + $parameter_name = $action_token->getName(); + $action = $this->getParameter($parameter_name); + + if (is_string($action) && in_array($action, [self::CMD_ACTIVATE, self::CMD_DEACTIVATE, self::CMD_SET_DEFAULT])) { + $this->$action(); + } + } + + protected function ensureTableBuilder(): void + { + if (!isset($this->table_builder)) { + $data_retrieval = new DataRetrieval( + $this->record, + $this->language + ); + + $this->table_builder = new TableBuilder( + $data_retrieval, + $this->language, + $this->ui_factory, + $this->http, + $this->ctrl, + $this->data_factory + ); + } + } + + protected function activate(): void + { + $lang_keys = $this->getLanguageCodes(); + $record_id = $this->record->getRecordId(); + $translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId($record_id); + + foreach ($lang_keys as $lang_key) { if (!$translations->isConfigured($lang_key)) { - $translations->addTranslationEntry($lang_key); + $translations->addTranslationEntry($lang_key, false); } } - $this->record->setDefaultLanguage($default); + if (count($lang_keys) > 0) { + $this->tpl->setOnScreenMessage('success', $this->language->txt('settings_saved'), true); + } + + $this->ctrl->redirect($this, self::CMD_DEFAULT); + } + + protected function deactivate(): void + { + $lang_keys = $this->getLanguageCodes(); + $record_id = $this->record->getRecordId(); + $translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId($record_id); + $success = false; + + foreach ($lang_keys as $lang_key) { + if ($lang_key === $this->record->getDefaultLanguage()) { + $this->tpl->setOnScreenMessage('failure', $this->language->txt('md_adn_int_error_no_default'), true); + } else { + $translation = $translations->getTranslation($lang_key); + if ($translation) { + $translation->delete(); + $success = true; + } + } + } + + if ($success) { + $this->tpl->setOnScreenMessage('success', $this->language->txt('settings_saved'), true); + } + + $this->ctrl->redirect($this, self::CMD_DEFAULT); + } + + protected function setDefault(): void + { + $lang_keys = $this->getLanguageCodes(); + $lang_key = reset($lang_keys); + + if (!$lang_key) { + $this->ctrl->redirect($this, self::CMD_DEFAULT); + } + + $translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId($this->record->getRecordId()); + if (!$translations->isConfigured($lang_key)) { + $this->tpl->setOnScreenMessage('failure', $this->language->txt('err_check_input'), true); + $this->ctrl->redirect($this, self::CMD_DEFAULT); + } + + $this->record->setDefaultLanguage($lang_key); $this->record->update(); $this->tpl->setOnScreenMessage('success', $this->language->txt('settings_saved'), true); $this->ctrl->redirect($this, self::CMD_DEFAULT); } + + /** + * show translation creation form + */ + protected function addTranslations(?ilPropertyFormGUI $form = null) + { + $this->tabs->activateTab(self::CMD_DEFAULT); + if (!$form instanceof ilPropertyFormGUI) { + $form = $this->initCreateTranslationForm(); + } + $this->tpl->setContent($form->getHTML()); + } + + protected function initCreateTranslationForm(): ilPropertyFormGUI + { + $form = new \ilPropertyFormGUI(); + $form->setFormAction($this->ctrl->getFormAction($this)); + $form->setTitle($this->language->txt('obj_add_languages')); + + $language_options = $this->getAvailableLanguagesOptions(); + $languages = new ilSelectInputGUI( + $this->language->txt('obj_additional_langs'), + 'languages' + ); + $languages->setOptions($language_options); + $languages->setMulti(true); + $languages->setRequired(true); + $form->addItem($languages); + + $form->addCommandButton( + self::CMD_SAVE_ADDITIONAL_TRANSLATIONS, + $this->language->txt('save') + ); + $form->addCommandButton( + self::CMD_DEFAULT, + $this->language->txt('cancel') + ); + return $form; + } + + /** + * @return array + * @todo handle generic isConfigured + */ + protected function getAvailableLanguagesOptions(): array + { + $languages = ilAdvancedMDRecordTranslations::getInstanceByRecordId($this->record->getRecordId()); + + $installed_languages = ilLanguage::_getInstalledLanguages(); + $options = []; + $options[''] = $this->language->txt('select_one'); + foreach ($installed_languages as $key => $language) { + if ($languages->isConfigured($language)) { + continue; + } + $options[$language] = $this->language->txt('meta_l_' . $language); + } + return $options; + } + + protected function saveAdditionalTranslations(): void + { + $form = $this->initCreateTranslationForm(); + if (!$form->checkInput()) { + $form->setValuesByPost(); + $this->tpl->setOnScreenMessage('failure', $this->language->txt('err_check_input')); + $this->addTranslations($form); + return; + } + foreach (array_unique((array) $form->getInput('languages')) as $language_code) { + $languages = ilAdvancedMDRecordTranslations::getInstanceByRecordId($this->record->getRecordId()); + $languages->addTranslationEntry($language_code); + } + + $this->tpl->setOnScreenMessage('success', $this->language->txt('settings_saved'), true); + $this->ctrl->redirect($this, self::CMD_DEFAULT); + } } diff --git a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDTranslationGUI.php b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDTranslationGUI.php deleted file mode 100755 index 9d9e6dfa0ba2..000000000000 --- a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDTranslationGUI.php +++ /dev/null @@ -1,160 +0,0 @@ -ctrl = $DIC->ctrl(); - $this->tpl = $DIC->ui()->mainTemplate(); - $this->toolbar = $DIC->toolbar(); - $this->tabs = $DIC->tabs(); - $this->language = $DIC->language(); - $this->language->loadLanguageModule('obj'); - $this->request = $DIC->http()->request(); - /** @noinspection PhpUndefinedMethodInspection */ - $this->logger = $DIC->logger()->amet(); - $this->record = $record; - } - - /** - * Execute command and save parameter record id - */ - public function executeCommand() - { - $this->ctrl->setParameterByClass( - strtolower(get_class($this)), - 'record_id', - $this->record->getRecordId() - ); - - $next_class = $this->ctrl->getNextClass($this); - $cmd = $this->ctrl->getCmd(self::CMD_DEFAULT); - switch ($next_class) { - default: - $this->$cmd(); - } - } - - protected function setTabs(string $active_tab) - { - $this->tabs->activateTab($active_tab); - } - - /** - * @return void - */ - abstract protected function translations(): void; - - /** - * show translation creation form - */ - protected function addTranslations(?ilPropertyFormGUI $form = null) - { - $this->tabs->activateTab(self::CMD_DEFAULT); - if (!$form instanceof ilPropertyFormGUI) { - $form = $this->initCreateTranslationForm(); - } - $this->tpl->setContent($form->getHTML()); - } - - protected function initCreateTranslationForm(): ilPropertyFormGUI - { - $form = new \ilPropertyFormGUI(); - $form->setFormAction($this->ctrl->getFormAction($this)); - $form->setTitle($this->language->txt('obj_add_languages')); - - $language_options = $this->getAvailableLanguagesOptions(); - $languages = new ilSelectInputGUI( - $this->language->txt('obj_additional_langs'), - 'languages' - ); - $languages->setOptions($language_options); - $languages->setMulti(true); - $languages->setRequired(true); - $form->addItem($languages); - - $form->addCommandButton( - self::CMD_SAVE_ADDITIONAL_TRANSLATIONS, - $this->language->txt('save') - ); - $form->addCommandButton( - self::CMD_DEFAULT, - $this->language->txt('cancel') - ); - return $form; - } - - /** - * @return array - * @todo handle generic isConfigured - */ - protected function getAvailableLanguagesOptions(): array - { - $languages = ilAdvancedMDRecordTranslations::getInstanceByRecordId($this->record->getRecordId()); - - $this->language->loadLanguageModule('meta'); - $installed_languages = ilLanguage::_getInstalledLanguages(); - $options = []; - $options[''] = $this->language->txt('select_one'); - foreach ($installed_languages as $key => $language) { - if ($languages->isConfigured($language)) { - continue; - } - $options[$language] = $this->language->txt('meta_l_' . $language); - } - return $options; - } - - protected function saveAdditionalTranslations(): void - { - $form = $this->initCreateTranslationForm(); - if (!$form->checkInput()) { - $form->setValuesByPost(); - $this->tpl->setOnScreenMessage('failure', $this->language->txt('err_check_input')); - $this->addTranslations($form); - return; - } - foreach (array_unique((array) $form->getInput('languages')) as $language_code) { - $languages = ilAdvancedMDRecordTranslations::getInstanceByRecordId($this->record->getRecordId()); - $languages->addTranslationEntry($language_code); - } - - $this->tpl->setOnScreenMessage('success', $this->language->txt('settings_saved'), true); - $this->ctrl->redirect($this, self::CMD_DEFAULT); - } -} diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php index 890362731cde..dd56591747b1 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php @@ -27,7 +27,8 @@ /** * @author Stefan Meyer - * @ilCtrl_Calls ilAdvancedMDSettingsGUI: ilPropertyFormGUI + * @ilCtrl_Calls ilAdvancedMDSettingsGUI: ilPropertyFormGUI, ilAdvancedMDRecordTranslationGUI + * @ilCtrl_Calls ilAdvancedMDSettingsGUI: ilAdvancedMDFieldDefinitionGUI * @ingroup ServicesAdvancedMetaData */ class ilAdvancedMDSettingsGUI diff --git a/components/ILIAS/AdvancedMetaData/templates/default/tpl.record_language_selection_row.html b/components/ILIAS/AdvancedMetaData/templates/default/tpl.record_language_selection_row.html deleted file mode 100755 index eba8e5e4b316..000000000000 --- a/components/ILIAS/AdvancedMetaData/templates/default/tpl.record_language_selection_row.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - {TXT_LANGUAGE} - - - - - -
- {GLYPH_ACTIVE} -
- - -
- {GLYPH_INSTALLED} -
- - \ No newline at end of file From bf3cc5805d4d7e6cb2344ff678ef9dd9ecf8b402 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Thu, 29 Oct 2026 18:25:28 +0100 Subject: [PATCH 2/7] refactor multilingualism table in metadata --- .../Record/Multilingualism/DataRetrieval.php | 38 ++---- .../Record/Multilingualism/TableBuilder.php | 15 +-- ...class.ilAdvancedMDRecordTranslationGUI.php | 117 +++++++++--------- 3 files changed, 70 insertions(+), 100 deletions(-) diff --git a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php index 552f2488db7e..596fb6601418 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php +++ b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php @@ -98,34 +98,22 @@ public function getTotalRowCount( mixed $filter_data, mixed $additional_parameters ): ?int { - return count($this->readLanguages()); + return count(self::getAllIDs()); } - /** - * @return string[] - */ - public function resolveIDs(array|string $ids): array + public static function getAllIDs(): array { - if ($ids === ['ALL_OBJECTS'] || $ids === 'ALL_OBJECTS') { - return $this->getAllIDs(); - } - if (is_array($ids)) { - return array_values(array_filter($ids, 'is_string')); - } - if (is_string($ids)) { - return [$ids]; + $languages = ilObject::_getObjectsByType('lng'); + $parsed_languages = []; + foreach ($languages as $language) { + $parsed_languages[] = $language['title']; } - return []; - } - - public function getAllIDs(): array - { - return $this->readLanguages(); + return array_values(array_filter($parsed_languages, static fn($lang) => is_string($lang) && strlen($lang) >= 2 && strlen($lang) <= 10 && $lang !== 'ALL_OBJECTS')); } protected function getRawData(): array { - $all_languages = $this->readLanguages(); + $all_languages = self::getAllIDs(); $installed_languages = ilLanguage::_getInstalledLanguages(); $record_translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId( @@ -145,14 +133,4 @@ protected function getRawData(): array } return $data; } - - protected function readLanguages(): array - { - $languages = ilObject::_getObjectsByType('lng'); - $parsed_languages = []; - foreach ($languages as $language) { - $parsed_languages[] = $language['title']; - } - return array_values(array_filter($parsed_languages, fn($lang) => is_string($lang) && strlen($lang) >= 2 && strlen($lang) <= 10 && $lang !== 'ALL_OBJECTS')); - } } diff --git a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php index 7018059d8d0c..1f638ef77e6b 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php +++ b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php @@ -34,7 +34,6 @@ use ILIAS\Data\Range; use ILIAS\Data\Factory as DataFactory; - class TableBuilder { public const string COL_LANGUAGE = 'language'; @@ -56,10 +55,8 @@ public function __construct( ) { } - public function get(): DataTable + public function get(URLBuilder $url_builder, URLBuilderToken $id_token, URLBuilderToken $action_token): DataTable { - [$url_builder, $id_token, $action_token] = $this->getTableActionURLBuilder(); - $columns = []; $columns[self::COL_LANGUAGE] = $this->ui_factory->table()->column()->text( $this->lng->txt('md_adv_record_lng_table_lng') @@ -114,14 +111,4 @@ public function get(): DataTable ->withId('advanced_metadata_record_translations_table'); } - public function getTableActionURLBuilder(): array - { - $link = ILIAS_HTTP_PATH . '/' . $this->ctrl->getLinkTargetByClass( - ilAdvancedMDRecordTranslationGUI::class, - 'handleTableAction' - ); - $url_builder = new URLBuilder($this->data_factory->uri($link)); - - return $url_builder->acquireParameters(['advmd_ml'], 'table_ids', 'table_action'); - } } diff --git a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php index 582208301203..01c9f4083e8a 100755 --- a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php @@ -23,17 +23,16 @@ use Psr\Http\Message\RequestInterface; use ILIAS\HTTP\Services as HTTP; use ILIAS\Data\Factory as DataFactory; - use ILIAS\UI\Factory as UIFactory; use ILIAS\UI\Renderer as UIRenderer; use ILIAS\Refinery\Factory as RefineryFactory; use ILIAS\AdvancedMetaData\Record\Multilingualism\DataRetrieval; use ILIAS\AdvancedMetaData\Record\Multilingualism\TableBuilder; +use ILIAS\UI\URLBuilder; +use ILIAS\UI\URLBuilderToken; class ilAdvancedMDRecordTranslationGUI { - protected TableBuilder $table_builder; - protected const CMD_DEFAULT = 'translations'; protected const CMD_ADD_TRANSLATION = 'addTranslations'; protected const CMD_SAVE_ADDITIONAL_TRANSLATIONS = 'saveAdditionalTranslations'; @@ -70,7 +69,7 @@ public function __construct(ilAdvancedMDRecord $record) $this->ui_renderer = $DIC->ui()->renderer(); $this->http = $DIC->http(); $this->refinery = $DIC->refinery(); - $this->data_factory = new \ILIAS\Data\Factory(); + $this->data_factory = new DataFactory(); } /** @@ -107,7 +106,7 @@ protected function translations(): void $this->language ); - $this->table_builder = new TableBuilder( + $table_builder = new TableBuilder( $data_retrieval, $this->language, $this->ui_factory, @@ -116,83 +115,91 @@ protected function translations(): void $this->data_factory ); - $table = $this->table_builder->get(); + [$url_builder, $id_token, $action_token] = $this->getTableActionURLBuilder(); + $table = $table_builder->get($url_builder, $id_token, $action_token); $this->tpl->setContent($this->ui_renderer->render($table)); } - protected function getLanguageCodes(): array + protected function getTableActionURLBuilder(): array { - $this->ensureTableBuilder(); + $link = ILIAS_HTTP_PATH . '/' . $this->ctrl->getLinkTargetByClass( + ilAdvancedMDRecordTranslationGUI::class, + 'handleTableAction' + ); + $url_builder = new URLBuilder($this->data_factory->uri($link)); - list($url_builder, $id_token, $action_token) = $this->table_builder->getTableActionURLBuilder(); + return $url_builder->acquireParameters(['advmd_ml'], 'table_ids', 'table_action'); + } - $data_retrieval = new DataRetrieval($this->record, $this->language); + protected function getLanguageCodes(URLBuilderToken $id_token): array + { $parameter_name = $id_token->getName(); - - $raw_ids = $this->getParameter($parameter_name); + $raw_ids = $this->getPostParameter($parameter_name, true); if ($raw_ids === null) { - return []; + $raw_ids = $this->getQueryParameter($parameter_name, true); + } + + if ($raw_ids === ['ALL_OBJECTS'] || $raw_ids === 'ALL_OBJECTS') { + return DataRetrieval::getAllIDs(); } - return $data_retrieval->resolveIDs($raw_ids); + return (array) ($raw_ids ?? []); } - protected function getParameter(string $name): mixed + protected function getPostParameter(string $name, bool $is_list = false): mixed { - if ($this->http->wrapper()->post()->has($name)) { - return $this->http->wrapper()->post()->retrieve( - $name, - $this->refinery->identity() - ); - } + $wrapper = $this->http->wrapper()->post(); - if ($this->http->wrapper()->query()->has($name)) { - return $this->http->wrapper()->query()->retrieve( - $name, - $this->refinery->identity() - ); + if ($wrapper->has($name)) { + $refinery = $is_list ? + $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) : + $this->refinery->kindlyTo()->string(); + return $wrapper->retrieve($name, $refinery); } return null; } - public function handleTableAction(): void + protected function getQueryParameter(string $name, bool $is_list = false): mixed { - $this->ensureTableBuilder(); - - list($url_builder, $id_token, $action_token) = $this->table_builder->getTableActionURLBuilder(); - - $parameter_name = $action_token->getName(); - $action = $this->getParameter($parameter_name); + $wrapper = $this->http->wrapper()->query(); - if (is_string($action) && in_array($action, [self::CMD_ACTIVATE, self::CMD_DEACTIVATE, self::CMD_SET_DEFAULT])) { - $this->$action(); + if ($wrapper->has($name)) { + $refinery = $is_list ? + $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) : + $this->refinery->kindlyTo()->string(); + return $wrapper->retrieve($name, $refinery); } + + return null; } - protected function ensureTableBuilder(): void + public function handleTableAction(): void { - if (!isset($this->table_builder)) { - $data_retrieval = new DataRetrieval( - $this->record, - $this->language - ); - - $this->table_builder = new TableBuilder( - $data_retrieval, - $this->language, - $this->ui_factory, - $this->http, - $this->ctrl, - $this->data_factory - ); + [$url_builder, $id_token, $action_token] = $this->getTableActionURLBuilder(); + $ids = $this->getLanguageCodes($id_token); + $action = $this->getPostParameter($action_token->getName()); + if ($action === null) { + $action = $this->getQueryParameter($action_token->getName()); + } + + switch ($action) { + case 'activate': + $this->activate($ids); + break; + case 'deactivate': + $this->deactivate($ids); + break; + case 'setDefault': + $this->setDefault($ids); + break; } } - protected function activate(): void + + protected function activate(array $lang_keys): void { - $lang_keys = $this->getLanguageCodes(); $record_id = $this->record->getRecordId(); $translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId($record_id); @@ -209,9 +216,8 @@ protected function activate(): void $this->ctrl->redirect($this, self::CMD_DEFAULT); } - protected function deactivate(): void + protected function deactivate(array $lang_keys): void { - $lang_keys = $this->getLanguageCodes(); $record_id = $this->record->getRecordId(); $translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId($record_id); $success = false; @@ -235,9 +241,8 @@ protected function deactivate(): void $this->ctrl->redirect($this, self::CMD_DEFAULT); } - protected function setDefault(): void + protected function setDefault(array $lang_keys): void { - $lang_keys = $this->getLanguageCodes(); $lang_key = reset($lang_keys); if (!$lang_key) { From ec45c8896f30c2f8f33f6f5882aed4d53ada544d Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Thu, 5 Nov 2026 10:11:28 +0100 Subject: [PATCH 3/7] refactor the multilingualism tables --- .../Record/Multilingualism/DataRetrieval.php | 70 +++++---- .../Record/Multilingualism/TableBuilder.php | 1 - ...class.ilAdvancedMDRecordTranslationGUI.php | 134 +++--------------- 3 files changed, 63 insertions(+), 142 deletions(-) diff --git a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php index 596fb6601418..15de204ddbb3 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php +++ b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php @@ -34,7 +34,9 @@ class DataRetrieval implements BaseDataRetrieval { protected ilAdvancedMDRecord $record; protected ilLanguage $lng; - protected ilAdvancedMDRecordTranslations $record_translations; + protected ?ilAdvancedMDRecordTranslations $record_translations = null; + protected ?array $raw_data_cache = null; + protected ?array $all_ids_cache = null; public function __construct( ilAdvancedMDRecord $record, @@ -42,9 +44,16 @@ public function __construct( ) { $this->record = $record; $this->lng = $lng; - $this->record_translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId( - $this->record->getRecordId() - ); + } + + protected function getRecordTranslations(): ilAdvancedMDRecordTranslations + { + if ($this->record_translations === null) { + $this->record_translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId( + $this->record->getRecordId() + ); + } + return $this->record_translations; } public function getRows( @@ -98,39 +107,42 @@ public function getTotalRowCount( mixed $filter_data, mixed $additional_parameters ): ?int { - return count(self::getAllIDs()); + return count($this->getAllIDs()); } - public static function getAllIDs(): array + public function getAllIDs(): array { - $languages = ilObject::_getObjectsByType('lng'); - $parsed_languages = []; - foreach ($languages as $language) { - $parsed_languages[] = $language['title']; + if ($this->all_ids_cache === null) { + $languages = ilObject::_getObjectsByType('lng'); + $parsed_languages = []; + foreach ($languages as $language) { + $lang = $language['title']; + $parsed_languages[] = $lang; + } + $this->all_ids_cache = $parsed_languages; } - return array_values(array_filter($parsed_languages, static fn($lang) => is_string($lang) && strlen($lang) >= 2 && strlen($lang) <= 10 && $lang !== 'ALL_OBJECTS')); + return $this->all_ids_cache; } protected function getRawData(): array { - $all_languages = self::getAllIDs(); - $installed_languages = ilLanguage::_getInstalledLanguages(); - - $record_translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId( - $this->record->getRecordId() - ); - - $default_language = $this->record->getDefaultLanguage(); - - $data = []; - foreach ($all_languages as $lang_code) { - $data[$lang_code] = [ - TableBuilder::COL_LANGUAGE => $this->lng->txt('meta_l_' . $lang_code), - TableBuilder::COL_DEFAULT => ($lang_code === $default_language), - TableBuilder::COL_ACTIVE => $record_translations->isConfigured($lang_code), - TableBuilder::COL_INSTALLED => in_array($lang_code, $installed_languages) - ]; + if ($this->raw_data_cache === null) { + $all_languages = $this->getAllIDs(); + $installed_languages = ilLanguage::_getInstalledLanguages(); + $record_translations = $this->getRecordTranslations(); + $default_language = $this->record->getDefaultLanguage(); + + $data = []; + foreach ($all_languages as $lang_code) { + $data[$lang_code] = [ + TableBuilder::COL_LANGUAGE => $this->lng->txt('meta_l_' . $lang_code), + TableBuilder::COL_DEFAULT => ($lang_code === $default_language), + TableBuilder::COL_ACTIVE => $record_translations->isConfigured($lang_code), + TableBuilder::COL_INSTALLED => in_array($lang_code, $installed_languages) + ]; + } + $this->raw_data_cache = $data; } - return $data; + return $this->raw_data_cache; } } diff --git a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php index 1f638ef77e6b..a7d91c9f46cb 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php +++ b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php @@ -29,7 +29,6 @@ use ilCtrl; use ILIAS\Data\URI; use ILIAS\UI\Component\Symbol\Icon\Icon; -use ILIAS\UI\Component\Symbol\Glyph\Glyph; use ilAdvancedMDRecordTranslationGUI; use ILIAS\Data\Range; use ILIAS\Data\Factory as DataFactory; diff --git a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php index 01c9f4083e8a..843af3bab5d7 100755 --- a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php @@ -34,11 +34,6 @@ class ilAdvancedMDRecordTranslationGUI { protected const CMD_DEFAULT = 'translations'; - protected const CMD_ADD_TRANSLATION = 'addTranslations'; - protected const CMD_SAVE_ADDITIONAL_TRANSLATIONS = 'saveAdditionalTranslations'; - protected const CMD_ACTIVATE = 'activate'; - protected const CMD_DEACTIVATE = 'deactivate'; - protected const CMD_SET_DEFAULT = 'setDefault'; protected ilCtrl $ctrl; protected ilGlobalTemplateInterface $tpl; @@ -88,7 +83,15 @@ public function executeCommand(): void switch ($next_class) { default: - $this->$cmd(); + switch ($cmd) { + case self::CMD_DEFAULT: + $this->translations(); + break; + case 'handleTableAction': + $this->handleTableAction(); + break; + } + break; } } @@ -132,35 +135,18 @@ protected function getTableActionURLBuilder(): array return $url_builder->acquireParameters(['advmd_ml'], 'table_ids', 'table_action'); } - protected function getLanguageCodes(URLBuilderToken $id_token): array + protected function getLanguageCodes(URLBuilderToken $id_token, DataRetrieval $data_retrieval): array { $parameter_name = $id_token->getName(); - $raw_ids = $this->getPostParameter($parameter_name, true); - if ($raw_ids === null) { - $raw_ids = $this->getQueryParameter($parameter_name, true); - } + $raw_ids = $this->getQueryParameter($parameter_name, true); - if ($raw_ids === ['ALL_OBJECTS'] || $raw_ids === 'ALL_OBJECTS') { - return DataRetrieval::getAllIDs(); + if ($raw_ids === ['ALL_OBJECTS']) { + return $data_retrieval->getAllIDs(); } return (array) ($raw_ids ?? []); } - protected function getPostParameter(string $name, bool $is_list = false): mixed - { - $wrapper = $this->http->wrapper()->post(); - - if ($wrapper->has($name)) { - $refinery = $is_list ? - $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) : - $this->refinery->kindlyTo()->string(); - return $wrapper->retrieve($name, $refinery); - } - - return null; - } - protected function getQueryParameter(string $name, bool $is_list = false): mixed { $wrapper = $this->http->wrapper()->query(); @@ -177,21 +163,22 @@ protected function getQueryParameter(string $name, bool $is_list = false): mixed public function handleTableAction(): void { + $data_retrieval = new DataRetrieval( + $this->record, + $this->language + ); [$url_builder, $id_token, $action_token] = $this->getTableActionURLBuilder(); - $ids = $this->getLanguageCodes($id_token); - $action = $this->getPostParameter($action_token->getName()); - if ($action === null) { - $action = $this->getQueryParameter($action_token->getName()); - } + $ids = $this->getLanguageCodes($id_token, $data_retrieval); + $action = $this->getQueryParameter($action_token->getName()); switch ($action) { - case 'activate': + case TableBuilder::ACTION_ACTIVATE: $this->activate($ids); break; - case 'deactivate': + case TableBuilder::ACTION_DEACTIVATE: $this->deactivate($ids); break; - case 'setDefault': + case TableBuilder::ACTION_SET_DEFAULT: $this->setDefault($ids); break; } @@ -261,81 +248,4 @@ protected function setDefault(array $lang_keys): void $this->tpl->setOnScreenMessage('success', $this->language->txt('settings_saved'), true); $this->ctrl->redirect($this, self::CMD_DEFAULT); } - - /** - * show translation creation form - */ - protected function addTranslations(?ilPropertyFormGUI $form = null) - { - $this->tabs->activateTab(self::CMD_DEFAULT); - if (!$form instanceof ilPropertyFormGUI) { - $form = $this->initCreateTranslationForm(); - } - $this->tpl->setContent($form->getHTML()); - } - - protected function initCreateTranslationForm(): ilPropertyFormGUI - { - $form = new \ilPropertyFormGUI(); - $form->setFormAction($this->ctrl->getFormAction($this)); - $form->setTitle($this->language->txt('obj_add_languages')); - - $language_options = $this->getAvailableLanguagesOptions(); - $languages = new ilSelectInputGUI( - $this->language->txt('obj_additional_langs'), - 'languages' - ); - $languages->setOptions($language_options); - $languages->setMulti(true); - $languages->setRequired(true); - $form->addItem($languages); - - $form->addCommandButton( - self::CMD_SAVE_ADDITIONAL_TRANSLATIONS, - $this->language->txt('save') - ); - $form->addCommandButton( - self::CMD_DEFAULT, - $this->language->txt('cancel') - ); - return $form; - } - - /** - * @return array - * @todo handle generic isConfigured - */ - protected function getAvailableLanguagesOptions(): array - { - $languages = ilAdvancedMDRecordTranslations::getInstanceByRecordId($this->record->getRecordId()); - - $installed_languages = ilLanguage::_getInstalledLanguages(); - $options = []; - $options[''] = $this->language->txt('select_one'); - foreach ($installed_languages as $key => $language) { - if ($languages->isConfigured($language)) { - continue; - } - $options[$language] = $this->language->txt('meta_l_' . $language); - } - return $options; - } - - protected function saveAdditionalTranslations(): void - { - $form = $this->initCreateTranslationForm(); - if (!$form->checkInput()) { - $form->setValuesByPost(); - $this->tpl->setOnScreenMessage('failure', $this->language->txt('err_check_input')); - $this->addTranslations($form); - return; - } - foreach (array_unique((array) $form->getInput('languages')) as $language_code) { - $languages = ilAdvancedMDRecordTranslations::getInstanceByRecordId($this->record->getRecordId()); - $languages->addTranslationEntry($language_code); - } - - $this->tpl->setOnScreenMessage('success', $this->language->txt('settings_saved'), true); - $this->ctrl->redirect($this, self::CMD_DEFAULT); - } } From a27aa2478b6fbd1055dd2370d7caf009d31235c9 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Thu, 5 Nov 2026 16:06:09 +0100 Subject: [PATCH 4/7] adjust data retrieval cache and query methods for multilingualism table --- .../Record/Multilingualism/DataRetrieval.php | 28 +++++-------- ...class.ilAdvancedMDRecordTranslationGUI.php | 40 +++++++++++++------ 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php index 15de204ddbb3..500616a494cb 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php +++ b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php @@ -34,27 +34,22 @@ class DataRetrieval implements BaseDataRetrieval { protected ilAdvancedMDRecord $record; protected ilLanguage $lng; - protected ?ilAdvancedMDRecordTranslations $record_translations = null; - protected ?array $raw_data_cache = null; - protected ?array $all_ids_cache = null; + protected ilAdvancedMDRecordTranslations $record_translations; + /** @var array */ + protected array $raw_data_cache; + /** @var string[] */ + protected array $all_ids_cache; public function __construct( ilAdvancedMDRecord $record, - ilLanguage $lng + ilLanguage $lng, + ilAdvancedMDRecordTranslations $record_translations ) { $this->record = $record; $this->lng = $lng; + $this->record_translations = $record_translations; } - protected function getRecordTranslations(): ilAdvancedMDRecordTranslations - { - if ($this->record_translations === null) { - $this->record_translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId( - $this->record->getRecordId() - ); - } - return $this->record_translations; - } public function getRows( DataRowBuilder $row_builder, @@ -112,7 +107,7 @@ public function getTotalRowCount( public function getAllIDs(): array { - if ($this->all_ids_cache === null) { + if (!isset($this->all_ids_cache)) { $languages = ilObject::_getObjectsByType('lng'); $parsed_languages = []; foreach ($languages as $language) { @@ -126,10 +121,9 @@ public function getAllIDs(): array protected function getRawData(): array { - if ($this->raw_data_cache === null) { + if (!isset($this->raw_data_cache)) { $all_languages = $this->getAllIDs(); $installed_languages = ilLanguage::_getInstalledLanguages(); - $record_translations = $this->getRecordTranslations(); $default_language = $this->record->getDefaultLanguage(); $data = []; @@ -137,7 +131,7 @@ protected function getRawData(): array $data[$lang_code] = [ TableBuilder::COL_LANGUAGE => $this->lng->txt('meta_l_' . $lang_code), TableBuilder::COL_DEFAULT => ($lang_code === $default_language), - TableBuilder::COL_ACTIVE => $record_translations->isConfigured($lang_code), + TableBuilder::COL_ACTIVE => $this->record_translations->isConfigured($lang_code), TableBuilder::COL_INSTALLED => in_array($lang_code, $installed_languages) ]; } diff --git a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php index 843af3bab5d7..0bbc5ecdd8cc 100755 --- a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php @@ -34,6 +34,7 @@ class ilAdvancedMDRecordTranslationGUI { protected const CMD_DEFAULT = 'translations'; + protected const CMD_TABLE_ACTION = 'handleTableAction'; protected ilCtrl $ctrl; protected ilGlobalTemplateInterface $tpl; @@ -47,6 +48,7 @@ class ilAdvancedMDRecordTranslationGUI protected HTTP $http; protected RefineryFactory $refinery; protected DataFactory $data_factory; + protected ilAdvancedMDRecordTranslations $record_translations; public function __construct(ilAdvancedMDRecord $record) { @@ -65,6 +67,9 @@ public function __construct(ilAdvancedMDRecord $record) $this->http = $DIC->http(); $this->refinery = $DIC->refinery(); $this->data_factory = new DataFactory(); + $this->record_translations = ilAdvancedMDRecordTranslations::getInstanceByRecordId( + $this->record->getRecordId() + ); } /** @@ -87,7 +92,7 @@ public function executeCommand(): void case self::CMD_DEFAULT: $this->translations(); break; - case 'handleTableAction': + case self::CMD_TABLE_ACTION: $this->handleTableAction(); break; } @@ -106,7 +111,8 @@ protected function translations(): void $data_retrieval = new DataRetrieval( $this->record, - $this->language + $this->language, + $this->record_translations ); $table_builder = new TableBuilder( @@ -128,7 +134,7 @@ protected function getTableActionURLBuilder(): array { $link = ILIAS_HTTP_PATH . '/' . $this->ctrl->getLinkTargetByClass( ilAdvancedMDRecordTranslationGUI::class, - 'handleTableAction' + $this::CMD_TABLE_ACTION ); $url_builder = new URLBuilder($this->data_factory->uri($link)); @@ -138,7 +144,15 @@ protected function getTableActionURLBuilder(): array protected function getLanguageCodes(URLBuilderToken $id_token, DataRetrieval $data_retrieval): array { $parameter_name = $id_token->getName(); - $raw_ids = $this->getQueryParameter($parameter_name, true); + $wrapper = $this->http->wrapper()->query(); + + $raw_ids = null; + if ($wrapper->has($parameter_name)) { + $raw_ids = $wrapper->retrieve( + $parameter_name, + $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) + ); + } if ($raw_ids === ['ALL_OBJECTS']) { return $data_retrieval->getAllIDs(); @@ -147,29 +161,31 @@ protected function getLanguageCodes(URLBuilderToken $id_token, DataRetrieval $da return (array) ($raw_ids ?? []); } - protected function getQueryParameter(string $name, bool $is_list = false): mixed + protected function getTableActionFromQuery(URLBuilderToken $action_token): string { + $name = $action_token->getName(); $wrapper = $this->http->wrapper()->query(); if ($wrapper->has($name)) { - $refinery = $is_list ? - $this->refinery->kindlyTo()->listOf($this->refinery->kindlyTo()->string()) : - $this->refinery->kindlyTo()->string(); - return $wrapper->retrieve($name, $refinery); + return (string) $wrapper->retrieve( + $name, + $this->refinery->kindlyTo()->string() + ); } - return null; + return ''; } public function handleTableAction(): void { $data_retrieval = new DataRetrieval( $this->record, - $this->language + $this->language, + $this->record_translations ); [$url_builder, $id_token, $action_token] = $this->getTableActionURLBuilder(); $ids = $this->getLanguageCodes($id_token, $data_retrieval); - $action = $this->getQueryParameter($action_token->getName()); + $action = $this->getTableActionFromQuery($action_token); switch ($action) { case TableBuilder::ACTION_ACTIVATE: From 5b90d542ec4a3a02ebe70d90cef6dd45e92caa05 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Fri, 6 Nov 2026 20:09:08 +0100 Subject: [PATCH 5/7] adjust refactoring of the multilingualism table --- .../Record/Multilingualism/DataRetrieval.php | 32 ++++++++----------- .../Record/Multilingualism/TableBuilder.php | 10 +----- ...class.ilAdvancedMDRecordTranslationGUI.php | 20 ++++++------ .../classes/class.ilAdvancedMDSettingsGUI.php | 2 +- 4 files changed, 26 insertions(+), 38 deletions(-) diff --git a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php index 500616a494cb..23dcaaf36937 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php +++ b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/DataRetrieval.php @@ -35,8 +35,7 @@ class DataRetrieval implements BaseDataRetrieval protected ilAdvancedMDRecord $record; protected ilLanguage $lng; protected ilAdvancedMDRecordTranslations $record_translations; - /** @var array */ - protected array $raw_data_cache; + /** @var string[] */ protected array $all_ids_cache; @@ -121,22 +120,19 @@ public function getAllIDs(): array protected function getRawData(): array { - if (!isset($this->raw_data_cache)) { - $all_languages = $this->getAllIDs(); - $installed_languages = ilLanguage::_getInstalledLanguages(); - $default_language = $this->record->getDefaultLanguage(); - - $data = []; - foreach ($all_languages as $lang_code) { - $data[$lang_code] = [ - TableBuilder::COL_LANGUAGE => $this->lng->txt('meta_l_' . $lang_code), - TableBuilder::COL_DEFAULT => ($lang_code === $default_language), - TableBuilder::COL_ACTIVE => $this->record_translations->isConfigured($lang_code), - TableBuilder::COL_INSTALLED => in_array($lang_code, $installed_languages) - ]; - } - $this->raw_data_cache = $data; + $all_languages = $this->getAllIDs(); + $installed_languages = ilLanguage::_getInstalledLanguages(); + $default_language = $this->record->getDefaultLanguage(); + + $data = []; + foreach ($all_languages as $lang_code) { + $data[$lang_code] = [ + TableBuilder::COL_LANGUAGE => $this->lng->txt('meta_l_' . $lang_code), + TableBuilder::COL_DEFAULT => ($lang_code === $default_language), + TableBuilder::COL_ACTIVE => $this->record_translations->isConfigured($lang_code), + TableBuilder::COL_INSTALLED => in_array($lang_code, $installed_languages) + ]; } - return $this->raw_data_cache; + return $data; } } diff --git a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php index a7d91c9f46cb..4ebd5ee37794 100644 --- a/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php +++ b/components/ILIAS/AdvancedMetaData/classes/Record/Multilingualism/TableBuilder.php @@ -26,12 +26,6 @@ use ILIAS\HTTP\Services as HTTP; use ILIAS\UI\URLBuilder; use ILIAS\UI\URLBuilderToken; -use ilCtrl; -use ILIAS\Data\URI; -use ILIAS\UI\Component\Symbol\Icon\Icon; -use ilAdvancedMDRecordTranslationGUI; -use ILIAS\Data\Range; -use ILIAS\Data\Factory as DataFactory; class TableBuilder { @@ -48,9 +42,7 @@ public function __construct( protected DataRetrieval $data_retrieval, protected ilLanguage $lng, protected UIFactory $ui_factory, - protected HTTP $http, - protected ilCtrl $ctrl, - protected DataFactory $data_factory + protected HTTP $http ) { } diff --git a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php index 0bbc5ecdd8cc..613fccd4648a 100755 --- a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php @@ -19,7 +19,6 @@ declare(strict_types=1); use ilLanguage; -use ilSelectInputGUI; use Psr\Http\Message\RequestInterface; use ILIAS\HTTP\Services as HTTP; use ILIAS\Data\Factory as DataFactory; @@ -31,10 +30,13 @@ use ILIAS\UI\URLBuilder; use ILIAS\UI\URLBuilderToken; +/** + * @ilCtrl_IsCalledBy ilAdvancedMDRecordTranslationGUI: ilAdvancedMDSettingsGUI + */ class ilAdvancedMDRecordTranslationGUI { - protected const CMD_DEFAULT = 'translations'; - protected const CMD_TABLE_ACTION = 'handleTableAction'; + protected const string CMD_DEFAULT = 'translations'; + protected const string CMD_TABLE_ACTION = 'handleTableAction'; protected ilCtrl $ctrl; protected ilGlobalTemplateInterface $tpl; @@ -119,9 +121,7 @@ protected function translations(): void $data_retrieval, $this->language, $this->ui_factory, - $this->http, - $this->ctrl, - $this->data_factory + $this->http ); [$url_builder, $id_token, $action_token] = $this->getTableActionURLBuilder(); @@ -141,7 +141,7 @@ protected function getTableActionURLBuilder(): array return $url_builder->acquireParameters(['advmd_ml'], 'table_ids', 'table_action'); } - protected function getLanguageCodes(URLBuilderToken $id_token, DataRetrieval $data_retrieval): array + protected function getLanguageCodesFromQuery(URLBuilderToken $id_token, DataRetrieval $data_retrieval): array { $parameter_name = $id_token->getName(); $wrapper = $this->http->wrapper()->query(); @@ -158,7 +158,7 @@ protected function getLanguageCodes(URLBuilderToken $id_token, DataRetrieval $da return $data_retrieval->getAllIDs(); } - return (array) ($raw_ids ?? []); + return $raw_ids ?? []; } protected function getTableActionFromQuery(URLBuilderToken $action_token): string @@ -184,7 +184,7 @@ public function handleTableAction(): void $this->record_translations ); [$url_builder, $id_token, $action_token] = $this->getTableActionURLBuilder(); - $ids = $this->getLanguageCodes($id_token, $data_retrieval); + $ids = $this->getLanguageCodesFromQuery($id_token, $data_retrieval); $action = $this->getTableActionFromQuery($action_token); switch ($action) { @@ -208,7 +208,7 @@ protected function activate(array $lang_keys): void foreach ($lang_keys as $lang_key) { if (!$translations->isConfigured($lang_key)) { - $translations->addTranslationEntry($lang_key, false); + $translations->addTranslationEntry($lang_key); } } diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php index dd56591747b1..5a2b535bb080 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php @@ -27,7 +27,7 @@ /** * @author Stefan Meyer - * @ilCtrl_Calls ilAdvancedMDSettingsGUI: ilPropertyFormGUI, ilAdvancedMDRecordTranslationGUI + * @ilCtrl_Calls ilAdvancedMDSettingsGUI: ilPropertyFormGUI * @ilCtrl_Calls ilAdvancedMDSettingsGUI: ilAdvancedMDFieldDefinitionGUI * @ingroup ServicesAdvancedMetaData */ From 07f8d6b0c3d5c1fbf05e44f606e82667247a725a Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Mon, 9 Nov 2026 16:00:06 +0100 Subject: [PATCH 6/7] add lng variables # Conflicts: # lang/ilias_de.lang # lang/ilias_en.lang --- .../Translation/class.ilAdvancedMDRecordTranslationGUI.php | 1 - .../AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php | 1 - 2 files changed, 2 deletions(-) diff --git a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php index 613fccd4648a..e97f0fadc080 100755 --- a/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/Translation/class.ilAdvancedMDRecordTranslationGUI.php @@ -18,7 +18,6 @@ declare(strict_types=1); -use ilLanguage; use Psr\Http\Message\RequestInterface; use ILIAS\HTTP\Services as HTTP; use ILIAS\Data\Factory as DataFactory; diff --git a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php index 5a2b535bb080..890362731cde 100755 --- a/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php +++ b/components/ILIAS/AdvancedMetaData/classes/class.ilAdvancedMDSettingsGUI.php @@ -28,7 +28,6 @@ /** * @author Stefan Meyer * @ilCtrl_Calls ilAdvancedMDSettingsGUI: ilPropertyFormGUI - * @ilCtrl_Calls ilAdvancedMDSettingsGUI: ilAdvancedMDFieldDefinitionGUI * @ingroup ServicesAdvancedMetaData */ class ilAdvancedMDSettingsGUI From 160493741c5199ef2ba6dbd73a32ff01ed649655 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Mon, 9 Nov 2026 17:06:15 +0100 Subject: [PATCH 7/7] fix lng variables --- components/ILIAS/MetaData/lang/meta_de.po | 9 +++++++++ components/ILIAS/MetaData/lang/meta_en.po | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/components/ILIAS/MetaData/lang/meta_de.po b/components/ILIAS/MetaData/lang/meta_de.po index 0eea03005ec7..f3b39db67bca 100644 --- a/components/ILIAS/MetaData/lang/meta_de.po +++ b/components/ILIAS/MetaData/lang/meta_de.po @@ -143,9 +143,15 @@ msgstr "Datensätze" msgid "md_adv_record_lng_table" msgstr "Sprachenverwaltung" +msgid "md_adv_record_lng_table_activate" +msgstr "Aktivieren" + msgid "md_adv_record_lng_table_active" msgstr "Aktiv" +msgid "md_adv_record_lng_table_deactivate" +msgstr "Deaktivieren" + msgid "md_adv_record_lng_table_default" msgstr "Default" @@ -155,6 +161,9 @@ msgstr "Installiert" msgid "md_adv_record_lng_table_lng" msgstr "Sprache" +msgid "md_adv_record_lng_table_set_default" +msgstr "Als Standard festlegen" + msgid "md_adv_records" msgstr "Enthaltene Datensätze" diff --git a/components/ILIAS/MetaData/lang/meta_en.po b/components/ILIAS/MetaData/lang/meta_en.po index 334b927388a5..319c2acb98a8 100644 --- a/components/ILIAS/MetaData/lang/meta_en.po +++ b/components/ILIAS/MetaData/lang/meta_en.po @@ -143,9 +143,15 @@ msgstr "Data Sets" msgid "md_adv_record_lng_table" msgstr "Language Management" +msgid "md_adv_record_lng_table_activate" +msgstr "Activate" + msgid "md_adv_record_lng_table_active" msgstr "Active" +msgid "md_adv_record_lng_table_deactivate" +msgstr "Deactivate" + msgid "md_adv_record_lng_table_default" msgstr "Default" @@ -155,6 +161,9 @@ msgstr "Installed" msgid "md_adv_record_lng_table_lng" msgstr "Language" +msgid "md_adv_record_lng_table_set_default" +msgstr "Set As Default" + msgid "md_adv_records" msgstr "Data Sets"