- jsonDB upgrade
- Supprime le change de $siteContent dans la gestion d'un espace
This commit is contained in:
Fred Tempez 2025-01-23 20:39:22 +01:00
parent ed2b2c2826
commit 6d19f6ebad
4 changed files with 80 additions and 60 deletions

View File

@ -1,4 +1,4 @@
# ZwiiCampus 1.19.02 # ZwiiCampus 1.19.03
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

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Created by PhpStorm. * Created by PhpStorm.
* User: Andrey Mistulov * User: Andrey Mistulov
@ -112,75 +113,94 @@ class JsonDb extends \Prowebcraft\Dot
/** /**
* Local database upload * Charge les données depuis un fichier JSON.
* @param bool $reload Reboot data? *
* @return array|mixed|null * @param bool $reload Force le rechargement des données si true
*
* @return array|null Les données chargées ou null si le fichier n'existe pas
*
* @throws \RuntimeException En cas d'erreur lors de la création de la sauvegarde
* @throws \InvalidArgumentException Si le fichier contient des données JSON invalides
*/ */
protected function loadData($reload = false) protected function loadData($reload = false): ?array
{ {
if ($this->data === null || $reload) { if ($this->data === null || $reload) {
$this->db = $this->config['dir'] . $this->config['name']; $this->db = $this->config['dir'] . $this->config['name'];
if (!file_exists($this->db)) { if (!file_exists($this->db)) {
return null; // Rebuild database manage by CMS return null; // Rebuild database managed by CMS
} else { }
if ($this->config['backup']) {
try { if ($this->config['backup']) {
copy($this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'], $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'] . '.backup'); $backup_path = $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'] . '.backup';
} catch (\Exception $e) {
error_log('Erreur de chargement : ' . $e); try {
exit('Erreur de chargement : ' . $e); if (!copy($this->db, $backup_path)) {
throw new \RuntimeException('Échec de la création de la sauvegarde');
} }
} catch (\Exception $e) {
throw new \RuntimeException('Erreur de sauvegarde : ' . $e->getMessage());
} }
} }
$this->data = json_decode(file_get_contents($this->db), true);
if (!$this->data === null) { $file_contents = file_get_contents($this->db);
throw new \InvalidArgumentException('Le fichier ' . $this->db
. ' contient des données invalides.'); $this->data = json_decode($file_contents, true);
if ($this->data === null) {
throw new \InvalidArgumentException('Le fichier ' . $this->db . ' contient des données invalides.');
} }
} }
return $this->data; return $this->data;
} }
/** /**
* Save database * Charge les données depuis un fichier JSON.
*
* @param bool $reload Force le rechargement des données si true
*
* @return array|null Les données chargées ou null si le fichier n'existe pas
*
* @throws \RuntimeException En cas d'erreur lors de la création de la sauvegarde
* @throws \InvalidArgumentException Si le fichier contient des données JSON invalides
*/ */
public function save(): void public function save(): void
{ {
if ($this->data === null) { if ($this->data === null) {
throw new \RuntimeException('Tentative de sauvegarde de données nulles'); throw new \RuntimeException('Tentative de sauvegarde de données nulles');
} }
try {
try { $encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT | JSON_THROW_ON_ERROR);
$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT | JSON_THROW_ON_ERROR); } catch (\JsonException $e) {
} catch (\JsonException $e) { throw new \RuntimeException('Erreur d\'encodage JSON : ' . $e->getMessage());
throw new \RuntimeException('Erreur d\'encodage JSON : ' . $e->getMessage()); }
}
$encoded_length = strlen($encoded_data);
$encoded_length = strlen($encoded_data); $max_attempts = 5;
$max_attempts = 5;
for ($attempt = 0; $attempt < $max_attempts; $attempt++) {
for ($attempt = 0; $attempt < $max_attempts; $attempt++) { $temp_file = $this->db . '.tmp' . uniqid();
$temp_file = $this->db . '.tmp' . uniqid();
try {
try { $write_result = file_put_contents($temp_file, $encoded_data, LOCK_EX);
$write_result = file_put_contents($temp_file, $encoded_data, LOCK_EX);
if ($write_result === $encoded_length) {
if ($write_result === $encoded_length) { if (rename($temp_file, $this->db)) {
if (rename($temp_file, $this->db)) { return;
return; }
} }
} } catch (\Exception $e) {
} catch (\Exception $e) { // Nettoyer le fichier temporaire en cas d'exception
// Nettoyer le fichier temporaire en cas d'exception if (file_exists($temp_file)) {
if (file_exists($temp_file)) { unlink($temp_file);
unlink($temp_file); }
} }
}
usleep(pow(2, $attempt) * 250000);
usleep(pow(2, $attempt) * 250000); }
}
// Erreur fatale si tous les essais échouent
// Erreur fatale si tous les essais échouent throw new \RuntimeException('Échec de sauvegarde après ' . $max_attempts . ' tentatives');
throw new \RuntimeException('Échec de sauvegarde après ' . $max_attempts . ' tentatives');
} }
} }

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.19.02'; const ZWII_VERSION = '1.19.03';
// 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/';

View File

@ -180,7 +180,7 @@ class course extends common
$this->initData('theme', $courseId); $this->initData('theme', $courseId);
// Pointer RFM sur le dossier de l'espace // Pointer RFM sur le dossier de l'espace
self::$siteContent = $courseId; // self::$siteContent = $courseId;
// Ordonne les pages par position // Ordonne les pages par position
$this->buildHierarchy(); $this->buildHierarchy();
@ -319,7 +319,7 @@ class course extends common
$this->initDB('page', $courseId); $this->initDB('page', $courseId);
// Pointer RFM sur le dossier de l'espace // Pointer RFM sur le dossier de l'espace
self::$siteContent = $courseId; // self::$siteContent = $courseId;
// Ordonne les pages par position // Ordonne les pages par position
$this->buildHierarchy(); $this->buildHierarchy();
@ -378,7 +378,7 @@ class course extends common
$this->initDB('page', $courseId); $this->initDB('page', $courseId);
// Pointer RFM sur le dossier de l'espace // Pointer RFM sur le dossier de l'espace
self::$siteContent = $courseId; // self::$siteContent = $courseId;
// Ordonne les pages par position // Ordonne les pages par position
$this->buildHierarchy(); $this->buildHierarchy();
@ -1740,7 +1740,7 @@ class course extends common
$this->initDB('page', $courseId); $this->initDB('page', $courseId);
// Pointer RFM sur le dossier de l'espace // Pointer RFM sur le dossier de l'espace
self::$siteContent = $courseId; // self::$siteContent = $courseId;
// Ordonne les pages par position // Ordonne les pages par position
$this->buildHierarchy(); $this->buildHierarchy();