-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathshow.php
294 lines (253 loc) · 10.5 KB
/
show.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Récupérer les données JSON et le nombre de copies
$jsonInput = $_POST['json_input'];
$numCopies = intval($_POST['copies']);
$maxQuestionsPerPage = intval($_POST['max_questions']); // Nombre de questions max par page
/**
* Fonction pour vérifier si le format est "text2quizz"
*/
function isText2Quizz($input) {
return strpos($input, 'QCM ||') !== false;
}
/**
* Conversion du format "text2quizz" en JSON
*/
function convertText2QuizzToJson($input) {
$lines = explode("\n", trim($input));
$questions = [];
foreach ($lines as $line) {
// Vérifier si la ligne commence par "QCM ||"
if (strpos($line, 'QCM ||') === 0) {
// Séparer la question et les réponses
$parts = explode(' || ', $line);
if (count($parts) === 3) {
$questionText = trim($parts[1]);
$answersText = trim($parts[2]);
// Séparer les réponses par "|"
$answers = explode('|', $answersText);
$choices = [];
$correctAnswers = [];
foreach ($answers as $answer) {
$answer = trim($answer);
if (strpos($answer, 'V:') === 0) {
// C'est une réponse correcte
$correctAnswer = substr($answer, 2); // Retirer le "V:"
$choices[] = $correctAnswer;
$correctAnswers[] = $correctAnswer;
} else {
// Réponse incorrecte
$choices[] = $answer;
}
}
// Ajouter la question au tableau
$questions[] = [
'question' => $questionText,
'choices' => $choices,
'correct_answer' => implode(', ', $correctAnswers) // Si plusieurs réponses correctes
];
}
}
}
return json_encode($questions, JSON_PRETTY_PRINT);
}
/**
* Si l'entrée est au format "text2quizz", la convertir en JSON
*/
if (isText2Quizz($jsonInput)) {
$jsonInput = convertText2QuizzToJson($jsonInput);
}
// Décoder le JSON
$questions = json_decode($jsonInput, true);
if (json_last_error() !== JSON_ERROR_NONE) {
die('Format JSON invalide. Veuillez vérifier vos données.');
}
// Fonction pour marquer les réponses correctes et générer le QCM corrigé
function generateCorrectedQCM($questions, $uniqueId) {
ob_start(); // Démarrer la capture du contenu HTML
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>QCM Corrigé</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<style>
body {
font-family: Arial, sans-serif;
font-size: 14px;
padding: 20px;
}
.question {
margin-bottom: 20px;
}
.choix {
margin-left: 20px;
}
</style>
</head>
<body>
<h1>QCM Corrigé</h1>
<div class="questionnaire">
<?php foreach ($questions as $index => $question): ?>
<div class="question">
<p><strong><?= ($index + 1) ?> - <?= htmlentities($question['question']) ?></strong></p>
<?php foreach ($question['choices'] as $choice): ?>
<?php if ($choice == $question['correct_answer']): ?>
<p class="choix">☑ <?= htmlentities($choice) ?></p>
<?php else: ?>
<p class="choix">☐ <?= htmlentities($choice) ?></p>
<?php endif; ?>
<?php endforeach; ?>
</div>
<?php endforeach; ?>
</div>
</body>
</html>
<?php
$htmlContent = ob_get_clean(); // Fin de la capture et retour du contenu
$filePath = "../qcms/{$uniqueId}.html";
// Sauvegarder le contenu HTML dans un fichier
file_put_contents($filePath, $htmlContent);
}
// Générer un identifiant unique pour chaque copie
function generateUniqueId() {
return time() . rand(1000, 9999);
}
?>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>QCM à imprimer</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<style>
@media print {
/* Masquer le bouton d'impression lors de l'impression */
.print-button {
display: none;
}
/* Forcer un saut de page après chaque copie */
.page {
page-break-after: always;
}
}
/* Conteneur principal pour l'entête et le questionnaire */
.copy {
display: flex;
flex-direction: column;
justify-content: flex-start;
width: 100%;
}
/* Positionner le QR code en haut à droite */
.header {
display: flex;
justify-content: space-between;
align-items: flex-start;
width: 100%;
margin-bottom: 10px; /* Réduire l'espace sous l'en-tête */
}
.header-left {
width: 70%;
}
.header-right {
width: 30%;
text-align: right;
}
/* Questions en deux colonnes */
.questionnaire {
display: flex;
flex-wrap: wrap;
font-size: 12px; /* Réduire un peu la taille de la police */
line-height: 1.2em; /* Réduire l'interligne */
}
/* Empêcher qu'une question soit coupée entre deux pages */
.question {
width: 50%;
padding: 5px; /* Réduire l'espacement autour des questions */
page-break-inside: avoid;
}
/* Réduire l'espacement entre les choix et la question */
.question p:first-child {
margin-bottom: 5px; /* Réduire l'espace entre la question et les choix */
font-weight: bold;
}
/* Réduire l'espacement entre les choix */
.choix {
margin-left: 20px;
margin-bottom: 3px; /* Réduire l'espace entre chaque choix */
}
/* Réduire la taille de l'image du QR code pour économiser de la place */
.header-right img {
width: 120px;
height: 120px;
}
</style>
</head>
<body>
<div class="container my-4">
<h1></h1>
<!-- Bouton d'impression (sera masqué lors de l'impression) -->
<button class="btn btn-primary mb-4 print-button" onclick="window.print()">Imprimer</button>
<?php for ($i = 0; $i < $numCopies; $i++): ?>
<div class="page">
<!-- Générer un identifiant unique pour chaque copie -->
<?php $uniqueId = generateUniqueId(); ?>
<div class="copy">
<!-- En-tête avec le QR code à droite -->
<div class="header">
<div class="header-left">
<h2 style="font-size: 16px;">Merci d'écrire en CAPITALES</h2>
<label>Nom :</label> ________________________________________________<br>
<label>Prénom :</label> _____________________________________________<br>
<label>Classe :</label> ______________________________________________<br>
<p style="margin-top: 5px;">Coloriez en NOIR les bonnes réponses</p>
</div>
<div class="header-right">
<!-- Generating a QR code that links to the corrected version -->
<img src="https://api.qrserver.com/v1/create-qr-code/?size=120x120&data=https://philo-lycée.fr/qcms.php?id=<?= $uniqueId ?>" alt="QR Code">
</div>
</div>
<!-- Section des questions -->
<div class="questionnaire">
<?php
// Mélanger les questions pour chaque copie
shuffle($questions); // Mélange les questions de manière aléatoire
// Pagination des questions en fonction du nombre maximum par page
$totalQuestions = count($questions);
$currentQuestion = 0;
while ($currentQuestion < $totalQuestions):
// Afficher un groupe de questions par page
for ($q = 0; $q < $maxQuestionsPerPage && $currentQuestion < $totalQuestions; $q++, $currentQuestion++):
$question = $questions[$currentQuestion];
// Mélanger les choix de la question
shuffle($question['choices']);
?>
<div class="question">
<p><strong><?= ($currentQuestion + 1) ?> - <?= htmlentities($question['question']) ?></strong></p>
<?php foreach ($question['choices'] as $choice): ?>
<p class="choix">☐ <?= htmlentities($choice) ?></p>
<?php endforeach; ?>
</div>
<?php endfor; ?>
<!-- Ajouter un saut de page pour la prochaine page de questions -->
<?php if ($currentQuestion < $totalQuestions): ?>
<div class="page-break"></div>
<?php endif; ?>
<?php endwhile; ?>
</div>
</div>
</div>
<?php
// Générer la version corrigée et l'enregistrer dans un fichier HTML
generateCorrectedQCM($questions, $uniqueId);
?>
<?php endfor; ?>
</div>
</body>
</html>
<?php
}
?>