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é.
|
||||
|
||||
|
@ -143,7 +143,6 @@ class JsonDb extends \Prowebcraft\Dot
|
||||
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);
|
||||
$l = strlen($v);
|
||||
$t = 0;
|
||||
while ($t < 5) {
|
||||
|
@ -423,10 +423,10 @@ class core extends common
|
||||
)
|
||||
) {
|
||||
// Stocke l'historique des pages vues
|
||||
$data = is_array($this->getData(['enrolment', self::$siteContent, $this->getUser('id'), 'history', $this->getUrl(0)]))
|
||||
? array_merge([time()], $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(['report', $this->getUser('id'),$this->getUrl(0)]))
|
||||
: [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
|
||||
$this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'lastPageView', $this->getUrl(0)]);
|
||||
$this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'datePageView', time()]);
|
||||
|
244
core/core.php
244
core/core.php
@ -51,7 +51,7 @@ class common
|
||||
const ACCESS_TIMER = 1800;
|
||||
|
||||
// Numéro de version
|
||||
const ZWII_VERSION = '1.7.09';
|
||||
const ZWII_VERSION = '1.8.00';
|
||||
|
||||
// URL autoupdate
|
||||
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/';
|
||||
@ -224,14 +224,15 @@ class common
|
||||
'user' => '',
|
||||
'language' => '',
|
||||
'profil' => '',
|
||||
'enrolment' => '',
|
||||
'category' => '',
|
||||
'enrolment' => '',
|
||||
];
|
||||
|
||||
private $contentFiles = [
|
||||
'page' => '',
|
||||
'module' => '',
|
||||
'theme' => '',
|
||||
'report' => '',
|
||||
];
|
||||
|
||||
public static $fontsWebSafe = [
|
||||
@ -447,7 +448,7 @@ class common
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
require_once('core/module/install/ressource/defaultdata.php');
|
||||
require_once ('core/module/install/ressource/defaultdata.php');
|
||||
|
||||
// L'arborescence
|
||||
if (!file_exists(self::DATA_DIR . $path)) {
|
||||
@ -669,7 +787,7 @@ class common
|
||||
public function saveConfig($module)
|
||||
{
|
||||
// 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
|
||||
$this->setData([$module, init::$defaultData[$module]]);
|
||||
common::$coreNotices[] = $module;
|
||||
@ -705,65 +823,65 @@ class common
|
||||
* Fonction pour construire le tableau des pages
|
||||
*/
|
||||
|
||||
private function buildHierarchy()
|
||||
{
|
||||
private function buildHierarchy()
|
||||
{
|
||||
|
||||
$pages = helper::arrayColumn($this->getData(['page']), 'position', 'SORT_ASC');
|
||||
// Parents
|
||||
foreach ($pages as $pageId => $pagePosition) {
|
||||
if (
|
||||
// Page parent
|
||||
$this->getData(['page', $pageId, 'parentPageId']) === ""
|
||||
// Ignore les pages dont l'utilisateur n'a pas accès
|
||||
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
|
||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
//and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
|
||||
// Modification qui tient compte du profil de la page
|
||||
and ($this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil']))
|
||||
$pages = helper::arrayColumn($this->getData(['page']), 'position', 'SORT_ASC');
|
||||
// Parents
|
||||
foreach ($pages as $pageId => $pagePosition) {
|
||||
if (
|
||||
// Page parent
|
||||
$this->getData(['page', $pageId, 'parentPageId']) === ""
|
||||
// Ignore les pages dont l'utilisateur n'a pas accès
|
||||
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
|
||||
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
//and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
|
||||
// Modification qui tient compte du profil de la page
|
||||
and ($this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil']))
|
||||
|
||||
)
|
||||
)
|
||||
) {
|
||||
if ($pagePosition !== 0) {
|
||||
$this->hierarchy['visible'][$pageId] = [];
|
||||
}
|
||||
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
|
||||
$this->hierarchy['bar'][$pageId] = [];
|
||||
}
|
||||
$this->hierarchy['all'][$pageId] = [];
|
||||
}
|
||||
}
|
||||
// Enfants
|
||||
foreach ($pages as $pageId => $pagePosition) {
|
||||
)
|
||||
)
|
||||
) {
|
||||
if ($pagePosition !== 0) {
|
||||
$this->hierarchy['visible'][$pageId] = [];
|
||||
}
|
||||
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
|
||||
$this->hierarchy['bar'][$pageId] = [];
|
||||
}
|
||||
$this->hierarchy['all'][$pageId] = [];
|
||||
}
|
||||
}
|
||||
// Enfants
|
||||
foreach ($pages as $pageId => $pagePosition) {
|
||||
|
||||
if (
|
||||
// Page parent
|
||||
$parentId = $this->getData(['page', $pageId, 'parentPageId'])
|
||||
// Ignore les pages dont l'utilisateur n'a pas accès
|
||||
and (
|
||||
(
|
||||
$this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
|
||||
and
|
||||
$this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR
|
||||
)
|
||||
or (
|
||||
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
and
|
||||
$this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil'])
|
||||
if (
|
||||
// Page parent
|
||||
$parentId = $this->getData(['page', $pageId, 'parentPageId'])
|
||||
// Ignore les pages dont l'utilisateur n'a pas accès
|
||||
and (
|
||||
(
|
||||
$this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
|
||||
and
|
||||
$this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR
|
||||
)
|
||||
or (
|
||||
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
||||
and
|
||||
$this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil'])
|
||||
|
||||
)
|
||||
)
|
||||
) {
|
||||
if ($pagePosition !== 0) {
|
||||
$this->hierarchy['visible'][$parentId][] = $pageId;
|
||||
}
|
||||
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
|
||||
$this->hierarchy['bar'][$pageId] = [];
|
||||
}
|
||||
$this->hierarchy['all'][$parentId][] = $pageId;
|
||||
}
|
||||
}
|
||||
}
|
||||
)
|
||||
)
|
||||
) {
|
||||
if ($pagePosition !== 0) {
|
||||
$this->hierarchy['visible'][$parentId][] = $pageId;
|
||||
}
|
||||
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
|
||||
$this->hierarchy['bar'][$pageId] = [];
|
||||
}
|
||||
$this->hierarchy['all'][$parentId][] = $pageId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Génère un fichier json avec la liste des pages
|
||||
@ -1435,8 +1553,8 @@ class common
|
||||
foreach ($courses as $courseId => $value) {
|
||||
// Affiche les espaces gérés par l'éditeur, les espaces où il participe et les espaces anonymes
|
||||
if (
|
||||
// le membre est inscrit
|
||||
( $this->getData(['enrolment', $courseId]) && array_key_exists($this->getUser('id'), $this->getData(['enrolment', $courseId])) )
|
||||
// le membre est inscrit
|
||||
($this->getData(['enrolment', $courseId]) && array_key_exists($this->getUser('id'), $this->getData(['enrolment', $courseId])))
|
||||
// Il est l'auteur
|
||||
|| $this->getUser('id') === $this->getData(['course', $courseId, 'author'])
|
||||
// Le cours est ouvert
|
||||
@ -1450,7 +1568,7 @@ class common
|
||||
foreach ($courses as $courseId => $value) {
|
||||
// Affiche les espaces du participant et les espaces anonymes
|
||||
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
|
||||
) {
|
||||
$filter[$courseId] = $courses[$courseId];
|
||||
|
@ -10,7 +10,7 @@ if (
|
||||
) {
|
||||
// Supprime la variable path des profils, seul l'accès à l'espace et autorisé.
|
||||
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) {
|
||||
$path = $this->getData(['profil', $group, $profil, 'folder', 'path']);
|
||||
$this->setData(['profil', $group, $profil, 'folder', 'homePath', $path]);
|
||||
@ -21,3 +21,30 @@ if (
|
||||
}
|
||||
$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
|
||||
'usersHistoryExport' => self::GROUP_EDITOR, //fait
|
||||
'userDelete' => self::GROUP_EDITOR, //Fait
|
||||
'userHistory' => self::GROUP_EDITOR, //Fait
|
||||
'userHistoryExport' => self::GROUP_EDITOR, //Fait
|
||||
'userReport' => self::GROUP_EDITOR, //Fait
|
||||
'userReportExport' => self::GROUP_EDITOR, //Fait
|
||||
'backup' => self::GROUP_EDITOR, // Fait
|
||||
'restore' => self::GROUP_EDITOR, //Fait
|
||||
'clone' => self::GROUP_ADMIN,
|
||||
@ -74,7 +74,7 @@ class course extends common
|
||||
public static $pagesList = ['accueil' => 'Accueil'];
|
||||
|
||||
|
||||
public static $userHistory = [];
|
||||
public static $userReport = [];
|
||||
|
||||
public static $userGraph = [];
|
||||
|
||||
@ -641,27 +641,14 @@ class course extends common
|
||||
|
||||
// Liste des inscrits dans le contenu sélectionné.
|
||||
$users = $this->getData(['enrolment', $courseId]);
|
||||
// Récupère l'historique des participants
|
||||
$reports = $this->getReport($courseId);
|
||||
|
||||
if (is_array($users)) {
|
||||
// Tri du tableau par défaut par $userId
|
||||
ksort($users);
|
||||
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
|
||||
if (isset ($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
|
||||
$viewPages = $this->getData(['enrolment', $courseId, $userId, 'history']) !== null ?
|
||||
count(array_keys($this->getData(['enrolment', $courseId, $userId, 'history']))) :
|
||||
$viewPages = $this->getReport($courseId, $userId) !== null ?
|
||||
count(array_keys($this->getReport($courseId, $userId))) :
|
||||
0;
|
||||
|
||||
// Construction du tableau
|
||||
@ -712,10 +699,10 @@ class course extends common
|
||||
? helper::dateUTF8('%H:%M', $this->getData(['enrolment', $courseId, $userId, 'datePageView']))
|
||||
: '',
|
||||
$this->getData(['user', $userId, 'tags']),
|
||||
template::button('userHistory' . $userId, [
|
||||
'href' => helper::baseUrl() . 'course/userHistory/' . $courseId . '/' . $userId,
|
||||
'value' => !empty ($userValue['history']) ? min(round(($viewPages * 100) / $sumPages, 1), 100) . ' %' : '0%',
|
||||
'disable' => empty ($userValue['history'])
|
||||
template::button('userReport' . $userId, [
|
||||
'href' => helper::baseUrl() . 'course/userReport/' . $courseId . '/' . $userId,
|
||||
'value' => !empty ($reports[$userId]) ? min(round(($viewPages * 100) / $sumPages, 1), 100) . ' %' : '0%',
|
||||
'disable' => empty ($reports[$userId])
|
||||
]),
|
||||
template::button('userDelete' . $userId, [
|
||||
'class' => 'userDelete buttonRed',
|
||||
@ -773,7 +760,7 @@ class course extends common
|
||||
$this->getData(['user', $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
|
||||
*/
|
||||
public function userHistory()
|
||||
public function userReport()
|
||||
{
|
||||
|
||||
// Espace sélectionné
|
||||
@ -1181,7 +1168,7 @@ class course extends common
|
||||
}
|
||||
|
||||
$userId = $this->getUrl(3);
|
||||
$h = $this->getData(['enrolment', $courseId, $userId, 'history']);
|
||||
$h = $this->getReport($courseId, $userId);
|
||||
|
||||
// Inversion des clés et des valeurs
|
||||
$history = array();
|
||||
@ -1211,7 +1198,7 @@ class course extends common
|
||||
if (isset ($pages[$pageId]['title'])) {
|
||||
$lastView = ($lastView === 0) ? $time : $lastView;
|
||||
$diff = $time - $lastView;
|
||||
self::$userHistory[] = [
|
||||
self::$userReport[] = [
|
||||
html_entity_decode($pages[$pageId]['title']),
|
||||
$time,
|
||||
($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
|
||||
for ($i = 0; $i < count(self::$userHistory) - 1; $i++) {
|
||||
self::$userHistory[$i][2] = self::$userHistory[$i + 1][2];
|
||||
for ($i = 0; $i < count(self::$userReport) - 1; $i++) {
|
||||
self::$userReport[$i][2] = self::$userReport[$i + 1][2];
|
||||
}
|
||||
// Décale les temps de consultation
|
||||
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
|
||||
array_walk(self::$userHistory, function (&$item) {
|
||||
array_walk(self::$userReport, function (&$item) {
|
||||
$item[1] = helper::dateUTF8('%d/%m/%Y %H:%M:%S', $item[1]);
|
||||
});
|
||||
|
||||
@ -1257,7 +1244,7 @@ class course extends common
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => helper::translate('Historique ') . $this->getData(['user', $userId, 'firstname']) . ' ' . $this->getData(['user', $userId, 'lastname']),
|
||||
'view' => 'userHistory',
|
||||
'view' => 'userReport',
|
||||
'vendor' => [
|
||||
"plotly"
|
||||
]
|
||||
@ -1310,27 +1297,14 @@ class course extends common
|
||||
mkdir(self::FILE_DIR . 'source/' . $courseId . '/export/');
|
||||
}
|
||||
$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) {
|
||||
|
||||
// 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
|
||||
$viewPages = $this->getData(['enrolment', $courseId, $userId, 'history']) !== null ?
|
||||
count(array_keys($this->getData(['enrolment', $courseId, $userId, 'history']))) :
|
||||
0;
|
||||
$viewPages = $reports[$userId] != null
|
||||
? count($reports[$userId])
|
||||
: 0;
|
||||
|
||||
// Construction du tableau
|
||||
self::$courseUsers[] = [
|
||||
@ -1371,7 +1345,7 @@ class course extends common
|
||||
}
|
||||
}
|
||||
|
||||
public function userHistoryExport()
|
||||
public function userReportExport()
|
||||
{
|
||||
|
||||
$courseId = $this->getUrl(2);
|
||||
@ -1388,7 +1362,7 @@ class course extends common
|
||||
}
|
||||
|
||||
// Traitement de l'historique
|
||||
$h = $this->getData(['enrolment', $courseId, $userId, 'history']);
|
||||
$h = $this->getReport($courseId, $userId);
|
||||
|
||||
// Inversion des clés et des valeurs
|
||||
$history = array();
|
||||
@ -1416,7 +1390,7 @@ class course extends common
|
||||
if (isset ($pages[$pageId]['title'])) {
|
||||
$lastView = ($lastView === 0) ? $time : $lastView;
|
||||
$diff = $time - $lastView;
|
||||
self::$userHistory[] = [
|
||||
self::$userReport[] = [
|
||||
$pageId,
|
||||
html_entity_decode($pages[$pageId]['title']),
|
||||
$time,
|
||||
@ -1429,16 +1403,16 @@ class course extends common
|
||||
}
|
||||
|
||||
// Décale les temps de consultation
|
||||
for ($i = 0; $i < count(self::$userHistory) - 1; $i++) {
|
||||
self::$userHistory[$i][3] = self::$userHistory[$i + 1][3];
|
||||
for ($i = 0; $i < count(self::$userReport) - 1; $i++) {
|
||||
self::$userReport[$i][3] = self::$userReport[$i + 1][3];
|
||||
}
|
||||
// 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]);
|
||||
});
|
||||
|
||||
// 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
|
||||
if (is_dir(self::FILE_DIR . 'source/' . $courseId) === false) {
|
||||
@ -1451,7 +1425,7 @@ class course extends common
|
||||
|
||||
$file = fopen($filename, 'w');
|
||||
|
||||
foreach (self::$userHistory as $keys => $values) {
|
||||
foreach (self::$userReport as $keys => $values) {
|
||||
$data = $values;
|
||||
// Écrire la ligne dans le fichier CSV
|
||||
fputcsv($file, $data, ';');
|
||||
@ -1461,7 +1435,7 @@ class course extends common
|
||||
|
||||
// Valeurs en sortie
|
||||
$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"',
|
||||
'state' => true,
|
||||
]);
|
||||
@ -1857,9 +1831,7 @@ class course extends common
|
||||
'enrolment',
|
||||
$courseId,
|
||||
$userId,
|
||||
[
|
||||
'history' => [],
|
||||
]
|
||||
[]
|
||||
]);
|
||||
}
|
||||
|
||||
@ -1895,4 +1867,6 @@ class course extends common
|
||||
return $r;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
@ -1,6 +1,6 @@
|
||||
<div class="row">
|
||||
<div class="col1">
|
||||
<?php echo template::button('courseUserHistoryBack', [
|
||||
<?php echo template::button('courseuserReportBack', [
|
||||
'class' => 'buttonGrey',
|
||||
'href' => helper::baseUrl() . 'course/users/' . $this->getUrl(2),
|
||||
'value' => template::ico('left')
|
||||
@ -8,7 +8,7 @@
|
||||
</div>
|
||||
<div class="col1 offset10">
|
||||
<?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'),
|
||||
'help' => 'Exporter',
|
||||
]) ?>
|
||||
@ -20,7 +20,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if ($module::$userHistory): ?>
|
||||
<?php if ($module::$userReport): ?>
|
||||
<div class="row">
|
||||
<div class="col4 offset2">
|
||||
<?php if ($this->getData(['course', $this->getUrl(2), 'access']) === self::COURSE_ACCESS_DATE): ?>
|
||||
@ -46,7 +46,7 @@
|
||||
</div>
|
||||
<div class="row textAlignCenter">
|
||||
<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>
|
||||
<?php else: ?>
|
@ -963,6 +963,7 @@ class init extends common
|
||||
]
|
||||
]
|
||||
],
|
||||
'report' => []
|
||||
];
|
||||
|
||||
public static $siteContent = [
|
||||
|
@ -360,16 +360,16 @@ class page extends common
|
||||
}
|
||||
}
|
||||
// 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
|
||||
if (
|
||||
isset($userData["history"])
|
||||
&& isset($userData['history'][$this->getUrl(2)])
|
||||
is_array($userData)
|
||||
&& array_key_exists($userId, $userData)
|
||||
) {
|
||||
// Remplacer l'ancienne ID par la nouvelle
|
||||
$datas = $this->getData(['enrolment', self::$siteContent, $userId, 'history', $this->getUrl(2)]);
|
||||
$this->setData(['enrolment', self::$siteContent, $userId, 'history', $pageId, $datas]);
|
||||
$this->deleteData(['enrolment', self::$siteContent, $userId, 'history', $this->getUrl(2)]);
|
||||
$datas = $this->getReport(self::$siteContent, $userId, $this->getUrl(2));
|
||||
$this->setReport(self::$siteContent, $userId, $pageId, $datas);
|
||||
$this->deleteReport(self::$siteContent, $userId, $this->getUrl(2));
|
||||
}
|
||||
// Mettre à jour la dernière page vue si nécessaire
|
||||
if ($this->getData(['enrolment', self::$siteContent, $userId, 'lastPageView']) === $this->getUrl(2)) {
|
||||
|
Loading…
Reference in New Issue
Block a user