19 declare(strict_types=1);
39 protected int $question_title_output_mode,
40 protected bool $autosave_enabled,
41 protected int $autosave_interval,
42 protected bool $shuffle_questions,
43 protected bool $question_hints_enabled,
44 protected bool $instant_feedback_points_enabled,
45 protected bool $instant_feedback_generic_enabled,
46 protected bool $instant_feedback_specific_enabled,
47 protected bool $instant_feedback_solution_enabled,
48 protected bool $force_instant_feedback_on_next_question,
49 protected bool $lock_answer_on_instant_feedback,
50 protected bool $lock_answer_on_next_question,
51 protected bool $compulsory_questions_enabled
64 array $environment = null
66 $inputs[
'title_output'] = $f->radio($lng->
txt(
'tst_title_output'))
67 ->withOption(
'0', $lng->
txt(
'tst_title_output_full'))
68 ->withOption(
'1', $lng->
txt(
'tst_title_output_hide_points'))
69 ->withOption(
'3', $lng->
txt(
'tst_title_output_only_points'))
70 ->withOption(
'2', $lng->
txt(
'tst_title_output_no_title'))
76 $inputs[
'shuffle_questions'] = $f->checkbox(
77 $lng->
txt(
'tst_shuffle_questions'),
78 $lng->
txt(
'tst_shuffle_questions_description')
81 $inputs[
'offer_hints'] = $f->checkbox(
82 $lng->
txt(
'tst_setting_offer_hints_label'),
83 $lng->
txt(
'tst_setting_offer_hints_info')
86 if ($environment[
'participant_data_exists']) {
87 $inputs[
'shuffle_questions'] =
$inputs[
'shuffle_questions']->withDisabled(
true);
88 $inputs[
'offer_hints'] =
$inputs[
'offer_hints']->withDisabled(
true);
94 $inputs[
'enable_compulsory_questions'] = $f->checkbox(
95 $lng->
txt(
'tst_setting_enable_obligations_label'),
96 $lng->
txt(
'tst_setting_enable_obligations_info')
99 if ($environment[
'participant_data_exists']) {
100 $inputs[
'enable_compulsory_questions'] =
$inputs[
'enable_compulsory_questions']->withDisabled(
true);
103 $section = $f->section(
$inputs, $lng->
txt(
'tst_presentation_properties'));
105 $section = $section->withAdditionalTransformation($constraint);
116 $trafo = $refinery->custom()->transformation(
117 static function (?array $vs): array {
120 'autosave_enabled' =>
false,
121 'autosave_interval' => self::DEFAULT_AUTOSAVE_INTERVAL
126 'autosave_enabled' =>
true,
127 'autosave_interval' => $vs[
'autosave_interval'] * 1000
131 $sub_inputs_autosave[
'autosave_interval'] = $f->numeric($lng->
txt(
'autosave_ival'), $lng->
txt(
'seconds'))
140 $autosave_input = $f->optionalGroup(
141 $sub_inputs_autosave,
142 $lng->
txt(
'autosave'),
143 $lng->
txt(
'autosave_info')
145 ->withAdditionalTransformation($trafo);
148 return $autosave_input;
151 return $autosave_input->withValue(
164 $constraint = $refinery->custom()->constraint(
165 fn(?array $vs) => $vs === null
166 || $vs[
'enabled_feedback_types'][
'instant_feedback_specific'] === null
167 && $vs[
'enabled_feedback_types'][
'instant_feedback_generic'] === null
168 && $vs[
'enabled_feedback_types'][
'instant_feedback_points'] === null
169 && $vs[
'enabled_feedback_types'][
'instant_feedback_solution'] === null
170 && $vs[
'feedback_trigger'] === null
172 $vs[
'enabled_feedback_types'][
'instant_feedback_specific'] ===
true 173 || $vs[
'enabled_feedback_types'][
'instant_feedback_generic'] ===
true 174 || $vs[
'enabled_feedback_types'][
'instant_feedback_points'] ===
true 175 || $vs[
'enabled_feedback_types'][
'instant_feedback_solution'] ===
true 177 && $vs[
'feedback_trigger'] !==
'',
178 $lng->
txt(
'select_at_least_one_feedback_type_and_trigger')
180 $trafo = $refinery->custom()->transformation(
181 static function (?array $vs): array {
184 'enabled_feedback_types' => [
185 'instant_feedback_specific' =>
false,
186 'instant_feedback_generic' =>
false,
187 'instant_feedback_points' =>
false,
188 'instant_feedback_solution' => false
190 'feedback_on_next_question' => false
194 $vs[
'feedback_on_next_question'] = $vs[
'feedback_trigger'] ===
'1' ? true :
false;
199 $instant_feedback = $f->optionalGroup(
201 $lng->
txt(
'tst_instant_feedback'),
202 $lng->
txt(
'tst_instant_feedback_desc')
204 ->withAdditionalTransformation($constraint)
205 ->withAdditionalTransformation($trafo);
208 $instant_feedback = $instant_feedback->withValue(
210 'enabled_feedback_types' => [
222 if (!$environment[
'participant_data_exists']) {
223 return $instant_feedback;
226 return $instant_feedback->withDisabled(
true);
234 $feedback_options = [
235 'instant_feedback_points' => $f->checkbox(
236 $lng->
txt(
'tst_instant_feedback_results'),
237 $lng->
txt(
'tst_instant_feedback_results_desc')
239 'instant_feedback_generic' => $f->checkbox(
240 $lng->
txt(
'tst_instant_feedback_answer_generic'),
241 $lng->
txt(
'tst_instant_feedback_answer_generic_desc')
243 'instant_feedback_specific' => $f->checkbox(
244 $lng->
txt(
'tst_instant_feedback_answer_specific'),
245 $lng->
txt(
'tst_instant_feedback_answer_specific_desc')
247 'instant_feedback_solution' => $f->checkbox(
248 $lng->
txt(
'tst_instant_feedback_solution'),
249 $lng->
txt(
'tst_instant_feedback_solution_desc')
253 $sub_inputs_feedback[
'enabled_feedback_types'] = $f->group(
255 $lng->
txt(
'tst_instant_feedback_contents')
258 $sub_inputs_feedback[
'feedback_trigger'] = $f->radio(
259 $lng->
txt(
'tst_instant_feedback_trigger')
262 $lng->
txt(
'tst_instant_feedback_trigger_manual'),
263 $lng->
txt(
'tst_instant_feedback_trigger_manual_desc')
266 $lng->
txt(
'tst_instant_feedback_trigger_forced'),
267 $lng->
txt(
'tst_instant_feedback_trigger_forced_desc')
270 if (!$environment[
'participant_data_exists']) {
271 $sub_inputs_feedback[
'feedback_trigger'] = $sub_inputs_feedback[
'feedback_trigger']
272 ->withRequired(
true);
274 return $sub_inputs_feedback;
285 $lock_answers = $f->radio(
286 $lng->
txt(
'tst_answer_fixation_handling')
288 self::ANSWER_FIXATION_NONE,
289 $lng->
txt(
'tst_answer_fixation_none'),
290 $lng->
txt(
'tst_answer_fixation_none_desc')
292 self::ANSWER_FIXATION_ON_INSTANT_FEEDBACK,
293 $lng->
txt(
'tst_answer_fixation_on_instant_feedback'),
294 $lng->
txt(
'tst_answer_fixation_on_instant_feedback_desc')
296 self::ANSWER_FIXATION_ON_FOLLOWUP_QUESTION,
297 $lng->
txt(
'tst_answer_fixation_on_followup_question'),
298 $lng->
txt(
'tst_answer_fixation_on_followup_question_desc')
300 self::ANSWER_FIXATION_ON_IFB_OR_FUQST,
301 $lng->
txt(
'tst_answer_fixation_on_instantfb_or_followupqst'),
302 $lng->
txt(
'tst_answer_fixation_on_instantfb_or_followupqst_desc')
307 if (!$environment[
'participant_data_exists']) {
308 return $lock_answers;
311 return $lock_answers->withDisabled(
true);
316 return $refinery->custom()->transformation(
317 static function (?
string $v): array {
318 if ($v === null || $v === self::ANSWER_FIXATION_NONE) {
320 'lock_answer_on_instant_feedback' =>
false,
321 'lock_answer_on_next_question' => false
325 if ($v === self::ANSWER_FIXATION_ON_INSTANT_FEEDBACK) {
327 'lock_answer_on_instant_feedback' =>
true,
328 'lock_answer_on_next_question' => false
331 if ($v === self::ANSWER_FIXATION_ON_FOLLOWUP_QUESTION) {
333 'lock_answer_on_instant_feedback' =>
false,
334 'lock_answer_on_next_question' => true
339 'lock_answer_on_instant_feedback' =>
true,
340 'lock_answer_on_next_question' => true
351 $refinery->custom()->constraint(
352 function ($vs):
bool {
353 if ($vs[
'enable_compulsory_questions'] ===
true 355 $vs[
'lock_answers'][
'lock_answer_on_instant_feedback']
356 || $vs[
'lock_answers'][
'lock_answer_on_next_question']
363 $lng->
txt(
'tst_settings_conflict_compulsory_and_lock')
365 $refinery->custom()->constraint(
366 function ($vs):
bool {
367 if ($vs[
'shuffle_questions'] ===
true 368 && $vs[
'lock_answers'][
'lock_answer_on_next_question']) {
373 $lng->
txt(
'tst_settings_conflict_shuffle_and_lock')
399 return $this->question_title_output_mode;
403 $clone = clone $this;
404 $clone->question_title_output_mode = $question_title_output_mode;
410 return $this->autosave_enabled;
414 $clone = clone $this;
415 $clone->autosave_enabled = $autosave_enabled;
421 return $this->autosave_interval;
425 $clone = clone $this;
426 $clone->autosave_interval = $autosave_interval;
432 return $this->shuffle_questions;
436 $clone = clone $this;
437 $clone->shuffle_questions = $shuffle_questions;
443 return $this->question_hints_enabled;
447 $clone = clone $this;
448 $clone->question_hints_enabled = $question_hints_enabled;
454 return $this->instant_feedback_points_enabled;
458 $clone = clone $this;
459 $clone->instant_feedback_points_enabled = $instant_feedback_points_enabled;
464 return $this->instant_feedback_generic_enabled;
468 $clone = clone $this;
469 $clone->instant_feedback_generic_enabled = $instant_feedback_generic_enabled;
474 return $this->instant_feedback_specific_enabled;
478 $clone = clone $this;
479 $clone->instant_feedback_specific_enabled = $instant_feedback_specific_enabled;
484 return $this->instant_feedback_solution_enabled;
488 $clone = clone $this;
489 $clone->instant_feedback_solution_enabled = $instant_feedback_solution_enabled;
502 return $this->force_instant_feedback_on_next_question;
506 $clone = clone $this;
507 $clone->force_instant_feedback_on_next_question = $force_instant_feedback_on_next_question;
513 return $this->lock_answer_on_instant_feedback;
517 return $this->lock_answer_on_next_question;
523 return self::ANSWER_FIXATION_ON_IFB_OR_FUQST;
527 return self::ANSWER_FIXATION_ON_INSTANT_FEEDBACK;
531 return self::ANSWER_FIXATION_ON_FOLLOWUP_QUESTION;
534 return self::ANSWER_FIXATION_NONE;
538 $clone = clone $this;
539 $clone->lock_answer_on_instant_feedback = $lock_answer_on_instant_feedback;
544 $clone = clone $this;
545 $clone->lock_answer_on_next_question = $lock_answer_on_next_question;
551 return $this->compulsory_questions_enabled;
555 $clone = clone $this;
556 $clone->compulsory_questions_enabled = $compulsory_questions_enabled;
withInstantFeedbackSpecificEnabled(bool $instant_feedback_specific_enabled)
getLockAnswerOnInstantFeedbackEnabled()
const DEFAULT_AUTOSAVE_INTERVAL
withQuestionHintsEnabled(bool $question_hints_enabled)
const ANSWER_FIXATION_ON_FOLLOWUP_QUESTION
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
getCompulsoryQuestionsEnabled()
withForceInstantFeedbackOnNextQuestion(bool $force_instant_feedback_on_next_question)
withLockAnswerOnInstantFeedbackEnabled(bool $lock_answer_on_instant_feedback)
getInstantFeedbackPointsEnabled()
withAutosaveEnabled(bool $autosave_enabled)
const ANSWER_FIXATION_ON_IFB_OR_FUQST
getTransformationLockAnswers(Refinery $refinery)
toForm(\ilLanguage $lng, FieldFactory $f, Refinery $refinery, array $environment=null)
getForceInstantFeedbackOnNextQuestion()
const ANSWER_FIXATION_ON_INSTANT_FEEDBACK
withAutosaveInterval(int $autosave_interval)
getQuestionTitleOutputMode()
withInstantFeedbackSolutionEnabled(bool $instant_feedback_solution_enabled)
getInputLockAnswers(\ilLanguage $lng, FieldFactory $f, Refinery $refinery, array $environment)
withLockAnswerOnNextQuestionEnabled(bool $lock_answer_on_next_question)
withCompulsoryQuestionsEnabled(bool $compulsory_questions_enabled)
__construct(int $test_id, protected int $question_title_output_mode, protected bool $autosave_enabled, protected int $autosave_interval, protected bool $shuffle_questions, protected bool $question_hints_enabled, protected bool $instant_feedback_points_enabled, protected bool $instant_feedback_generic_enabled, protected bool $instant_feedback_specific_enabled, protected bool $instant_feedback_solution_enabled, protected bool $force_instant_feedback_on_next_question, protected bool $lock_answer_on_instant_feedback, protected bool $lock_answer_on_next_question, protected bool $compulsory_questions_enabled)
getInstantFeedbackGenericEnabled()
getInputAutosave(\ilLanguage $lng, FieldFactory $f, Refinery $refinery)
isAnyInstantFeedbackOptionEnabled()
getConstraintsSectionQuestionBehaviour(\ilLanguage $lng, Refinery $refinery)
withQuestionTitleOutputMode(int $question_title_output_mode)
getAnswerFixationSettingsAsFormValue()
getInstantFeedbackSolutionEnabled()
withInstantFeedbackGenericEnabled(bool $instant_feedback_generic_enabled)
const ANSWER_FIXATION_NONE
withShuffleQuestions(bool $shuffle_questions)
getLockAnswerOnNextQuestionEnabled()
getInstantFeedbackSpecificEnabled()
getInputInstantFeedback(\ilLanguage $lng, FieldFactory $f, Refinery $refinery, array $environment)
getSubInputInstantFeedback(\ilLanguage $lng, FieldFactory $f, array $environment)
getQuestionHintsEnabled()
withInstantFeedbackPointsEnabled(bool $instant_feedback_points_enabled)
Refinery Factory $refinery