diff --git a/.htaccess b/.htaccess index 574dd56b..7c933e06 100644 --- a/.htaccess +++ b/.htaccess @@ -24,8 +24,8 @@ AddOutputFilterByType DEFLATE application/x-javascript -# Cache le PHPSESSID de l'url -SetEnv SESSION_USE_TRANS_SID 0 +# Cache le PHPSESSID de l'url // Désormais géré par index.php +# SetEnv SESSION_USE_TRANS_SID 0 # Bloque l'accès à la liste des fichiers Options -Indexes diff --git a/CHANGES.md b/CHANGES.md index 7d42d818..9bb74c6b 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,31 @@ # Changelog +## Version 11.2.00 +Mises à jour : + - jQuery v3.6.0 + - Lity v2.4.1 + - Lightbox v2.10.1 + - Faltpickr v4.6.9 + - FavIcon Switcher v1.2.2 +- Corrections : + - Configuration, restauration d'une archive du site : + - la validation du formulaire sans avoir sélectionné de fichier de sauvegarde provoquait le crash du site. + - la conversion des URL des ressources ne fonctionnait plus depuis l'externalisation du contenu des pages dans des fichiers séparés. + - Multi-langues : + - Bug auto détection du navigateur. + - Page site map, correction d'erreurs et rénovation de la présentation. +- Modifications : + - Gestion des cookies : + - Options de personnalisation du message d'acceptation des cookies, acceptation ou refus du cookie Google Analytics, affichage de la page des mentions légales. + - Etiquette dans le footer permettant d'afficher la popup des cookies. + - Thème : + - Disposition des options de configuration du site. + - Bannière : le contenu peut être personnalisé à l'aide d'un éditeur. La bannière au-dessus du site peut s'étendre sur la largeur de la page. + - Pages : il est désormais possible de donner un nom de page court utilisé dans le menu du site, dans les barres latérales et dans les sélecteurs de page (éditeur / lien). En revanche le nom de la page affiché en haut de celle-ci est inchangé. Dans la plupart des cas le titre court sera identique au titre. + - Les écrans d'aide renvoient vers le site doc.zwiicms.fr + - Mise en évidence du statut des pages dans la liste de la barre d'administration. Rouge italique = page orpheline ; Orange gras = page inactive. + - Référencement, l'URL de la page d'accueil (www.site.fr/accueil) est remplacée par la base Url du site (www.site.fr/) afin d'éviter la duplication de contenu. + ## Version 11.1.01 - Corrections : - Langues : bug de l'utilitaire de copie de site. diff --git a/README.md b/README.md index 98060049..84e47c24 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# ZwiiCMS 11.1.01 +# ZwiiCMS 11.2.00 Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation. diff --git a/core/class/template.class.php b/core/class/template.class.php index ff0b7ce6..16cbef01 100644 --- a/core/class/template.class.php +++ b/core/class/template.class.php @@ -47,7 +47,8 @@ class template { 'id' => $nameId, 'name' => $nameId, 'value' => '', - 'limit' => false // captcha simple + 'limit' => false, // captcha simple + 'type'=> 'alpha' // num(érique) ou alpha(bétique) ], $attributes); // Captcha quatre opérations @@ -114,14 +115,15 @@ class template { $secondLetter = uniqid(); // Masquage image source pour éviter un décodage - copy ('core/vendor/zwiico/png/'.$letters[$firstNumber] . '.png', 'site/tmp/' . $firstLetter . '.png'); - copy ('core/vendor/zwiico/png/'.$letters[$secondNumber] . '.png', 'site/tmp/' . $secondLetter . '.png'); + copy ('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$firstNumber] . '.png', 'site/tmp/' . $firstLetter . '.png'); + copy ('core/vendor/zwiico/png/' . $attributes['type'] . '/' . $letters[$secondNumber] . '.png', 'site/tmp/' . $secondLetter . '.png'); + // Début du wrapper $html = '
'; // Label $html .= self::label($attributes['id'], - ' ' . $operator . '  en chiffres ?', [ + ' ' . $operator . '  en chiffres ?', [ 'help' => $attributes['help'] ]); diff --git a/core/core.js.php b/core/core.js.php index ed7a8f87..0f3343f2 100644 --- a/core/core.js.php +++ b/core/core.js.php @@ -6,7 +6,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2021, Frédéric Tempez + * @copyright Copyright (C) 2018-2022, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ @@ -194,11 +194,11 @@ core.start = function() { // Disparition de la notification notificationTimer = setTimeout(function() { $("#notification").fadeOut(); - }, 2000); + }, 3000); // Barre de progression $("#notificationProgress").animate({ "width": "0%" - }, 2000, "linear"); + }, 3000, "linear"); }) .trigger("mouseleave"); $("#notificationClose").on("click", function() { @@ -206,59 +206,69 @@ core.start = function() { $("#notification").fadeOut(); $("#notificationProgress").stop(); }); + /** - * Affiche / Cache le menu en mode responsive + * Traitement du formulaire cookies */ - var menuDOM = $("#menu"); - $("#toggle").on("click", function() { - menuDOM.slideToggle(); - }); - $(window).on("resize", function() { - if($(window).width() > 768) { - menuDOM.css("display", ""); + $("#cookieForm").submit(function(event){ + + // Varables des cookies + var samesite = "samesite=lax"; + var getUrl = window.location; + var domain = "domain=" + getUrl.host; + var path = "path=" + getUrl.pathname.split('/')[1]; + var samesite = "samesite=lax"; + var e = new Date(); + e.setFullYear(e.getFullYear() + 1); + var expires = "expires=" + e.toUTCString(); + + // Crée le cookie d'acceptation Google Analytics si l'ID a été saisie + var analytics = "getData(['config', 'seo', 'analyticsId']);?>"; + // l'Id GA est défini dans la configuration, afficher la checkbox d'acceptation + if( analytics.length > 0){ + // Traitement du retour de la checkbox + if ($("#googleAnalytics").is(":checked")) { + // L'URL du serveur faut TRUE + document.cookie = "ZWII_COOKIE_GA_CONSENT=true;" + domain + ";" + path + ";" + samesite + ";" + expires; + } else { + document.cookie = "ZWII_COOKIE_GA_CONSENT=false;" + domain + ";" + path + ";" + samesite + ";" + expires; + } + } + + // Stocke le cookie d'acceptation + document.cookie = "ZWII_COOKIE_CONSENT=true;" + domain + ";" + path + ";" + samesite + ";" + expires; }); + /** - * Message sur l'utilisation des cookies + * Fermeture de la popup des cookies */ - var analytics = ""; - if (getData(['config', 'seo', 'analyticsId'])); ?>) { - analytics = ' grâce au cookie Google Analytics' - } - if(getData(['config', 'cookieConsent'])); ?>) { - if(document.cookie.indexOf("ZWII_COOKIE_CONSENT") === -1) { - $("body").append( - $("
").attr("id", "cookieConsent").append( - $("").html("

