Compare commits

...

7 Commits

Author SHA1 Message Date
13a603b1f9 fonction getReport ajoutée à tester 2024-04-04 16:13:54 +02:00
ab34cb1953 Fonctions pour récupérer les données des rapports 2024-04-04 15:36:05 +02:00
65029fb191 Ecriture dans report sauf dans course à venir 2024-04-04 13:14:43 +02:00
e58ce9cda0 update :
creation des bases de données report dans les espaces avec les historiques des utilisateurs
2024-04-04 11:27:48 +02:00
0b14519567 Interface de gestion des abonnements 2024-04-03 18:22:05 +02:00
0eede10300 readme 2024-04-03 17:46:04 +02:00
5dc51a62ce 1.8.00 initialise avec la création des bases dans les espaces WIP 2024-04-03 16:59:04 +02:00
11 changed files with 265 additions and 146 deletions

View File

@ -1,4 +1,4 @@
# ZwiiCampus 1.7.07 # ZwiiCampus 1.8.00
ZwiiCampus (Learning Management System) est logiciel auteur destiné à mettre en ligne des tutoriels. Il dispose de plusieurs modalités d'ouverture et d'accès des contenus. Basé sur la version 13 du CMS Zwii, la structure logicielle est solide, le framework de Zwii est éprouvé. ZwiiCampus (Learning Management System) est logiciel auteur destiné à mettre en ligne des tutoriels. Il dispose de plusieurs modalités d'ouverture et d'accès des contenus. Basé sur la version 13 du CMS Zwii, la structure logicielle est solide, le framework de Zwii est éprouvé.

View File

@ -143,7 +143,6 @@ class JsonDb extends \Prowebcraft\Dot
public function save() public function save()
{ {
$v = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT ); $v = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT );
// $v = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT);
$l = strlen($v); $l = strlen($v);
$t = 0; $t = 0;
while ($t < 5) { while ($t < 5) {

View File

@ -423,10 +423,10 @@ class core extends common
) )
) { ) {
// Stocke l'historique des pages vues // Stocke l'historique des pages vues
$data = is_array($this->getData(['enrolment', self::$siteContent, $this->getUser('id'), 'history', $this->getUrl(0)])) $data = is_array($this->getData(['report', $this->getUser('id'), $this->getUrl(0)]))
? array_merge([time()], $this->getData(['enrolment', self::$siteContent, $this->getUser('id'), 'history', $this->getUrl(0)])) ? array_merge([time()], $this->getData(['report', $this->getUser('id'),$this->getUrl(0)]))
: [time()]; : [time()];
$this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'history', $this->getUrl(0), $data]); $this->setData(['report', $this->getUser('id'), $this->getUrl(0), $data]);
// Stocke la dernière page vue et sa date de consultation // Stocke la dernière page vue et sa date de consultation
$this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'lastPageView', $this->getUrl(0)]); $this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'lastPageView', $this->getUrl(0)]);
$this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'datePageView', time()]); $this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'datePageView', time()]);

View File

