diff options
Diffstat (limited to 'app/controllers/module/module.php')
| -rw-r--r-- | app/controllers/module/module.php | 184 |
1 files changed, 135 insertions, 49 deletions
diff --git a/app/controllers/module/module.php b/app/controllers/module/module.php index 10674d0..7ced003 100644 --- a/app/controllers/module/module.php +++ b/app/controllers/module/module.php @@ -105,6 +105,20 @@ class Module_ModuleController extends MVVController $this->setSidebar(); } + public function select_module_language_action() + { + $this->languages = []; + foreach (Config::get()->CONTENT_LANGUAGES as $language_code => $language) { + $code = strtok($language_code, '_'); + $this->languages[] = [ + 'name' => $language['name'], + 'code' => $language_code, + 'picture' => "lang_{$code}_text.svg", + ]; + }; + PageLayout::setTitle(_('Sprache wählen')); + } + public function modul_action($modul_id = null, $institut_id = null) { $own_institutes = MvvPerm::getOwnInstitutes(); @@ -133,13 +147,20 @@ class Module_ModuleController extends MVVController if ($this->modul->isNew()) { PageLayout::setTitle(_('Neues Modul anlegen')); $success_message = ('Das Modul "%s" wurde angelegt.'); - $this->display_language = $this->modul->getDefaultLanguage(); - $this->deskriptor = $this->modul->getDeskriptor($this->display_language, true); + $language = Request::option('display_language'); + $content_languages = Config::get()->CONTENT_LANGUAGES; + if (!empty($content_languages[$language])) { + $this->display_language = $language; + } else { + $this->display_language = Config::get()->MVV_DEFAULT_LANGUAGE; + } + $this->modul->original_language = $this->display_language; + $this->deskriptor = $this->modul->getDeskriptor(); $this->reset_search('Modul'); if (!$modul_id) { PageLayout::postInfo(sprintf( - _('Sie legen ein neues Modul an. Das Modul muss zunächst in der Ausgabesprache <em>%s</em> angelegt werden.'), - $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'] + _('Sie legen ein neues Modul an. Das Modul wird zunächst in der Ausgabesprache <em>%s</em> angelegt (Originalsprache).'), + Config::get()->CONTENT_LANGUAGES[$this->display_language]['name'] )); } // set default language of instruction @@ -151,17 +172,17 @@ class Module_ModuleController extends MVVController } else { $this->display_language = Request::option( 'display_language', - $this->modul->getDefaultLanguage() + $this->modul->original_language ); - $this->deskriptor = $this->modul->getDeskriptor($this->display_language, true); - $this->translations = $this->deskriptor->getAvailableTranslations(); + $this->deskriptor = $this->modul->getDeskriptor(); + $this->translations = $this->deskriptor->getAvailableTranslations($this->modul->original_language); if (!in_array($this->display_language, $this->translations)) { PageLayout::setTitle( sprintf( _('Modul: <em>%s</em> in der Ausgabesprache <em>%s</em> neu anlegen.'), $this->modul->getDisplayName(), - $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'] + Config::get()->CONTENT_LANGUAGE[$this->display_language]['name'] ) ); } else { @@ -173,15 +194,18 @@ class Module_ModuleController extends MVVController $success_message = _('Das Modul "%s" wurde geändert.'); // language selector as sidebar widget $template_factory = $this->get_template_factory(); - $sidebar_template = $template_factory->render('shared/deskriptor_language', [ - 'modul' => $this->modul, - 'sprache' => $this->display_language, - 'link' => $this->modulURL($this->modul->id, $this->institut_id), - 'url' => $this->url] + $sidebar_template = $template_factory->render( + 'shared/deskriptor_language', + [ + 'original_language' => $this->modul->original_language, + 'display_language' => $this->display_language, + 'descriptor' => $this->modul->deskriptoren, + 'link' => $this->modulURL($this->modul->id, $this->institut_id), + ] ); $widget = new SidebarWidget(); - $widget->setTitle(_('Ausgabesprache')); + $widget->setTitle(_('Ausgabesprache wählen')); $widget->addElement(new WidgetElement($sidebar_template)); $sidebar->addWidget($widget, 'language'); @@ -235,9 +259,11 @@ class Module_ModuleController extends MVVController $sidebar->addWidget($widget, 'variants'); } } + $this->semester = array_reverse(Semester::getAll()); - $this->def_lang = $this->display_language === $this->modul->getDefaultLanguage(); - ModuleManagementModel::setContentLanguage($this->display_language); + $this->def_lang = $this->display_language === $this->modul->original_language; + I18NString::setDefaultLanguage($this->modul->original_language); + I18NString::setContentLanguage($this->display_language); if (!$this->def_lang) { $action_widget = $sidebar->getWidget('actions'); $action_widget->addLink( @@ -247,7 +273,6 @@ class Module_ModuleController extends MVVController ); } - $this->language = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['content_language']; if (Request::isPost()) { CSRFProtection::verifyUnsafeRequest(); $stored = false; @@ -279,6 +304,13 @@ class Module_ModuleController extends MVVController $this->modul->fassung_typ = Request::option('fassung_typ'); $this->modul->version = trim(Request::get('version')); $this->modul->verantwortlich = trim(Request::get('verantwortlich')); + // change original language + if ( + !$this->modul->isNew() + && $this->modul->original_language !== Request::option('original_language') + ) { + $this->setOriginalLanguage($this->modul, Request::option('original_language')); + } } $deskriptor_fields = ['bezeichnung', 'verantwortlich', @@ -290,10 +322,16 @@ class Module_ModuleController extends MVVController foreach ($deskriptor_fields as $deskriptor_field) { if ($this->deskriptor->isI18nField($deskriptor_field)) { - $this->deskriptor->$deskriptor_field->setLocalized( - trim(Request::get($deskriptor_field)), - $this->language - ); + if ($this->display_language === $this->modul->original_language) { + $this->deskriptor->$deskriptor_field->setOriginal( + trim(Request::get($deskriptor_field)) + ); + } else { + $this->deskriptor->$deskriptor_field->setLocalized( + trim(Request::get($deskriptor_field)), + $this->display_language + ); + } } else { $this->deskriptor->setValue( $deskriptor_field, @@ -307,7 +345,7 @@ class Module_ModuleController extends MVVController $df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key); if ($df) { $tdf = $df->getTypedDatafield(); - $tdf->setContentLanguage($this->language); + $tdf->setContentLanguage($this->display_language); $tdf->setValueFromSubmit($df_value); $tdf->store(); } @@ -652,29 +690,31 @@ class Module_ModuleController extends MVVController if ($this->modulteil->isNew()) { PageLayout::setTitle(_('Neuen Modulteil anlegen')); $success_message = ('Der Modulteil "%s" wurde angelegt.'); - $this->display_language = $this->modulteil->getDefaultLanguage(); - $this->deskriptor = $this->modulteil->getDeskriptor($this->display_language, true); + $this->display_language = Request::option( + 'display_language', + $this->modul->original_language + ); + $this->deskriptor = $this->modulteil->getDeskriptor(); PageLayout::postInfo(sprintf( _('Sie legen einen neuen Modulteil für das Modul <em>%s</em> an. Der Modulteil muss zunächst in der Ausgabesprache <em>%s</em> angelegt werden.'), htmlReady($this->modul->getDisplayName()), - htmlReady($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name']) + htmlReady(Config::get()->MVV_MODUL_DESKRIPTOR['SPRACHE']['values'][$this->display_language]['name']) )); // set default language of instruction - if ($GLOBALS['MVV_MODULTEIL']['SPRACHE']['default']) { + if (Config::get()->MVV_MODULTEIL['SPRACHE']['default']) { $this->modulteil->assignLanguagesOfInstruction([ - $GLOBALS['MVV_MODULTEIL']['SPRACHE']['default'] + Config::get()->MVV_MODULTEIL['SPRACHE']['default'] ]); } } else { - $this->display_language = Request::option('display_language', $this->modulteil->getDefaultLanguage()); - $this->deskriptor = $this->modulteil->getDeskriptor($this->display_language, true); - $this->translations = $this->deskriptor->getAvailableTranslations(); - + $this->display_language = Request::option('display_language', $this->modul->original_language); + $this->deskriptor = $this->modulteil->getDeskriptor(); + $this->translations = $this->deskriptor->getAvailableTranslations($this->modul->original_language); if (!in_array($this->display_language, $this->translations)) { PageLayout::setTitle(sprintf( _('Modulteil: "%s" in der Ausgabesprache "%s" neu anlegen.'), $this->modulteil->getDisplayName(), - $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'] + Config::get()->CONTENT_LANGUAGES[$this->display_language]['name'] )); } else { PageLayout::setTitle(sprintf(_('Modulteil: %s'), htmlReady($this->modulteil->getDisplayName()))); @@ -688,10 +728,10 @@ class Module_ModuleController extends MVVController $widget_element = new WidgetElement( $template_factory->render('shared/deskriptor_language', [ - 'modul' => $this->modulteil, - 'sprache' => $this->display_language, - 'link' => $this->modulteilURL($this->modulteil->id), - 'url' => $this->url + 'descriptor' => $this->modulteil->deskriptoren, + 'display_language' => $this->display_language, + 'original_language' => $this->modul->original_language, + 'link' => $this->modulteilURL($this->modulteil->id), ] ) ); @@ -699,7 +739,9 @@ class Module_ModuleController extends MVVController $sidebar->addWidget($widget, 'languages'); } - $this->def_lang = $this->display_language === $this->modulteil->getDefaultLanguage(); + $this->def_lang = $this->display_language === $this->modul->original_language; + I18NString::setDefaultLanguage($this->modul->original_language); + I18NString::setContentLanguage($this->display_language); if (!$this->def_lang) { $action_widget = $sidebar->getWidget('actions'); @@ -711,7 +753,6 @@ class Module_ModuleController extends MVVController ); } - $this->language = $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['content_language']; if (Request::submitted('store')) { CSRFProtection::verifyUnsafeRequest(); $stored = false; @@ -748,12 +789,21 @@ class Module_ModuleController extends MVVController foreach ($deskriptor_fields as $deskriptor_field) { if ($this->deskriptor->isI18nField($deskriptor_field)) { - $this->deskriptor->$deskriptor_field->setLocalized( - trim(Request::get($deskriptor_field)), - $this->language - ); + if ($this->display_language === $this->modul->original_language) { + $this->deskriptor->$deskriptor_field->setOriginal( + trim(Request::get($deskriptor_field)) + ); + } else { + $this->deskriptor->$deskriptor_field->setLocalized( + trim(Request::get($deskriptor_field)), + $this->display_language + ); + } } else { - $this->deskriptor->setValue($deskriptor_field, trim(Request::get($deskriptor_field))); + $this->deskriptor->setValue( + $deskriptor_field, + trim(Request::get($deskriptor_field)) + ); } } @@ -762,7 +812,7 @@ class Module_ModuleController extends MVVController $df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key); if ($df) { $tdf = $df->getTypedDatafield(); - $tdf->setContentLanguage($this->language); + $tdf->setContentLanguage($this->display_language); $tdf->setValueFromSubmit($df_value); $tdf->store(); } @@ -795,11 +845,11 @@ class Module_ModuleController extends MVVController return; } } - if ($this->display_language !== $this->modulteil->getDefaultLanguage() && $this->deskriptor->isNew()) { + if ($this->display_language !== $this->modul->original_language && $this->deskriptor->isNew()) { PageLayout::postInfo(sprintf( _('Neue Beschreibung zum Modulteil "%s" in der Ausgabesprache %s anlegen.'), htmlReady($this->modulteil->getDisplayName()), - htmlReady($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name']) + htmlReady(Config::get()->CONTENT_LANGUAGES[$this->display_language]['name']) )); } $this->cancel_url = $this->detailsURL($this->modulteil->modul_id); @@ -828,7 +878,7 @@ class Module_ModuleController extends MVVController if (is_null($deskriptor)) { throw new Trails\Exception(404, _('Unbekannter Deskriptor')); } - $def_lang = $deskriptor->modulteil->getDefaultLanguage(); + $def_lang = $deskriptor->modulteil->modul->original_language; if ($language === $def_lang) { throw new Trails\Exception(403, _('Ein Deskriptor in der Original-Sprache kann nicht gelöscht werden.')); } @@ -1348,9 +1398,9 @@ class Module_ModuleController extends MVVController if (MvvPerm::havePermCreate('Modul')) { $widget->addLink( _('Neues Modul anlegen'), - $this->modulURL(), + $this->select_module_languageURL(), Icon::create('add') - ); + )->asDialog('size=600x300'); } $sidebar->addWidget($widget, 'actions'); @@ -1573,4 +1623,40 @@ class Module_ModuleController extends MVVController WHERE `mvv_studiengang`.`abschluss_id` = ?"; return DBManager::get()->fetchFirst($query, [$abschluss_id]); } + + private function setOriginalLanguage(Modul $module, string $original_language): void + { + $content_language = Config::get()->CONTENT_LANGUAGES[$original_language]; + if (empty($content_language)) { + throw new InvalidArgumentException("Original language $original_language is not defined"); + } + if ($module->deskriptoren) { + $current_language = $module->original_language; + $module->original_language = $original_language; + DBManager::get()->execute(" + UPDATE `i18n` + SET `lang` = ? + WHERE `object_id` = ? + AND `table` = 'mvv_modul_deskriptor' + AND `lang` = ?", + [ + $original_language, + $module->deskriptoren->id, + $current_language + ]); + $module->modulteile->each(fn($component) => DBManager::get()->execute(" + UPDATE `i18n` + SET `lang` = ? + WHERE `object_id` IN (?) + AND `table` = 'mvv_modulteil_deskriptor' + AND `lang` = ?", + [ + $original_language, + $module->deskriptoren->id, + $current_language + ] + ) + ); + } + } } |
