Skip to content
Snippets Groups Projects
Commit fcc7482d authored by David Siegfried's avatar David Siegfried
Browse files

Resolve "Sprachauswahl für Originalfassung der Modul(teil)-Deskriptoren", fixes #4261

parent 96fa5cde
Branches
No related tags found
No related merge requests found
Showing
with 420 additions and 205 deletions
...@@ -10,14 +10,15 @@ class Module_DownloadController extends MVVController ...@@ -10,14 +10,15 @@ class Module_DownloadController extends MVVController
public function details_action($modul_id, $language = null) public function details_action($modul_id, $language = null)
{ {
$language = Request::get('display_language', $language);
ModuleManagementModel::setLanguage($language);
$modul = Modul::find($modul_id); $modul = Modul::find($modul_id);
if (!$modul) { if (!$modul) {
throw new Exception(_('Ungültiges Modul')); throw new Exception(_('Ungültiges Modul'));
} }
$this->getDetails($modul_id, $language); $language = Request::get('display_language', $language) ?? $modul->original_language;
I18NString::setDefaultLanguage($modul->original_language);
I18NString::setContentLanguage($language);
$this->getDetails($modul_id);
$this->download = true; $this->download = true;
$as_pdf = Request::int('pdf'); $as_pdf = Request::int('pdf');
...@@ -51,7 +52,7 @@ class Module_DownloadController extends MVVController ...@@ -51,7 +52,7 @@ class Module_DownloadController extends MVVController
} }
} }
private function getDetails($id, $language = null) private function getDetails($id)
{ {
$modul = Modul::find($id); $modul = Modul::find($id);
if (!$modul) { if (!$modul) {
...@@ -81,7 +82,7 @@ class Module_DownloadController extends MVVController ...@@ -81,7 +82,7 @@ class Module_DownloadController extends MVVController
$modulTeilData = []; $modulTeilData = [];
foreach ($modul->modulteile as $modulTeil) { foreach ($modul->modulteile as $modulTeil) {
$deskriptor = $modulTeil->getDeskriptor($language); $deskriptor = $modulTeil->getDeskriptor();
$num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulTeil->num_bezeichnung]['name'] ?? ''; $num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulTeil->num_bezeichnung]['name'] ?? '';
$name_kurz = sprintf('%s %d', $num_bezeichnung, $modulTeil->nummer); $name_kurz = sprintf('%s %d', $num_bezeichnung, $modulTeil->nummer);
...@@ -134,7 +135,7 @@ class Module_DownloadController extends MVVController ...@@ -134,7 +135,7 @@ class Module_DownloadController extends MVVController
$this->semesterSelector = Semester::GetSemesterSelector(null, $currentSemester->getId(), 'semester_id', false); $this->semesterSelector = Semester::GetSemesterSelector(null, $currentSemester->getId(), 'semester_id', false);
$this->modul = $modul; $this->modul = $modul;
$this->pruefungsEbene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name'] ?? null; $this->pruefungsEbene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name'] ?? null;
$this->modulDeskriptor = $modul->getDeskriptor($language); $this->modulDeskriptor = $modul->getDeskriptor();
$this->startSemester = Semester::find($modul->start); $this->startSemester = Semester::find($modul->start);
if ($modul->responsible_institute->institute) { if ($modul->responsible_institute->institute) {
$this->instituteName = $modul->responsible_institute->getDisplayName(); $this->instituteName = $modul->responsible_institute->getDisplayName();
......
...@@ -105,6 +105,20 @@ class Module_ModuleController extends MVVController ...@@ -105,6 +105,20 @@ class Module_ModuleController extends MVVController
$this->setSidebar(); $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) public function modul_action($modul_id = null, $institut_id = null)
{ {
$own_institutes = MvvPerm::getOwnInstitutes(); $own_institutes = MvvPerm::getOwnInstitutes();
...@@ -133,13 +147,20 @@ class Module_ModuleController extends MVVController ...@@ -133,13 +147,20 @@ class Module_ModuleController extends MVVController
if ($this->modul->isNew()) { if ($this->modul->isNew()) {
PageLayout::setTitle(_('Neues Modul anlegen')); PageLayout::setTitle(_('Neues Modul anlegen'));
$success_message = ('Das Modul "%s" wurde angelegt.'); $success_message = ('Das Modul "%s" wurde angelegt.');
$this->display_language = $this->modul->getDefaultLanguage(); $language = Request::option('display_language');
$this->deskriptor = $this->modul->getDeskriptor($this->display_language, true); $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'); $this->reset_search('Modul');
if (!$modul_id) { if (!$modul_id) {
PageLayout::postInfo(sprintf( PageLayout::postInfo(sprintf(
_('Sie legen ein neues Modul an. Das Modul muss zunächst in der Ausgabesprache <em>%s</em> angelegt werden.'), _('Sie legen ein neues Modul an. Das Modul wird zunächst in der Ausgabesprache <em>%s</em> angelegt (Originalsprache).'),
$GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'] Config::get()->CONTENT_LANGUAGES[$this->display_language]['name']
)); ));
} }
// set default language of instruction // set default language of instruction
...@@ -151,17 +172,17 @@ class Module_ModuleController extends MVVController ...@@ -151,17 +172,17 @@ class Module_ModuleController extends MVVController
} else { } else {
$this->display_language = Request::option( $this->display_language = Request::option(
'display_language', 'display_language',
$this->modul->getDefaultLanguage() $this->modul->original_language
); );
$this->deskriptor = $this->modul->getDeskriptor($this->display_language, true); $this->deskriptor = $this->modul->getDeskriptor();
$this->translations = $this->deskriptor->getAvailableTranslations(); $this->translations = $this->deskriptor->getAvailableTranslations($this->modul->original_language);
if (!in_array($this->display_language, $this->translations)) { if (!in_array($this->display_language, $this->translations)) {
PageLayout::setTitle( PageLayout::setTitle(
sprintf( sprintf(
_('Modul: <em>%s</em> in der Ausgabesprache <em>%s</em> neu anlegen.'), _('Modul: <em>%s</em> in der Ausgabesprache <em>%s</em> neu anlegen.'),
$this->modul->getDisplayName(), $this->modul->getDisplayName(),
$GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'] Config::get()->CONTENT_LANGUAGE[$this->display_language]['name']
) )
); );
} else { } else {
...@@ -173,15 +194,18 @@ class Module_ModuleController extends MVVController ...@@ -173,15 +194,18 @@ class Module_ModuleController extends MVVController
$success_message = _('Das Modul "%s" wurde geändert.'); $success_message = _('Das Modul "%s" wurde geändert.');
// language selector as sidebar widget // language selector as sidebar widget
$template_factory = $this->get_template_factory(); $template_factory = $this->get_template_factory();
$sidebar_template = $template_factory->render('shared/deskriptor_language', [ $sidebar_template = $template_factory->render(
'modul' => $this->modul, 'shared/deskriptor_language',
'sprache' => $this->display_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), 'link' => $this->modulURL($this->modul->id, $this->institut_id),
'url' => $this->url] ]
); );
$widget = new SidebarWidget(); $widget = new SidebarWidget();
$widget->setTitle(_('Ausgabesprache')); $widget->setTitle(_('Ausgabesprache wählen'));
$widget->addElement(new WidgetElement($sidebar_template)); $widget->addElement(new WidgetElement($sidebar_template));
$sidebar->addWidget($widget, 'language'); $sidebar->addWidget($widget, 'language');
...@@ -235,9 +259,11 @@ class Module_ModuleController extends MVVController ...@@ -235,9 +259,11 @@ class Module_ModuleController extends MVVController
$sidebar->addWidget($widget, 'variants'); $sidebar->addWidget($widget, 'variants');
} }
} }
$this->semester = array_reverse(Semester::getAll()); $this->semester = array_reverse(Semester::getAll());
$this->def_lang = $this->display_language === $this->modul->getDefaultLanguage(); $this->def_lang = $this->display_language === $this->modul->original_language;
ModuleManagementModel::setContentLanguage($this->display_language); I18NString::setDefaultLanguage($this->modul->original_language);
I18NString::setContentLanguage($this->display_language);
if (!$this->def_lang) { if (!$this->def_lang) {
$action_widget = $sidebar->getWidget('actions'); $action_widget = $sidebar->getWidget('actions');
$action_widget->addLink( $action_widget->addLink(
...@@ -247,7 +273,6 @@ class Module_ModuleController extends MVVController ...@@ -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()) { if (Request::isPost()) {
CSRFProtection::verifyUnsafeRequest(); CSRFProtection::verifyUnsafeRequest();
$stored = false; $stored = false;
...@@ -279,6 +304,13 @@ class Module_ModuleController extends MVVController ...@@ -279,6 +304,13 @@ class Module_ModuleController extends MVVController
$this->modul->fassung_typ = Request::option('fassung_typ'); $this->modul->fassung_typ = Request::option('fassung_typ');
$this->modul->version = trim(Request::get('version')); $this->modul->version = trim(Request::get('version'));
$this->modul->verantwortlich = trim(Request::get('verantwortlich')); $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', $deskriptor_fields = ['bezeichnung', 'verantwortlich',
...@@ -290,10 +322,16 @@ class Module_ModuleController extends MVVController ...@@ -290,10 +322,16 @@ class Module_ModuleController extends MVVController
foreach ($deskriptor_fields as $deskriptor_field) { foreach ($deskriptor_fields as $deskriptor_field) {
if ($this->deskriptor->isI18nField($deskriptor_field)) { if ($this->deskriptor->isI18nField($deskriptor_field)) {
if ($this->display_language === $this->modul->original_language) {
$this->deskriptor->$deskriptor_field->setOriginal(
trim(Request::get($deskriptor_field))
);
} else {
$this->deskriptor->$deskriptor_field->setLocalized( $this->deskriptor->$deskriptor_field->setLocalized(
trim(Request::get($deskriptor_field)), trim(Request::get($deskriptor_field)),
$this->language $this->display_language
); );
}
} else { } else {
$this->deskriptor->setValue( $this->deskriptor->setValue(
$deskriptor_field, $deskriptor_field,
...@@ -307,7 +345,7 @@ class Module_ModuleController extends MVVController ...@@ -307,7 +345,7 @@ class Module_ModuleController extends MVVController
$df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key); $df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key);
if ($df) { if ($df) {
$tdf = $df->getTypedDatafield(); $tdf = $df->getTypedDatafield();
$tdf->setContentLanguage($this->language); $tdf->setContentLanguage($this->display_language);
$tdf->setValueFromSubmit($df_value); $tdf->setValueFromSubmit($df_value);
$tdf->store(); $tdf->store();
} }
...@@ -652,29 +690,31 @@ class Module_ModuleController extends MVVController ...@@ -652,29 +690,31 @@ class Module_ModuleController extends MVVController
if ($this->modulteil->isNew()) { if ($this->modulteil->isNew()) {
PageLayout::setTitle(_('Neuen Modulteil anlegen')); PageLayout::setTitle(_('Neuen Modulteil anlegen'));
$success_message = ('Der Modulteil "%s" wurde angelegt.'); $success_message = ('Der Modulteil "%s" wurde angelegt.');
$this->display_language = $this->modulteil->getDefaultLanguage(); $this->display_language = Request::option(
$this->deskriptor = $this->modulteil->getDeskriptor($this->display_language, true); 'display_language',
$this->modul->original_language
);
$this->deskriptor = $this->modulteil->getDeskriptor();
PageLayout::postInfo(sprintf( 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.'), _('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($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 // set default language of instruction
if ($GLOBALS['MVV_MODULTEIL']['SPRACHE']['default']) { if (Config::get()->MVV_MODULTEIL['SPRACHE']['default']) {
$this->modulteil->assignLanguagesOfInstruction([ $this->modulteil->assignLanguagesOfInstruction([
$GLOBALS['MVV_MODULTEIL']['SPRACHE']['default'] Config::get()->MVV_MODULTEIL['SPRACHE']['default']
]); ]);
} }
} else { } else {
$this->display_language = Request::option('display_language', $this->modulteil->getDefaultLanguage()); $this->display_language = Request::option('display_language', $this->modul->original_language);
$this->deskriptor = $this->modulteil->getDeskriptor($this->display_language, true); $this->deskriptor = $this->modulteil->getDeskriptor();
$this->translations = $this->deskriptor->getAvailableTranslations(); $this->translations = $this->deskriptor->getAvailableTranslations($this->modul->original_language);
if (!in_array($this->display_language, $this->translations)) { if (!in_array($this->display_language, $this->translations)) {
PageLayout::setTitle(sprintf( PageLayout::setTitle(sprintf(
_('Modulteil: "%s" in der Ausgabesprache "%s" neu anlegen.'), _('Modulteil: "%s" in der Ausgabesprache "%s" neu anlegen.'),
$this->modulteil->getDisplayName(), $this->modulteil->getDisplayName(),
$GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$this->display_language]['name'] Config::get()->CONTENT_LANGUAGES[$this->display_language]['name']
)); ));
} else { } else {
PageLayout::setTitle(sprintf(_('Modulteil: %s'), htmlReady($this->modulteil->getDisplayName()))); PageLayout::setTitle(sprintf(_('Modulteil: %s'), htmlReady($this->modulteil->getDisplayName())));
...@@ -688,10 +728,10 @@ class Module_ModuleController extends MVVController ...@@ -688,10 +728,10 @@ class Module_ModuleController extends MVVController
$widget_element = new WidgetElement( $widget_element = new WidgetElement(
$template_factory->render('shared/deskriptor_language', $template_factory->render('shared/deskriptor_language',
[ [
'modul' => $this->modulteil, 'descriptor' => $this->modulteil->deskriptoren,
'sprache' => $this->display_language, 'display_language' => $this->display_language,
'original_language' => $this->modul->original_language,
'link' => $this->modulteilURL($this->modulteil->id), 'link' => $this->modulteilURL($this->modulteil->id),
'url' => $this->url
] ]
) )
); );
...@@ -699,7 +739,9 @@ class Module_ModuleController extends MVVController ...@@ -699,7 +739,9 @@ class Module_ModuleController extends MVVController
$sidebar->addWidget($widget, 'languages'); $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) { if (!$this->def_lang) {
$action_widget = $sidebar->getWidget('actions'); $action_widget = $sidebar->getWidget('actions');
...@@ -711,7 +753,6 @@ class Module_ModuleController extends MVVController ...@@ -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')) { if (Request::submitted('store')) {
CSRFProtection::verifyUnsafeRequest(); CSRFProtection::verifyUnsafeRequest();
$stored = false; $stored = false;
...@@ -748,12 +789,21 @@ class Module_ModuleController extends MVVController ...@@ -748,12 +789,21 @@ class Module_ModuleController extends MVVController
foreach ($deskriptor_fields as $deskriptor_field) { foreach ($deskriptor_fields as $deskriptor_field) {
if ($this->deskriptor->isI18nField($deskriptor_field)) { if ($this->deskriptor->isI18nField($deskriptor_field)) {
if ($this->display_language === $this->modul->original_language) {
$this->deskriptor->$deskriptor_field->setOriginal(
trim(Request::get($deskriptor_field))
);
} else {
$this->deskriptor->$deskriptor_field->setLocalized( $this->deskriptor->$deskriptor_field->setLocalized(
trim(Request::get($deskriptor_field)), trim(Request::get($deskriptor_field)),
$this->language $this->display_language
); );
}
} else { } 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 ...@@ -762,7 +812,7 @@ class Module_ModuleController extends MVVController
$df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key); $df = $this->deskriptor->datafields->findOneBy('datafield_id', $df_key);
if ($df) { if ($df) {
$tdf = $df->getTypedDatafield(); $tdf = $df->getTypedDatafield();
$tdf->setContentLanguage($this->language); $tdf->setContentLanguage($this->display_language);
$tdf->setValueFromSubmit($df_value); $tdf->setValueFromSubmit($df_value);
$tdf->store(); $tdf->store();
} }
...@@ -795,11 +845,11 @@ class Module_ModuleController extends MVVController ...@@ -795,11 +845,11 @@ class Module_ModuleController extends MVVController
return; 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( PageLayout::postInfo(sprintf(
_('Neue Beschreibung zum Modulteil "%s" in der Ausgabesprache %s anlegen.'), _('Neue Beschreibung zum Modulteil "%s" in der Ausgabesprache %s anlegen.'),
htmlReady($this->modulteil->getDisplayName()), 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); $this->cancel_url = $this->detailsURL($this->modulteil->modul_id);
...@@ -828,7 +878,7 @@ class Module_ModuleController extends MVVController ...@@ -828,7 +878,7 @@ class Module_ModuleController extends MVVController
if (is_null($deskriptor)) { if (is_null($deskriptor)) {
throw new Trails\Exception(404, _('Unbekannter Deskriptor')); throw new Trails\Exception(404, _('Unbekannter Deskriptor'));
} }
$def_lang = $deskriptor->modulteil->getDefaultLanguage(); $def_lang = $deskriptor->modulteil->modul->original_language;
if ($language === $def_lang) { if ($language === $def_lang) {
throw new Trails\Exception(403, _('Ein Deskriptor in der Original-Sprache kann nicht gelöscht werden.')); 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 ...@@ -1348,9 +1398,9 @@ class Module_ModuleController extends MVVController
if (MvvPerm::havePermCreate('Modul')) { if (MvvPerm::havePermCreate('Modul')) {
$widget->addLink( $widget->addLink(
_('Neues Modul anlegen'), _('Neues Modul anlegen'),
$this->modulURL(), $this->select_module_languageURL(),
Icon::create('add') Icon::create('add')
); )->asDialog('size=600x300');
} }
$sidebar->addWidget($widget, 'actions'); $sidebar->addWidget($widget, 'actions');
...@@ -1573,4 +1623,40 @@ class Module_ModuleController extends MVVController ...@@ -1573,4 +1623,40 @@ class Module_ModuleController extends MVVController
WHERE `mvv_studiengang`.`abschluss_id` = ?"; WHERE `mvv_studiengang`.`abschluss_id` = ?";
return DBManager::get()->fetchFirst($query, [$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
]
)
);
}
}
} }
...@@ -341,7 +341,7 @@ class Search_StudiengaengeController extends MVVController ...@@ -341,7 +341,7 @@ class Search_StudiengaengeController extends MVVController
// add links to export Modulhandbücher as PDF // add links to export Modulhandbücher as PDF
$widget = new ActionsWidget(); $widget = new ActionsWidget();
$widget->setTitle(_('Aktuelle Modulhandbücher')); $widget->setTitle(_('Aktuelle Modulhandbücher'));
$avl_lang = array_keys($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values']); $avl_lang = array_keys(Config::get()->CONTENT_LANGUAGES);
foreach ($avl_lang as $language) { foreach ($avl_lang as $language) {
if ($language === $GLOBALS['MVV_LANGUAGES']['default']) { if ($language === $GLOBALS['MVV_LANGUAGES']['default']) {
......
...@@ -13,8 +13,6 @@ ...@@ -13,8 +13,6 @@
* @since 3.5 * @since 3.5
*/ */
class Shared_ModulController extends AuthenticatedController class Shared_ModulController extends AuthenticatedController
{ {
...@@ -30,96 +28,89 @@ class Shared_ModulController extends AuthenticatedController ...@@ -30,96 +28,89 @@ class Shared_ModulController extends AuthenticatedController
$display_language = Request::option('display_language', $_SESSION['_language']); $display_language = Request::option('display_language', $_SESSION['_language']);
ModuleManagementModel::setLanguage($display_language); ModuleManagementModel::setLanguage($display_language);
$modul = Modul::find($modul_id); $this->modul = Modul::find($modul_id);
if (!$modul->hasPublicStatus()) { if (!$this->modul->hasPublicStatus()) {
throw new AccessDeniedException(); throw new AccessDeniedException();
} }
if ($modul) { if ($this->modul) {
$this->details_id = $modul->getId(); $this->details_id = $this->modul->getId();
$type = 1; $type = 1;
if (count($modul->modulteile) == 1) { if (count($this->modul->modulteile) == 1) {
$modulteil = $modul->modulteile->first(); $modulteil = $this->modul->modulteile->first();
$type = 3; $type = 3;
if (count($modulteil->lvgruppen) > 0) { if (count($modulteil->lvgruppen) > 0) {
$type = 2; $type = 2;
} }
} else if (count($modul->modulteile) == 0) { } else if (count($this->modul->modulteile) == 0) {
$type = 3; $type = 3;
} }
if (!$semester_id) { if (!$semester_id) {
$currentSemester = Semester::findDefault(); $current_semester = Semester::findDefault();
} else { } else {
$currentSemester = Semester::find($semester_id); $current_semester = Semester::find($semester_id);
} }
$sws = 0; $sws = 0;
$institut = new Institute($modul->responsible_institute->institut_id); $institut = new Institute($this->modul->responsible_institute->institut_id);
$modulTeileData = []; $modulteile_data = [];
foreach ($modul->modulteile as $modulTeil) { foreach ($this->modul->modulteile as $modulteil) {
$modulteil_deskriptor = $modulteil->getDeskriptor();
$modulTeilDeskriptor = $modulTeil->getDeskriptor($display_language); $sws += (int) $modulteil->sws;
$num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulteil->num_bezeichnung]['name'] ?? '';
$sws += (int) $modulTeil->sws; $name_kurz = sprintf('%s %d', $num_bezeichnung, $modulteil->nummer);
$modulteile_data[$modulteil->getId()] = [
$num_bezeichnung = $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG']['values'][$modulTeil->num_bezeichnung]['name'] ?? ''; 'name' => $modulteil->getDisplayName(),
$name_kurz = sprintf('%s %d', $num_bezeichnung, $modulTeil->nummer);
$modulTeileData[$modulTeil->getId()] = [
'name' => $modulTeil->getDisplayName(),
'name_kurz' => $name_kurz, 'name_kurz' => $name_kurz,
'voraussetzung' => $modulTeilDeskriptor->voraussetzung, 'voraussetzung' => $modulteil_deskriptor->voraussetzung,
'pruef_leistung' => $modulTeilDeskriptor->pruef_leistung, 'pruef_leistung' => $modulteil_deskriptor->pruef_leistung,
'pruef_vorleistung' => $modulTeilDeskriptor->pruef_vorleistung, 'pruef_vorleistung' => $modulteil_deskriptor->pruef_vorleistung,
'kommentar' => $modulTeilDeskriptor->kommentar, 'kommentar' => $modulteil_deskriptor->kommentar,
'kapazitaet' => $modulTeil->kapazitaet, 'kapazitaet' => $modulteil->kapazitaet,
'lvGruppen' => [] 'lvGruppen' => []
]; ];
$lvGruppen = Lvgruppe::findByModulteil($modulTeil->getId()); $lvGruppen = Lvgruppe::findByModulteil($modulteil->getId());
foreach ($lvGruppen as $lvGruppe) { foreach ($lvGruppen as $lvGruppe) {
$ids = array_column($lvGruppe->getAssignedCoursesBySemester($currentSemester['semester_id'], $GLOBALS['user']->id), 'seminar_id'); $ids = array_column($lvGruppe->getAssignedCoursesBySemester($current_semester['semester_id'], $GLOBALS['user']->id), 'seminar_id');
$courses = Course::findMany($ids, 'order by Veranstaltungsnummer, Name'); $courses = Course::findMany($ids, 'order by Veranstaltungsnummer, Name');
$modulTeileData[$modulTeil->getId()]['lvGruppen'][$lvGruppe->getId()] = [ $modulteile_data[$modulteil->getId()]['lvGruppen'][$lvGruppe->getId()] = [
'courses' => $courses, 'courses' => $courses,
'alt_texte' => $lvGruppe->alttext 'alt_texte' => $lvGruppe->alttext
]; ];
} }
} }
$this->modulTeile = $modulTeileData; $this->modulteile = $modulteile_data;
$this->deskriptor = $modul->getDeskriptor($display_language); $this->deskriptor = $this->modul->getDeskriptor();
$this->institut = $institut; $this->institut = $institut;
$this->semester = $currentSemester; $this->semester = $current_semester;
$this->sws = $sws; $this->sws = $sws;
$this->pruef_ebene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name'] ?? null; $this->pruef_ebene = $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$this->modul->pruef_ebene]['name'] ?? null;
$this->modul = $modul;
$this->type = $type; $this->type = $type;
$this->self_url = $this->url_for('modul/show/' . $modul_id); $this->self_url = $this->url_for('modul/show/' . $modul_id);
$this->detail_url = $this->url_for('modul/detail/' . $modul_id); $this->detail_url = $this->url_for('modul/detail/' . $modul_id);
$this->teilnahmeVoraussetzung = $modul->getDeskriptor()->voraussetzung; PageLayout::setTitle($this->modul->getDisplayName() . ' (' . _('Veranstaltungsübersicht') .')');
PageLayout::setTitle($modul->getDisplayName() . ' (' . _('Veranstaltungsübersicht') .')');
} }
} }
public function description_action($id) public function description_action($id)
{ {
$modul = Modul::find($id); $this->modul = Modul::find($id);
$perm = MvvPerm::get($modul); $perm = MvvPerm::get($this->modul);
if (!($modul->hasPublicStatus() || $perm->haveObjectPerm(MvvPerm::PERM_READ))) { if (!($this->modul->hasPublicStatus() || $perm->haveObjectPerm(MvvPerm::PERM_READ))) {
throw new AccessDeniedException(); throw new AccessDeniedException();
} }
$type = 1; $this->type = 1;
if (count($modul->modulteile) == 1) { if (count($this->modul->modulteile) == 1) {
$modulteil = $modul->modulteile->first(); $modulteil = $this->modul->modulteile->first();
$type = 3; $this->type = 3;
if (count($modulteil->lvgruppen) > 0) { if (count($modulteil->lvgruppen) > 0) {
$type = 2; $this->type = 2;
} }
} else if (count($modul->modulteile) == 0) { } else if (count($this->modul->modulteile) == 0) {
$type = 3; $this->type = 3;
} }
if (!Request::get('sem_select')) { if (!Request::get('sem_select')) {
...@@ -128,28 +119,27 @@ class Shared_ModulController extends AuthenticatedController ...@@ -128,28 +119,27 @@ class Shared_ModulController extends AuthenticatedController
$currentSemester = Semester::find(Request::get('sem_select')); $currentSemester = Semester::find(Request::get('sem_select'));
} }
$display_language = Request::get('display_language', $_SESSION['_language']); $this->display_language = Request::get('display_language', $this->modul->original_language);
ModuleManagementModel::setLanguage($display_language); ModuleManagementModel::setLanguage($this->display_language);
I18NString::setDefaultLanguage($this->modul->original_language);
I18NString::setContentLanguage($this->display_language);
$this->semesterSelector = Semester::getSemesterSelector(null, $currentSemester['semester_id'], 'semester_id', false); $this->semesterSelector = Semester::getSemesterSelector(null, $currentSemester['semester_id'], 'semester_id', false);
$this->modul = $modul; $this->pruefungsEbene = isset($GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$this->modul->pruef_ebene])
$this->pruefungsEbene = isset($GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]) ? $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$this->modul->pruef_ebene]['name']
? $GLOBALS['MVV_MODUL']['PRUEF_EBENE']['values'][$modul->pruef_ebene]['name']
: null; : null;
$this->modulDeskriptor = $modul->getDeskriptor($display_language); $this->modulDeskriptor = $this->modul->getDeskriptor();
$this->startSemester = Semester::findByTimestamp($modul->start); $this->startSemester = Semester::findByTimestamp($this->modul->start);
if (!$modul->responsible_institute) { if (!$this->modul->responsible_institute) {
$this->instituteName = null; $this->instituteName = null;
} elseif ($modul->responsible_institute->institute) { } elseif ($this->modul->responsible_institute->institute) {
$this->instituteName = $modul->responsible_institute->institute->name; $this->instituteName = $this->modul->responsible_institute->institute->name;
} else { } else {
$this->instituteName = _('Unbekannte Einrichtung'); $this->instituteName = _('Unbekannte Einrichtung');
} }
$this->type = $type;
$this->semester = $currentSemester; $this->semester = $currentSemester;
$this->display_language = $display_language; PageLayout::setTitle($this->modul->getDisplayName() . ' (' . _('Vollständige Modulbeschreibung') .')');
PageLayout::setTitle($modul->getDisplayName() . ' (' . _('Vollständige Modulbeschreibung') .')');
} }
public function mail_action($modul_id, $semester_id) public function mail_action($modul_id, $semester_id)
......
...@@ -71,7 +71,7 @@ use Studip\Button, Studip\LinkButton; ...@@ -71,7 +71,7 @@ use Studip\Button, Studip\LinkButton;
<select multiple name="object_class[]" id="object_class" required> <select multiple name="object_class[]" id="object_class" required>
<option value="NULL" <? if ($item->object_class === null) echo 'selected'; ?>><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option> <option value="NULL" <? if ($item->object_class === null) echo 'selected'; ?>><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option>
<? foreach ((array) $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?> <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?>
<option value="<?= htmlReady($key) ?>" <? if (mb_strpos($item->object_class, $key) !== false) echo 'selected'; ?>> <option value="<?= htmlReady($key) ?>" <? if (mb_strpos($item->object_class, $key) !== false) echo 'selected'; ?>>
<?= htmlReady($value['name']) ?> <?= htmlReady($value['name']) ?>
</option> </option>
...@@ -82,7 +82,7 @@ use Studip\Button, Studip\LinkButton; ...@@ -82,7 +82,7 @@ use Studip\Button, Studip\LinkButton;
<select multiple name="object_class[]" id="object_class" required> <select multiple name="object_class[]" id="object_class" required>
<option value="NULL" <? if ($item->object_class === null) echo 'selected'; ?>><?= _('alle (mehrsprachige Eingabe)') ?></option> <option value="NULL" <? if ($item->object_class === null) echo 'selected'; ?>><?= _('alle (mehrsprachige Eingabe)') ?></option>
<? foreach ((array) $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?> <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?>
<option value="<?= htmlReady($key) ?>" <? if (mb_strpos($item->object_class, $key) !== false) echo 'selected'; ?>> <option value="<?= htmlReady($key) ?>" <? if (mb_strpos($item->object_class, $key) !== false) echo 'selected'; ?>>
<?= htmlReady($value['name']) ?> <?= htmlReady($value['name']) ?>
</option> </option>
......
...@@ -108,7 +108,7 @@ ...@@ -108,7 +108,7 @@
<?= $val->object_class !== null ? htmlReady($GLOBALS['INST_TYPE'][$val->object_class]['name']) : _('alle')?> <?= $val->object_class !== null ? htmlReady($GLOBALS['INST_TYPE'][$val->object_class]['name']) : _('alle')?>
<? elseif ($key === 'moduldeskriptor' || $key === 'modulteildeskriptor') : ?> <? elseif ($key === 'moduldeskriptor' || $key === 'modulteildeskriptor') : ?>
<?= $val->object_class !== null ? htmlReady(implode(', ', array_map(function ($class) { <?= $val->object_class !== null ? htmlReady(implode(', ', array_map(function ($class) {
return $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'][$class]['name']; return Config::get()->CONTENT_LANGUAGES[$class]['name'];
}, explode(',', $val->object_class)))) : _('alle')?> }, explode(',', $val->object_class)))) : _('alle')?>
<? elseif ($key === 'studycourse'): ?> <? elseif ($key === 'studycourse'): ?>
<? $object_classes = <? $object_classes =
......
...@@ -72,13 +72,13 @@ use Studip\Button, Studip\LinkButton; ...@@ -72,13 +72,13 @@ use Studip\Button, Studip\LinkButton;
<? elseif ($object_typ === 'moduldeskriptor') : ?> <? elseif ($object_typ === 'moduldeskriptor') : ?>
<select multiple name="object_class[]" required> <select multiple name="object_class[]" required>
<option value="NULL" selected><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option> <option value="NULL" selected><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option>
<? foreach ((array) $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?> <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?>
<option value="<?= htmlReady($key) ?>"><?= htmlReady($value['name']) ?></option> <option value="<?= htmlReady($key) ?>"><?= htmlReady($value['name']) ?></option>
<? endforeach; ?> <? endforeach; ?>
<? elseif ($object_typ === 'modulteildeskriptor') : ?> <? elseif ($object_typ === 'modulteildeskriptor') : ?>
<select multiple name="object_class[]" required> <select multiple name="object_class[]" required>
<option value="NULL" selected><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option> <option value="NULL" selected><?= _('alle (mehrsprachige Eingabe bei Feldtyp textline, textarea, textmarkup)') ?></option>
<? foreach ((array) $GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE']['values'] as $key => $value) : ?> <? foreach (Config::get()->CONTENT_LANGUAGES as $key => $value) : ?>
<option value="<?= htmlReady($key) ?>"><?= htmlReady($value['name']) ?></option> <option value="<?= htmlReady($key) ?>"><?= htmlReady($value['name']) ?></option>
<? endforeach; ?> <? endforeach; ?>
<? elseif ($object_typ === 'studycourse') : ?> <? elseif ($object_typ === 'studycourse') : ?>
......
<?php
/**
* @var Modul $modul
* @var string $modulteil_id
* @var string $display_language
* @var Module_ModuleController $controller
* @var string $institut_id
*/
?>
<td colspan="6"> <td colspan="6">
<table class="default collapsable sortable" id="<?= $modul->id ?>"> <table class="default collapsable sortable" id="<?= $modul->id ?>">
<colgroup> <colgroup>
<col> <col>
<col span="2" style="width: 150px;"> <col style="width: 150px;">
<col style="width: 70px;">
</colgroup> </colgroup>
<? foreach ($modul->modulteile as $modulteil) : ?> <? foreach ($modul->modulteile as $modulteil) : ?>
<? $perm = MvvPerm::get($modulteil) ?> <? $perm = MvvPerm::get($modulteil) ?>
...@@ -20,8 +31,8 @@ ...@@ -20,8 +31,8 @@
</td> </td>
<td class="dont-hide actions" style="white-space: nowrap; text-align: center;"> <td class="dont-hide actions" style="white-space: nowrap; text-align: center;">
<? if ($perm->havePermWrite()) : ?> <? if ($perm->havePermWrite()) : ?>
<? foreach ($modulteil->deskriptoren->getAvailableTranslations() as $language) : ?> <? foreach ($modulteil->deskriptoren->getAvailableTranslations($modulteil->modul->original_language) as $language) : ?>
<? $lang = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]; ?> <? $lang = Config::get()->CONTENT_LANGUAGES[$language]; ?>
<a href="<?= $controller->action_link('modulteil/' . join('/', [$modulteil->id, $institut_id]), ['display_language' => $language]) ?>"> <a href="<?= $controller->action_link('modulteil/' . join('/', [$modulteil->id, $institut_id]), ['display_language' => $language]) ?>">
<?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?> <?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?>
</a> </a>
......
<?php
/**
* @var Module_ModuleController $controller
* @var int $count
* @var int $page
*/
?>
<?= $controller->jsUrl() ?> <?= $controller->jsUrl() ?>
<table class="default collapsable"> <table class="default collapsable">
<colgroup>
<col>
<col>
<col>
<col>
<col style="width: 150px">
<col style="width: 70px">
</colgroup>
<caption> <caption>
<?= _('Module')?> <?= _('Module')?>
<span class="actions"><?= sprintf(ngettext('%s Modul', '%s Module', $count), $count) ?></span> <span class="actions"><?= sprintf(ngettext('%s Modul', '%s Module', $count), $count) ?></span>
...@@ -10,10 +26,10 @@ ...@@ -10,10 +26,10 @@
<?= $controller->renderSortLink('module/module/', _('Modul'), 'bezeichnung') ?> <?= $controller->renderSortLink('module/module/', _('Modul'), 'bezeichnung') ?>
<?= $controller->renderSortLink('module/module/', _('Fassung'), 'fassung_nr', ['style' => 'width: 5%;']) ?> <?= $controller->renderSortLink('module/module/', _('Fassung'), 'fassung_nr', ['style' => 'width: 5%;']) ?>
<?= $controller->renderSortLink('module/module/', _('Modulteile'), 'count_modulteile', ['style' => 'width: 5%;']) ?> <?= $controller->renderSortLink('module/module/', _('Modulteile'), 'count_modulteile', ['style' => 'width: 5%;']) ?>
<th style="text-align: right; width: 150px;"> <th style="text-align: center;">
<?= _('Ausgabesprachen') ?> <?= _('Ausgabesprachen') ?>
</th> </th>
<th style="width: 5%; text-align: right;"><?= _('Aktionen') ?></th> <th style="text-align: right;"><?= _('Aktionen') ?></th>
</tr> </tr>
</thead> </thead>
<?= $this->render_partial('module/module/module') ?> <?= $this->render_partial('module/module/module') ?>
......
<?php
/**
* @var Module_ModuleController $controller
* @var Modul $modul
* @var ModulDeskriptor $deskriptor
* @var string $display_language
* @var boolean $def_lang
* @var QuickSearch $search_modul
* @var string $qs_id_module
* @var Semester[] $semester
* @var QuickSearch $search_responsible
* @var string $qs_id_responsible
* @var QuickSearch $search_institutes
* @var string $qs_id_institutes
* @var SimpleORMapCollection $contacts
* @var array $translations
* @var string $cancel_url
*/
?>
<? use Studip\Button, Studip\LinkButton; ?> <? use Studip\Button, Studip\LinkButton; ?>
<?= $controller->jsUrl() ?> <?= $controller->jsUrl() ?>
<? <?
$perm = MvvPerm::get($modul); $perm = MvvPerm::get($modul);
$perm_d = MvvPerm::get($deskriptor); $perm_d = MvvPerm::get($deskriptor);
if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) { if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] !== $display_language) {
$perm_d->setVariant($display_language); $perm_d->setVariant($display_language);
} }
?> ?>
...@@ -144,12 +164,12 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) { ...@@ -144,12 +164,12 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) {
<?= _('Beschlussdatum:') ?> <?= _('Beschlussdatum:') ?>
<? if ($perm->haveFieldPerm('beschlussdatum')) : ?> <? if ($perm->haveFieldPerm('beschlussdatum')) : ?>
<input type="text" name="beschlussdatum" <input type="text" name="beschlussdatum"
value="<?= ($modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : '') ?>" value="<?= $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : '' ?>"
placeholder="<?= _('TT.MM.JJJJ') ?>" class="with-datepicker"> placeholder="<?= _('TT.MM.JJJJ') ?>" class="with-datepicker">
<? else : ?> <? else : ?>
<?= ($modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : '') ?> <?= $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : '' ?>
<input type="hidden" name="beschlussdatum" <input type="hidden" name="beschlussdatum"
value="<?= ($modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : '') ?>"> value="<?= $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : '' ?>">
<? endif; ?> <? endif; ?>
</label> </label>
<label for="mvv-field-modul-fassung_nr"><?= _('Fassung:') ?> <label for="mvv-field-modul-fassung_nr"><?= _('Fassung:') ?>
...@@ -196,7 +216,7 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) { ...@@ -196,7 +216,7 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) {
</div> </div>
<div id="mvv-field-modul-beschlussdatum"> <div id="mvv-field-modul-beschlussdatum">
<? printf(_('Beschlussdatum: %s'), <? printf(_('Beschlussdatum: %s'),
$modul->beschlussdatum ? strftime('%d.%m.%Y', $modul->beschlussdatum) : _('nicht angegeben')) ?> $modul->beschlussdatum ? date('d.m.Y', $modul->beschlussdatum) : _('nicht angegeben')) ?>
</div> </div>
<div id="mvv-field-modul-fassung_nr"> <div id="mvv-field-modul-fassung_nr">
<? <?
...@@ -444,6 +464,17 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) { ...@@ -444,6 +464,17 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) {
<? endif; ?> <? endif; ?>
</label> </label>
<? if ($def_lang && !$modul->isNew()) : ?>
<label id="mvv-field-modul-original_language"><?= _('Originalsprache der Modulbeschreibung') ?>
<select name="original_language" id="original_language">
<? foreach (Config::get()->CONTENT_LANGUAGES as $language_code => $content_language) : ?>
<option value="<?= htmlReady($language_code) ?>"<?= $modul->original_language === $language_code ? ' selected' : '' ?>>
<?= htmlReady($content_language['name']) ?>
</option>
<? endforeach ?>
</select>
</label>
<? endif ?>
</fieldset> </fieldset>
<fieldset class="collapsable collapsed" id="mvv-field-modul-assigned_users"> <fieldset class="collapsable collapsed" id="mvv-field-modul-assigned_users">
...@@ -657,7 +688,7 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) { ...@@ -657,7 +688,7 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) {
$entry->datafield_id, $entry->datafield_id,
$entry->range_id, $entry->range_id,
$entry->sec_range_id, $entry->sec_range_id,
$language == 'de_DE' ? '' : $language $display_language === Config::get()->MVV_DEFAULT_LANGUAGE ? '' : $display_language
]); ?> ]); ?>
<? else : ?> <? else : ?>
<? $df = $entry; ?> <? $df = $entry; ?>
...@@ -694,6 +725,6 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) { ...@@ -694,6 +725,6 @@ if ($GLOBALS['MVV_MODUL']['SPRACHE']['default'] != $display_language) {
</form> </form>
<? if (!$def_lang) : ?> <? if (!$def_lang) : ?>
<script> <script>
jQuery('#modul_form').find('textarea, input[type=text]').after('<div style="padding-top:10px;"><a href="#" title="<?= _('Originalfassung anzeigen') ?>" class="mvv-show-original" data-type="modul"><?= Assets::img(MVV::getContentLanguageImagePath($modul->getDefaultLanguage()), ['alt' => _('Originalfassung'), 'size' => 24]) ?></a></div>'); jQuery('#modul_form').find('textarea, input[type=text]').after('<div style="padding-top:10px;"><a href="#" title="<?= _('Originalfassung anzeigen') ?>" class="mvv-show-original" data-type="modul"><?= Assets::img(MVV::getContentLanguageImagePath($modul->original_language), ['alt' => _('Originalfassung'), 'size' => 24]) ?></a></div>');
</script> </script>
<? endif; ?> <? endif; ?>
<?php
/**
* @var Modul[] $module
*/
?>
<? foreach ($module as $modul) : ?> <? foreach ($module as $modul) : ?>
<? $perm = MvvPerm::get($modul) ?> <? $perm = MvvPerm::get($modul) ?>
<tbody class="<?= $modul->count_modulteile ? '' : 'empty ' ?><?= $modul_id === $modul->getId() ? 'not-collapsed' : 'collapsed' ?>"> <tbody class="<?= $modul->count_modulteile ? '' : 'empty ' ?><?= $modul_id === $modul->getId() ? 'not-collapsed' : 'collapsed' ?>">
...@@ -29,13 +35,13 @@ ...@@ -29,13 +35,13 @@
<? endif;?> <? endif;?>
</td> </td>
<? else : ?> <? else : ?>
<td style="white-space:nowrap;"> <td style="white-space:nowrap; font-weight: 700; padding-left: 20px;">
<? if ($ampel_icon) : ?> <? if ($ampel_icon) : ?>
<?= $ampel_icon->asImg(['title' => $ampelstatus, 'style' => 'vertical-align: text-top;']) ?> <?= $ampel_icon->asImg(['title' => $ampelstatus, 'style' => 'vertical-align: text-top;']) ?>
<? endif; ?> <? endif; ?>
<?= htmlReady($modul->code) ?> <?= htmlReady($modul->code) ?>
</td> </td>
<td class="dont-hide" style="font-weight: bold;"> <td class="dont-hide" style="font-weight: 700;">
<?= htmlReady($modul->getDisplayName()) ?> <?= htmlReady($modul->getDisplayName()) ?>
</td> </td>
<? endif; ?> <? endif; ?>
...@@ -43,11 +49,12 @@ ...@@ -43,11 +49,12 @@
<td style="text-align: center;" class="dont-hide"><?= $modul->count_modulteile ?></td> <td style="text-align: center;" class="dont-hide"><?= $modul->count_modulteile ?></td>
<td class="dont-hide actions" style="text-align: center;"> <td class="dont-hide actions" style="text-align: center;">
<? if ($perm->havePermRead()) : ?> <? if ($perm->havePermRead()) : ?>
<? $languages = $modul->deskriptoren->getAvailableTranslations(); ?> <? $languages = $modul->deskriptoren->getAvailableTranslations($modul->original_language); ?>
<? $content_languages = Config::get()->CONTENT_LANGUAGES ?>
<? foreach ($languages as $language) : ?> <? foreach ($languages as $language) : ?>
<? $lang = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]; ?>
<a href="<?= $controller->action_link('modul/' . $modul->id . '/', ['display_language' => $language]) ?>"> <a href="<?= $controller->action_link('modul/' . $modul->id . '/', ['display_language' => $language]) ?>">
<?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?> <?= Assets::img(MVV::getContentLanguageImagePath($language),
['alt' => $content_languages[$language]['name'], 'size' => 24]) ?>
</a> </a>
<? endforeach; ?> <? endforeach; ?>
<? endif; ?> <? endif; ?>
......
<?php
/**
* @var Module_ModuleController $controller
* @var array $languages
*/
?>
<ul class="content-items" style="padding-top: 10px;">
<? foreach ($languages as $language) : ?>
<li class="content-item">
<a class="content-item-link" href="<?= $controller->modulURL(['display_language' => $language['code']]) ?>">
<div class="content-item-img-wrapper">
<?= Assets::img('/images/languages/' . $language['picture'], ['size' => 64]) ?>
</div>
<div class="content-item-text">
<p class="content-item-title">
<?= htmlReady($language['name']) ?>
</p>
<p class="content-item-description">
<? printf(_('Erstellen Sie ein Modul in der Originalsprache <em>%s</em>.'), $language['name']) ?>
</p>
</div>
</a>
</li>
<? endforeach ?>
</ul>
<? $table = get_class($modul) == 'Modul' ? 'mvv_modul_deskriptor' : 'mvv_modulteil_deskriptor'; ?> <?php
<? $languages = $modul->deskriptoren->getAvailableTranslations(); ?> /**
<? foreach ($GLOBALS[strtoupper($table)]['SPRACHE']['values'] as $lang => $value) : ?> * @var ModulDeskriptor|ModulteilDeskriptor $descriptor
* @var string $original_language
* @var string $display_language
* @var string $link
*/
?>
<? $languages = $descriptor->getAvailableTranslations($original_language) ?>
<? $content_languages = array_merge(array_flip($languages), Config::get()->CONTENT_LANGUAGES) ?>
<? foreach ($content_languages as $code => $language) : ?>
<div style="padding-top:10px;"> <div style="padding-top:10px;">
<a href="<?= URLHelper::getLink($link, ['display_language' => $lang]) ?>"> <a href="<?= URLHelper::getLink($link, ['display_language' => $code]) ?>">
<?= Assets::img(MVV::getContentLanguageImagePath($lang), ['alt' => $value['name'], 'size' => 24]) ?> <?= Assets::img(MVV::getContentLanguageImagePath($code), ['alt' => $language['name'], 'size' => 24]) ?>
<?= $value['name'] ?> (<?= in_array($lang, $languages) ? 'bearbeiten' : 'neu anlegen' ?>) <?= $language['name'] ?> (<?= ($code === $original_language ? 'Originalfassung, ' : '')
<?= $lang == $sprache ? Icon::create('accept', 'accept', [])->asImg() : '' ?> . (in_array($code, $languages) ? 'bearbeiten' : 'neu anlegen') ?>)
<?= $code === $display_language ? Icon::create('accept', Icon::ROLE_ACCEPT) : '' ?>
</a> </a>
</div> </div>
<? endforeach; ?> <? endforeach ?>
<?php
/**
* @var Modul $modul
* @var int $type
* @var Shared_ModulController $controller
*/
?>
<? if (count($modul->deskriptoren) > 1): ?> <? if (count($modul->deskriptoren) > 1): ?>
<div style="width: 100%; text-align: right;"> <div style="width: 100%; text-align: right;">
<? foreach ($modul->deskriptoren->getAvailableTranslations() as $language) : ?> <? foreach ($modul->deskriptoren->getAvailableTranslations($modul->original_language) as $language) : ?>
<? $lang = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]; ?> <? $lang = Config::get()->CONTENT_LANGUAGES[$language]; ?>
<a data-dialog="size=auto;title='<?= htmlReady($modul->getDisplayName()) ?>'" href="<?= $controller->action_link('description/' . $modul->id . '/', ['display_language' => $language]) ?>"> <a data-dialog="size=auto;title='<?= htmlReady($modul->getDisplayName()) ?>'" href="<?= $controller->action_link('description/' . $modul->id . '/', ['display_language' => $language]) ?>">
<?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?> <?= Assets::img(MVV::getContentLanguageImagePath($language), ['alt' => $lang['name'], 'size' => 24]) ?>
</a> </a>
......
<?php
/**
* @var Modul $modul
* @var Institute $institut
* @var ModulDeskriptor $deskriptor
* @var array $modulteile
* @var Semester $semester
* @var string $pruef_ebene
* @var int $type
*/
?>
<table class="default mvv-modul-details nohover"> <table class="default mvv-modul-details nohover">
<tr> <tr>
<th class="mvv-modul-details-head" style="width: 30%"><?= htmlReady($modul->code) ?></th> <th class="mvv-modul-details-head" style="width: 30%"><?= htmlReady($modul->code) ?></th>
...@@ -34,10 +46,10 @@ ...@@ -34,10 +46,10 @@
<tr> <tr>
<td colspan="4" style="padding: 0;"> <td colspan="4" style="padding: 0;">
<table class="default nohover"> <table class="default nohover">
<? if (mb_strlen($teilnahmeVoraussetzung) > 0): ?> <? if (mb_strlen($deskriptor->voraussetzung) > 0): ?>
<tr> <tr>
<td style="width: 20%; font-weight: bold;"><?= _('Teilnahmevoraussetzungen') ?></td> <td style="width: 20%; font-weight: bold;"><?= _('Teilnahmevoraussetzungen') ?></td>
<td ><?= formatReady($teilnahmeVoraussetzung) ?></td> <td ><?= formatReady($deskriptor->voraussetzung) ?></td>
</tr> </tr>
<? endif; ?> <? endif; ?>
<? if (mb_strlen($deskriptor->kommentar)) : ?> <? if (mb_strlen($deskriptor->kommentar)) : ?>
...@@ -104,7 +116,7 @@ ...@@ -104,7 +116,7 @@
<th><?= _('Prüfungsleistung') ?></th> <th><?= _('Prüfungsleistung') ?></th>
<? endif; ?> <? endif; ?>
</tr> </tr>
<? foreach ($modulTeile as $modul_teil): ?> <? foreach ($modulteile as $modul_teil): ?>
<tr> <tr>
<? if ($type === 1): ?> <? if ($type === 1): ?>
<td> <td>
......
...@@ -114,17 +114,6 @@ $GLOBALS['MVV_MODUL']['INSTITUT_GRUPPEN'] = [ ...@@ -114,17 +114,6 @@ $GLOBALS['MVV_MODUL']['INSTITUT_GRUPPEN'] = [
] ]
]; ];
// Moduldeskriptor Ausgabesprache
$GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE'] = [
'values' => [
'DE' => ['visible' => 1, 'name' => _('Originalfassung'), 'content_language' => 'de_DE'],
'EN' => ['visible' => 1, 'name' => _('Englisch'), 'content_language' => 'en_GB']
// 'de_DE' => array('visible' => 1, 'name' => _('Originalfassung')),
// 'en_GB' => array('visible' => 1, 'name' => _('Englisch'))
],
'default' => 'DE'
];
// Modulteile // Modulteile
$GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG'] = [ $GLOBALS['MVV_MODULTEIL']['NUM_BEZEICHNUNG'] = [
'values' => [ 'values' => [
...@@ -201,9 +190,6 @@ $GLOBALS['MVV_MODULTEIL']['LERNLEHRFORM'] = [ ...@@ -201,9 +190,6 @@ $GLOBALS['MVV_MODULTEIL']['LERNLEHRFORM'] = [
'default' => '' 'default' => ''
]; ];
// Modulteildeskriptor
$GLOBALS['MVV_MODULTEIL_DESKRIPTOR']['SPRACHE'] = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE'];
// Maximale Anzahl Fachsemester // Maximale Anzahl Fachsemester
$GLOBALS['MVV_MODULTEIL_FACHSEMESTER'] = 10; $GLOBALS['MVV_MODULTEIL_FACHSEMESTER'] = 10;
...@@ -230,16 +216,6 @@ $GLOBALS['MVV_STGTEILVERSION']['STATUS'] = $GLOBALS['MVV_MODUL']['STATUS']; ...@@ -230,16 +216,6 @@ $GLOBALS['MVV_STGTEILVERSION']['STATUS'] = $GLOBALS['MVV_MODUL']['STATUS'];
$GLOBALS['MVV_STGTEIL']['STATUS'] = $GLOBALS['MVV_MODUL']['STATUS']; $GLOBALS['MVV_STGTEIL']['STATUS'] = $GLOBALS['MVV_MODUL']['STATUS'];
$GLOBALS['MVV_LANGUAGES'] = [
'values' => [
'DE' => ['visible' => 1, 'name' => _('Deutsch'),
'locale' => 'de_DE'],
'EN' => ['visible' => 1, 'name' => _('Englisch'),
'locale' => 'en_GB']
],
'default' => 'DE'
];
$GLOBALS['MVV_STUDIENGANG']['FASSUNG_TYP'] = $GLOBALS['MVV_STGTEILVERSION']['FASSUNG_TYP']; $GLOBALS['MVV_STUDIENGANG']['FASSUNG_TYP'] = $GLOBALS['MVV_STGTEILVERSION']['FASSUNG_TYP'];
$GLOBALS['MVV_STUDIENGANG']['STUDYCOURSE_TYPE'] = [ $GLOBALS['MVV_STUDIENGANG']['STUDYCOURSE_TYPE'] = [
......
<?php
final class Step4261 extends Migration
{
public function description()
{
return 'Add field to module table to store original language.';
}
protected function up()
{
$db = DBManager::get();
// retrieve default language from config
$config_language = $db->fetchColumn(
"SELECT `value` FROM `config` WHERE `field` = 'DEFAULT_LANGUAGE'"
);
$default_language = $config_language ?? array_keys($GLOBALS['CONTENT_LANGUAGES'])[0] ?? 'de_DE';
$db->execute(
'ALTER TABLE `mvv_modul`
ADD `original_language` VARCHAR(10) NOT NULL DEFAULT ? COLLATE latin1_bin AFTER `verantwortlich`',
[$default_language]
);
$query = "INSERT INTO `config` (`field`, `value`, `type`, `range`, `section`, `mkdate`, `chdate`, `description`)
VALUES ('MVV_DEFAULT_LANGUAGE', ?, 'string', 'global', 'mvv', UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), ?)";
$db->execute($query,
[
$default_language,
'Code der Inhalts-Sprache, die als Original-Sprache der Deskriptoren für Module und Modulteile vorausgewählt ist.',
]
);
}
protected function down()
{
$db = DBManager::get();
$db->exec(
"ALTER TABLE `mvv_modul`
DROP COLUMN `original_language`"
);
$query = "DELETE `config`, `config_values`
FROM `config`
LEFT JOIN `config_values` USING (`field`)
WHERE `field` = 'MVV_DEFAULT_LANGUAGE'";
$db->exec($query);
}
}
...@@ -842,8 +842,8 @@ class MVV implements Loggable { ...@@ -842,8 +842,8 @@ class MVV implements Loggable {
*/ */
public static function getContentLanguageImagePath($language): string public static function getContentLanguageImagePath($language): string
{ {
$content_language = $GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language]['content_language']; $code = strtok($language, '_');
return 'languages/' . ($GLOBALS['CONTENT_LANGUAGES'][$content_language]['picture'] ?? 'lang_' . mb_strtolower($language) . '.gif'); return 'languages/' . ($GLOBALS['CONTENT_LANGUAGES'][$language]['picture'] ?? 'lang_' . mb_strtolower($code) . '.gif');
} }
} }
...@@ -583,9 +583,7 @@ class Lvgruppe extends ModuleManagementModelTreeItem ...@@ -583,9 +583,7 @@ class Lvgruppe extends ModuleManagementModelTreeItem
$modul = Modul::find($modul_id); $modul = Modul::find($modul_id);
if ($modul) { if ($modul) {
$name = $modul->responsible_institute->institute->getShortName(); $name = $modul->responsible_institute->institute->getShortName();
$short_name_modul = $modul->getDeskriptor( $short_name_modul = $modul->getDeskriptor()->bezeichnung_kurz;
$GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default'])
->bezeichnung_kurz;
$name .= $short_name_modul ? ' ' . $short_name_modul : ''; $name .= $short_name_modul ? ' ' . $short_name_modul : '';
} }
* *
...@@ -594,7 +592,6 @@ class Lvgruppe extends ModuleManagementModelTreeItem ...@@ -594,7 +592,6 @@ class Lvgruppe extends ModuleManagementModelTreeItem
$modulteil = Modulteil::findCached($modulteil_id); $modulteil = Modulteil::findCached($modulteil_id);
if ($modulteil) { if ($modulteil) {
$name = $modulteil->getDeskriptor()->bezeichnung; $name = $modulteil->getDeskriptor()->bezeichnung;
//$name = $name_modulteil ? ' ' . $name_modulteil : '';
} }
return $name; return $name;
} }
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
* @property string|null $stat database column * @property string|null $stat database column
* @property string|null $kommentar_status database column * @property string|null $kommentar_status database column
* @property string|null $verantwortlich database column * @property string|null $verantwortlich database column
* @property string $original_language database column
* @property string $author_id database column * @property string $author_id database column
* @property string $editor_id database column * @property string $editor_id database column
* @property int $mkdate database column * @property int $mkdate database column
...@@ -383,14 +384,12 @@ class Modul extends ModuleManagementModelTreeItem ...@@ -383,14 +384,12 @@ class Modul extends ModuleManagementModelTreeItem
* previously set by ApplicationSimpleORMap::setLanguage() or the one * previously set by ApplicationSimpleORMap::setLanguage() or the one
* defined as default in mvv_config.php. * defined as default in mvv_config.php.
*/ */
private function setDefaultLanguage() private function setDefaultLanguage(): void
{ {
if (isset($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'] if ($this->isNew()) {
[ModuleManagementModel::getLanguage()])) { $this->default_language = Config::get()->MVV_DESCRIPTOR_DEFAULT_LANGUAGE;
$this->default_language = ModuleManagementModel::getLanguage();
} else { } else {
$this->default_language = $this->default_language = $this->original_language;
$GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['default'];
} }
} }
...@@ -405,18 +404,13 @@ class Modul extends ModuleManagementModelTreeItem ...@@ -405,18 +404,13 @@ class Modul extends ModuleManagementModelTreeItem
} }
/** /**
* Returns the Deskriptor in the given language. A Modul has always a * Returns the descriptor. If this component has no descriptor already
* Deskriptor in the default language. If the given language is unknown, the * a new one is created and returned.
* method returns the deskriptor in the default language.
* *
* @param string $language The id of the language * @return ModulDeskriptor The descriptor.
* @param bool If true returns always a new descriptor
* @return object The Deskriptor.
*/ */
public function getDeskriptor($language = null, $force_new = false) { public function getDeskriptor()
if (!isset($GLOBALS['MVV_MODUL_DESKRIPTOR']['SPRACHE']['values'][$language])) { {
$language = $this->default_language;
}
if (!$this->deskriptoren) { if (!$this->deskriptoren) {
// the module is new and has no descriptor // the module is new and has no descriptor
// return a new descriptor in the default language // return a new descriptor in the default language
...@@ -481,7 +475,7 @@ class Modul extends ModuleManagementModelTreeItem ...@@ -481,7 +475,7 @@ class Modul extends ModuleManagementModelTreeItem
/** /**
* Assignes languages of instruction to this part-module. * Assignes languages of instruction to this part-module.
* *
* @param type $languages An array of language keys defined in mvv_config.php. * @param array $languages An array of language keys defined in mvv_config.php.
*/ */
public function assignLanguagesOfInstruction($languages) public function assignLanguagesOfInstruction($languages)
{ {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment