diff --git a/CHANGES.md b/CHANGES.md index 5cc03d49..22f3272f 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,11 +1,17 @@ # Changelog -## version 10.6.03 -- Correction : - - Module actualités (news), version 3.3, le flux RSS affiche l'ensemble des articles plutôt que ceux de la page courante. + +## Version 11.0.00 - Modifications : - - Installation : livraison des fichiers de thème du site de test dans une archive. Désormais, le dossier site ne contiendra que les fichiers de sécurité htaccess. Cette procédure permettra de ne plus différencier les archives d'installation et de mise à jour. - - Mises à jour : les mises à jour s'effectueront à partir de la forge plutôt que sur le site. + - Gestion multi-langues + - Traduction rédigée dans une langue européenne + - Traduction automatique dans une langue européenne + - Traduction selon la langue navigateur + - Configuration du site : + - Activation et désactivation de la déconnexion automatique empêchant plusieurs sessions avec le même compte. + - Suppression de l'option articles par pages. + - Suppression de l'option de backup individuel des fichiers de données, pour l'activer manuellement, créez un fichier vide .backup dans site/data + - Nouvelle option permettant de transférer les fichiers de sauvegarde automatiques dans le gestionnaire de fichiers. ## version 10.6.03 - Correction : diff --git a/core/layout/common.css b/core/layout/common.css index ced1cd47..5ec54e7a 100755 --- a/core/layout/common.css +++ b/core/layout/common.css @@ -29,7 +29,7 @@ body { } -@media (min-width: 769px) { +@media screen and (min-width: 769px) { body { /*margin:0px 10px;*/ margin: 0; @@ -41,7 +41,7 @@ body { /** * Petits écrans inférieurs à 768px de largeur, on supprime les marges */ -@media (max-width: 768px) { +@media screen and (max-width: 768px) { body { margin: 0px; } @@ -65,7 +65,7 @@ body { -@media (max-width: 768px) { +@media screen and (max-width: 768px) { .siteContainer { display: flex; flex-direction: column; @@ -237,12 +237,12 @@ td>.col12 { } /* Tableau sur les écrans de petites tailles */ -@media (max-width: 768px) { +@media screen and (max-width: 768px) { .table thead { font-size: 0.8em; } } -@media (max-width: 668px) { +@media screen and (max-width: 668px) { .table thead { display:none; } @@ -408,7 +408,7 @@ td>.col12 { background-color: rgba(255, 255, 255, 1); } -@media (min-width: 769px) { +@media screen and (min-width: 769px) { #bar #barLeft { float: left; } @@ -419,7 +419,7 @@ td>.col12 { } } -@media (max-width: 768px) { +@media screen and (max-width: 768px) { #bar { text-align: center; padding: 0 1; @@ -455,7 +455,7 @@ td>.col12 { overflow: hidden; } /* Dans theme.css -@media (min-width:768px) { +@media screen and (min-width:768px) { #site { margin: 20px auto; } @@ -464,7 +464,7 @@ td>.col12 { /* Bannière */ -@media (min-width:768px) { +@media screen and (min-width:768px) { body>header { margin: 0; /*-10px;*/ @@ -598,13 +598,13 @@ nav::before { display: flex; } -@media (min-width: 769px) { +@media screen and (min-width: 769px) { nav #menu { display: block; } } -@media (max-width: 768px) { +@media screen and (max-width: 768px) { body>nav { margin: 0; } @@ -691,41 +691,66 @@ li .menuSideChild { /* Container des drapeaux */ -#i18nContainer { - z-index: 100; + +#i18nContainerNav, #i18nContainerSite { position: relative ; float: right; - width: auto; - height: auto; - margin-top: -25px; } -#i18nContainer ul { +#i18nContainerNav ul, #i18nContainerSite ul { list-style: none; } -#i18nContainer li { +#i18nContainerNav li, #i18nContainerSite li { display: inline-block; position: relative; } -#i18nContainer img { - width: 80%; +#i18nFlag { + width: 70%; +} + +#i18nFlagSelected { + width: 100%; } +/* +* Position du bloc dans le site sur les petits écrans +*/ - -#i18nContainer img { - margin: 2px; +#i18nContainerNav { + display: block; +} +#i18nContainerSite { + display: none; } +@media screen and (max-width:1024px){ + #i18nContainerNav { + display: none; + } + #i18nContainerSite { + display: block; + margin-top: -10px; + } + #i18nFlag { + width: 100%; + padding: 5px; + } + + #i18nFlagSelected { + width: 130%; + padding: 5px; + } + + } /* Corps */ -@media (min-width:768px) { +@media screen and (min-width:768px) { section { padding: 20px; } @@ -822,7 +847,7 @@ footer #footerbody>div { } /* Conserve le pied de page sur une ligne */ -@media (max-width: 768px) { +@media screen and (max-width: 768px) { body>footer { margin: 0; } @@ -1031,6 +1056,7 @@ footer #footerSocials .zwiico-github:hover { user-select: none; } + /* Lightbox */ .lightbox { background: #FFF; @@ -1367,7 +1393,7 @@ input[type='checkbox']:disabled+label:before { display: inline-block; } -@media (min-width: 769px) { +@media screen and (min-width: 769px) { .col1 { width: 8.33333333%; } @@ -1556,7 +1582,7 @@ th.col12 { } /* Tableau sur les écrans de très petites tailles */ -@media (max-width: 480px){ +@media screen and (max-width: 480px){ .table tr{ display: block; margin-bottom: 10px; @@ -1710,3 +1736,7 @@ th.col12 { border-radius: 5px; z-index: 30; } + +.helpDisplayButton { + cursor: pointer; +} diff --git a/core/module/config/config.php b/core/module/config/config.php index b17dde0e..a0299776 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -18,17 +18,19 @@ class config extends common { public static $actions = [ 'backup' => self::GROUP_ADMIN, + 'copyBackups'=> self::GROUP_ADMIN, 'configMetaImage' => self::GROUP_ADMIN, 'generateFiles' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, 'advanced' => self::GROUP_ADMIN, - 'manage' => self::GROUP_ADMIN, + 'restore' => self::GROUP_ADMIN, 'updateBaseUrl' => self::GROUP_ADMIN, 'script' => self::GROUP_ADMIN, 'logReset' => self::GROUP_ADMIN, 'logDownload'=> self::GROUP_ADMIN, 'blacklistReset' => self::GROUP_ADMIN, - 'blacklistDownload' => self::GROUP_ADMIN + 'blacklistDownload' => self::GROUP_ADMIN, + ]; public static $timezones = [ @@ -191,7 +193,7 @@ class config extends common { $this->addOutput([ 'notification' => $successSitemap ? 'Le sitemap a été mis à jour' : 'Echec d\'écriture, le site map n\'a pas été mis à jour', 'redirect' => helper::baseUrl() . 'config/advanced', - 'state' => $successSitemap + 'state' => $successSitemap ]); } @@ -265,11 +267,11 @@ class config extends common { /** * Procédure d'importation */ - public function manage() { + public function restore() { // Soumission du formulaire if($this->isPost()) { - //if ($this->getInput('configManageImportFile')) - $fileZip = $this->getInput('configManageImportFile'); + //if ($this->getInput('configRestoreImportFile')) + $fileZip = $this->getInput('configRestoreImportFile'); $file_parts = pathinfo($fileZip); $folder = date('Y-m-d-h-i-s', time()); $zip = new ZipArchive(); @@ -277,7 +279,7 @@ class config extends common { // Valeurs en sortie erreur $this->addOutput([ 'notification' => 'Le fichier n\'est pas une archive valide', - 'redirect' => helper::baseUrl() . 'config/manage', + 'redirect' => helper::baseUrl() . 'config/restore', 'state' => false ]); } @@ -286,7 +288,7 @@ class config extends common { // Valeurs en sortie erreur $this->addOutput([ 'notification' => 'Impossible de lire l\'archive', - 'redirect' => helper::baseUrl() . 'config/manage', + 'redirect' => helper::baseUrl() . 'config/restore', 'state' => false ]); } @@ -311,21 +313,21 @@ class config extends common { // V10 valide $version = '10'; // Option active, les users sont stockées - if ($this->getInput('configManageImportUser', helper::FILTER_BOOLEAN) === true ) { + if ($this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ) { $users = $this->getData(['user']); } } else { // Version invalide // Valeurs en sortie erreur $this->addOutput([ 'notification' => 'Cette archive n\'est pas une sauvegarde valide', - 'redirect' => helper::baseUrl() . 'config/manage', + 'redirect' => helper::baseUrl() . 'config/restore', 'state' => false ]); } // Préserver les comptes des utilisateurs d'une version 9 si option cochée // Positionnement d'une variable de session lue au constructeurs if ($version === '9') { - $_SESSION['KEEP_USERS'] = $this->getInput('configManageImportUser', helper::FILTER_BOOLEAN); + $_SESSION['KEEP_USERS'] = $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN); } // Extraire le zip ou 'site/' $success = $zip->extractTo( 'site/' ); @@ -335,13 +337,13 @@ class config extends common { // Restaurer les users originaux d'une v10 si option cochée if (!empty($users) && $version === '10' && - $this->getInput('configManageImportUser', helper::FILTER_BOOLEAN) === true) { + $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true) { $this->setData(['user',$users]); } // Message de notification $notification = $success === true ? 'Restauration réalisée avec succès' : 'Erreur inconnue'; - $redirect = $this->getInput('configManageImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/manage' : helper::baseUrl() . 'user/login/'; + $redirect = $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/restore' : helper::baseUrl() . 'user/login/'; // Valeurs en sortie erreur $this->addOutput([ 'notification' => $notification, @@ -353,7 +355,7 @@ class config extends common { // Valeurs en sortie $this->addOutput([ 'title' => 'Restaurer', - 'view' => 'manage' + 'view' => 'restore' ]); } @@ -399,6 +401,7 @@ class config extends common { 'title' => $this->getInput('configTitle', helper::FILTER_STRING_SHORT, true) ] ]); + $this->setData(['config', 'i18n', 'enabled', $this->getInput('configI18n',helper::FILTER_BOOLEAN) ]); // Générer robots.txt et sitemap $this->generateFiles(); // Valeurs en sortie @@ -428,6 +431,11 @@ class config extends common { $this->getInput('configAdvancedAutoUpdate', helper::FILTER_BOOLEAN) === true) { $this->setData(['core','lastAutoUpdate',0]); } + // Eviter déconnexion automatique après son activation + if ( $this->getData(['config','autoDisconnect']) === false + AND $this->getInput('configAdvancedAutoDisconnect',helper::FILTER_BOOLEAN) === true ) { + $this->setData(['user',$this->getuser('id'),'accessCsrf',$_SESSION['csrf']]); + } // Sauvegarder $this->setData([ 'config', @@ -455,6 +463,7 @@ class config extends common { 'proxyUrl' => $this->getInput('configAdvancedProxyUrl'), 'proxyPort' => $this->getInput('configAdvancedProxyPort',helper::FILTER_INT), 'captchaStrong' => $this->getInput('configAdvancedCaptchaStrong',helper::FILTER_BOOLEAN), + 'autoDisconnect' => $this->getInput('configAdvancedAutoDisconnect',helper::FILTER_BOOLEAN), 'smtp' => [ 'enable' => $this->getInput('configAdvancedSmtpEnable',helper::FILTER_BOOLEAN), 'host' => $this->getInput('configAdvancedSmtpHost',helper::FILTER_STRING_SHORT), @@ -612,7 +621,7 @@ class config extends common { // Valeurs en sortie $this->addOutput([ 'notification' => $success ? $c3. ' conversion' . ($c3 > 1 ? 's' : '') . ' effectuée' . ($c3 > 1 ? 's' : '') : 'Aucune conversion', - 'redirect' => helper::baseUrl() . 'config/manage', + 'redirect' => helper::baseUrl() . 'config/restore', 'state' => $success ? true : false ]); } @@ -729,6 +738,23 @@ class config extends common { } } + /** + * Récupération des backups auto dans le gestionnaire de fichiers + */ + public function copyBackups() { + // Créer le répertoire manquant + if (!is_dir(self::FILE_DIR.'source/backup')) { + mkdir(self::FILE_DIR.'source/backup'); + } + $this->custom_copy(self::BACKUP_DIR, self::FILE_DIR . 'source/backup' ); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'config/advanced', + 'notification' => 'Copie terminée', + 'state' => true + ]); + } + /** * Fonction de parcours des données de module @@ -750,4 +776,31 @@ class config extends common { } return $newArray; } + + /* + * Copie récursive de dossiers + * + */ + private function custom_copy($src, $dst) { + // open the source directory + $dir = opendir($src); + // Make the destination directory if not exist + if (!is_dir($dst)) { + mkdir($dst); + } + // Loop through the files in source directory + while( $file = readdir($dir) ) { + if (( $file != '.' ) && ( $file != '..' )) { + if ( is_dir($src . '/' . $file) ){ + // Recursively calling custom copy function + // for sub directory + $this -> custom_copy($src . '/' . $file, $dst . '/' . $file); + } + else { + copy($src . '/' . $file, $dst . '/' . $file); + } + } + } + closedir($dir); + } } diff --git a/core/module/config/view/advanced/advanced.php b/core/module/config/view/advanced/advanced.php index fd6d03de..a4c307fe 100644 --- a/core/module/config/view/advanced/advanced.php +++ b/core/module/config/view/advanced/advanced.php @@ -27,24 +27,26 @@
Une archive contenant le dossier /site/data est copiée dans le dossier \'site/backup\'. La sauvegarde est conservée pendant 30 jours.
Les fichiers du site ne sont pas sauvegardés automatiquement.
' +Un fichier .backup.json est généré à chaque édition ou effacement d\'une donnée. La désactivation entraîne la suppression de ces fichiers.
' + +Les fichiers du site ne sont pas sauvegardés automatiquement. Activation recommandée.' ]); ?>
Lorsque les langues étrangères sont activées, il convient d'adapter les pages spéciales.
Vous avez le choix entre une traduction automatique réalisée avec le script Google Traduction ou une traduction rédigée. La traduction automatique offre deux possibilités, la détection automatique de la langue du navigateur même celle-ci n'est pas + matérialisée par un drapeau. Le clic sur un drapeau forcera la traduction dans cette langue, pour cela sélectionnez le drapeau puis l'option de "Traduction automatique". + La traduction automatique est réalisée à partir du site en version française.
+Avec l'option "Traduction rédigée", une nouveau sité est généré, seule la page d'accueil est crée, il faut alors rédiger les pages dans la langue sélectionnée. + Il est possible de copier les pages et les modules d'une langue vers une autre à l'aide de l'utilitaire de copie. + Quand un drapeau est masqué, la traduction est effacée, pensez à sauvegarder. + Afficher le drapeau français pour revenir à la traduction dans la langue originale.