forked from ZwiiCMS-Team/ZwiiCampus
Compare commits
7 Commits
master
...
1.8-emplac
Author | SHA1 | Date | |
---|---|---|---|
13a603b1f9 | |||
ab34cb1953 | |||
65029fb191 | |||
e58ce9cda0 | |||
0b14519567 | |||
0eede10300 | |||
5dc51a62ce |
@ -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é.
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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()]);
|
||||||
|
122
core/core.php
122
core/core.php
@ -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 = [
|
||||||
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -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]);
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -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: ?>
|
@ -963,6 +963,7 @@ class init extends common
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
],
|
],
|
||||||
|
'report' => []
|
||||||
];
|
];
|
||||||
|
|
||||||
public static $siteContent = [
|
public static $siteContent = [
|
||||||
|
@ -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)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user