diff --git a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php index 335ba5cce035..2d0c8d325289 100755 --- a/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php +++ b/components/ILIAS/Conditions/classes/class.ilConditionHandlerGUI.php @@ -1,7 +1,5 @@ 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,30 +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); + 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)) - ] - ) - ); - } - if (count($all_conditions) > 1) { + $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->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( + 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') + ) + ) + ->withAdditionalTransformation( + $this->refinery->custom()->constraint( + fn($val) => $val <= $all_conditions_number - 1, + $this->lng->txt('precondition_number_of_required_materials_bigger_preconditions_number') + ) + ); $condition_mode_subset = $this->ui_factory->input()->field()->group( $subset_limit, $this->lng->txt('rbac_precondition_mode_subset'), diff --git a/lang/ilias_de.lang b/lang/ilias_de.lang index 436d20c6b345..15d9d77e9a82 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 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 d6f95bdc77e3..bf5795101e75 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#:#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.