diff --git a/core/class/layout.class.php b/core/class/layout.class.php index da737c64..d9dd813e 100644 --- a/core/class/layout.class.php +++ b/core/class/layout.class.php @@ -1090,11 +1090,11 @@ class layout extends common $today > $checkUpdate + $this->getData(['config', 'autoUpdateDelay', 86400]) ) { // Dernier auto controle - $this->setData(['core', 'lastAutoUpdate', $today]); + $this->setData(['core', 'lastAutoUpdate', $today], false); if ( helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL) ) { - $this->setData(['core', 'updateAvailable', true]); + $this->setData(['core', 'updateAvailable', true], false); } // Recherche de mise à jour des modules @@ -1111,11 +1111,12 @@ class layout extends common } // Mise à jour d'un module if (array_key_exists($key, $infoModules) === true) { - $this->setData(['core', 'updateModuleAvailable', true]); + $this->setData(['core', 'updateModuleAvailable', true], false); } } } - + // Force la sauvegarde + $this->saveDB('core'); } } // Afficher le bouton : Mise à jour détectée + activée diff --git a/core/class/router.class.php b/core/class/router.class.php index 8b5a618c..40a0cc45 100644 --- a/core/class/router.class.php +++ b/core/class/router.class.php @@ -32,8 +32,6 @@ class core extends common } // Date de la dernière suppression $this->setData(['core', 'lastClearTmp', $lastClearTmp]); - // Enregistre les données - //$this->SaveData(); } // Backup automatique des données $lastBackup = mktime(0, 0, 0); @@ -519,7 +517,7 @@ class core extends common && $this->getUser('id') && !$this->isPost() ) { - $this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()]); + $this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()], false); $this->setData(['user', $this->getUser('id'), 'accessTimer', time()]); } // Breadcrumb diff --git a/core/core.php b/core/core.php index 5cc3fc9a..727fdb64 100644 --- a/core/core.php +++ b/core/core.php @@ -520,7 +520,7 @@ class common * Sauvegarde des données * @param array $keys Clé(s) des données */ - public function setData($keys = []) + public function setData($keys = [], $save = true) { // Pas d'enregistrement lorsqu'une notice est présente ou tableau transmis vide if ( @@ -548,7 +548,7 @@ class common $query .= '.' . $keys[$i]; } // Appliquer la modification, le dernier élément étant la donnée à sauvegarder - $success = is_object($db->set($query, $keys[count($keys) - 1], true)); + $success = is_object($db->set($query, $keys[count($keys) - 1], $save)); } return $success; } @@ -725,6 +725,17 @@ class common } + /** + * Forçage de l'enregistrement + * @param mixed $module + * @return void + */ + public function saveDB($module): void + { + $db = $this->dataFiles[$module]; + $db->save(); + } + /** * Accède à la liste des pages parents et de leurs enfants diff --git a/core/module/page/page.php b/core/module/page/page.php index 2790fda1..f24c41bc 100644 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -382,11 +382,13 @@ class page extends common $pageId = helper::increment($pageId, self::$moduleIds); // Met à jour les enfants foreach ($this->getHierarchy($this->getUrl(2), null) as $childrenPageId) { - $this->setData(['page', $childrenPageId, 'parentPageId', $pageId]); + $this->setData(['page', $childrenPageId, 'parentPageId', $pageId], false); } + // Force la sauvegarde + $this->saveDB('page'); // Change l'id de page dans les données des modules if ($this->getData(['module', $this->getUrl(2)]) !== null) { - $this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])]); + $this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])], false); $this->deleteData(['module', $this->getUrl(2)]); // Renommer le dossier du module $moduleId = $this->getData(['page', $this->getUrl(2), 'moduleId']); @@ -397,8 +399,10 @@ class page extends common copy($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2), $modulesData[$moduleId]['dataDirectory'] . $pageId); $this->deleteDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2)); // Mettre à jour le nom de la feuille de style - $this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId]); + $this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId], false); } + // Force la sauvegarde + $this->saveDB('module'); } // Si la page correspond à la page d'accueil, change l'id dans la configuration du site if ($this->getData(['locale', 'homePageId']) === $this->getUrl(2)) { @@ -418,20 +422,22 @@ class page extends common } // Traitement des pages spéciales affectées dans la config : if ($this->getUrl(2) === $this->getData(['locale', 'legalPageId'])) { - $this->setData(['locale', 'legalPageId', $pageId]); + $this->setData(['locale', 'legalPageId', $pageId], false); } if ($this->getUrl(2) === $this->getData(['locale', 'searchPageId'])) { - $this->setData(['locale', 'searchPageId', $pageId]); + $this->setData(['locale', 'searchPageId', $pageId], false); } if ($this->getUrl(2) === $this->getData(['locale', 'page404'])) { - $this->setData(['locale', 'page404', $pageId]); + $this->setData(['locale', 'page404', $pageId], false); } if ($this->getUrl(2) === $this->getData(['locale', 'page403'])) { - $this->setData(['locale', 'page403', $pageId]); + $this->setData(['locale', 'page403', $pageId], false); } if ($this->getUrl(2) === $this->getData(['locale', 'page302'])) { - $this->setData(['locale', 'page302', $pageId]); + $this->setData(['locale', 'page302', $pageId], false); } + // Force la sauvegarde + $this->saveDB('locale'); // Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents $lastPosition = 1; $hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy()); @@ -450,7 +456,7 @@ class page extends common $lastPosition++; } // Change la position - $this->setData(['page', $hierarchyPageId, 'position', $lastPosition]); + $this->setData(['page', $hierarchyPageId, 'position', $lastPosition], false); // Incrémente pour la prochaine position $lastPosition++; } @@ -475,26 +481,28 @@ class page extends common ) { foreach ($this->getHierarchy($pageId) as $parentId => $childId) { if ($this->getData(['page', $childId, 'parentPageId']) === $pageId) { - $this->setData(['page', $childId, 'position', 0]); + $this->setData(['page', $childId, 'position', 0], false); } } + // Force la sauvegarde + $this->saveDB('page'); } // La page est une barre latérale qui a été renommée : changer le nom de la barre dans les pages qui l'utilisent if ($this->getinput('pageEditBlock') === 'bar') { foreach ($this->getHierarchy() as $eachPageId => $parentId) { if ($this->getData(['page', $eachPageId, 'barRight']) === $this->getUrl(2)) { - $this->setData(['page', $eachPageId, 'barRight', $pageId]); + $this->setData(['page', $eachPageId, 'barRight', $pageId], false); } if ($this->getData(['page', $eachPageId, 'barLeft']) === $this->getUrl(2)) { - $this->setData(['page', $eachPageId, 'barLeft', $pageId]); + $this->setData(['page', $eachPageId, 'barLeft', $pageId], false); } foreach ($parentId as $childId) { if ($this->getData(['page', $childId, 'barRight']) === $this->getUrl(2)) { - $this->setData(['page', $childId, 'barRight', $pageId]); + $this->setData(['page', $childId, 'barRight', $pageId], false); } if ($this->getData(['page', $childId, 'barLeft']) === $this->getUrl(2)) { - $this->setData(['page', $childId, 'barLeft', $pageId]); + $this->setData(['page', $childId, 'barLeft', $pageId], false); } } } @@ -710,13 +718,13 @@ class page extends common { $p = $this->getData(['page']); $d = array_map(function ($d) { - unset ($d["css"], $d["js"]); + unset($d["css"], $d["js"]); return $d; }, $p); return json_encode($d); } - /** + /** * Stocke la variable dans les paramètres de l'utilisateur pour activer la tab à sa prochaine visite * @return never */ diff --git a/core/module/theme/theme.php b/core/module/theme/theme.php index 795f811e..59c17741 100644 --- a/core/module/theme/theme.php +++ b/core/module/theme/theme.php @@ -419,7 +419,7 @@ class theme extends common ]); // Sauvegarder la configuration localisée - $this->setData(['locale', 'legalPageId', $this->getInput('configLegalPageId')]); + $this->setData(['locale', 'legalPageId', $this->getInput('configLegalPageId')], false); $this->setData(['locale', 'searchPageId', $this->getInput('configSearchPageId')]); // Valeurs en sortie @@ -507,21 +507,23 @@ class theme extends common 'featureContent' => $featureContent, 'featureFiles' => $files ] - ]); + ], false); // Modification de la position du menu selon la position de la bannière if ($this->getData(['theme', 'header', 'position']) == 'site') { - $this->setData(['theme', 'menu', 'position', str_replace('body-', 'site-', $this->getData(['theme', 'menu', 'position']))]); + $this->setData(['theme', 'menu', 'position', str_replace('body-', 'site-', $this->getData(['theme', 'menu', 'position']))], false); } if ($this->getData(['theme', 'header', 'position']) == 'body') { - $this->setData(['theme', 'menu', 'position', str_replace('site-', 'body-', $this->getData(['theme', 'menu', 'position']))]); + $this->setData(['theme', 'menu', 'position', str_replace('site-', 'body-', $this->getData(['theme', 'menu', 'position']))], false); } // Menu accroché à la bannière qui devient cachée if ( $this->getData(['theme', 'header', 'position']) == 'hide' && in_array($this->getData(['theme', 'menu', 'position']), ['body-first', 'site-first', 'body-first', 'site-second']) ) { - $this->setData(['theme', 'menu', 'position', 'site']); + $this->setData(['theme', 'menu', 'position', 'site'], false); } + // Force la sauvegarde + $this->saveDB('theme'); // Valeurs en sortie $this->addOutput([ 'notification' => helper::translate('Modifications enregistrées'), @@ -631,7 +633,7 @@ class theme extends common // Polices liées au thème admin $fonts['Titre (admin)'] = $this->getData(['admin', 'fontTitle']); $fonts['Texte (admin)'] = $this->getData(['admin', 'fontText']); - + // Polices liées au thème $fonts['Bannière'] = $this->getData(['theme', 'header', 'font']); $fonts['Menu'] = $this->getData(['theme', 'menu', 'font']); @@ -650,7 +652,7 @@ class theme extends common if (is_array($typeValue)) { foreach ($typeValue as $fontId => $fontValue) { // Recherche les correspondances - $result = array_filter($fonts, function($value) use ($fontId) { + $result = array_filter($fonts, function ($value) use ($fontId) { return $value == $fontId; }); $keyResults = array_keys($result); @@ -846,7 +848,7 @@ class theme extends common file_exists($this->getData(['font', 'files', $this->getUrl(3), 'resource'])) ) { - unlink($this->getData(['font', 'files', $this->getUrl(3), 'resource'])); + unlink($this->getData(['font', 'files', $this->getUrl(3), 'resource'])); } // Valeurs en sortie @@ -921,7 +923,7 @@ class theme extends common 'fontWeight' => $this->getInput('themeTitleFontWeight'), 'textTransform' => $this->getInput('themeTitleTextTransform') ] - ]); + ], false); $this->setData([ 'theme', 'text', @@ -931,7 +933,7 @@ class theme extends common 'textColor' => $this->getInput('themeTextTextColor'), 'linkColor' => $this->getInput('themeTextLinkColor') ] - ]); + ], false); $this->setData([ 'theme', 'site', @@ -942,14 +944,14 @@ class theme extends common 'width' => $this->getInput('themeSiteWidth'), 'margin' => $this->getInput('themeSiteMargin', helper::FILTER_BOOLEAN) ] - ]); + ], false); $this->setData([ 'theme', 'button', [ 'backgroundColor' => $this->getInput('themeButtonBackgroundColor') ] - ]); + ], false); $this->setData([ 'theme', 'block', @@ -957,7 +959,9 @@ class theme extends common 'backgroundColor' => $this->getInput('themeBlockBackgroundColor'), 'borderColor' => $this->getInput('themeBlockBorderColor') ] - ]); + ], false); + // Force la sauvegarde + $this->saveDB('theme'); // Valeurs en sortie $this->addOutput([ 'notification' => helper::translate('Modifications enregistrées'), diff --git a/core/module/user/user.php b/core/module/user/user.php index 728e7510..453a04cc 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -345,7 +345,7 @@ class user extends common 'files' => $this->getInput('userEditFiles', helper::FILTER_BOOLEAN), 'language' => $this->getInput('userEditLanguage', helper::FILTER_STRING_SHORT), 'tags' => $this->getInput('userEditTags', helper::FILTER_STRING_SHORT), - 'authKey' => $this->getData(['user', $this->getUrl(2), 'authKey']), + 'authKey' => $this->getData(['user', $this->getUrl(2), 'authKey']), ] ]); // Redirection spécifique si l'utilisateur change son mot de passe @@ -1031,8 +1031,8 @@ class user extends common $this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time() and $this->getData(['user', $userId, 'connectFail']) === $this->getData(['config', 'connect', 'attempt']) ) { - $this->setData(['user', $userId, 'connectFail', 0]); - $this->setData(['user', $userId, 'connectTimeout', 0]); + $this->setData(['user', $userId, 'connectFail', 0], false); + $this->setData(['user', $userId, 'connectTimeout', 0], false); } // Check la présence des variables et contrôle du blocage du compte si valeurs dépassées // Vérification du mot de passe et du groupe @@ -1044,8 +1044,8 @@ class user extends common and $captcha === true ) { // RAZ - $this->setData(['user', $userId, 'connectFail', 0]); - $this->setData(['user', $userId, 'connectTimeout', 0]); + $this->setData(['user', $userId, 'connectFail', 0], false); + $this->setData(['user', $userId, 'connectTimeout', 0], false); // Clé d'authenfication $authKey = uniqid('', true) . bin2hex(random_bytes(8)); @@ -1073,7 +1073,7 @@ class user extends common } // Accès multiples avec le même compte - $this->setData(['user', $userId, 'accessCsrf', $_SESSION['csrf']]); + $this->setData(['user', $userId, 'accessCsrf', $_SESSION['csrf']], false); // Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur if ( $this->getData(['config', 'maintenance']) @@ -1106,12 +1106,12 @@ class user extends common $notification = helper::translate('Captcha, identifiant ou mot de passe incorrects'); $logStatus = $captcha === true ? 'Erreur de mot de passe' : 'Erreur de captcha'; // Cas 1 le nombre de connexions est inférieur aux tentatives autorisées : incrément compteur d'échec - if ($this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt'])) { - $this->setData(['user', $userId, 'connectFail', $this->getdata(['user', $userId, 'connectFail']) + 1]); + if ($this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt'], false)) { + $this->setData(['user', $userId, 'connectFail', $this->getdata(['user', $userId, 'connectFail']) + 1], false); } // Cas 2 la limite du nombre de connexion est atteinte : placer le timer if ($this->getdata(['user', $userId, 'connectFail']) == $this->getData(['config', 'connect', 'attempt'])) { - $this->setData(['user', $userId, 'connectTimeout', time()]); + $this->setData(['user', $userId, 'connectTimeout', time()], false); } // Cas 3 le délai de bloquage court if ($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) > time()) { @@ -1124,6 +1124,8 @@ class user extends common ]); } } + // Force la sauvegarde + $this->saveDB('user'); } // Journalisation $this->saveLog($logStatus); @@ -1202,11 +1204,11 @@ class user extends common $newPassword = $this->getInput('userResetNewPassword', helper::FILTER_PASSWORD, true); } // Modifie le mot de passe - $this->setData(['user', $this->getUrl(2), 'password', $newPassword]); + $this->setData(['user', $this->getUrl(2), 'password', $newPassword], false); // Réinitialise la date de la demande - $this->setData(['user', $this->getUrl(2), 'forgot', 0]); + $this->setData(['user', $this->getUrl(2), 'forgot', 0], false); // Réinitialise le blocage - $this->setData(['user', $this->getUrl(2), 'connectFail', 0]); + $this->setData(['user', $this->getUrl(2), 'connectFail', 0], false); $this->setData(['user', $this->getUrl(2), 'connectTimeout', 0]); // Valeurs en sortie $this->addOutput([ @@ -1321,7 +1323,7 @@ class user extends common "accessCsrf" => null, 'tags' => $item['tags'] ] - ]); + ], false); // Icône de notification $item['notification'] = $create ? template::ico('check') : template::ico('cancel'); // Envoi du mail @@ -1362,6 +1364,8 @@ class user extends common } } + // Force la sauvegarde + $this->saveDB('user'); if (empty(self::$users)) { $notification = helper::translate('Rien à importer, erreur de format ou fichier incorrect'); $success = false;