|
@@ -31,7 +31,7 @@ class LearnerSequence
|
31
|
31
|
*
|
32
|
32
|
* @var \SplObjectStorage
|
33
|
33
|
*/
|
34
|
|
- protected $tracks;
|
|
34
|
+ protected $tracks;
|
35
|
35
|
|
36
|
36
|
/**
|
37
|
37
|
*
|
|
@@ -41,7 +41,7 @@ class LearnerSequence
|
41
|
41
|
public function __construct(Person $learner, Sequence $sequence)
|
42
|
42
|
{
|
43
|
43
|
$this->learner = $learner;
|
44
|
|
- $this->sequence = $sequence;
|
|
44
|
+ $this->sequence = $sequence;
|
45
|
45
|
|
46
|
46
|
$this->tracks = new \SplObjectStorage();
|
47
|
47
|
}
|
|
@@ -236,16 +236,16 @@ class LearnerSequence
|
236
|
236
|
|
237
|
237
|
/**
|
238
|
238
|
* Retourne le score moyen d'un apprenant sur la séquence
|
239
|
|
- *
|
240
|
|
- * !! WARNING !!
|
241
|
|
- * Le service est injecté dans la méthode directement pour une raison de temps
|
242
|
|
- * Cette solution n'est que temporaire
|
243
|
|
- * Un refactoring est à prévoir avec principalement
|
244
|
|
- * le retrait de buildLearnerPath dans l'entity Session
|
245
|
|
- * !! WARNING !!
|
246
|
|
- *
|
247
|
|
- * @param ScormEngine $scormEngine
|
248
|
|
- * @return float|null
|
|
239
|
+ *
|
|
240
|
+ * !! WARNING !!
|
|
241
|
+ * Le service est injecté dans la méthode directement pour une raison de temps
|
|
242
|
+ * Cette solution n'est que temporaire
|
|
243
|
+ * Un refactoring est à prévoir avec principalement
|
|
244
|
+ * le retrait de buildLearnerPath dans l'entity Session
|
|
245
|
+ * !! WARNING !!
|
|
246
|
+ *
|
|
247
|
+ * @param ScormEngine $scormEngine
|
|
248
|
+ * @return float|null
|
249
|
249
|
*/
|
250
|
250
|
public function getAverageScore(ScormEngine $scormEngine)
|
251
|
251
|
{
|
|
@@ -254,9 +254,8 @@ class LearnerSequence
|
254
|
254
|
$scoreNum = 0;
|
255
|
255
|
|
256
|
256
|
$sequenceItems = $this->sequence->getSequenceItems();
|
257
|
|
-
|
258
|
|
- foreach ($sequenceItems as $item)
|
259
|
|
- {
|
|
257
|
+
|
|
258
|
+ foreach ($sequenceItems as $item) {
|
260
|
259
|
$itemScore = $this->getItemAverageScore($item, $scormEngine);
|
261
|
260
|
|
262
|
261
|
if (!is_null($itemScore)) {
|
|
@@ -276,17 +275,17 @@ class LearnerSequence
|
276
|
275
|
/**
|
277
|
276
|
* Retourne le score moyen d'un séquenceItem de type SCORM 12 si il est complété
|
278
|
277
|
*
|
279
|
|
- * !! WARNING !!
|
280
|
|
- * Le service est injecté dans la méthode directement pour une raison de temps
|
281
|
|
- * Cette solution n'est que temporaire
|
282
|
|
- * Un refactoring est à prévoir avec principalement
|
283
|
|
- * le retrait de buildLearnerPath dans l'entity Session
|
284
|
|
- * !! WARNING !!
|
285
|
|
- *
|
286
|
|
- * @param SequenceItem $item
|
287
|
|
- * @param ScormEngine $scormEngine
|
288
|
|
- *
|
289
|
|
- * @return float|null
|
|
278
|
+ * !! WARNING !!
|
|
279
|
+ * Le service est injecté dans la méthode directement pour une raison de temps
|
|
280
|
+ * Cette solution n'est que temporaire
|
|
281
|
+ * Un refactoring est à prévoir avec principalement
|
|
282
|
+ * le retrait de buildLearnerPath dans l'entity Session
|
|
283
|
+ * !! WARNING !!
|
|
284
|
+ *
|
|
285
|
+ * @param SequenceItem $item
|
|
286
|
+ * @param ScormEngine $scormEngine
|
|
287
|
+ *
|
|
288
|
+ * @return float|null
|
290
|
289
|
*/
|
291
|
290
|
public function getItemAverageScore(SequenceItem $item, ScormEngine $scormEngine)
|
292
|
291
|
{
|
|
@@ -294,53 +293,67 @@ class LearnerSequence
|
294
|
293
|
|
295
|
294
|
$sequenceItems = $this->sequence->getSequenceItems();
|
296
|
295
|
|
297
|
|
- if ($sequenceItems->contains($item))
|
298
|
|
- {
|
299
|
|
- if ($item instanceof ActivityPackage)
|
300
|
|
- {
|
301
|
|
- $track = $this->retrieveTrack($item);
|
302
|
|
-
|
303
|
|
- if ($track) {
|
304
|
|
- // On ne retourne le score moyen que si l'item est complété
|
305
|
|
- if ($track->getCompletion() == 100) {
|
306
|
|
- if (AbstractPackageFile::TYPE_SCORM1_2 == $item->getPackageType()) {
|
307
|
|
- $scoreSum = 0;
|
308
|
|
- $scoreNum = 0;
|
309
|
|
-
|
310
|
|
- $scorm12Tracks = $track->getScorm12Tracks();
|
311
|
|
-
|
312
|
|
- foreach ($scorm12Tracks as $scorm12Track) {
|
313
|
|
- $scoreMax = $scorm12Track->getScoreMax();
|
314
|
|
- // Si pas de score max, pas de score valide
|
315
|
|
- if ($scoreMax > 0) {
|
316
|
|
- $score = $scorm12Track->getScore();
|
317
|
|
- $score = $score * 100 / $scoreMax;
|
318
|
|
- $score = max(min($score, 100), 0);
|
319
|
|
-
|
320
|
|
- $scoreNum ++;
|
321
|
|
- $scoreSum += $score;
|
322
|
|
- }
|
323
|
|
- }
|
324
|
|
-
|
325
|
|
- if ($scoreNum > 0) {
|
326
|
|
- $averageScore = $scoreSum / $scoreNum;
|
327
|
|
- $averageScore = round($averageScore, 2);
|
328
|
|
- }
|
329
|
|
- }
|
330
|
|
-
|
331
|
|
- if (AbstractPackageFile::TYPE_SCORM2004 == $item->getPackageType()) {
|
332
|
|
- // Récupération de la clef de l'inscription
|
333
|
|
- $phoenixLearner = $track->getLearner();
|
334
|
|
- $learnerKey = $phoenixLearner->getPersonId();
|
335
|
|
- $sequenceItem = $track->getSequenceItem();
|
336
|
|
- $courseKey = $sequenceItem->getSequenceItemId();
|
337
|
|
- $registrationKey = $courseKey . '|' . $learnerKey;
|
338
|
|
-
|
339
|
|
- // Récupération de la complétion
|
340
|
|
- $averageScore = $scormEngine->getAverageScore($registrationKey);
|
341
|
|
- }
|
342
|
|
- }
|
343
|
|
- }
|
|
296
|
+
|
|
297
|
+ if ($sequenceItems->contains($item)) {
|
|
298
|
+ if ($item instanceof ActivityPackage) {
|
|
299
|
+ $track = $this->retrieveTrack($item);
|
|
300
|
+
|
|
301
|
+ if ($track) {
|
|
302
|
+ // On ne retourne le score moyen que si l'item est complété
|
|
303
|
+ if ($track->getCompletion() == 100) {
|
|
304
|
+ if (AbstractPackageFile::TYPE_SCORM1_2 == $item->getPackageType()) {
|
|
305
|
+ $scoreSum = 0;
|
|
306
|
+ $scoreNum = 0;
|
|
307
|
+
|
|
308
|
+ $scorm12Tracks = $track->getScorm12Tracks();
|
|
309
|
+
|
|
310
|
+ foreach ($scorm12Tracks as $scorm12Track) {
|
|
311
|
+ $itemInteractions = $scorm12Track->getInteractions();
|
|
312
|
+
|
|
313
|
+ if (!$itemInteractions->isEmpty()) {
|
|
314
|
+ // Test pour savoir si le questionnaire est composé seulement de question neutre ou non
|
|
315
|
+ $trackIsNeutral = true;
|
|
316
|
+ foreach ($itemInteractions as $interaction) {
|
|
317
|
+ if ($interaction->getResult() != "neutral") {
|
|
318
|
+ $trackIsNeutral = false;
|
|
319
|
+ break;
|
|
320
|
+ }
|
|
321
|
+ }
|
|
322
|
+ }
|
|
323
|
+
|
|
324
|
+ if ($trackIsNeutral == false) {
|
|
325
|
+ $scoreMax = $scorm12Track->getScoreMax();
|
|
326
|
+ // Si pas de score max, pas de score valide
|
|
327
|
+ if ($scoreMax > 0) {
|
|
328
|
+ $score = $scorm12Track->getScore();
|
|
329
|
+ $score = $score * 100 / $scoreMax;
|
|
330
|
+ $score = max(min($score, 100), 0);
|
|
331
|
+
|
|
332
|
+ $scoreNum++;
|
|
333
|
+ $scoreSum += $score;
|
|
334
|
+ }
|
|
335
|
+ }
|
|
336
|
+ }
|
|
337
|
+
|
|
338
|
+ if ($scoreNum > 0) {
|
|
339
|
+ $averageScore = $scoreSum / $scoreNum;
|
|
340
|
+ $averageScore = round($averageScore, 2);
|
|
341
|
+ }
|
|
342
|
+ }
|
|
343
|
+
|
|
344
|
+ if (AbstractPackageFile::TYPE_SCORM2004 == $item->getPackageType()) {
|
|
345
|
+ // Récupération de la clef de l'inscription
|
|
346
|
+ $phoenixLearner = $track->getLearner();
|
|
347
|
+ $learnerKey = $phoenixLearner->getPersonId();
|
|
348
|
+ $sequenceItem = $track->getSequenceItem();
|
|
349
|
+ $courseKey = $sequenceItem->getSequenceItemId();
|
|
350
|
+ $registrationKey = $courseKey . '|' . $learnerKey;
|
|
351
|
+
|
|
352
|
+ // Récupération de la complétion
|
|
353
|
+ $averageScore = $scormEngine->getAverageScore($registrationKey);
|
|
354
|
+ }
|
|
355
|
+ }
|
|
356
|
+ }
|
344
|
357
|
}
|
345
|
358
|
}
|
346
|
359
|
|
|
@@ -349,18 +362,18 @@ class LearnerSequence
|
349
|
362
|
|
350
|
363
|
/**
|
351
|
364
|
* Retourne un tableau contenant les quiz et leurs interactions pour une activité
|
352
|
|
- *
|
353
|
|
- * !! WARNING !!
|
354
|
|
- * Le service est injecté dans la méthode directement pour une raison de temps
|
355
|
|
- * Cette solution n'est que temporaire
|
356
|
|
- * Un refactoring est à prévoir avec principalement
|
357
|
|
- * le retrait de buildLearnerPath dans l'entity Session
|
358
|
|
- * !! WARNING !!
|
359
|
|
- *
|
360
|
|
- * @param SequenceItem $item
|
361
|
|
- * @param ScormEngine $scormEngine
|
362
|
|
- *
|
363
|
|
- * @return array|null
|
|
365
|
+ *
|
|
366
|
+ * !! WARNING !!
|
|
367
|
+ * Le service est injecté dans la méthode directement pour une raison de temps
|
|
368
|
+ * Cette solution n'est que temporaire
|
|
369
|
+ * Un refactoring est à prévoir avec principalement
|
|
370
|
+ * le retrait de buildLearnerPath dans l'entity Session
|
|
371
|
+ * !! WARNING !!
|
|
372
|
+ *
|
|
373
|
+ * @param SequenceItem $item
|
|
374
|
+ * @param ScormEngine $scormEngine
|
|
375
|
+ *
|
|
376
|
+ * @return array|null
|
364
|
377
|
*/
|
365
|
378
|
public function getItemInteractions(SequenceItem $item, ScormEngine $scormEngine)
|
366
|
379
|
{
|
|
@@ -368,85 +381,77 @@ class LearnerSequence
|
368
|
381
|
|
369
|
382
|
$sequenceItems = $this->sequence->getSequenceItems();
|
370
|
383
|
|
371
|
|
- if ($sequenceItems->contains($item))
|
372
|
|
- {
|
373
|
|
- if ($item instanceof ActivityPackage) {
|
374
|
|
- $track = $this->retrieveTrack($item);
|
375
|
|
-
|
376
|
|
- if ($track) {
|
377
|
|
- // CAS SCORM 1.2
|
378
|
|
- if (AbstractPackageFile::TYPE_SCORM1_2 == $item->getPackageType()) {
|
379
|
|
- $scorm12Tracks = $track->getScorm12Tracks();
|
380
|
|
-
|
381
|
|
- foreach ($scorm12Tracks as $scorm12Track) {
|
382
|
|
- $itemInteractions = $scorm12Track->getInteractions();
|
383
|
|
-
|
384
|
|
- if (!$itemInteractions->isEmpty())
|
385
|
|
- {
|
386
|
|
- $result = array();
|
|
384
|
+ if ($sequenceItems->contains($item)) {
|
|
385
|
+ if ($item instanceof ActivityPackage) {
|
|
386
|
+ $track = $this->retrieveTrack($item);
|
|
387
|
+
|
|
388
|
+ if ($track) {
|
|
389
|
+ // CAS SCORM 1.2
|
|
390
|
+ if (AbstractPackageFile::TYPE_SCORM1_2 == $item->getPackageType()) {
|
|
391
|
+ $scorm12Tracks = $track->getScorm12Tracks();
|
|
392
|
+
|
|
393
|
+ foreach ($scorm12Tracks as $scorm12Track) {
|
|
394
|
+ $itemInteractions = $scorm12Track->getInteractions();
|
|
395
|
+
|
|
396
|
+ if (!$itemInteractions->isEmpty()) {
|
|
397
|
+ $result = array();
|
387
|
398
|
$scormItem = $scorm12Track->getItem();
|
388
|
399
|
$result['title'] = $scormItem->getTitle();
|
389
|
400
|
|
390
|
401
|
// Test pour savoir si le questionnaire est composé seulement de question neutre ou non
|
391
|
402
|
$trackIsNeutral = true;
|
392
|
|
- foreach($itemInteractions as $interaction)
|
393
|
|
- {
|
394
|
|
- if ($interaction->getResult() != "neutral")
|
395
|
|
- {
|
|
403
|
+ foreach ($itemInteractions as $interaction) {
|
|
404
|
+ if ($interaction->getResult() != "neutral") {
|
396
|
405
|
$trackIsNeutral = false;
|
397
|
406
|
break;
|
398
|
407
|
}
|
399
|
408
|
}
|
400
|
409
|
|
401
|
|
- if ($trackIsNeutral)
|
402
|
|
- {
|
|
410
|
+ if ($trackIsNeutral) {
|
403
|
411
|
$result['score'] = null;
|
404
|
412
|
$result['lessonStatus'] = null;
|
405
|
|
- }
|
406
|
|
- else
|
407
|
|
- {
|
|
413
|
+ } else {
|
408
|
414
|
$score = null;
|
409
|
415
|
$scoreMax = $scorm12Track->getScoreMax();
|
410
|
416
|
// Si pas de score max, pas de score valide
|
411
|
|
- if ($scoreMax > 0)
|
412
|
|
- {
|
|
417
|
+ if ($scoreMax > 0) {
|
413
|
418
|
$score = $scorm12Track->getScore();
|
414
|
419
|
$score = $score * 100 / $scoreMax;
|
415
|
420
|
$score = max(min($score, 100), 0);
|
416
|
421
|
}
|
417
|
422
|
$result['score'] = $score;
|
418
|
|
-
|
|
423
|
+
|
419
|
424
|
$status = $scorm12Track->getLessonStatus();
|
420
|
425
|
$result['lessonStatus'] = $status;
|
421
|
426
|
}
|
422
|
|
-
|
|
427
|
+
|
423
|
428
|
$result['interactions'] = $itemInteractions;
|
424
|
429
|
|
425
|
430
|
$interactions[] = $result;
|
426
|
|
- }
|
427
|
|
- }
|
428
|
|
-
|
429
|
|
- if (count($interactions) > 0) {
|
430
|
|
- return $interactions;
|
431
|
|
- }
|
432
|
|
- }
|
433
|
|
-
|
434
|
|
- // CAS SCORM2004 (engine)
|
435
|
|
- if ($item->getPackageType() == AbstractPackageFile::TYPE_SCORM2004) {
|
436
|
|
- // Récupération de la clef de l'inscription
|
437
|
|
- $phoenixLearner = $track->getLearner();
|
438
|
|
- $learnerKey = $phoenixLearner->getPersonId();
|
439
|
|
- $sequenceItem = $track->getSequenceItem();
|
440
|
|
- $courseKey = $sequenceItem->getSequenceItemId();
|
441
|
|
- $registrationKey = $courseKey . '|' . $learnerKey;
|
442
|
|
-
|
443
|
|
- // Récupération de la complétion
|
444
|
|
- $interactions = $scormEngine->getInteractions($registrationKey);
|
445
|
|
-
|
446
|
|
- return $interactions;
|
447
|
|
- }
|
448
|
|
- }
|
449
|
|
- }
|
|
431
|
+ }
|
|
432
|
+ }
|
|
433
|
+
|
|
434
|
+ if (count($interactions) > 0) {
|
|
435
|
+ return $interactions;
|
|
436
|
+ }
|
|
437
|
+ }
|
|
438
|
+
|
|
439
|
+ // CAS SCORM2004 (engine)
|
|
440
|
+ if ($item->getPackageType() == AbstractPackageFile::TYPE_SCORM2004) {
|
|
441
|
+ // Récupération de la clef de l'inscription
|
|
442
|
+ $phoenixLearner = $track->getLearner();
|
|
443
|
+ $learnerKey = $phoenixLearner->getPersonId();
|
|
444
|
+ $sequenceItem = $track->getSequenceItem();
|
|
445
|
+ $courseKey = $sequenceItem->getSequenceItemId();
|
|
446
|
+ $registrationKey = $courseKey . '|' . $learnerKey;
|
|
447
|
+
|
|
448
|
+ // Récupération de la complétion
|
|
449
|
+ $interactions = $scormEngine->getInteractions($registrationKey);
|
|
450
|
+
|
|
451
|
+ return $interactions;
|
|
452
|
+ }
|
|
453
|
+ }
|
|
454
|
+ }
|
450
|
455
|
}
|
451
|
456
|
|
452
|
457
|
return null;
|