@ -51,7 +51,7 @@ class common
const ACCESS_TIMER = 1800; const ACCESS_TIMER = 1800;
// Numéro de version // Numéro de version
const ZWII_VERSION = '1.7.09'; const ZWII_VERSION = '1.8.00';
// URL autoupdate // URL autoupdate
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/'; const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/';
@ -224,14 +224,15 @@ class common
'user' => '', 'user' => '',
'language' => '', 'language' => '',
'profil' => '', 'profil' => '',
'enrolment' => '',
'category' => '', 'category' => '',
'enrolment' => '',
]; ];
private $contentFiles = [ private $contentFiles = [
'page' => '', 'page' => '',
'module' => '', 'module' => '',
'theme' => '', 'theme' => '',
'report' => '',
]; ];
public static $fontsWebSafe = [ public static $fontsWebSafe = [
@ -447,7 +448,7 @@ class common
} }
// Mise à jour des données core // Mise à jour des données core
include('core/include/update.inc.php'); include ('core/include/update.inc.php');
} }
@ -598,6 +599,123 @@ class common
return file_put_contents(self::DATA_DIR . $path . '/content/' . $page . '.html', $value); return file_put_contents(self::DATA_DIR . $path . '/content/' . $page . '.html', $value);
} }
/**
* Fonction pour obtenir les statistiques d'un utilisateur ou d'une page spécifique à partir d'un fichier JSON.
*
* @param string $courseId Identifiant du cours.
* @param string|null $user Nom de l'utilisateur (facultatif).
* @param string|null $page Nom de la page (facultatif).
* @return mixed Statistiques demandées ou null si non trouvées.
*/
public function getReport($courseId, $user = null, $page = null)
{
// Lire les données du fichier JSON
$data = json_decode(file_get_contents(self::DATA_DIR . $courseId . '/report.json'), true);
// Si aucun utilisateur n'est spécifié, retourner toutes les statistiques
if ($user === null) {
return $data['report'];
}
// Si un utilisateur est spécifié mais pas de page, retourner les statistiques de cet utilisateur
if ($page === null) {
return isset($data['report'][$user]) ? $data['report'][$user] : null;
}
// Si à la fois un utilisateur et une page sont spécifiés, retourner les statistiques de cette page pour cet utilisateur
return isset($data['report'][$user][$page]) ? $data['report'][$user][$page] : null;
}
/**
* Fonction pour écrire les données de statistiques dans un fichier JSON.
*
* @param string $courseId Identifiant du cours.
* @param string $user Nom de l'utilisateur.
* @param string $page Nom de la page.
* @param int|null $timestamp Timestamp de la visite (facultatif).
* @return int|false Le nombre d'octets écrits ou false en cas d'erreur.
*/
public function setReport($courseId, $user, $page, $timestamp = null)
{
// Lire les données existantes du fichier
$data = json_decode(file_get_contents(self::DATA_DIR . $courseId . '/report.json'), true);
// Pointeur pour naviguer dans la structure
$pointer =& $data['report'];
// Si la clé utilisateur n'existe pas, la créer
if (!isset($pointer[$user])) {
$pointer[$user] = [];
}
// Si une date est fournie, l'ajouter, sinon ajouter une visite sans date
if ($timestamp !== null) {
// Ajouter la visite avec la date
$pointer[$user][$page][] = $timestamp;
} else {
// Ajouter une visite sans date
$pointer[$user][$page][] = time(); // Timestamp actuel
}
// Écrire les données modifiées dans le fichier
return file_put_contents(self::DATA_DIR . $courseId . '/report.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
}
/**
* Fonction pour supprimer toutes les statistiques, les statistiques d'un utilisateur spécifique
* ou les statistiques d'une page spécifique pour tous les utilisateurs.
*
* @param string $courseId Identifiant du cours.
* @param string|null $user Nom de l'utilisateur à supprimer (facultatif).
* @param string|null $page Nom de la page à supprimer (facultatif).
* @return bool Retourne true si les statistiques ont été supprimées avec succès, sinon false.
*/
public function deleteReport($courseId, $user = null, $page = null)
{
// Lire les données existantes du fichier
$data = json_decode(file_get_contents(self::DATA_DIR . $courseId . '/report.json'), true);
$deleted = false; // Variable pour suivre si des statistiques ont été supprimées
// Si aucun utilisateur ni page n'est spécifié, supprimer toutes les statistiques
if ($user === null && $page === null) {
unset($data['report']);
$deleted = true;
} elseif ($user !== null && $page === null) {
// Si un utilisateur est spécifié mais pas de page, supprimer les statistiques de cet utilisateur
if (isset($data['report'][$user])) {
unset($data['report'][$user]);
$deleted = true;
}
} elseif ($user !== null && $page !== null) {
// Si à la fois un utilisateur et une page sont spécifiés, supprimer la page pour cet utilisateur
if (isset($data['report'][$user][$page])) {
unset($data['report'][$user][$page]);
$deleted = true;
}
} elseif ($user === null && $page !== null) {
// Si une page est spécifiée mais pas d'utilisateur, supprimer la page pour tous les utilisateurs
foreach ($data['report'] as $username => &$userStats) {
if (isset($userStats[$page])) {
unset($userStats[$page]);
// Si l'utilisateur n'a plus de pages, le supprimer également
if (empty($userStats)) {
unset($data['report'][$username]);
}
$deleted = true;
}
}
}
// Écrire les données modifiées dans le fichier si au moins une statistique a été supprimée
if ($deleted) {
return file_put_contents(self::DATA_DIR . $courseId . '/report.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)) !== false;
}
return false; // Aucun utilisateur ou page spécifié, aucune action réalisée
}
/** /**
@ -634,7 +752,7 @@ class common
{ {
// Tableau avec les données vierges // Tableau avec les données vierges
require_once('core/module/install/ressource/defaultdata.php'); require_once ('core/module/install/ressource/defaultdata.php');
// L'arborescence // L'arborescence
if (!file_exists(self::DATA_DIR . $path)) { if (!file_exists(self::DATA_DIR . $path)) {
@ -669,7 +787,7 @@ class common
public function saveConfig($module) public function saveConfig($module)
{ {
// Tableau avec les données vierges // Tableau avec les données vierges
require_once('core/module/install/ressource/defaultdata.php'); require_once ('core/module/install/ressource/defaultdata.php');
// Installation des données des autres modules cad theme profil font config, admin et core // Installation des données des autres modules cad theme profil font config, admin et core
$this->setData([$module, init::$defaultData[$module]]); $this->setData([$module, init::$defaultData[$module]]);
common::$coreNotices[] = $module; common::$coreNotices[] = $module;
@ -1436,7 +1554,7 @@ class common
// Affiche les espaces gérés par l'éditeur, les espaces où il participe et les espaces anonymes // Affiche les espaces gérés par l'éditeur, les espaces où il participe et les espaces anonymes
if ( if (
// le membre est inscrit // le membre est inscrit
( $this->getData(['enrolment', $courseId]) && array_key_exists($this->getUser('id'), $this->getData(['enrolment', $courseId])) ) ($this->getData(['enrolment', $courseId]) && array_key_exists($this->getUser('id'), $this->getData(['enrolment', $courseId])))
// Il est l'auteur // Il est l'auteur
|| $this->getUser('id') === $this->getData(['course', $courseId, 'author']) || $this->getUser('id') === $this->getData(['course', $courseId, 'author'])
// Le cours est ouvert // Le cours est ouvert
@ -1450,7 +1568,7 @@ class common
foreach ($courses as $courseId => $value) { foreach ($courses as $courseId => $value) {
// Affiche les espaces du participant et les espaces anonymes // Affiche les espaces du participant et les espaces anonymes
if ( if (
($this->getData(['enrolment', $courseId]) && array_key_exists($this->getUser('id'), $this->getData(['enrolment', $courseId])) ) ($this->getData(['enrolment', $courseId]) && array_key_exists($this->getUser('id'), $this->getData(['enrolment', $courseId])))
|| $this->getData(['course', $courseId, 'enrolment']) === self::COURSE_ENROLMENT_GUEST || $this->getData(['course', $courseId, 'enrolment']) === self::COURSE_ENROLMENT_GUEST
) { ) {
$filter[$courseId] = $courses[$courseId]; $filter[$courseId] = $courses[$courseId];

View File

@ -10,7 +10,7 @@ if (
) { ) {
// Supprime la variable path des profils, seul l'accès à l'espace et autorisé. // Supprime la variable path des profils, seul l'accès à l'espace et autorisé.
foreach (['1', '2'] as $group) { foreach (['1', '2'] as $group) {
foreach ( array_keys($this->getData(['profil', $group])) as $profil) { foreach (array_keys($this->getData(['profil', $group])) as $profil) {
if (is_null($this->getData(['profil', $group, $profil, 'folder', 'path'])) === false) { if (is_null($this->getData(['profil', $group, $profil, 'folder', 'path'])) === false) {
$path = $this->getData(['profil', $group, $profil, 'folder', 'path']); $path = $this->getData(['profil', $group, $profil, 'folder', 'path']);
$this->setData(['profil', $group, $profil, 'folder', 'homePath', $path]); $this->setData(['profil', $group, $profil, 'folder', 'homePath', $path]);
@ -21,3 +21,30 @@ if (
} }
$this->setData(['core', 'dataVersion', 1700]); $this->setData(['core', 'dataVersion', 1700]);
} }
// Déplacement des
if (
$this->getData(['core', 'dataVersion']) < 1800
) {
// Déplace les historiques dans les dossiers des esapaces
// Parcourir les espaces
foreach ($this->getData(['course']) as $courseId => $courseValues) {
$data = [];
//Parcourir les participants
foreach ($this->getData(['user']) as $userId => $userValues) {
// Un historique existe pour ce participant
$report = $this->getData(['enrolment', $courseId, $userId, 'history']);
if ( is_array($report)
) {
// Ecriture dans un fichier report dans le dossier de l'espace
$data = array_merge($data, [$userId => $report]);
// Nettoyage du fichier des inscriptions
// Ce fichier ne contient que l'id du participant et de la date et de l'id de la dernière page vue
$this->deleteData(['enrolment', $courseId, $userId, 'history']);
}
}
file_put_contents(self::DATA_DIR . $courseId . '/report.json', json_encode(['report' => $data], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES), LOCK_EX);
}
$this->setData(['core', 'dataVersion', 1800]);
}

View File

@ -28,8 +28,8 @@ class course extends common
'usersDelete' => self::GROUP_EDITOR, //Fait 'usersDelete' => self::GROUP_EDITOR, //Fait
'usersHistoryExport' => self::GROUP_EDITOR, //fait 'usersHistoryExport' => self::GROUP_EDITOR, //fait
'userDelete' => self::GROUP_EDITOR, //Fait 'userDelete' => self::GROUP_EDITOR, //Fait
'userHistory' => self::GROUP_EDITOR, //Fait 'userReport' => self::GROUP_EDITOR, //Fait
'userHistoryExport' => self::GROUP_EDITOR, //Fait 'userReportExport' => self::GROUP_EDITOR, //Fait
'backup' => self::GROUP_EDITOR, // Fait 'backup' => self::GROUP_EDITOR, // Fait
'restore' => self::GROUP_EDITOR, //Fait 'restore' => self::GROUP_EDITOR, //Fait
'clone' => self::GROUP_ADMIN, 'clone' => self::GROUP_ADMIN,
@ -74,7 +74,7 @@ class course extends common
public static $pagesList = ['accueil' => 'Accueil']; public static $pagesList = ['accueil' => 'Accueil'];
public static $userHistory = []; public static $userReport = [];
public static $userGraph = []; public static $userGraph = [];
@ -641,27 +641,14 @@ class course extends common
// Liste des inscrits dans le contenu sélectionné. // Liste des inscrits dans le contenu sélectionné.
$users = $this->getData(['enrolment', $courseId]); $users = $this->getData(['enrolment', $courseId]);
// Récupère l'historique des participants
$reports = $this->getReport($courseId);
if (is_array($users)) { if (is_array($users)) {
// Tri du tableau par défaut par $userId // Tri du tableau par défaut par $userId
ksort($users); ksort($users);
foreach ($users as $userId => $userValue) { foreach ($users as $userId => $userValue) {
// Date et heure de la dernière page vue
// Compatibilité anciennes versions
if (
$this->getData(['enrolment', $courseId, $userId, 'lastPageView']) === null
or $this->getData(['enrolment', $courseId, $userId, 'datePageView']) === null
) {
if (!empty ($userValue['history'])) {
$maxTime = max($userValue['history']);
$lastPageId = array_search($maxTime, $userValue['history']);
$this->setData(['enrolment', $courseId, $userId, 'lastPageView', $lastPageId]);
$this->setData(['enrolment', $courseId, $userId, 'datePageView', $maxTime]);
}
}
// Compte les rôles valides // Compte les rôles valides
if (isset ($profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])])) { if (isset ($profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])])) {
$profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])]++; $profils[$this->getData(['user', $userId, 'group']) . $this->getData(['user', $userId, 'profil'])]++;
@ -694,8 +681,8 @@ class course extends common
} }
// Progression // Progression
$viewPages = $this->getData(['enrolment', $courseId, $userId, 'history']) !== null ? $viewPages = $this->getReport($courseId, $userId) !== null ?
count(array_keys($this->getData(['enrolment', $courseId, $userId, 'history']))) : count(array_keys($this->getReport($courseId, $userId))) :
0; 0;
// Construction du tableau // Construction du tableau
@ -712,10 +699,10 @@ class course extends common
? helper::dateUTF8('%H:%M', $this->getData(['enrolment', $courseId, $userId, 'datePageView'])) ? helper::dateUTF8('%H:%M', $this->getData(['enrolment', $courseId, $userId, 'datePageView']))
: '', : '',
$this->getData(['user', $userId, 'tags']), $this->getData(['user', $userId, 'tags']),
template::button('userHistory' . $userId, [ template::button('userReport' . $userId, [
'href' => helper::baseUrl() . 'course/userHistory/' . $courseId . '/' . $userId, 'href' => helper::baseUrl() . 'course/userReport/' . $courseId . '/' . $userId,
'value' => !empty ($userValue['history']) ? min(round(($viewPages * 100) / $sumPages, 1), 100) . ' %' : '0%', 'value' => !empty ($reports[$userId]) ? min(round(($viewPages * 100) / $sumPages, 1), 100) . ' %' : '0%',
'disable' => empty ($userValue['history']) 'disable' => empty ($reports[$userId])
]), ]),
template::button('userDelete' . $userId, [ template::button('userDelete' . $userId, [
'class' => 'userDelete buttonRed', 'class' => 'userDelete buttonRed',
@ -773,7 +760,7 @@ class course extends common
$this->getData(['user', $keyPost]) !== null $this->getData(['user', $keyPost]) !== null
&& $this->getData(['enrolment', $courseId, $keyPost]) === null && $this->getData(['enrolment', $courseId, $keyPost]) === null
) { ) {
$this->setData(['enrolment', $courseId, $keyPost, 'history', array()]); $this->setData(['enrolment', $courseId, $keyPost, array()]);
} }
} }
} }
@ -1164,7 +1151,7 @@ class course extends common
/** /**
* Liste les pages consultées par un utilisateur * Liste les pages consultées par un utilisateur
*/ */
public function userHistory() public function userReport()
{ {
// Espace sélectionné // Espace sélectionné
@ -1181,7 +1168,7 @@ class course extends common
} }
$userId = $this->getUrl(3); $userId = $this->getUrl(3);
$h = $this->getData(['enrolment', $courseId, $userId, 'history']); $h = $this->getReport($courseId, $userId);
// Inversion des clés et des valeurs // Inversion des clés et des valeurs
$history = array(); $history = array();
@ -1211,7 +1198,7 @@ class course extends common
if (isset ($pages[$pageId]['title'])) { if (isset ($pages[$pageId]['title'])) {
$lastView = ($lastView === 0) ? $time : $lastView; $lastView = ($lastView === 0) ? $time : $lastView;
$diff = $time - $lastView; $diff = $time - $lastView;
self::$userHistory[] = [ self::$userReport[] = [
html_entity_decode($pages[$pageId]['title']), html_entity_decode($pages[$pageId]['title']),
$time, $time,
($diff < 1800) ? sprintf("%d' %d''", floor($diff / 60), $diff % 60) : "Non significatif", ($diff < 1800) ? sprintf("%d' %d''", floor($diff / 60), $diff % 60) : "Non significatif",
@ -1230,16 +1217,16 @@ class course extends common
} }
// Décale les temps de consultation // Décale les temps de consultation
for ($i = 0; $i < count(self::$userHistory) - 1; $i++) { for ($i = 0; $i < count(self::$userReport) - 1; $i++) {
self::$userHistory[$i][2] = self::$userHistory[$i + 1][2]; self::$userReport[$i][2] = self::$userReport[$i + 1][2];
} }
// Décale les temps de consultation // Décale les temps de consultation
for ($i = 0; $i < count(self::$userGraph) - 1; $i++) { for ($i = 0; $i < count(self::$userGraph) - 1; $i++) {
self::$userHistory[$i][1] = self::$userHistory[$i + 1][1]; self::$userReport[$i][1] = self::$userReport[$i + 1][1];
} }
// Formate le timestamp // Formate le timestamp
array_walk(self::$userHistory, function (&$item) { array_walk(self::$userReport, function (&$item) {
$item[1] = helper::dateUTF8('%d/%m/%Y %H:%M:%S', $item[1]); $item[1] = helper::dateUTF8('%d/%m/%Y %H:%M:%S', $item[1]);
}); });
@ -1257,7 +1244,7 @@ class course extends common
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => helper::translate('Historique ') . $this->getData(['user', $userId, 'firstname']) . ' ' . $this->getData(['user', $userId, 'lastname']), 'title' => helper::translate('Historique ') . $this->getData(['user', $userId, 'firstname']) . ' ' . $this->getData(['user', $userId, 'lastname']),
'view' => 'userHistory', 'view' => 'userReport',
'vendor' => [ 'vendor' => [
"plotly" "plotly"
] ]
@ -1310,27 +1297,14 @@ class course extends common
mkdir(self::FILE_DIR . 'source/' . $courseId . '/export/'); mkdir(self::FILE_DIR . 'source/' . $courseId . '/export/');
} }
$filename = self::FILE_DIR . 'source/' . $courseId . '/export/' . '/synthèse' . helper::dateUTF8('%Y%m%d', time()) . '.csv'; $filename = self::FILE_DIR . 'source/' . $courseId . '/export/' . '/synthèse' . helper::dateUTF8('%Y%m%d', time()) . '.csv';
$reports = $this->getReport($courseId);
foreach ($users as $userId => $userValue) { foreach ($users as $userId => $userValue) {
// Date et heure de la dernière page vue
// Compatibilité anciennes versions
if (
$this->getData(['enrolment', $courseId, $userId, 'lastPageView']) === null
or $this->getData(['enrolment', $courseId, $userId, 'datePageView']) === null
) {
if (!empty ($userValue['history'])) {
$maxTime = max($userValue['history']);
$lastPageId = array_search($maxTime, $userValue['history']);
$this->setData(['enrolment', $courseId, $userId, 'lastPageView', $lastPageId]);
$this->setData(['enrolment', $courseId, $userId, 'datePageView', $maxTime]);
}
}
// Progression // Progression
$viewPages = $this->getData(['enrolment', $courseId, $userId, 'history']) !== null ? $viewPages = $reports[$userId] != null
count(array_keys($this->getData(['enrolment', $courseId, $userId, 'history']))) : ? count($reports[$userId])
0; : 0;
// Construction du tableau // Construction du tableau
self::$courseUsers[] = [ self::$courseUsers[] = [
@ -1371,7 +1345,7 @@ class course extends common
} }
} }
public function userHistoryExport() public function userReportExport()
{ {
$courseId = $this->getUrl(2); $courseId = $this->getUrl(2);
@ -1388,7 +1362,7 @@ class course extends common
} }
// Traitement de l'historique // Traitement de l'historique
$h = $this->getData(['enrolment', $courseId, $userId, 'history']); $h = $this->getReport($courseId, $userId);
// Inversion des clés et des valeurs // Inversion des clés et des valeurs
$history = array(); $history = array();
@ -1416,7 +1390,7 @@ class course extends common
if (isset ($pages[$pageId]['title'])) { if (isset ($pages[$pageId]['title'])) {
$lastView = ($lastView === 0) ? $time : $lastView; $lastView = ($lastView === 0) ? $time : $lastView;
$diff = $time - $lastView; $diff = $time - $lastView;
self::$userHistory[] = [ self::$userReport[] = [
$pageId, $pageId,
html_entity_decode($pages[$pageId]['title']), html_entity_decode($pages[$pageId]['title']),
$time, $time,
@ -1429,16 +1403,16 @@ class course extends common
} }
// Décale les temps de consultation // Décale les temps de consultation
for ($i = 0; $i < count(self::$userHistory) - 1; $i++) { for ($i = 0; $i < count(self::$userReport) - 1; $i++) {
self::$userHistory[$i][3] = self::$userHistory[$i + 1][3]; self::$userReport[$i][3] = self::$userReport[$i + 1][3];
} }
// Formate le timestamp // Formate le timestamp
array_walk(self::$userHistory, function (&$item) { array_walk(self::$userReport, function (&$item) {
$item[2] = helper::dateUTF8('%d/%m/%Y %H:%M:%S', $item[2]); $item[2] = helper::dateUTF8('%d/%m/%Y %H:%M:%S', $item[2]);
}); });
// Ajoute les entêtes // Ajoute les entêtes
self::$userHistory = array_merge([0 => ['PageId', 'Page Titre', 'Consultation Date', 'Temps Consultation']], self::$userHistory); self::$userReport = array_merge([0 => ['PageId', 'Page Titre', 'Consultation Date', 'Temps Consultation']], self::$userReport);
// Dossier d'export // Dossier d'export
if (is_dir(self::FILE_DIR . 'source/' . $courseId) === false) { if (is_dir(self::FILE_DIR . 'source/' . $courseId) === false) {
@ -1451,7 +1425,7 @@ class course extends common
$file = fopen($filename, 'w'); $file = fopen($filename, 'w');
foreach (self::$userHistory as $keys => $values) { foreach (self::$userReport as $keys => $values) {
$data = $values; $data = $values;
// Écrire la ligne dans le fichier CSV // Écrire la ligne dans le fichier CSV
fputcsv($file, $data, ';'); fputcsv($file, $data, ';');
@ -1461,7 +1435,7 @@ class course extends common
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl() . 'course/userHistory/' . $courseId . '/' . $userId, 'redirect' => helper::baseUrl() . 'course/userReport/' . $courseId . '/' . $userId,
'notification' => 'Création ' . basename($filename) . ' dans le dossier "Export"', 'notification' => 'Création ' . basename($filename) . ' dans le dossier "Export"',
'state' => true, 'state' => true,
]); ]);
@ -1857,9 +1831,7 @@ class course extends common
'enrolment', 'enrolment',
$courseId, $courseId,
$userId, $userId,
[ []
'history' => [],
]
]); ]);
} }
@ -1895,4 +1867,6 @@ class course extends common
return $r; return $r;
} }
} }