Ce site utilise des cookies pour assurer l'authentification, améliorer l'expérience utilisateur"+analytics+".
En cliquant sur ”J’accepte”, vous acceptez l’utilisation de ces cookies.

"), - $("") - .attr("id", "cookieConsentConfirm") - .text("Accepter") - .on("click", function() { - // Créé le cookie d'acceptation - var expires = new Date(); - expires.setFullYear(expires.getFullYear() + 1); - expires = "expires=" + expires.toUTCString(); - document.cookie = "ZWII_COOKIE_CONSENT=true;" + expires; - // Ferme le message - $(this).parents("#cookieConsent").fadeOut(); - }), - $("") - .attr("id", "cookieConsentRefuse") - .text("Refuser") - .on("click", function() { - // Créé le cookie d'acceptation - var expires = new Date(); - expires.setFullYear(expires.getFullYear() + 1); - expires = "expires=" + expires.toUTCString(); - document.cookie = "ZWII_COOKIE_CONSENT=false;" + expires; - // Ferme le message - $(this).parents("#cookieConsent").fadeOut(); - }), - ) - ); - } - } + $("#cookieConsent .cookieClose").on("click", function() { + $('#cookieConsent').addClass("displayNone"); + }); + + /** + * Commande de gestion des cookies dans le footer + */ + + $("#footerLinkCookie").on("click", function() { + $("#cookieConsent").removeClass("displayNone"); + }); + + /** + * Affiche / Cache le menu en mode responsive + */ + var menuDOM = $("#menu"); + $("#toggle").on("click", function() { + menuDOM.slideToggle(); + }); + $(window).on("resize", function() { + if($(window).width() > 768) { + menuDOM.css("display", ""); + } + }); + /** * Choix de page dans la barre de membre */ @@ -366,8 +376,11 @@ core.start = function() { var height = heightpx.substr(0,heightpx.length-2); var ratio = width / height; if ( ($(window).width() / ratio) <= height) { + //var feature = "getdata(['theme','header','feature']);?>"; $("header").height( $(window).width() / ratio ); - $("header").css("line-height", $(window).width() / ratio + "px"); + //if( feature !== "feature"){ + // $("header").css("line-height", $(window).width() / ratio + "px"); + //}; } } }).trigger("resize"); @@ -478,21 +491,25 @@ $(document).ready(function(){ }; }); - /** - * Active le système d'aide interne - * - */ + /** + * Active le système d'aide interne + * + */ - $(".buttonHelp").on({ - click: function () { + $(".buttonHelp").click(function() { $(".helpDisplayContent").slideToggle(); + /** if( $(".buttonHelp").css('opacity') > '0.75'){ $(".buttonHelp").css('opacity','0.5'); } else{ $(".buttonHelp").css('opacity','1'); } - } + */ + }); + + $(".helpDisplayContent").click(function() { + $(".helpDisplayContent").slideToggle(); }); /** @@ -501,4 +518,11 @@ $(document).ready(function(){ if(/^\?fbclid=/.test(location.search)) location.replace(location.href.replace(/\?fbclid.+/, "")); + /** + * No translate Lity close + */ + $(document).on('lity:ready', function(event, instance) { + $('.lity-close').addClass('notranslate'); + }); + }); diff --git a/core/core.php b/core/core.php index eca7b08e..e99f15cd 100644 --- a/core/core.php +++ b/core/core.php @@ -8,7 +8,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2021, Frédéric Tempez + * @copyright Copyright (C) 2018-2022, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ @@ -45,7 +45,7 @@ class common { // Numéro de version const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/'; - const ZWII_VERSION = '11.1.01'; + const ZWII_VERSION = '11.2.01'; const ZWII_UPDATE_CHANNEL = "v11"; public static $actions = []; @@ -264,7 +264,13 @@ class common { * la traduction est celle de la langue du drapeau * */ if ( $this->getInput('ZWII_I18N_SCRIPT') !== substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2 ) ) { - setrawcookie('googtrans', '/fr/'.substr( $_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2 ), time() + 3600, helper::baseUrl()); + setrawcookie('googtrans', '/fr/'.substr( $_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2 ), time() + 3600, helper::baseUrl(false, false)); + } else { + // Langue du drapeau si elle est définie + if ( $this->getInput('ZWII_I18N_SCRIPT') !== '' ) { + // Paramètre du script + setrawcookie("googtrans", '/fr/'. $this->getInput('ZWII_I18N_SCRIPT') , time() + 3600, helper::baseUrl(false,false)); + } } } @@ -473,7 +479,7 @@ class common { */ public function getPage($page, $lang) { - // Le nom de la ressource et le fichier de contenu sont définis : + // Le nom de la ressource et le fichier de contenu sont définis : if ( $this->getData(['page', $page, 'content']) !== '' && file_exists(self::DATA_DIR . $lang . '/content/' . $this->getData(['page', $page, 'content'])) @@ -482,14 +488,14 @@ class common { return file_get_contents(self::DATA_DIR . $lang . '/content/' . $this->getData(['page', $page, 'content'])); } else { return 'Aucun contenu trouvé.'; - } + } } /** * Ecrire les données de la page * @param string pageId - * @param string contenu de la page + * @param string contenu de la page * @param return nombre d'octets écrits ou erreur */ public function setPage($page, $value, $lang) { @@ -800,23 +806,23 @@ class common { if ($this->getData(['page', $parentId, 'block']) !== 'bar' ) { // Boucler sur les enfants et récupérer le tableau children avec la liste des enfants foreach($childIds as $childId) { - $children [] = [ 'title' => ' » '. html_entity_decode($this->getData(['page', $childId, 'title']), ENT_QUOTES) , + $children [] = [ 'title' => ' » '. html_entity_decode($this->getData(['page', $childId, 'shortTitle']), ENT_QUOTES) , 'value'=> $rewrite.$childId ]; } // Traitement if (empty($childIds)) { // Pas d'enfant, uniquement l'entrée du parent - $parents [] = ['title' => html_entity_decode($this->getData(['page', $parentId, 'title']), ENT_QUOTES) , + $parents [] = ['title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES) , 'value'=> $rewrite.$parentId ]; } else { // Des enfants, on ajoute la page parent en premier - array_unshift ($children , ['title' => html_entity_decode($this->getData(['page', $parentId, 'title']), ENT_QUOTES) , + array_unshift ($children , ['title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES) , 'value'=> $rewrite.$parentId ]); // puis on ajoute les enfants au parent - $parents [] = ['title' => html_entity_decode($this->getData(['page', $parentId, 'title']), ENT_QUOTES) , + $parents [] = ['title' => html_entity_decode($this->getData(['page', $parentId, 'shortTitle']), ENT_QUOTES) , 'value'=> $rewrite.$parentId , 'menu' => $children ]; @@ -906,7 +912,9 @@ class common { } // Page désactivée, traiter les sous-pages sans prendre en compte la page parente. if ($this->getData(['page', $parentPageId, 'disable']) !== true ) { - $sitemap->addUrl ('/' . $parentPageId,$datetime); + // Cas de la page d'accueil ne pas dupliquer l'URL + $pageId = ($parentPageId !== $this->getData(['locale', 'homePageId'])) ? $parentPageId : ''; + $sitemap->addUrl ('/' . $pageId, $datetime); } // Articles du blog if ($this->getData(['page', $parentPageId, 'moduleId']) === 'blog' && @@ -923,6 +931,8 @@ class common { if ($this->getData(['page',$childKey,'group']) !== 0 || $this->getData(['page', $childKey, 'disable']) === true) { continue; } + // Cas de la page d'accueil ne pas dupliquer l'URL + $pageId = ($childKey !== $this->getData(['locale', 'homePageId'])) ? $childKey : ''; $sitemap->addUrl('/' . $childKey,$datetime); // La sous-page est un blog @@ -953,7 +963,7 @@ class common { } else { file_put_contents('robots.txt','User-agent: *' . PHP_EOL . 'Disallow: /'); } - + // Submit your sitemaps to Google, Yahoo, Bing and Ask.com if (empty ($this->getData(['config','proxyType']) . $this->getData(['config','proxyUrl']) . ':' . $this->getData(['config','proxyPort'])) ) { $sitemap->submitSitemap(); @@ -976,6 +986,7 @@ class common { if (!is_dir($fileInfo['dirname'])) { mkdir($fileInfo['dirname'], 0755, true); } + $source_image = ''; // Type d'image switch( $fileInfo['extension']) { case 'jpeg': @@ -1171,18 +1182,60 @@ class common { /** * Affiche le script Google Analytics */ - public function showAnalytics() { - if($code = $this->getData(['config', 'analyticsId']) - AND $this->getInput('ZWII_COOKIE_CONSENT') === 'true') { - echo ' - - '; + public function showAnalytics() { + if( !empty($code = $this->getData(['config', 'seo', 'analyticsId'])) && + $this->getInput('ZWII_COOKIE_GA_CONSENT') === 'true' ) { + echo ' + + '; + } + } + + /** + * Affiche le consentement aux cookies + */ + public function showCookies() { + + // Gestion des cookies intégrée + if ($this->getData(['config', 'cookieConsent']) === true ) + { + // Détermine si le bloc doit être affiché selon la validité du cookie + // L'URL du serveur faut TRUE + $item = '
getInput('ZWII_COOKIE_CONSENT') !== 'true' ? '>' : ' class="displayNone">'; + // Bouton de fermeture + $item .= '
'; + $item .= template::ico('cancel'); + $item .= '
'; + // Texte de la popup + $item .= '

'. $this->getData(['locale', 'cookies', 'cookiesTitleText']) . '

'; + $item .= '

' . $this->getData(['locale', 'cookies', 'cookiesZwiiText']) . '

'; + // Formulaire de réponse + $item .= '
'; + $analytics = $this->getData(['config', 'seo', 'analyticsId']); + $stateCookieGA = $this->getInput('ZWII_COOKIE_GA_CONSENT') === 'true' ? 'checked="checked"' : ''; + if( $analytics !== null AND $analytics !== '' ) { + $item .= '

' . $this->getData(['locale', 'cookies', 'cookiesGaText']) . '

'; + $item .= ''; + $item .= ''; + } + $item .= '

'; + $item .= ''; + $item .= '
'; + // mentions légales si la page est définie + $legalPage = $this->getData(['locale', 'legalPageId']); + if ($legalPage !== 'none') { + $item .= '

' . $this->getData(['locale', 'cookies', 'cookiesLinkMlText']) . '

'; + } + $item .= '
'; + echo $item; } + } /** @@ -1259,7 +1312,7 @@ class common { * Barre droite */ if ($blockright !== "") { - echo '