diff --git a/core/core.php b/core/core.php index 592b419..1ee66a7 100644 --- a/core/core.php +++ b/core/core.php @@ -599,48 +599,123 @@ class common return file_put_contents(self::DATA_DIR . $path . '/content/' . $page . '.html', $value); } - /* - * Lire les données des historiques - * @param string courseId - * @param array $keys Clé(s) des données - * @return array tableau demandé - */ - public function getReport($courseId, $keys = []) + /** + * 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) { - $data = json_decode(file_get_contents(self::DATA_DIR . $courseId . '/' . 'enrolment.json'), true); + // Lire les données du fichier JSON + $data = json_decode(file_get_contents(self::DATA_DIR . $courseId . '/report.json'), true); - if ($keys === []) { - return $data['enrolment'][$courseId]; - } else { - // Récupérer la première clé - $result = $data['enrolment'][$courseId][$keys[0]]; - - // Parcourir les clés restantes pour naviguer dans la structure - for ($i = 1; $i < count($keys); $i++) { - // Vérifier si la clé existe - if (isset($result[$keys[$i]])) { - // Déplacer le pointeur - $result = $result[$keys[$i]]; - } else { - // Si la clé n'existe pas, retourner null - return null; - } - } - return $result; + // 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; } /** - * Ecrire les données de statistiques - * @param string pageId - * @param string contenu de la page - * @return int nombre d'octets écrits ou erreur + * 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, $keys = []) + public function setReport($courseId, $user, $page, $timestamp = null) { - return file_put_contents(self::DATA_DIR . $courseId . '/enrolment.json', json_encode($keys, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)); + // 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 + } + + /** diff --git a/core/include/update.inc.php b/core/include/update.inc.php index abad670..e4113cd 100644 --- a/core/include/update.inc.php +++ b/core/include/update.inc.php @@ -48,10 +48,3 @@ if ( $this->setData(['core', 'dataVersion', 1800]); } - -/* -$t = $this->getEnrolment('6571b5913e87e', ['pablorodriguez', 'history', 'les-titres-ou-headers']); -echo"
";
-var_dump($t);
-die();
-*/
\ No newline at end of file
diff --git a/core/module/page/page.php b/core/module/page/page.php
index 9f548df..01b1948 100644
--- a/core/module/page/page.php
+++ b/core/module/page/page.php
@@ -363,13 +363,13 @@ class page extends common
 						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->getReport([self::$siteContent, [ $userId, $this->getUrl(2)]]);
-								$this->setReport(self::$siteContent,  [$userId,  $pageId, $datas]);
-								$this->deleteData(['report', $userId,$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)) {