From 3b0c22f5790ebbb25eb9087bc5661789546a5bbe Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms Date: Fri, 22 Aug 2025 15:38:41 +0200 Subject: fix datafield select on admin courses by using the same underlying method as in the datafield itself (and prevent php warning on admin page), fixes #5848 --- app/controllers/admin/courses.php | 11 ++++----- app/controllers/admin/datafields.php | 2 +- lib/classes/DataFieldSelectboxEntry.php | 40 ++++++++++++++++++++------------- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/app/controllers/admin/courses.php b/app/controllers/admin/courses.php index 6a9a311..876abf3 100644 --- a/app/controllers/admin/courses.php +++ b/app/controllers/admin/courses.php @@ -62,11 +62,8 @@ class Admin_CoursesController extends AuthenticatedController ['onclick' => "$(this).toggleClass(['options-checked', 'options-unchecked']); STUDIP.AdminCourses.App.changeFilter({'df_".$datafield->id."': $(this).hasClass('options-checked') ? 1 : 0}); return false;"] ); return $checkboxWidget; - } elseif ($type == 'selectbox' || $type == 'radio' || $type == 'selectboxmultiple') { - $options = array_map('trim', explode("\n", DBManager::get()->fetchColumn( - 'SELECT typeparam FROM datafields WHERE datafield_id = ?', - [$datafield->id] - ))); + } elseif (in_array($type, ['selectbox', 'radio', 'selectboxmultiple'])) { + $options = DataFieldSelectboxEntry::convertTypeParamToChoiceList($datafield->typeparam, $is_assoc); if ($options) { $selectWidget = new SelectWidget( @@ -80,10 +77,10 @@ class Admin_CoursesController extends AuthenticatedController '(' . _('Keine Auswahl') . ')' ) ); - foreach ($options as $option) { + foreach ($options as $index => $option) { $selectWidget->addElement( new SelectElement( - $option, + $is_assoc ? $index : $option, $option, Request::get('df_'.$datafield->id, $datafields_filters[$datafield->id] ?? null) === $option ) diff --git a/app/controllers/admin/datafields.php b/app/controllers/admin/datafields.php index ef0f708..ab8d9db 100644 --- a/app/controllers/admin/datafields.php +++ b/app/controllers/admin/datafields.php @@ -259,7 +259,7 @@ class Admin_DatafieldsController extends AuthenticatedController PageLayout::postSuccess(_('Die Parameter wurden übernommen.')); - $this->redirect('admin/datafields/index/' . $datafield_id->object_type . '#item_' . $datafield_id); + $this->redirect('admin/datafields/index/' . $datafield->object_type . '#item_' . $datafield_id); } $this->struct = $datafield; diff --git a/lib/classes/DataFieldSelectboxEntry.php b/lib/classes/DataFieldSelectboxEntry.php index 8ac1a3c..aeb8ec2 100644 --- a/lib/classes/DataFieldSelectboxEntry.php +++ b/lib/classes/DataFieldSelectboxEntry.php @@ -65,23 +65,9 @@ class DataFieldSelectboxEntry extends DataFieldEntry */ public function getParameters() { - $params = explode("\n", rtrim($this->model->typeparam)); - $params = array_map('trim', $params); - - $ret = []; - $is_assoc = false; - - foreach ($params as $i => $p) { - if (mb_strpos($p, '=>') !== false) { - $is_assoc = true; + $choices = self::convertTypeParamToChoiceList($this->model->typeparam, $is_assoc); - list($key, $value) = array_map('trim', explode('=>', $p, 2)); - $ret[$key] = $value; - } else { - $ret[$i] = $p; - } - } - return [$ret, $is_assoc]; + return [$choices, $is_assoc]; } /** @@ -97,4 +83,26 @@ class DataFieldSelectboxEntry extends DataFieldEntry : $this->getValue(); return $entities ? htmlReady($value) : $value; } + + public static function convertTypeParamToChoiceList(string $typeparam, ?bool &$is_assoc = null): array + { + $params = explode("\n", rtrim($typeparam)); + $params = array_map('trim', $params); + + $ret = []; + $is_assoc = false; + + foreach ($params as $i => $p) { + if (mb_strpos($p, '=>') !== false) { + $is_assoc = true; + + [$key, $value] = array_map('trim', explode('=>', $p, 2)); + $ret[$key] = $value; + } else { + $ret[$i] = $p; + } + } + + return $ret; + } } -- cgit v1.0