ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
TestQuestionsImportTrait.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
23use Psr\Http\Message\ServerRequestInterface;
25
27{
28 private string $import_temp_directory = CLIENT_DATA_DIR . DIRECTORY_SEPARATOR . 'temp';
29
31 'ORDERING QUESTION' => \ilQTIItem::QT_ORDERING,
32 'KPRIM CHOICE QUESTION' => \ilQTIItem::QT_KPRIM_CHOICE,
33 'LONG MENU QUESTION' => \ilQTIItem::QT_LONG_MENU,
34 'SINGLE CHOICE QUESTION' => \ilQTIItem::QT_MULTIPLE_CHOICE_SR,
35 'MULTIPLE CHOICE QUESTION' => \ilQTIItem::QT_MULTIPLE_CHOICE_MR,
36 'MATCHING QUESTION' => \ilQTIItem::QT_MATCHING,
37 'CLOZE QUESTION' => \ilQTIItem::QT_CLOZE,
38 'IMAGE MAP QUESTION' => \ilQTIItem::QT_IMAGEMAP,
39 'TEXT QUESTION' => \ilQTIItem::QT_TEXT,
40 'NUMERIC QUESTION' => \ilQTIItem::QT_NUMERIC,
41 'TEXTSUBSET QUESTION' => \ilQTIItem::QT_TEXTSUBSET
42 ];
43
44 private function buildImportDirectoriesFromImportFile(string $file_to_import): array
45 {
46 $subdir = basename($file_to_import, '.zip');
47 return [
48 $subdir,
49 $this->import_temp_directory . DIRECTORY_SEPARATOR . $subdir,
50 $this->import_temp_directory . DIRECTORY_SEPARATOR . $subdir . DIRECTORY_SEPARATOR . $subdir . '.xml',
51 $this->import_temp_directory . DIRECTORY_SEPARATOR . $subdir . DIRECTORY_SEPARATOR . str_replace(
52 ['qpl', 'tst'],
53 'qti',
54 $subdir
55 ) . '.xml'
56 ];
57 }
58
59 private function buildImportDirectoriesFromContainerImport(string $importdir): array
60 {
61 return [
62 $importdir,
63 $importdir . DIRECTORY_SEPARATOR . basename($importdir) . '.xml',
64 $importdir . DIRECTORY_SEPARATOR . preg_replace('/test|tst|qpl/', 'qti', basename($importdir)) . '.xml'
65 ];
66 }
67
68 private function buildResultsFilePath(string $importdir, string $subdir): string
69 {
70 return $importdir . DIRECTORY_SEPARATOR
71 . str_replace('tst', 'results', $subdir) . '.xml';
72 }
73
74 private function getImportTempDirectory(): string
75 {
76 return $this->import_temp_directory;
77 }
78
79 private function buildImportDirectoryFromImportFile(string $file_to_import): string
80 {
81 $subdir = basename($file_to_import, '.zip');
82 return $this->import_temp_directory . DIRECTORY_SEPARATOR . $subdir;
83 }
84
86 string $form_cmd,
87 string $importdir,
88 string $qtifile,
89 ServerRequestInterface $request
90 ): array {
92 $form_cmd,
93 $importdir,
94 $qtifile
95 )->withRequest($request)->getData();
96 if (isset($data['selected_questions'])) {
97 return $data['selected_questions'];
98 }
99 return [];
100 }
101
103 string $form_cmd,
104 string $importdir,
105 string $qtifile,
106 ?string $path_to_uploaded_file_in_temp_dir = null
107 ): ?StandardForm {
108 $qtiParser = new \ilQTIParser(
109 $importdir,
110 $qtifile,
111 \ilQTIParser::IL_MO_VERIFY_QTI,
112 0,
113 []
114 );
115 $qtiParser->startParsing();
116 $founditems = &$qtiParser->getFoundItems();
117 if ($path_to_uploaded_file_in_temp_dir !== null && $founditems === []) {
118 \ilFileUtils::delDir($importdir);
119 $this->deleteUploadedImportFile($path_to_uploaded_file_in_temp_dir);
120 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('qpl_import_no_items'), true);
121 return null;
122 }
123
124 $complete = 0;
125 $incomplete = 0;
126 foreach ($founditems as $item) {
127 if ($item['type'] !== '') {
128 $complete++;
129 } else {
130 $incomplete++;
131 }
132 }
133
134 if ($complete == 0) {
135 \ilFileUtils::delDir($importdir);
136 $this->deleteUploadedImportFile($path_to_uploaded_file_in_temp_dir);
137 $this->tpl->setOnScreenMessage('failure', $this->lng->txt('qpl_import_non_ilias_files'), true);
138 return null;
139 }
140
141 $options = [];
142 $values = [];
143 foreach ($founditems as $item) {
144 $options[$item['ident']] = "{$item['title']} ({$this->getLabelForQuestionType($item['type'])})";
145 $values[] = $item['ident'];
146 }
147 $select_questions = $this->ui_factory->input()->field()->multiSelect(
148 $this->lng->txt('questions'),
149 $options
150 )->withValue($values);
151
152 return $this->ui_factory->input()->container()->form()->standard(
153 $this->ctrl->getFormActionByClass(self::class, $form_cmd),
154 ['selected_questions' => $select_questions]
155 )->withSubmitLabel($this->lng->txt('import'));
156 }
157
158 private function getLabelForQuestionType(string $type): string
159 {
160 if ($this->lng->exists($type)) {
161 return $this->lng->txt($type);
162 }
163
169 if (array_key_exists($type, $this->old_export_question_types)) {
170 return $this->lng->txt($this->old_export_question_types[$type]);
171 }
172 return $this->getLabelForPluginQuestionTypes($type);
173 }
174
175 private function getLabelForPluginQuestionTypes(string $type): string
176 {
177 foreach ($this->component_factory->getActivePluginsInSlot('qst') as $pl) {
178 if ($pl->getQuestionType() === $type) {
179 return $pl->getQuestionTypeTranslation();
180 }
181 }
182 return $type;
183 }
184}
static delDir(string $a_dir, bool $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
const QT_MULTIPLE_CHOICE_MR
const QT_MULTIPLE_CHOICE_SR
const QT_LONG_MENU
const QT_KPRIM_CHOICE
const QT_NUMERIC
const QT_MATCHING
const QT_ORDERING
const QT_IMAGEMAP
const QT_TEXTSUBSET
startParsing()
stores xml data in array
const CLIENT_DATA_DIR
Definition: constants.php:46
This describes a standard form.
Definition: Standard.php:29
buildImportDirectoriesFromContainerImport(string $importdir)
buildImportQuestionsSelectionForm(string $form_cmd, string $importdir, string $qtifile, ?string $path_to_uploaded_file_in_temp_dir=null)
buildImportDirectoryFromImportFile(string $file_to_import)
buildImportDirectoriesFromImportFile(string $file_to_import)
buildResultsFilePath(string $importdir, string $subdir)
retrieveSelectedQuestionsFromImportQuestionsSelectionForm(string $form_cmd, string $importdir, string $qtifile, ServerRequestInterface $request)