View File

@ -1,6 +1,6 @@
<div class="row"> <div class="row">
<div class="col1"> <div class="col1">
<?php echo template::button('courseUserHistoryBack', [ <?php echo template::button('courseuserReportBack', [
'class' => 'buttonGrey', 'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'course/users/' . $this->getUrl(2), 'href' => helper::baseUrl() . 'course/users/' . $this->getUrl(2),
'value' => template::ico('left') 'value' => template::ico('left')
@ -8,7 +8,7 @@
</div> </div>
<div class="col1 offset10"> <div class="col1 offset10">
<?php echo template::button('userDeleteAll', [ <?php echo template::button('userDeleteAll', [
'href' => helper::baseUrl() . 'course/userHistoryExport/' . $this->getUrl(2) . '/' . $this->getUrl(3), 'href' => helper::baseUrl() . 'course/userReportExport/' . $this->getUrl(2) . '/' . $this->getUrl(3),
'value' => template::ico('download'), 'value' => template::ico('download'),
'help' => 'Exporter', 'help' => 'Exporter',
]) ?> ]) ?>
@ -20,7 +20,7 @@
</div> </div>
</div> </div>
</div> </div>
<?php if ($module::$userHistory): ?> <?php if ($module::$userReport): ?>
<div class="row"> <div class="row">
<div class="col4 offset2"> <div class="col4 offset2">
<?php if ($this->getData(['course', $this->getUrl(2), 'access']) === self::COURSE_ACCESS_DATE): ?> <?php if ($this->getData(['course', $this->getUrl(2), 'access']) === self::COURSE_ACCESS_DATE): ?>
@ -46,7 +46,7 @@
</div> </div>
<div class="row textAlignCenter"> <div class="row textAlignCenter">
<div class="col8"> <div class="col8">
<?php echo template::table([6, 3, 3], $module::$userHistory, ['Page', 'Début de Consultation', 'Temps consultation']); ?> <?php echo template::table([6, 3, 3], $module::$userReport, ['Page', 'Début de Consultation', 'Temps consultation']); ?>
</div> </div>
</div> </div>
<?php else: ?> <?php else: ?>

View File

@ -963,6 +963,7 @@ class init extends common
] ]
] ]
], ],
'report' => []
]; ];
public static $siteContent = [ public static $siteContent = [

View File

@ -360,16 +360,16 @@ class page extends common
} }
} }
// Met à jour les historiques des utilisateurs // Met à jour les historiques des utilisateurs
foreach ($this->getData(['enrolment', self::$siteContent]) as $userId => $userData) { foreach ($this->getReport(self::$siteContent) as $userId => $userData) {
// Vérifier si l'utilisateur a un historique // Vérifier si l'utilisateur a un historique
if ( if (
isset($userData["history"]) is_array($userData)
&& isset($userData['history'][$this->getUrl(2)]) && array_key_exists($userId, $userData)
) { ) {
// Remplacer l'ancienne ID par la nouvelle // Remplacer l'ancienne ID par la nouvelle
$datas = $this->getData(['enrolment', self::$siteContent, $userId, 'history', $this->getUrl(2)]); $datas = $this->getReport(self::$siteContent, $userId, $this->getUrl(2));
$this->setData(['enrolment', self::$siteContent, $userId, 'history', $pageId, $datas]); $this->setReport(self::$siteContent, $userId, $pageId, $datas);
$this->deleteData(['enrolment', self::$siteContent, $userId, 'history', $this->getUrl(2)]); $this->deleteReport(self::$siteContent, $userId, $this->getUrl(2));
} }
// Mettre à jour la dernière page vue si nécessaire // Mettre à jour la dernière page vue si nécessaire
if ($this->getData(['enrolment', self::$siteContent, $userId, 'lastPageView']) === $this->getUrl(2)) { if ($this->getData(['enrolment', self::$siteContent, $userId, 'lastPageView']) === $this->getUrl(2)) {