From baf5e20b31e99684844457ce2642f730ff99c51d Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Wed, 13 May 2026 17:19:28 +0200 Subject: [PATCH 1/4] fix number of required preconditions bug, refactor initCompulsoryForm, add new error messages in en and de lang files --- .../classes/class.ilConditionHandlerGUI.php | 59 +++++++++++++------ lang/ilias_de.lang | 3 + lang/ilias_en.lang | 3 + 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php index 335ba5cce035..abad90b9c47d 100755 --- a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php +++ b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php @@ -893,9 +893,10 @@ protected function initCompulsoryForm(bool $with_request = false): ?StandardForm $this->getTargetId(), $this->getTargetType() ); + $is_subset_mode = count($optional_conditions) > 0; $old_status = $this->ui_factory->input()->field()->hidden()->withValue( - (string) (count($optional_conditions) ? self::LIST_MODE_SUBSET : self::LIST_MODE_ALL) + (string) ($is_subset_mode ? self::LIST_MODE_SUBSET : self::LIST_MODE_ALL) ); $hidden = $this->ui_factory->input()->field()->checkbox( @@ -911,28 +912,50 @@ protected function initCompulsoryForm(bool $with_request = false): ?StandardForm $list_mode_items[self::LIST_MODE_ALL] = $condition_mode_all; $subset_limit = []; - if (count($all_conditions) > 1) { + $compulsory_count = 0; + foreach ($all_conditions as $condition) { + if ($condition['obligatory']) $compulsory_count++; + } + + $all_conditions_number = count($all_conditions) - 1; + if ($all_conditions_number > 1) { $num_required = ilConditionHandler::lookupObligatoryConditionsOfTarget( $this->getTargetRefId(), $this->getTargetId() ); - $subset_limit['num_compulsory'] = - $this->ui_factory->input() - ->field() - ->numeric( - $this->lng->txt('precondition_num_obligatory'), - $this->lng->txt('precondition_num_optional_info') - ) - ->withValue($num_required > 0 ? $num_required : null) - ->withAdditionalTransformation( - $this->refinery->logical()->parallel( - [ - $this->refinery->int()->isGreaterThan(0), - $this->refinery->int()->isLessThan(count($all_conditions)) - ] - ) - ); + $subset_limit['num_compulsory'] = $this->ui_factory->input()->field() + ->numeric( + $this->lng->txt('precondition_num_obligatory'), + $this->lng->txt('precondition_num_optional_info') + ) + ->withValue($num_required > 0 ? $num_required : null) + // check if the number of required materials is bigger than compulsory conditions in subset mode + ->withAdditionalTransformation( + $this->refinery->custom()->constraint( + function ($val) use ($is_subset_mode, $compulsory_count) { + if ($is_subset_mode) { + return $val >= $compulsory_count + 1; + } + return true; + }, + $this->lng->txt('precondition_number_of_required_materials_lower_compulsory_items') + ) + ) + // absolute ceilings: from 1 to # of preconditions + 1 + ->withAdditionalTransformation( + $this->refinery->custom()->constraint( + fn($val) => $val >= 1, + $this->lng->txt('precondition_number_of_required_materials_lower_than_one') + ) + ) + ->withAdditionalTransformation( + $this->refinery->custom()->constraint( + fn($val) => $val <= $all_conditions_number - 1, + $this->lng->txt('precondition_number_of_required_materials_bigger_preconditions_number') + + ) + ); } if (count($all_conditions) > 1) { $condition_mode_subset = $this->ui_factory->input()->field()->group( diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 436d20c6b345..6d74e0311e46 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -14516,6 +14516,9 @@ rbac#:#positions_override_operations#:#Globale Einstellungen überschreiben rbac#:#precondition_not_obligatory_alt#:#Die Vorbedingung ist optional rbac#:#precondition_num_obligatory#:#Geforderte Anzahl Materialien rbac#:#precondition_num_optional_info#:#Anzahl von Materialien, die bis zum festgelegten Status / Ergebnis zu bearbeiten sind +rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#Die Anzahl der geforderten Materialien muss kleiner als die Gesamtzahl der verfügbaren Vorbedingungen sein. +rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#Die Anzahl der erforderlichen Materialien muss größer als die Anzahl der verpflichtenden Vorbedingungen sein. +rbac#:#precondition_number_of_required_materials_lower_than_one#:#Sie müssen mindestens 1 Material angeben. rbac#:#precondition_obligatory#:#Verpflichtend rbac#:#precondition_obligatory_alt#:#Die Vorbedingung muss erfüllt werden rbac#:#precondition_obligatory_info#:#Verpflichtende Vorbedingungen müssen erfüllt werden, um Zugriff zu erhalten. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index d6f95bdc77e3..1ee7fa6f871d 100755 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -14517,6 +14517,9 @@ rbac#:#positions_override_operations#:#Override global Settings rbac#:#precondition_not_obligatory_alt#:#Precondition is optional rbac#:#precondition_num_obligatory#:#Number of Required Materials rbac#:#precondition_num_optional_info#:#Please enter the minimum number of materials required to fulfill this precondition. +rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#Number of required materials should be less than the total number of available preconditions. +rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#The number of required materials should be greater than the number of compulsory preconditions. +rbac#:#precondition_number_of_required_materials_lower_than_one#:#You must require at least 1 material. rbac#:#precondition_obligatory#:#Compulsory rbac#:#precondition_obligatory_alt#:#Precondition must be fulfilled rbac#:#precondition_obligatory_info#:#Compulsory preconditions must be fulfilled, for having access. From b473d66e759b65f233b67d70a929676813b1a2b5 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Wed, 13 May 2026 17:59:00 +0200 Subject: [PATCH 2/4] adjust conditions order and error messages text --- .../classes/class.ilConditionHandlerGUI.php | 23 ++++++++++--------- lang/ilias_de.lang | 6 ++--- lang/ilias_en.lang | 6 ++--- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php index abad90b9c47d..f85ab61f8b68 100755 --- a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php +++ b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php @@ -1,7 +1,5 @@ lng->txt('precondition_num_optional_info') ) ->withValue($num_required > 0 ? $num_required : null) + // absolute ceilings: from 1 to # of preconditions + 1 + ->withAdditionalTransformation( + $this->refinery->custom()->constraint( + fn($val) => $val >= 1, + $this->lng->txt('precondition_number_of_required_materials_lower_than_one') + ) + ) // check if the number of required materials is bigger than compulsory conditions in subset mode ->withAdditionalTransformation( $this->refinery->custom()->constraint( @@ -942,18 +951,10 @@ function ($val) use ($is_subset_mode, $compulsory_count) { $this->lng->txt('precondition_number_of_required_materials_lower_compulsory_items') ) ) - // absolute ceilings: from 1 to # of preconditions + 1 - ->withAdditionalTransformation( - $this->refinery->custom()->constraint( - fn($val) => $val >= 1, - $this->lng->txt('precondition_number_of_required_materials_lower_than_one') - ) - ) ->withAdditionalTransformation( $this->refinery->custom()->constraint( fn($val) => $val <= $all_conditions_number - 1, $this->lng->txt('precondition_number_of_required_materials_bigger_preconditions_number') - ) ); } diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 6d74e0311e46..73eadfb89135 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -14516,9 +14516,9 @@ rbac#:#positions_override_operations#:#Globale Einstellungen überschreiben rbac#:#precondition_not_obligatory_alt#:#Die Vorbedingung ist optional rbac#:#precondition_num_obligatory#:#Geforderte Anzahl Materialien rbac#:#precondition_num_optional_info#:#Anzahl von Materialien, die bis zum festgelegten Status / Ergebnis zu bearbeiten sind -rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#Die Anzahl der geforderten Materialien muss kleiner als die Gesamtzahl der verfügbaren Vorbedingungen sein. -rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#Die Anzahl der erforderlichen Materialien muss größer als die Anzahl der verpflichtenden Vorbedingungen sein. -rbac#:#precondition_number_of_required_materials_lower_than_one#:#Sie müssen mindestens 1 Material angeben. +rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#Die Anzahl der geforderten Materialien muss kleiner sein, als die Anzahl der Vorbedingungen. +rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#Die Anzahl der geforderten Materialien muss größer sein, als die Anzahl der verpflichtenden Vorbedingungen. +rbac#:#precondition_number_of_required_materials_lower_than_one#:#Die Anzahl der geforderten Materialien muss mindestens 1 sein. rbac#:#precondition_obligatory#:#Verpflichtend rbac#:#precondition_obligatory_alt#:#Die Vorbedingung muss erfüllt werden rbac#:#precondition_obligatory_info#:#Verpflichtende Vorbedingungen müssen erfüllt werden, um Zugriff zu erhalten. diff --git a/lang/ilias_en.lang b/lang/ilias_en.lang index 1ee7fa6f871d..bf5795101e75 100755 --- a/lang/ilias_en.lang +++ b/lang/ilias_en.lang @@ -14517,9 +14517,9 @@ rbac#:#positions_override_operations#:#Override global Settings rbac#:#precondition_not_obligatory_alt#:#Precondition is optional rbac#:#precondition_num_obligatory#:#Number of Required Materials rbac#:#precondition_num_optional_info#:#Please enter the minimum number of materials required to fulfill this precondition. -rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#Number of required materials should be less than the total number of available preconditions. -rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#The number of required materials should be greater than the number of compulsory preconditions. -rbac#:#precondition_number_of_required_materials_lower_than_one#:#You must require at least 1 material. +rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#The number of required materials must be less than the total number of preconditions. +rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#The number of required materials must be greater than the number of compulsory preconditions. +rbac#:#precondition_number_of_required_materials_lower_than_one#:#The number of required materials must be at least 1. rbac#:#precondition_obligatory#:#Compulsory rbac#:#precondition_obligatory_alt#:#Precondition must be fulfilled rbac#:#precondition_obligatory_info#:#Compulsory preconditions must be fulfilled, for having access. From 956d200f0c8c5db6cd285697dd0f905af80d1e97 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Wed, 13 May 2026 17:59:00 +0200 Subject: [PATCH 3/4] adjust conditions order and error messages text # Conflicts: # components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php # lang/ilias_de.lang --- .../Conditions/classes/class.ilConditionHandlerGUI.php | 7 +++---- lang/ilias_de.lang | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php index f85ab61f8b68..368c058b5b2b 100755 --- a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php +++ b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php @@ -1,5 +1,7 @@ 1) { $num_required = ilConditionHandler::lookupObligatoryConditionsOfTarget( @@ -932,7 +932,6 @@ protected function initCompulsoryForm(bool $with_request = false): ?StandardForm $this->lng->txt('precondition_num_optional_info') ) ->withValue($num_required > 0 ? $num_required : null) - // absolute ceilings: from 1 to # of preconditions + 1 ->withAdditionalTransformation( $this->refinery->custom()->constraint( fn($val) => $val >= 1, diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 73eadfb89135..15d9d77e9a82 100644 --- a/lang/ilias_de.lang +++ b/lang/ilias_de.lang @@ -14516,8 +14516,8 @@ rbac#:#positions_override_operations#:#Globale Einstellungen überschreiben rbac#:#precondition_not_obligatory_alt#:#Die Vorbedingung ist optional rbac#:#precondition_num_obligatory#:#Geforderte Anzahl Materialien rbac#:#precondition_num_optional_info#:#Anzahl von Materialien, die bis zum festgelegten Status / Ergebnis zu bearbeiten sind -rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#Die Anzahl der geforderten Materialien muss kleiner sein, als die Anzahl der Vorbedingungen. -rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#Die Anzahl der geforderten Materialien muss größer sein, als die Anzahl der verpflichtenden Vorbedingungen. +rbac#:#precondition_number_of_required_materials_bigger_preconditions_number#:#Die Anzahl der geforderten Materialien muss kleiner sein als die Anzahl der Vorbedingungen. +rbac#:#precondition_number_of_required_materials_lower_compulsory_items#:#Die Anzahl der geforderten Materialien muss größer sein als die Anzahl der verpflichtenden Vorbedingungen. rbac#:#precondition_number_of_required_materials_lower_than_one#:#Die Anzahl der geforderten Materialien muss mindestens 1 sein. rbac#:#precondition_obligatory#:#Verpflichtend rbac#:#precondition_obligatory_alt#:#Die Vorbedingung muss erfüllt werden From f5c768c9eba14708729f947ef7f38112bdb8fc69 Mon Sep 17 00:00:00 2001 From: Aleksandr Litvin Date: Thu, 21 May 2026 16:26:16 +0200 Subject: [PATCH 4/4] small variable change --- .../Conditions/classes/class.ilConditionHandlerGUI.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php index 368c058b5b2b..2d0c8d325289 100755 --- a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php +++ b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php @@ -1,7 +1,5 @@ lng->txt('precondition_number_of_required_materials_bigger_preconditions_number') ) ); - } - if (count($all_conditions) > 1) { $condition_mode_subset = $this->ui_factory->input()->field()->group( $subset_limit, $this->lng->txt('rbac_precondition_mode_subset'),