diff --git a/.htaccess b/.htaccess old mode 100755 new mode 100644 diff --git a/CHANGES.md b/CHANGES.md index a0526baa..195aef46 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -11,11 +11,46 @@ - Suppression des commentaires en masse. - Limiter l'édition des articles et des commentaires à l'id de l'éditeur - Approbation des commentaires +- Corrections : + - Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom. + - Login : l'option "Se souvenir de moi" est fonctionnelle. + - Menu : déplacement de la classe "active". + - Le titre dans la configuration du module non affiché si le titre de la page est masqué. + - Masque de saisie : formulaire validé malgré la présence d'une notice d'erreur + - Classe jsonDb, suppression de la réinitialisation de la structure de données en cas d'absence du fichier. +- Modifications : + - Noyau : + - Mise en cache des données des modules. + - Module recherche : + - La recherche dans le site devient un module externe plutôt qu'un module interne ; + - Diverses corrections optimisations permettant une recherche à l'aide de plusieurs mot-clés. + - Module galerie : + - Les données du thème de galerie sont désormais stockées de manière unique, un seul thème par site pour toutes les galeries d'un même site. + - Configuration du site : + - Pages 403 (accès interdit) et 404 (page introuvable) personnalisables + - Sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur ; le nom de l'archive prend le nom du sous-domaine s'il existe. + - Captcha : addition présentée en lettres sous la forme d'images, réponse en chiffres ; correction du nom de la fonction (capcha en captcha). + - Page : + - Duplication d'une page. +- Mise à jour : + - Script favicon-switcher 1.2.2 + +## version 10.2.09 +- Correction : + - Sécurisation de la fonction d'enregistrement des données. + +## version 10.2.08 +- Correction : + - Bug pageId, régression corrigée. + +## version 10.2.07 +- Correction : + - Défaut de chargement de flatpickr dans le module formulaire qui passe en version 2.4 ## version 10.2.06 - Corrections : - Anticipation de la dépréciation de l'option de cookie samesite=none. - - Warning : absence de fichier map dans le thème TinyMCE lightgray + - Warning : absence de fichier map dans le thème TinyMCE lightgray. ## version 10.2.05 - Correction : diff --git a/core/class/.htaccess b/core/class/.htaccess old mode 100755 new mode 100644 diff --git a/core/class/SitemapGenerator.class.php b/core/class/SitemapGenerator.class.php old mode 100755 new mode 100644 diff --git a/core/class/autoload.php b/core/class/autoload.php old mode 100755 new mode 100644 diff --git a/core/class/helper.class.php b/core/class/helper.class.php old mode 100755 new mode 100644 index ffe6c1ad..f14395fc --- a/core/class/helper.class.php +++ b/core/class/helper.class.php @@ -98,7 +98,9 @@ class helper { public static function autoBackup($folder, $filter = ['backup','tmp'] ) { // Creation du ZIP - $fileName = 'ZwiiCMS-backup'. date('Y-m-d-h-i-s', time()) . '.zip'; + $baseName = str_replace('/','',helper::baseUrl(false,false)); + $baseName = empty($baseName) ? 'ZwiiCMS' : $baseName; + $fileName = $baseName . '-backup-' . date('Y-m-d-h-i-s', time()) . '.zip'; $zip = new ZipArchive(); $zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE); $directory = 'site/'; @@ -185,7 +187,7 @@ class helper { * @return string */ public static function getOnlineVersion() { - return (helper::urlGetContents('http://zwiicms.com/update/'. common::ZWII_UPDATE_CHANNEL . '/version')); + return (helper::urlGetContents('http://zwiicms.fr/update/'. common::ZWII_UPDATE_CHANNEL . '/version')); } diff --git a/core/class/jsondb/Dot.class.php b/core/class/jsondb/Dot.class.php old mode 100755 new mode 100644 diff --git a/core/class/jsondb/JsonDb.class.php b/core/class/jsondb/JsonDb.class.php old mode 100755 new mode 100644 index de755bc1..1dc7cbbd --- a/core/class/jsondb/JsonDb.class.php +++ b/core/class/jsondb/JsonDb.class.php @@ -22,10 +22,10 @@ class JsonDb extends \Prowebcraft\Dot public function __construct($config = []) { $this->config = array_merge([ - 'name' => 'data.json', - 'backup' => 5, + 'name' => 'data.json', + 'backup' => 5, 'dir' => getcwd(), - 'template' => getcwd() . DIRECTORY_SEPARATOR . 'data.template.json' + 'template' => getcwd() . DIRECTORY_SEPARATOR . 'data.template.json' ], $config); $this->loadData(); parent::__construct(); @@ -36,7 +36,7 @@ class JsonDb extends \Prowebcraft\Dot * * @param mixed $key Path or array of paths and values * @param mixed|null $value Value to set if path is not an array - * @param bool $save Сохранить данные в базу + * @param bool $save Save data to database * @return $this */ public function set($key, $value = null, $save = true) @@ -49,10 +49,10 @@ class JsonDb extends \Prowebcraft\Dot /** * Add value or array of values to path * - * @param mixed $key Path or array of paths and values + * @param mixed $key Path or array of paths and values * @param mixed|null $value Value to set if path is not an array - * @param boolean $pop Helper to pop out last key if value is an array - * @param bool $save Сохранить данные в базу + * @param boolean $pop Helper to pop out last key if value is an array + * @param bool $save Save data to database * @return $this */ public function add($key, $value = null, $pop = false, $save = true) @@ -65,8 +65,8 @@ class JsonDb extends \Prowebcraft\Dot /** * Delete path or array of paths * - * @param mixed $key Path or array of paths to delete - * @param bool $save Сохранить данные в базу + * @param mixed $key Path or array of paths to delete + * @param bool $save Save data to database * @return $this */ public function delete($key, $save = true) @@ -81,8 +81,8 @@ class JsonDb extends \Prowebcraft\Dot * optionally format path if it doesn't exist * * @param mixed|null $key Path or array of paths to clean - * @param boolean $format Format option - * @param bool $save Сохранить данные в базу + * @param boolean $format Format option + * @param bool $save Save data to database * @return $this */ public function clear($key = null, $format = false, $save = true) @@ -94,14 +94,15 @@ class JsonDb extends \Prowebcraft\Dot /** - * Загрузка локальной базы данных - * @param bool $reload - * Перезагрузить данные? + * Local database upload + * @param bool $reload Reboot data? * @return array|mixed|null */ protected function loadData($reload = false) { if ($this->data === null || $reload) { - $this->db = $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name']; + // $this->db = $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name']; + $this->db = $this->config['dir'] . $this->config['name']; + /* if (!file_exists($this->db)) { $templateFile = $this->config['template']; if (file_exists($templateFile)) { @@ -118,6 +119,7 @@ class JsonDb extends \Prowebcraft\Dot } } } + */ $this->data = json_decode(file_get_contents($this->db), true); if (!$this->data === null) { throw new \InvalidArgumentException('Database file ' . $this->db @@ -128,11 +130,9 @@ class JsonDb extends \Prowebcraft\Dot } /** - * Сохранение в локальную базу + * Saving to local database */ public function save() { file_put_contents($this->db, json_encode($this->data, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT)); } - - } diff --git a/core/class/phpmailer/.htaccess b/core/class/phpmailer/.htaccess old mode 100755 new mode 100644 diff --git a/core/class/phpmailer/Exception.class.php b/core/class/phpmailer/Exception.class.php old mode 100755 new mode 100644 diff --git a/core/class/phpmailer/PHPMailer.class.php b/core/class/phpmailer/PHPMailer.class.php old mode 100755 new mode 100644 diff --git a/core/class/phpmailer/SMTP.class.php b/core/class/phpmailer/SMTP.class.php old mode 100755 new mode 100644 diff --git a/core/class/template.class.php b/core/class/template.class.php old mode 100755 new mode 100644 index d3cc78bf..82554bf5 --- a/core/class/template.class.php +++ b/core/class/template.class.php @@ -33,12 +33,12 @@ class template { } /** - * Crée un champ capcha + * Crée un champ captcha * @param string $nameId Nom et id du champ * @param array $attributes Attributs ($key => $value) * @return string */ - public static function capcha($nameId, array $attributes = []) { + public static function captcha($nameId, array $attributes = []) { // Attributs par défaut $attributes = array_merge([ 'class' => '', @@ -48,15 +48,18 @@ class template { 'name' => $nameId, 'value' => '' ], $attributes); - // Génère deux nombres pour le capcha - $firstNumber = mt_rand(1, 15); - $secondNumber = mt_rand(1, 15); + // Génère deux nombres pour le captcha + $numbers = array(0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20); + $letters = array('u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'); + $firstNumber = rand ( 0 , count($letters)-1 ); + $secondNumber = rand ( 0 , count($letters)-1 ); // Début du wrapper $html = '
'; // Label - $html .= self::label($attributes['id'], $firstNumber . ' + ' . $secondNumber . ' = ?', [ - 'help' => $attributes['help'] - ]); + $html .= self::label($attributes['id'], + ' + = en chiffres ?', [ + 'help' => $attributes['help'] + ]); // Notice $notice = ''; if(array_key_exists($attributes['id'], common::$inputNotices)) { @@ -64,7 +67,7 @@ class template { $attributes['class'] .= ' notice'; } $html .= self::notice($attributes['id'], $notice); - // Capcha + // captcha $html .= sprintf( '', helper::sprintAttributes($attributes) @@ -241,7 +244,7 @@ class template { 'value' => $attributes['value'] ]); // Champ d'upload - $html .= '
'; + $html .= '
'; $html .= sprintf( ' * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ var core = {}; @@ -346,8 +346,8 @@ core.start = function() { var ratio = width / height; if ( ($(window).width() / ratio) <= height) { $("header").height( $(window).width() / ratio ); - $("header").css("line-height", $(window).width() / ratio + "px"); - } + $("header").css("line-height", $(window).width() / ratio + "px"); + } } }).trigger("resize"); @@ -389,7 +389,7 @@ core.relativeLuminanceW3C = function(rgba) { $(document).ready(function(){ /** - * Affiche le sous-menu quand il est sticky + * Affiche le sous-menu quand il est sticky */ $("nav").mouseenter(function(){ $("#navfixedlogout .navLevel2").css({ 'pointer-events' : 'auto' }); @@ -414,7 +414,7 @@ $(document).ready(function(){ // on récupère la valeur data-speed si elle existe var toggleSpeed = accordion.attr('data-speed') || 100; - // fonction pour afficher un élément + // fonction pour afficher un élément function open(item, speed) { // on récupère tous les éléments, on enlève l'élément actif de ce résultat, et on les cache accordion.find('.accordion-item').not(item).removeClass('active') @@ -428,32 +428,32 @@ $(document).ready(function(){ .find('.accordion-content').slideUp(speed); } - // on initialise l'accordéon, sans animation + // on initialise l'accordéon, sans animation open(accordion.find('.active:first'), 0); // au clic sur un titre... accordion.on('click', '.accordion-title', function(ev) { - ev.preventDefault(); + ev.preventDefault(); // Masquer l'élément déjà actif if ($(this).closest('.accordion-item').hasClass('active')) { close($(this).closest('.accordion-item'), toggleSpeed); } else { - // ...on lance l'affichage de l'élément, avec animation - open($(this).closest('.accordion-item'), toggleSpeed); + // ...on lance l'affichage de l'élément, avec animation + open($(this).closest('.accordion-item'), toggleSpeed); } }); }); /** - * Icône du Menu Burger + * Icône du Menu Burger */ - $("#toggle").click(function() { + $("#toggle").click(function() { var changeIcon = $('#toggle').children("span"); if ( $(changeIcon).hasClass('zwiico-menu') ) { $(changeIcon).removeClass('zwiico-menu').addClass('zwiico-cancel'); } - else { + else { $(changeIcon).addClass('zwiico-menu'); }; }); -}); \ No newline at end of file +}); diff --git a/core/core.php b/core/core.php old mode 100755 new mode 100644 index 94f2ad6c..48951b3a --- a/core/core.php +++ b/core/core.php @@ -10,7 +10,7 @@ * @license GNU General Public License, version 3 * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class common { @@ -43,7 +43,7 @@ class common { const ACCESS_TIMER = 1800; // Numéro de version - const ZWII_VERSION = '10.3.00'; + const ZWII_VERSION = '10.4.00'; const ZWII_UPDATE_CHANNEL = "v10"; public static $actions = []; @@ -52,7 +52,6 @@ class common { 'install', 'maintenance', 'page', - 'search', 'sitemap', 'theme', 'user' @@ -150,8 +149,11 @@ class common { ]; public static $timezone; private $url = ''; + // Données de site private $user = []; - private $page = ''; + private $page = []; + private $module = []; + /** * Constructeur commun @@ -191,8 +193,9 @@ class common { $this->user = $this->getData(['user', $this->getInput('ZWII_USER_ID')]); } - // Mise en cache des pages - $this->page = $this->getPageCache(); + // Mise en cache des pages et des modules + $this->page = $this->getCache('page'); + $this->module = $this->getCache('module'); // Construit la liste des pages parents/enfants if($this->hierarchy['all'] === []) { @@ -323,12 +326,9 @@ class common { //Retourne une chaine contenant le dossier à créer $folder = $this->dirData ($keys[0],'fr'); // Constructeur JsonDB - //require_once "core/vendor/jsondb/Dot.php"; - //require_once "core/vendor/jsondb/JsonDb.php"; $db = new \Prowebcraft\JsonDb([ 'name' => $keys[0] . '.json', - 'dir' => $folder, - 'template' => self::TEMP_DIR . 'data.template.json' + 'dir' => $folder ]); switch(count($keys)) { case 1: @@ -370,10 +370,14 @@ class common { public function getData($keys = []) { if (count($keys) >= 1) { - // Lecture d'une donnée de page en cache - if ($keys[0] === 'page') { + + /** + * Lecture dans le cache, page et module + */ + if ($keys[0] === 'page' || + $keys[0] === 'module' ) { // Décent dans les niveaux de la variable $data - $data = $this->page; + $data = array_merge ($this->page , $this->module); foreach($keys as $key) { // Si aucune donnée n'existe retourne null if(isset($data[$key]) === false) { @@ -387,13 +391,16 @@ class common { // Retourne les données return $data; } + + /** + * Lecture directe + */ //Retourne une chaine contenant le dossier à créer $folder = $this->dirData ($keys[0],'fr'); // Constructeur JsonDB $db = new \Prowebcraft\JsonDb([ 'name' => $keys[0] . '.json', - 'dir' => $folder, - 'template' => self::TEMP_DIR . 'data.template.json' + 'dir' => $folder ]); switch(count($keys)) { case 1: @@ -427,19 +434,15 @@ class common { * Lecture des fichiers de données de page et mise ne cache * @param @return string données des pages */ - public function getPageCache() { - // Trois tentatives - for($i = 0; $i < 3; $i++) { - $data =json_decode(file_get_contents(self::DATA_DIR.'fr/page.json'), true); - if($data) { - return($data); - } - elseif($i === 2) { - exit('Erreur fatale : impossible d\'accéder aux pages'); - } - // Pause de 10 millisecondes - usleep(10000); - } + public function getCache($data) { + $folder = $this->dirData ($data,'fr'); + // Constructeur JsonDB + $db = new \Prowebcraft\JsonDb([ + 'name' => $data . '.json', + 'dir' => $folder + ]); + $tempData = $db->get($data); + return [$data => $tempData]; } /* @@ -595,7 +598,7 @@ class common { break; } elseif($i === 2) { - exit('Impossible de lire les données à importer.'); + throw new \ErrorException('Import des données impossible.'); } // Pause de 10 millisecondes usleep(10000); @@ -950,8 +953,9 @@ class common { */ public function setData($keys = []) { - // Pas d'enregistrement lorsqu'une notice est présente - if (!empty(self::$inputNotices)) { + // Pas d'enregistrement lorsqu'une notice est présente ou tableau transmis vide + if (!empty(self::$inputNotices + OR empty($keys))) { return false; } @@ -960,8 +964,7 @@ class common { // Constructeur JsonDB $db = new \Prowebcraft\JsonDb([ 'name' => $keys[0] . '.json', - 'dir' => $folder, - 'template' => self::TEMP_DIR . 'data.template.json' + 'dir' => $folder ]); switch(count($keys)) { @@ -1012,8 +1015,7 @@ class common { // Constructeur JsonDB $db = new \Prowebcraft\JsonDb([ 'name' => $module . '.json', - 'dir' => $folder, - 'template' => self::TEMP_DIR . 'data.template.json' + 'dir' => $folder ]); if ($sampleSite === true) { $db->set($module,init::$siteData[$module]); @@ -1355,12 +1357,57 @@ class common { if ($this->getData(['core', 'dataVersion']) < 10201) { // Options de barre de membre simple $this->setData(['theme','footer','displayMemberBar',false]); - $this->setData(['theme','menu','memberBar',true]); $this->deleteData(['theme','footer','displayMemberAccount']); $this->deleteData(['theme','footer','displayMemberLogout']); $this->setData(['core', 'dataVersion', 10201]); } // Version 10.3.00 + if ($this->getData(['core', 'dataVersion']) < 10300) { + // Options de barre de membre simple + $this->setData(['config','page404','none']); + $this->setData(['config','page403','none']); + // Module de recherche + // Suppression du dossier search + if (is_dir('core/module/search')) { + $dir = getcwd(); + chdir('core/module/search'); + $files = glob('*'); + foreach($files as $file) unlink($file); + chdir($dir); + rmdir ('core/module/search/'); + } + // Désactivation de l'option dans le pied de page + $this->setData(['theme','footer','displaySearch',false]); + // Inscription des nouvelles variables + $this->setData(['config','searchPageId','']); + + // Mettre à jour les données des galeries + $pageList = array(); + foreach ($this->getHierarchy(null,null,null) as $parentKey=>$parentValue) { + $pageList [] = $parentKey; + foreach ($parentValue as $childKey) { + $pageList [] = $childKey; + } + } + // Mise à jour des données de thème de la galerie + // Les données de thème sont communes au site + foreach ($pageList as $parentKey => $parent) { + //La page a une galerie + if ($this->getData(['page',$parent,'moduleId']) === 'gallery' ) { + foreach ( $this->getData(['module', $parent]) as $galleryKey => $galleryItem) { + // Transfert du theme dans une structure unique + if ( is_array($this->getdata(['theme',$parent])) ) { + $this->setdata(['theme','gallery',$this->getdata(['theme',$parent])]); + } + } + $this->deleteData(['theme',$parent]); + } + } + + // Mise à jour du numéro de version + $this->setData(['core', 'dataVersion', 10300]); + } + // Version 10.4.00 if ($this->getData(['core', 'dataVersion']) < 10300) { // Ajouter le prénom comme pseudo et le pseudo comme signature foreach($this->getData(['user']) as $userId => $userIds){ @@ -1399,7 +1446,7 @@ class common { } } } - $this->setData(['core', 'dataVersion', 10300]); + $this->setData(['core', 'dataVersion', 10400]); } } } @@ -1713,7 +1760,7 @@ class core extends common { // Déconnexion $user = new user; $user->logout(); - // Rédirection + // Redirection http_response_code(302); header('Location:' . helper::baseUrl() . 'maintenance'); exit(); @@ -1753,11 +1800,11 @@ class core extends common { foreach($this->getData(['user']) as $userId => $userIds){ $t = explode('/',$this->getData(['user', $userId, 'accessUrl'])); if ( $this->getuser('id') && - $userId !== $this->getuser('id') && - $this->getData(['user', $userId,'accessUrl']) === $this->getUrl() && - array_intersect($t,self::$accessList) && - array_intersect($t,self::$accessExclude) !== false && - time() < $this->getData(['user', $userId,'accessTimer']) + self::ACCESS_TIMER + $userId !== $this->getuser('id') && + $this->getData(['user', $userId,'accessUrl']) === $this->getUrl() && + array_intersect($t,self::$accessList) && + array_intersect($t,self::$accessExclude) !== false && + time() < $this->getData(['user', $userId,'accessTimer']) + self::ACCESS_TIMER ) { $access = false; $accessInfo['userName'] = $this->getData(['user', $userId, 'lastname']) . ' ' . $this->getData(['user', $userId, 'firstname']); @@ -1990,20 +2037,31 @@ class core extends common { 'title' => 'Accès verrouillé', 'content' => template::speech('La page ' . $accessInfo['pageId'] . ' est ouverte par l\'utilisateur ' . $accessInfo['userName'] . '') ]); + } else { + if ( $this->getData(['config','page403']) !== 'none' + AND $this->getData(['page',$this->getData(['config','page403'])])) + { + header('Location:' . helper::baseUrl() . $this->getData(['config','page403'])); + } else { + $this->addOutput([ + 'title' => 'Erreur 403', + 'content' => template::speech('Vous n\'êtes pas autorisé à accéder à cette page...') + ]); + } + } + } elseif ($this->output['content'] === '') { + http_response_code(404); + if ( $this->getData(['config','page404']) !== 'none' + AND $this->getData(['page',$this->getData(['config','page404'])])) + { + header('Location:' . helper::baseUrl() . $this->getData(['config','page404'])); } else { $this->addOutput([ - 'title' => 'Erreur 403', - 'content' => template::speech('Vous n\'êtes pas autorisé à accéder à cette page...') + 'title' => 'Erreur 404', + 'content' => template::speech('Oups ! La page demandée est introuvable...') ]); } } - elseif($this->output['content'] === '') { - http_response_code(404); - $this->addOutput([ - 'title' => 'Erreur 404', - 'content' => template::speech('Oups ! La page demandée est introuvable...') - ]); - } // Mise en forme des métas if($this->output['metaTitle'] === '') { if($this->output['title']) { @@ -2088,12 +2146,12 @@ class layout extends common { AND ( $this->getData(['page', $this->getUrl(0)]) === null OR $this->getData(['page', $this->getUrl(0), 'hideTitle']) === false + OR $this->getUrl(1) === 'config' ) ) { echo '

' . $this->core->output['title'] . '

'; } echo $this->core->output['content']; - } @@ -2162,7 +2220,7 @@ class layout extends common { $items .= '>Motorisé par '; // Toujours afficher le nom du CMS $items .= ''; - $items .= '
ZwiiCMS'; + $items .= 'ZwiiCMS'; $items .= ''; // Affichage du numéro de version $items .= 'getData(['theme','footer','displaySearch']) === false ? ' class="displayNone"' : ''; - $items .= '> | Rechercher'; + $items .= '> | Recherche'; $items .= ''; // Affichage des mentions légales $items .= ''; - echo ''; + //echo ''; + echo ''; } } @@ -2303,7 +2362,7 @@ class layout extends common { foreach($this->getHierarchy() as $parentPageId => $childrenPageIds) { // Passer les entrées masquées // Propriétés de l'item - $active = ($parentPageId === $currentPageId OR in_array($currentPageId, $childrenPageIds)) ? ' class="active"' : ''; + $active = ($parentPageId === $currentPageId OR in_array($currentPageId, $childrenPageIds)) ? 'active ' : ''; $targetBlank = $this->getData(['page', $parentPageId, 'targetBlank']) ? ' target="_blank"' : ''; // Mise en page de l'item $items .= '
  • '; @@ -2313,7 +2372,7 @@ class layout extends common { {$items .= ''; } else { - $items .= ''; + $items .= ''; } switch ($this->getData(['page', $parentPageId, 'typeMenu'])) { @@ -2359,7 +2418,7 @@ class layout extends common { $items .= '
  • 'Valider', - 'ico' => 'check' - ]); ?> + 'value' => 'Sauvegarder' + ]); ?>
    +

    Paramètre

    -
    +
    true, - 'help' => 'Cette option n\'est pas recommandée lorsque le contenu du gestionnaire de fichiers est très volumineux.' + 'help' => 'Si le contenu du gestionnaire de fichiers est très volumineux, mieux vaut une copie par FTP.' ]); ?>
    +
    + L'archive est générée dans le dossier Backup du gestionnaire de fichiers. +
    diff --git a/core/module/config/view/index/index.css b/core/module/config/view/index/index.css index c7999362..bc85d6a6 100755 --- a/core/module/config/view/index/index.css +++ b/core/module/config/view/index/index.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @import url("site/data/admin.css"); @@ -18,17 +18,17 @@ display : none; } -#info .zwiico-minus { +#info .zwiico-minus-circled { display: inline; } -.zwiico-minus, -#info .zwiico-plus { +.zwiico-minus-circled, +#info .zwiico-plus-circled { display: none; } -.zwiico-minus, -.zwiico-plus { +.zwiico-minus-circled, +.zwiico-plus-circled { cursor: pointer; } \ No newline at end of file diff --git a/core/module/config/view/index/index.js.php b/core/module/config/view/index/index.js.php old mode 100755 new mode 100644 index bab33917..1be4b45c --- a/core/module/config/view/index/index.js.php +++ b/core/module/config/view/index/index.js.php @@ -7,7 +7,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ $( document).ready(function() { @@ -42,8 +42,8 @@ $( document).ready(function() { var i = [ "social", "ceo", "network", "smtp", "login", "logs", "script", "system" ]; $.each(i,function(e) { if (getCookie(i[e]) === "true") { - $("#" + i[e]).find(".zwiico-plus").hide(); - $("#" + i[e]).find(".zwiico-minus").show(); + $("#" + i[e]).find(".zwiico-plus-circled").hide(); + $("#" + i[e]).find(".zwiico-minus-circled").show(); $("#" + i[e]).find(".blockContainer").show(); } }); @@ -54,8 +54,8 @@ $( document).ready(function() { */ $("div .block").click(function(e) { - $(this).find(".zwiico-plus").toggle(); - $(this).find(".zwiico-minus").toggle(); + $(this).find(".zwiico-plus-circled").toggle(); + $(this).find(".zwiico-minus-circled").toggle(); $(this).find(".blockContainer").slideToggle(); /* * Sauvegarder la position des blocs diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php old mode 100755 new mode 100644 index f7939075..b48b5aaf --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -11,15 +11,13 @@
    helper::baseUrl() . 'config/backup', - 'value' => 'Sauvegarder', - 'ico' => 'download' + 'value' => 'Sauvegarder' ]); ?>
    helper::baseUrl() . 'config/manage', - 'value' => 'Restaurer', - 'ico' => 'upload' + 'value' => 'Restaurer' ]); ?>
    @@ -31,21 +29,7 @@

    Informations générales

    -
    - getData(['page']); - foreach($pages as $page => $pageId) { - if ($this->getData(['page',$page,'block']) === 'bar' || - $this->getData(['page',$page,'disable']) === true) { - unset($pages[$page]); - } - } - echo template::select('configHomePageId', helper::arrayCollumn($pages, 'title', 'SORT_ASC'), [ - 'label' => 'Page d\'accueil', - 'selected' =>$this->getData(['config', 'homePageId']) - ]); ?> -
    -
    +
    'Titre du site', 'value' => $this->getData(['config', 'title']), @@ -58,7 +42,7 @@ 'Description du site', 'value' => $this->getData(['config', 'metaDescription']), - 'help' => 'Elle apparaît dans les partages sur les réseaux sociaux.' + 'help' => 'La description participe au référence, n\'oubliez pas de personnaliser la description de chaque page sans copié collé.' ]); ?>
    @@ -68,7 +52,7 @@
    -

    Paramètres

    +

    Paramètres généraux

    @@ -103,16 +87,7 @@ 'help' => 'Le fuseau horaire est utile au bon référencement' ]); ?>
    -
    - 'Sélectionner'] , helper::arrayCollumn($this->getData(['page']), 'title', 'SORT_ASC') ); - ?> - 'Mentions légales', - 'selected' => $this->getData(['config', 'legalPageId']), - 'help' => 'Les mentions légales sont obligatoires en France' - ]); ?> -
    -
    +
    $this->getData(['config', 'cookieConsent']) ]); ?> @@ -165,14 +140,87 @@
    +
    +
    +
    +

    Pages spéciales

    +
    +
    + getData(['page']); + foreach($pages as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true) { + unset($pages[$page]); + } + } + $orphans = $this->getData(['page']); + foreach($orphans as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true || + $this->getdata(['page',$page, 'position']) !== 0) { + unset($orphans[$page]); + } + } + echo template::select('configHomePageId', helper::arrayCollumn($pages, 'title', 'SORT_ASC'), [ + 'label' => 'Accueil du site', + 'selected' =>$this->getData(['config', 'homePageId']), + 'help' => 'La première page que vos visiteurs verront.' + ]); ?> +
    +
    + 'Sélectionner'] , helper::arrayCollumn($this->getData(['page']), 'title', 'SORT_ASC') ) , [ + 'label' => 'Mentions légales', + 'selected' => $this->getData(['config', 'legalPageId']), + 'help' => 'Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.' + ]); ?> +
    +
    + 'Sélectionner'] , helper::arrayCollumn($this->getData(['page']), 'title', 'SORT_ASC') ) , [ + 'label' => 'Recherche dans le site', + 'selected' => $this->getData(['config', 'searchPageId']), + 'help' => 'Sélectionner la page "Recherche" ou une page contenant le module "Recherche" permet d\'activer un lien dans le pied de page. ' + ]); ?> +
    +
    +
    +
    + 'Aucune'],helper::arrayCollumn($orphans, 'title', 'SORT_ASC')), [ + 'label' => 'Accès interdit, erreur 403', + 'selected' =>$this->getData(['config', 'page403']), + 'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.' + ]); ?> +
    +
    + 'Aucune'],helper::arrayCollumn($orphans, 'title', 'SORT_ASC')), [ + 'label' => 'Page inexistante, erreur 404', + 'selected' =>$this->getData(['config', 'page404']), + 'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.' + ]); ?> +
    +
    + 'Aucune'],helper::arrayCollumn($orphans, 'title', 'SORT_ASC')), [ + 'label' => 'Site en maintenance', + 'selected' =>$this->getData(['config', 'page302']), + 'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.' + ]); ?> +
    +
    +
    +
    +
    +

    Réseaux sociaux

    @@ -247,8 +295,8 @@

    Référencement

    @@ -294,8 +342,8 @@

    Réseau

    @@ -332,8 +380,8 @@

    Messagerie SMTP

    @@ -403,8 +451,8 @@

    Sécurité de la connexion

    @@ -454,8 +502,8 @@

    Journalisation

    @@ -492,8 +540,8 @@

    Scripts

    @@ -529,57 +577,23 @@
    -

    Système +

    Versions des modules

    -
    - 'ZwiiCMS', - 'readonly' => true, - 'value' => common::ZWII_VERSION - ]); ?> -
    -
    - 'Blog', - 'readonly' => true, - 'value' => blog::BLOG_VERSION - ]); ?> -
    -
    - 'Form', - 'readonly' => true, - 'value' => form::FORM_VERSION - ]); ?> -
    -
    - 'Gallery', - 'readonly' => true, - 'value' => gallery::GALLERY_VERSION - ]); ?> -
    -
    - 'News', - 'readonly' => true, - 'value' => news::NEWS_VERSION - ]); ?> -
    -
    - 'Redirection', - 'readonly' => true, - 'value' => redirection::REDIRECTION_VERSION - ]); ?> +
    + + + + + +
    diff --git a/core/module/config/view/manage/manage.css b/core/module/config/view/manage/manage.css index 6faa3a6a..a7139f53 100755 --- a/core/module/config/view/manage/manage.css +++ b/core/module/config/view/manage/manage.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @import url("site/data/admin.css"); \ No newline at end of file diff --git a/core/module/config/view/manage/manage.php b/core/module/config/view/manage/manage.php old mode 100755 new mode 100644 index cd951922..bc5a8c2e --- a/core/module/config/view/manage/manage.php +++ b/core/module/config/view/manage/manage.php @@ -10,8 +10,7 @@
    'Valider', - 'ico' => 'check' + 'value' => 'Restaurer' ]); ?>
    diff --git a/core/module/config/view/restore/restore.php b/core/module/config/view/restore/restore.php deleted file mode 100755 index 8c4fc4ff..00000000 --- a/core/module/config/view/restore/restore.php +++ /dev/null @@ -1,85 +0,0 @@ - -
    -
    - 'buttonGrey', - 'href' => helper::baseUrl() . 'config', - 'ico' => 'left', - 'value' => 'Retour' - ]); ?> -
    -
    - 'Restaurer', - 'ico' => 'upload' - ]); ?> -
    -
    -
    -
    -
    -

    Restauration ou transfert d'un site

    -
    -
    - 'Sélectionnez une sauvegarde au format ZIP', - 'type' => 2, - 'help' => 'L\'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.' - ]); ?> -
    -
    -
    -
    - true, - 'help' => 'Les données des utilisateurs installés ne sont pas écrasés par la restauration quand l\'option est active.' - ]); ?> -
    -
    -
    -
    -
    -
    -
    -
    -

    Conversion des URL après transfert de site

    -
    -
    - getData(['core', 'baseUrl'])) ) { - $baseUrlValue = 'Pas de donnée dans la sauvegarde'; - $buttonClass = 'disabled'; - } elseif ($this->getData(['core', 'baseUrl']) === '') { - $baseUrlValue = '/'; - $buttonClass = (helper::baseUrl(true,false) !== $this->getData(['core', 'baseUrl']) ) ? '' : 'disabled'; - } else { - $baseUrlValue = $this->getData(['core', 'baseUrl']); - $buttonClass = (helper::baseUrl(true,false) !== $this->getData(['core', 'baseUrl']) ) ? '' : 'disabled'; - } - echo template::text('configRestoreBaseURLToConvert', [ - 'label' => 'Dossier d\'installation de l\'archive' , - 'value' => $baseUrlValue, - 'readonly' => true, - 'help' => 'Lors de la restauration d\'un backup d\'une version 9.2.10 ou supérieure, l\'URL de base est stockée dans la configuration sinon cette donnée est vide.' - ]); ?> -
    -
    - 'Dossier du site actuel', - 'value' => helper::baseUrl(true,false), - 'readonly' => true, - 'help' => 'Dossier du site installé.' - ]); ?> -
    -
    - helper::baseUrl() . 'config/updateBaseUrl', - 'class' => $buttonClass, - 'value' => 'convertir' - ]); ?> -
    -
    -
    -
    -
    - diff --git a/core/module/config/view/script/script.css b/core/module/config/view/script/script.css index 6faa3a6a..a7139f53 100755 --- a/core/module/config/view/script/script.css +++ b/core/module/config/view/script/script.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @import url("site/data/admin.css"); \ No newline at end of file diff --git a/core/module/config/view/script/script.php b/core/module/config/view/script/script.php old mode 100755 new mode 100644 diff --git a/core/module/install/install.php b/core/module/install/install.php index f359d338..2028877b 100755 --- a/core/module/install/install.php +++ b/core/module/install/install.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @@ -19,7 +19,7 @@ class install extends common { 'index' => self::GROUP_VISITOR, 'steps' => self::GROUP_ADMIN, 'update' => self::GROUP_ADMIN, - 'removeAll' => self::GROUP_ADMIN, + 'removeAll' => self::GROUP_ADMIN ]; @@ -41,17 +41,44 @@ class install extends common { else { // Soumission du formulaire if($this->isPost()) { - //$sent = $success = false; + $success = true; // Double vérification pour le mot de passe if($this->getInput('installPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('installConfirmPassword', helper::FILTER_STRING_SHORT, true)) { self::$inputNotices['installConfirmPassword'] = 'Incorrect'; + $success = false; } - // Crée l'utilisateur + // Utilisateur $userFirstname = $this->getInput('installFirstname', helper::FILTER_STRING_SHORT, true); $userLastname = $this->getInput('installLastname', helper::FILTER_STRING_SHORT, true); $userMail = $this->getInput('installMail', helper::FILTER_MAIL, true); $userId = $this->getInput('installId', helper::FILTER_ID, true); - // Bannière par défaut + // Création de l'utilisateur si les données sont complétées. + // success retour de l'enregistrement des données + $success = $this->setData([ + 'user', + $userId, + [ + 'firstname' => $userFirstname, + 'forgot' => 0, + 'group' => self::GROUP_ADMIN, + 'lastname' => $userLastname, + 'mail' => $userMail, + 'password' => $this->getInput('installPassword', helper::FILTER_PASSWORD, true) + ] + ]); + // Compte créé, envoi du mail et création des données du site + if ($success) { // Formulaire complété envoi du mail + // Envoie le mail + // Sent contient true si réussite sinon code erreur d'envoi en clair + $sent = $this->sendMail( + $userMail, + 'Installation de votre site', + 'Bonjour' . ' ' . $userFirstname . ' ' . $userLastname . ',

    ' . + 'Voici les détails de votre installation.

    ' . + 'URL du site : ' . helper::baseUrl(false) . '
    ' . + 'Identifiant du compte : ' . $this->getInput('installId') . '
    ', + null + ); // Créer les dossiers if (!is_dir(self::FILE_DIR.'source/banniere/')) { mkdir(self::FILE_DIR.'source/banniere/');} @@ -65,50 +92,25 @@ class install extends common { copy('core/module/install/ressource/file/source/favicon.ico',self::FILE_DIR.'source/favicon.ico'); copy('core/module/install/ressource/file/source/faviconDark.ico',self::FILE_DIR.'source/faviconDark.ico'); // Configure certaines données par défaut - if ($this->getInput('installDefaultData',helper::FILTER_BOOLEAN) === TRUE) { + if ($this->getInput('installDefaultData',helper::FILTER_BOOLEAN) === FALSE) { $this->initData('page','fr',true); $this->initData('module','fr',true); $this->setData(['module', 'blog', 'mon-premier-article', 'userId', $userId]); $this->setData(['module', 'blog', 'mon-deuxieme-article', 'userId', $userId]); $this->setData(['module', 'blog', 'mon-troisieme-article', 'userId', $userId]); } - $success = $this->setData([ - 'user', - $userId, - [ - 'firstname' => $userFirstname, - 'forgot' => 0, - 'group' => self::GROUP_ADMIN, - 'lastname' => $userLastname, - 'mail' => $userMail, - 'password' => $this->getInput('installPassword', helper::FILTER_PASSWORD, true), - 'pseudo' => $userFirstname, - 'signature'=> self::SIGNATURE_PSEUDO - ] + // Stocker le dossier d'installation + $this->setData(['core', 'baseUrl', helper::baseUrl(false,false) ]); + // Générer un fichier robots.txt + $this->createRobots(); + // Créer sitemap + $this->createSitemap(); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl(false), + 'notification' => ($sent === true ? 'Installation terminée' : $sent), + 'state' => ($sent === true ? true : null) ]); - if ($success === true) { // Formulaire complété envoi du mail - // Envoie le mail - $sent = $this->sendMail( - $userMail, - 'Installation de votre site', - 'Bonjour' . ' ' . $userFirstname . ' ' . $userLastname . ',

    ' . - 'Voici les détails de votre installation.

    ' . - 'URL du site : ' . helper::baseUrl(false) . '
    ' . - 'Identifiant du compte : ' . $this->getInput('installId') . '
    ', - null - ); - // Stocker le dossier d'installation - $this->setData(['core', 'baseUrl', helper::baseUrl(false,false) ]); - // Générer un fichier robots.txt - $this->createRobots(); - // Créer sitemap - $this->createSitemap(); - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl(false), - 'notification' => ($sent === true ? 'Installation terminée' : $sent), - 'state' => ($sent === true ? true : null) - ]); } } diff --git a/core/module/install/ressource/.htaccess b/core/module/install/ressource/.htaccess old mode 100755 new mode 100644 diff --git a/core/module/install/ressource/defaultdata.php b/core/module/install/ressource/defaultdata.php old mode 100755 new mode 100644 index 4a9cf666..624b50c5 --- a/core/module/install/ressource/defaultdata.php +++ b/core/module/install/ressource/defaultdata.php @@ -5,10 +5,14 @@ class init extends common { 'analyticsId' => '', 'autoBackup' => true, 'autoUpdate' => true, + 'autoUpdateHtaccess' => false, 'cookieConsent' => true, 'favicon' => 'favicon.ico', 'faviconDark' => 'faviconDark.ico', 'homePageId' => 'accueil', + 'page302' => 'erreur302', + 'page403' => 'erreur403', + 'page404' => 'erreur404', 'maintenance' => false, 'social' => [ 'facebookId' => 'facebook', @@ -22,22 +26,23 @@ class init extends common { 'timezone' => 'Europe/Paris', 'itemsperPage' => 10, 'legalPageId' => 'mentions-legales', + 'searchPageId' => 'recherche', 'metaDescription' => 'Zwii est un CMS sans base de données qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.', 'title' => 'Votre site en quelques clics !', - 'proxyUrl' => "", - 'proxyPort' => "", - 'proxyType' => "tcp://", + 'proxyUrl' => '', + 'proxyPort' => '', + 'proxyType' => 'tcp://', 'smtp' => [ 'enable' => false, ], - "connect" => [ - "timeout" => 600, - "attempt" => 3, + 'connect' => [ + 'timeout' => 600, + 'attempt' => 3, 'log' => false ] ], 'core' => [ - 'dataVersion' => 10000, + 'dataVersion' => 10300, 'lastBackup' => 0, 'lastClearTmp' => 0, 'lastAutoUpdate' => 0, @@ -109,10 +114,11 @@ class init extends common { 'displayCopyright' => false, 'displayLegal' => false, 'displaySearch' => false, + 'displayMemberBar' => false, 'template' => '3' ], 'header' => [ - 'backgroundColor' => 'rgba(255, 255, 255, 1)', + 'backgroundColor' => 'rgba(32, 59, 82, 1)', 'font' => 'Oswald', 'fontSize' => '2em', 'fontWeight' => 'normal', @@ -123,7 +129,7 @@ class init extends common { 'margin' => false, 'position' => 'site', 'textAlign' => 'center', - 'textColor' => 'rgba(0, 17, 157, 1)', + 'textColor' => 'rgba(255, 255, 255, 1)', 'textHide' => false, 'textTransform' => 'none', 'linkHomePage' => true, @@ -146,7 +152,8 @@ class init extends common { 'activeColorAuto' => true, 'activeColor' => 'rgba(255, 255, 255, 1)', 'activeTextColor' => 'rgba(255, 255, 255, 1)', - 'radius' => '0px' + 'radius' => '0px', + 'memberBar' => true ], 'site' => [ 'backgroundColor' => 'rgba(255, 255, 255, 1)', @@ -227,9 +234,9 @@ class init extends common { 'disable' => false, 'content' => '

    Vous pouvez assigner des parents à vos pages afin de mieux organiser votre menu !

    -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

    -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

    -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

    +

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ac dolor arcu. Cras dignissim finibus nisi, vulputate egestas mauris faucibus ultricies. Nullam ornare pretium eleifend. Donec placerat purus ut turpis dapibus condimentum. Fusce at leo pharetra nisl vestibulum fermentum. Maecenas feugiat justo at semper tincidunt. Integer in blandit lorem.

    +

    Ergo ego senator inimicus, si ita vultis, homini, amicus esse, sicut semper fui, rei publicae debeo. Quid? si ipsas inimicitias, depono rei publicae causa, quis me tandem iure reprehendet, praesertim cum ego omnium meorum consiliorum atque factorum exempla semper ex summorum hominum consiliis atque factis mihi censuerim petenda.

    +

    Principium autem unde latius se funditabat, emersit ex negotio tali. Chilo ex vicario et coniux eius Maxima nomine, questi apud Olybrium ea tempestate urbi praefectum, vitamque suam venenis petitam adseverantes inpetrarunt ut hi, quos suspectati sunt, ilico rapti conpingerentur in vincula, organarius Sericus et Asbolius palaestrita et aruspex Campensis.

    ', 'hideTitle' => false, 'breadCrumb' => true, @@ -255,8 +262,8 @@ class init extends common { 'disable' => false, 'content' => '

    Cette page n\'est visible que des membres de votre site !

    -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

    -

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam interdum, neque non vulputate hendrerit, arcu turpis dapibus nisl, id scelerisque metus lectus vitae nisi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec feugiat dolor et turpis finibus condimentum. Cras sit amet ligula sagittis justo.

    +

    Eius populus ab incunabulis primis ad usque pueritiae tempus extremum, quod annis circumcluditur fere trecentis, circummurana pertulit bella, deinde aetatem ingressus adultam post multiplices bellorum aerumnas Alpes transcendit et fretum, in iuvenem erectus et virum ex omni plaga quam orbis ambit inmensus, reportavit laureas et triumphos, iamque vergens in senium et nomine solo aliquotiens vincens ad tranquilliora vitae discessit.

    +

    Exsistit autem hoc loco quaedam quaestio subdifficilis, num quando amici novi, digni amicitia, veteribus sint anteponendi, ut equis vetulis teneros anteponere solemus. Indigna homine dubitatio! Non enim debent esse amicitiarum sicut aliarum rerum satietates; veterrima quaeque, ut ea vina, quae vetustatem ferunt, esse debet suavissima; verumque illud est, quod dicitur, multos modios salis simul edendos esse, ut amicitiae munus expletum sit.

    ', 'hideTitle' => false, 'breadCrumb' => true, @@ -291,7 +298,7 @@ class init extends common { 'moduleId' => '', 'parentPageId' => 'accueil', 'modulePosition' => 'bottom', - 'position' => 3, + 'position' => 2, 'group' => self::GROUP_VISITOR, 'targetBlank' => false, 'title' => 'Mise en page', @@ -339,7 +346,7 @@ class init extends common { 'moduleId' => 'blog', 'modulePosition' => 'bottom', 'parentPageId' => '', - 'position' => 4, + 'position' => 3, 'group' => self::GROUP_VISITOR, 'targetBlank' => false, 'title' => 'Blog', @@ -362,7 +369,7 @@ class init extends common { 'moduleId' => 'gallery', 'modulePosition' => 'bottom', 'parentPageId' => '', - 'position' => 5, + 'position' => 4, 'group' => self::GROUP_VISITOR, 'targetBlank' => false, 'title' => 'Galeries', @@ -386,7 +393,7 @@ class init extends common { 'moduleId' => 'redirection', 'modulePosition' => 'bottom', 'parentPageId' => '', - 'position' => 6, + 'position' => 5, 'group' => self::GROUP_VISITOR, 'targetBlank' => true, 'title' => 'Site de Zwii', @@ -409,7 +416,7 @@ class init extends common { 'moduleId' => 'form', 'modulePosition' => 'bottom', 'parentPageId' => '', - 'position' => 7, + 'position' => 6, 'group' => self::GROUP_VISITOR, 'targetBlank' => false, 'title' => 'Contact', @@ -537,7 +544,101 @@ class init extends common { 'hideMenuSide' => false, 'hideMenuHead' => false, 'hideMenuChildren' => false - ] + ], + 'erreur302' => [ + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + 'content' => '

    Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.

    + ', + 'hideTitle' => false, + 'breadCrumb' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => '', + 'modulePosition' => '', + 'parentPageId' => '', + 'position' => 0, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Maintenance en cours', + 'block' => '12', + 'barLeft' => '', + 'barRight' => '', + 'displayMenu' => 'none', + 'hideMenuSide' => true, + 'hideMenuHead' => true, + 'hideMenuChildren' => true + ], + 'erreur403' => [ + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + 'content' => '

    Vous n\'êtes pas autorisé à accéder à cette page...

    Personnalisez cette page à votre convenance sans qu\'elle apparaisse dans les menus.

    ', + 'hideTitle' => false, + 'breadCrumb' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => '', + 'modulePosition' => 'bottom', + 'parentPageId' => '', + 'position' => 0, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Erreur 403', + 'block' => '12', + 'barLeft' => '', + 'barRight' => '', + 'displayMenu' => 'none', + 'hideMenuSide' => false, + 'hideMenuChildren' => false + ], + 'erreur404' => [ + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + 'content' => '

    Oups ! La page demandée est introuvable...

    Personnalisez cette page à votre convenance sans qu\'elle apparaisse dans les menus.

    ', + 'hideTitle' => false, + 'breadCrumb' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => 'search', + 'modulePosition' => 'bottom', + 'parentPageId' => '', + 'position' => 0, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Erreur 404', + 'block' => '12', + 'barLeft' => '', + 'barRight' => '', + 'displayMenu' => 'none', + 'hideMenuSide' => false, + 'hideMenuChildren' =>false + ], + 'recherche' => [ + 'typeMenu' => 'icon', + 'iconUrl' => 'icones/loupe.png', + 'disable' => false, + 'content' => '

    Rechercher dans le site

    ', + 'hideTitle' => true, + 'breadCrumb' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => 'search', + 'modulePosition' => 'bottom', + 'parentPageId' => '', + 'position' => 7, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Recherche', + 'block' => '12', + 'barLeft' => '', + 'barRight' => '', + 'displayMenu' => 'none', + 'hideMenuSide' => false, + 'hideMenuChildren' => false + ], ], 'module' => [ 'blog' => [ @@ -551,7 +652,7 @@ class init extends common { 'userId' => '' ] ], - 'content' => '

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. In a placerat metus. Morbi luctus laoreet dolor et euismod. Phasellus eget eros ac eros pretium tincidunt. Sed maximus magna lectus, non vestibulum sapien pretium maximus. Donec convallis leo tortor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Cras convallis lacus eu risus gravida varius. Etiam mattis massa vitae eros placerat bibendum.

    Vivamus tempus magna augue, in bibendum quam blandit at. Morbi felis tortor, suscipit ut ipsum ut, volutpat consectetur orci. Nulla tincidunt quis ligula non viverra. Sed pretium dictum blandit. Donec fringilla, nunc at dictum pretium, arcu massa viverra leo, et porta turpis ipsum eget risus. Quisque quis maximus purus, in elementum arcu. Donec nisi orci, aliquam non luctus non, congue volutpat massa. Curabitur sed risus congue, porta arcu vel, tincidunt nisi. Duis tincidunt quam ut velit maximus ornare. Nullam sagittis, ante quis pharetra hendrerit, lorem massa dapibus mi, a hendrerit dolor odio nec augue. Nunc sem nisl, tincidunt vitae nunc et, viverra tristique diam. In eget dignissim lectus. Nullam volutpat lacus id ex dapibus viverra. Pellentesque ultricies lorem ut nunc elementum volutpat. Cras id ultrices justo.

    Phasellus nec erat leo. Praesent at sem nunc. Vestibulum quis condimentum turpis. Cras semper diam vitae enim fringilla, ut fringilla mauris efficitur. In nec porttitor urna. Nam eros leo, vehicula eget lobortis sed, gravida id mauris. Nulla bibendum nunc tortor, non bibendum justo consectetur vel. Phasellus nec risus diam. In commodo tellus nec nulla fringilla, nec feugiat nunc consectetur. Etiam non eros sodales, sodales lacus vel, finibus leo. Quisque hendrerit tristique congue. Phasellus nec augue vitae libero elementum facilisis. Mauris pretium ornare nisi, non scelerisque velit consectetur sit amet.

    ', + 'content' => '

    Et eodem impetu Domitianum praecipitem per scalas itidem funibus constrinxerunt, eosque coniunctos per ampla spatia civitatis acri raptavere discursu. iamque artuum et membrorum divulsa conpage superscandentes corpora mortuorum ad ultimam truncata deformitatem velut exsaturati mox abiecerunt in flumen.

    Ex his quidam aeternitati se commendari posse per statuas aestimantes eas ardenter adfectant quasi plus praemii de figmentis aereis sensu carentibus adepturi, quam ex conscientia honeste recteque factorum, easque auro curant inbracteari, quod Acilio Glabrioni delatum est primo, cum consiliis armisque regem superasset Antiochum. quam autem sit pulchrum exigua haec spernentem et minima ad ascensus verae gloriae tendere longos et arduos, ut memorat vates Ascraeus, Censorius Cato monstravit. qui interrogatus quam ob rem inter multos... statuam non haberet malo inquit ambigere bonos quam ob rem id non meruerim, quam quod est gravius cur inpetraverim mussitare.

    Latius iam disseminata licentia onerosus bonis omnibus Caesar nullum post haec adhibens modum orientis latera cuncta vexabat nec honoratis parcens nec urbium primatibus nec plebeiis.

    ', 'picture' => 'galerie/landscape/meadow.jpg', 'hidePicture' => false, 'pictureSize' => 20, @@ -563,7 +664,7 @@ class init extends common { 'mon-deuxieme-article' => [ 'closeComment' => false, 'comment' => [], - 'content' => '

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam lobortis eros pharetra metus rutrum pretium et sagittis mauris. Donec commodo venenatis sem nec suscipit. In tempor sollicitudin scelerisque. Etiam quis nibh eleifend, congue nisl quis, ultricies ipsum. Integer at est a eros vulputate pellentesque eu vitae tellus. Nullam suscipit quam nisl. Vivamus dui odio, luctus ac fringilla ultrices, eleifend vel sapien. Integer sem ex, lobortis eu mattis eu, condimentum non libero. Aliquam non porttitor elit, eu hendrerit neque. Praesent tortor urna, tincidunt sed dictum id, rutrum tempus sapien.

    Donec accumsan ante ac odio laoreet porttitor. Pellentesque et leo a leo scelerisque mattis id vel elit. Quisque egestas congue enim nec semper. Morbi mollis nibh sapien. Nunc quis fringilla lorem. Donec vel venenatis nunc. Donec lectus velit, tempor sit amet dui sed, consequat commodo enim. Nam porttitor neque semper, dapibus nunc bibendum, lobortis urna. Morbi ullamcorper molestie lectus a elementum. Curabitur eu cursus orci, sed tristique justo. In massa lacus, imperdiet eu elit quis, consectetur maximus magna. Integer suscipit varius ante vitae egestas. Morbi scelerisque fermentum ipsum, euismod faucibus mi tincidunt id. Sed at consectetur velit. Ut fermentum nunc nibh, at commodo felis lacinia nec.

    Nullam a justo quis lectus facilisis semper eget quis sem. Morbi suscipit erat sem, non fermentum nunc luctus vel. Proin venenatis quam ut arcu luctus efficitur. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam sollicitudin tristique nunc nec convallis. Maecenas id tortor semper, tempus nisl laoreet, cursus lacus. Aliquam sagittis est in leo congue, a pharetra felis aliquet. Nulla gravida lobortis sapien, quis viverra enim ullamcorper sed. Donec ultrices sem eu volutpat dapibus. Nam euismod, tellus eu congue mollis, massa nisi finibus odio, vitae porta arcu urna ac lorem. Sed faucibus dignissim pretium. Pellentesque eget ante tellus. Pellentesque a elementum odio, sit amet vulputate diam. Lorem ipsum dolor sit amet, consectetur adipiscing elit. In hendrerit consequat dolor, malesuada pellentesque tellus molestie non. Aenean quis purus a lectus pellentesque laoreet.

    ', + 'content' => '

    Et prima post Osdroenam quam, ut dictum est, ab hac descriptione discrevimus, Commagena, nunc Euphratensis, clementer adsurgit, Hierapoli, vetere Nino et Samosata civitatibus amplis inlustris.

    Ob haec et huius modi multa, quae cernebantur in paucis, omnibus timeri sunt coepta. et ne tot malis dissimulatis paulatimque serpentibus acervi crescerent aerumnarum, nobilitatis decreto legati mittuntur: Praetextatus ex urbi praefecto et ex vicario Venustus et ex consulari Minervius oraturi, ne delictis supplicia sint grandiora, neve senator quisquam inusitato et inlicito more tormentis exponeretur.

    Sed ut tum ad senem senex de senectute, sic hoc libro ad amicum amicissimus scripsi de amicitia. Tum est Cato locutus, quo erat nemo fere senior temporibus illis, nemo prudentior; nunc Laelius et sapiens (sic enim est habitus) et amicitiae gloria excellens de amicitia loquetur. Tu velim a me animum parumper avertas, Laelium loqui ipsum putes. C. Fannius et Q. Mucius ad socerum veniunt post mortem Africani; ab his sermo oritur, respondet Laelius, cuius tota disputatio est de amicitia, quam legens te ipse cognosces.

    ', 'picture' => 'galerie/landscape/desert.jpg', 'hidePicture' => false, 'pictureSize' => 40, @@ -575,7 +676,7 @@ class init extends common { 'mon-troisieme-article' => [ 'closeComment' => true, 'comment' => [], - 'content' => '

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut ut tempus nibh. Cras eget iaculis justo, ac laoreet lacus. Nunc tellus nulla, auctor id hendrerit eu, pellentesque in sapien. In hac habitasse platea dictumst. Aliquam leo urna, hendrerit id nunc eget, finibus maximus dolor. Sed rutrum sapien consectetur, tincidunt nulla at, blandit quam. Duis ex enim, vehicula vel nisi vitae, lobortis volutpat nisl. Vivamus enim libero, euismod nec risus vel, interdum placerat elit. In cursus sapien condimentum dui imperdiet, sed lobortis ante consectetur. Maecenas hendrerit eget felis non consequat.

    Nullam nec risus non velit efficitur tempus eget tincidunt mauris. Etiam venenatis leo id justo sagittis, commodo dignissim sapien tristique. Vivamus finibus augue malesuada sapien gravida rutrum. Integer mattis lectus ac pulvinar scelerisque. Integer suscipit feugiat metus, ac molestie odio suscipit eget. Fusce at elit in tellus venenatis finibus id sit amet magna. Integer sodales luctus neque blandit posuere. Cras pellentesque dictum lorem eget vestibulum. Quisque vitae metus non nisi efficitur rhoncus ut vitae ipsum. Donec accumsan massa at est faucibus lacinia. Quisque imperdiet luctus neque eu vestibulum. Phasellus pellentesque felis ligula, id imperdiet elit ultrices eu.

    ', + 'content' => '

    Rogatus ad ultimum admissusque in consistorium ambage nulla praegressa inconsiderate et leviter proficiscere inquit ut praeceptum est, Caesar sciens quod si cessaveris, et tuas et palatii tui auferri iubebo prope diem annonas. hocque solo contumaciter dicto subiratus abscessit nec in conspectum eius postea venit saepius arcessitus.

    Proinde concepta rabie saeviore, quam desperatio incendebat et fames, amplificatis viribus ardore incohibili in excidium urbium matris Seleuciae efferebantur, quam comes tuebatur Castricius tresque legiones bellicis sudoribus induratae.

    Inter has ruinarum varietates a Nisibi quam tuebatur accitus Vrsicinus, cui nos obsecuturos iunxerat imperiale praeceptum, dispicere litis exitialis certamina cogebatur abnuens et reclamans, adulatorum oblatrantibus turmis, bellicosus sane milesque semper et militum ductor sed forensibus iurgiis longe discretus, qui metu sui discriminis anxius cum accusatores quaesitoresque subditivos sibi consociatos ex isdem foveis cerneret emergentes, quae clam palamve agitabantur, occultis Constantium litteris edocebat inplorans subsidia, quorum metu tumor notissimus Caesaris exhalaret.

    ', 'picture' => 'galerie/landscape/iceberg.jpg', 'hidePicture' => false, 'pictureSize' => 100, @@ -632,7 +733,7 @@ class init extends common { 'contact' => [ 'config' => [ 'button' => '', - 'capcha' => true, + 'captcha' => true, 'group' => self::GROUP_ADMIN, 'pageId' => '', 'subject' => '' @@ -665,3 +766,4 @@ class init extends common { ] ]; } + diff --git a/core/module/install/view/index/index.css b/core/module/install/view/index/index.css index ba396f2e..d7c543b0 100755 --- a/core/module/install/view/index/index.css +++ b/core/module/install/view/index/index.css @@ -1,17 +1 @@ -/** - * This file is part of Zwii. - * - * For full copyright and license information, please see the LICENSE - * file that was distributed with this source code. - * - * @author Rémi Jean - * @copyright Copyright (C) 2008-2018, Rémi Jean - * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez - * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ - */ - - - -@import url("site/data/admin.css"); \ No newline at end of file +/* Vide */ \ No newline at end of file diff --git a/core/module/install/view/index/index.js.php b/core/module/install/view/index/index.js.php old mode 100755 new mode 100644 index 7a7d83c5..eef087dd --- a/core/module/install/view/index/index.js.php +++ b/core/module/install/view/index/index.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/core/module/install/view/index/index.php b/core/module/install/view/index/index.php old mode 100755 new mode 100644 index 74677c5a..9c60b0eb --- a/core/module/install/view/index/index.php +++ b/core/module/install/view/index/index.php @@ -20,7 +20,7 @@
    'off', - 'label' => 'Adresse mail' + 'label' => 'Adresse mail' ]); ?>
    @@ -38,10 +38,10 @@
    - true + false ]); - ?> + ?>
    diff --git a/core/module/install/view/update/update.css b/core/module/install/view/update/update.css index b7b07fc9..10b92b20 100755 --- a/core/module/install/view/update/update.css +++ b/core/module/install/view/update/update.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/core/module/install/view/update/update.js.php b/core/module/install/view/update/update.js.php old mode 100755 new mode 100644 diff --git a/core/module/install/view/update/update.php b/core/module/install/view/update/update.php old mode 100755 new mode 100644 diff --git a/core/module/maintenance/maintenance.php b/core/module/maintenance/maintenance.php old mode 100755 new mode 100644 index b91765c5..9d1dfb88 --- a/core/module/maintenance/maintenance.php +++ b/core/module/maintenance/maintenance.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class maintenance extends common { @@ -22,12 +22,23 @@ class maintenance extends common { * Maintenance */ public function index() { - // Valeurs en sortie - $this->addOutput([ - 'display' => self::DISPLAY_LAYOUT_LIGHT, - 'title' => 'Maintenance en cours...', - 'view' => 'index' - ]); + // Page perso définie et existante + if ($this->getData(['config','page302']) !== 'none' + AND $this->getData(['page',$this->getData(['config','page302'])]) ) { + $this->addOutput([ + 'display' => self::DISPLAY_LAYOUT_LIGHT, + 'title' => $this->getData(['page',$this->getData(['config','page302']),'title']), + 'content' => $this->getdata(['page',$this->getData(['config','page302']),'content']), + 'view' => 'index' + ]); + } else { + // Valeurs en sortie + $this->addOutput([ + 'display' => self::DISPLAY_LAYOUT_LIGHT, + 'title' => 'Maintenance en cours...', + 'view' => 'index' + ]); + } } } \ No newline at end of file diff --git a/core/module/maintenance/view/index/index.php b/core/module/maintenance/view/index/index.php old mode 100755 new mode 100644 index 52b7ac08..de412318 --- a/core/module/maintenance/view/index/index.php +++ b/core/module/maintenance/view/index/index.php @@ -2,7 +2,7 @@
    'Administration', + 'value' => 'Connexion', 'href' => helper::baseUrl() . 'user/login', 'ico' => 'lock' ]); ?> diff --git a/core/module/page/page.php b/core/module/page/page.php old mode 100755 new mode 100644 index 0afd8acd..733d9d54 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -11,7 +11,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class page extends common { @@ -19,7 +19,8 @@ class page extends common { public static $actions = [ 'add' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, - 'edit' => self::GROUP_MODERATOR + 'edit' => self::GROUP_MODERATOR, + 'duplicate' => self::GROUP_MODERATOR ]; public static $pagesNoParentId = [ '' => 'Aucune' @@ -34,12 +35,13 @@ class page extends common { 'blog' => 'Blog', 'form' => 'Formulaire', 'gallery' => 'Galerie', - 'redirection' => 'Redirection' + 'redirection' => 'Redirection', + 'search' => 'Recherche' ]; public static $typeMenu = [ 'text' => 'Texte', 'icon' => 'Icône', - 'icontitle' => 'Icône et bulle' + 'icontitle' => 'Icône avec bulle de texte' ]; // Position du module public static $modulePosition = [ @@ -64,6 +66,62 @@ class page extends common { 'children' => 'Le sous-menu de la page parente' ]; + /** + * Duplication + */ + public function duplicate() { + // Adresse sans le token + $url = explode('&',$this->getUrl(2)); + // La page n'existe pas + if($this->getData(['page', $url[0]]) === null) { + // Valeurs en sortie + $this->addOutput([ + 'access' => false + ]); + } // Jeton incorrect + elseif(!isset($_GET['csrf'])) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'page/edit/' . $url[0], + 'notification' => 'Jeton invalide' + ]); + } + elseif ($_GET['csrf'] !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'page/edit/' . $url[0], + 'notification' => 'Suppression non autorisée' + ]); + } + // Duplication de la page + $pageTitle = $this->getData(['page',$url[0],'title']); + $pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page'])); + $data = $this->getData([ + 'page', + $url[0] + ]); + // Ecriture + $this->setData (['page',$pageId,$data]); + $notification = 'La page a été dupliquée'; + // Duplication du module présent + if ($this->getData(['page',$url[0],'moduleId'])) { + $data = $this->getData([ + 'module', + $url[0] + ]); + // Ecriture + $this->setData (['module',$pageId,$data]); + $notification = 'La page et son module ont été dupliqués'; + } + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'page/edit/' . $pageId, + 'notification' => $notification, + 'state' => true + ]); + } + + /** * Création */ @@ -120,13 +178,67 @@ class page extends common { $this->addOutput([ 'access' => false ]); + } // Jeton incorrect + elseif(!isset($_GET['csrf'])) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'page/edit/' . $url[0], + 'notification' => 'Jeton invalide' + ]); + } + elseif ($_GET['csrf'] !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'page/edit/' . $url[0], + 'notification' => 'Suppression non autorisée' + ]); } // Impossible de supprimer la page d'accueil elseif($url[0] === $this->getData(['config', 'homePageId'])) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'page/edit/' . $url[0], - 'notification' => 'Impossible de supprimer la page d\'accueil' + 'redirect' => helper::baseUrl() . 'config', + 'notification' => 'Désactiver la page dans la configuration avant de la supprimer' + ]); + } + // Impossible de supprimer la page de recherche affectée + elseif($url[0] === $this->getData(['config', 'searchPageId'])) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'config', + 'notification' => 'Désactiver la page dans la configuration avant de la supprimer' + ]); + } + // Impossible de supprimer la page des mentions légales affectée + elseif($url[0] === $this->getData(['config', 'legalPageId'])) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'config', + 'notification' => 'Désactiver la page dans la configuration avant de la supprimer' + ]); + } + // Impossible de supprimer la page des mentions légales affectée + elseif($url[0] === $this->getData(['config', 'page404'])) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'config', + 'notification' => 'Désactiver la page dans la configuration avant de la supprimer' + ]); + } + // Impossible de supprimer la page des mentions légales affectée + elseif($url[0] === $this->getData(['config', 'page403'])) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'config', + 'notification' => 'Désactiver la page dans la configuration avant de la supprimer' + ]); + } + // Impossible de supprimer la page des mentions légales affectée + elseif($url[0] === $this->getData(['config', 'page302'])) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'config', + 'notification' => 'Désactiver la page dans la configuration avant de la supprimer' ]); } // Jeton incorrect @@ -184,7 +296,12 @@ class page extends common { else { // Soumission du formulaire if($this->isPost()) { - $pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true); + // Génére l'ID si le titre de la page a changé + if ( $this->getInput('pageEditTitle') !== $this->getData(['page',$this->getUrl(2),'title']) ) { + $pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true); + } else { + $pageId = $this->getUrl(2); + } // un dossier existe du même nom (erreur en cas de redirection) if (file_exists($pageId)) { $pageId = uniqid($pageId); @@ -215,6 +332,22 @@ class page extends common { if($pageId !== $this->getUrl(2)) { $this->deleteData(['page', $this->getUrl(2)]); } + // Traitement des pages spéciales affectées dans la config : + if ($this->getUrl(2) === $this->getData(['config', 'legalPageId']) ) { + $this->setData(['config','legalPageId', $pageId]); + } + if ($this->getUrl(2) === $this->getData(['config', 'searchPageId']) ) { + $this->setData(['config','searchPageId', $pageId]); + } + if ($this->getUrl(2) === $this->getData(['config', 'page404']) ) { + $this->setData(['config','page404', $pageId]); + } + if ($this->getUrl(2) === $this->getData(['config', 'page403']) ) { + $this->setData(['config','page403', $pageId]); + } + if ($this->getUrl(2) === $this->getData(['config', 'page302']) ) { + $this->setData(['config','page302', $pageId]); + } // 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()); diff --git a/core/module/page/view/edit/edit.css b/core/module/page/view/edit/edit.css index cb67dad9..8785259c 100755 --- a/core/module/page/view/edit/edit.css +++ b/core/module/page/view/edit/edit.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @@ -20,21 +20,21 @@ display: none; } -#info .zwiico-minus, -#layout .zwiico-minus, -#location .zwiico-minus { +#info .zwiico-minus-circled, +#layout .zwiico-minus-circled, +#location .zwiico-minus-circled { display: inline; } -.zwiico-minus, -#info .zwiico-plus, -#layout .zwiico-plus, -#location .zwiico-plus { +.zwiico-minus-circled, +#info .zwiico-plus-circled, +#layout .zwiico-plus-circled, +#location .zwiico-plus-circled { display: none; } -.zwiico-minus, -.zwiico-plus { +.zwiico-minus-circled, +.zwiico-plus-circled { cursor: pointer; } \ No newline at end of file diff --git a/core/module/page/view/edit/edit.js.php b/core/module/page/view/edit/edit.js.php old mode 100755 new mode 100644 index 2b9d0ab3..bc1da193 --- a/core/module/page/view/edit/edit.js.php +++ b/core/module/page/view/edit/edit.js.php @@ -9,7 +9,7 @@ * @authorFrédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** @@ -59,8 +59,8 @@ $( document ).ready(function() { var i = ["info", "layout", "setup", "location", "advanced", "ceo" ]; $.each(i,function(e) { if (getCookie(i[e]) === "true") { - $("#" + i[e]).find(".zwiico-plus").hide(); - $("#" + i[e]).find(".zwiico-minus").show(); + $("#" + i[e]).find(".zwiico-plus-circled").hide(); + $("#" + i[e]).find(".zwiico-minus-circled").show(); $("#" + i[e]).find(".blockContainer").show(); } }); @@ -73,8 +73,8 @@ $( document ).ready(function() { */ $("div .block").click(function(e) { - $(this).find(".zwiico-plus").toggle(); - $(this).find(".zwiico-minus").toggle(); + $(this).find(".zwiico-plus-circled").toggle(); + $(this).find(".zwiico-minus-circled").toggle(); $(this).find(".blockContainer").slideToggle(); /* * Sauvegarder la position des blocs diff --git a/core/module/page/view/edit/edit.php b/core/module/page/view/edit/edit.php old mode 100755 new mode 100644 index 27c277ea..cac97d04 --- a/core/module/page/view/edit/edit.php +++ b/core/module/page/view/edit/edit.php @@ -5,7 +5,7 @@ echo template::formOpen('pageEditForm');
    getUrl(2); ?> - getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code')$href = helper::baseUrl(); ?> + getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code')$href = helper::baseUrl(); ?> 'buttonGrey', 'href' => $href, @@ -13,7 +13,14 @@ echo template::formOpen('pageEditForm'); 'value' => 'Retour' ]); ?>
    -
    +
    + helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'], + 'value' => 'Dupliquer', + 'ico' => 'clone' + ]); ?> +
    +
    'buttonRed', 'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'], @@ -63,13 +70,13 @@ echo template::formOpen('pageEditForm');
    'La page peut être représentée par une image de petite taille.', - 'label' => 'Aspect', + 'label' => 'Aspect du lien', 'selected' => $this->getData(['page', $this->getUrl(2), 'typeMenu']) ]); ?>
    'Sélectionnez une image ou une icône de petite dimension', 'label' => 'Icône', 'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl']) ]); ?> @@ -77,7 +84,7 @@ echo template::formOpen('pageEditForm');
    'En position libre ajoutez le module en plaçant [MODULE] à l\'endroit voulu dans votre page.', - 'label' => 'Position du module dans la page', + 'label' => 'Position du module', 'selected' => $this->getData(['page', $this->getUrl(2), 'modulePosition']) ]); ?>
    @@ -99,8 +106,8 @@ echo template::formOpen('pageEditForm');

    Mise en page

    @@ -156,8 +163,8 @@ echo template::formOpen('pageEditForm');

    Emplacement dans le menu

    @@ -216,11 +223,11 @@ echo template::formOpen('pageEditForm');
    -

    Options avancées d'emplacement +

    Options d'emplacement avancées

    @@ -248,8 +255,8 @@ echo template::formOpen('pageEditForm');

    Permission et référencement

    diff --git a/core/module/search/search.php b/core/module/search/search.php deleted file mode 100755 index 8775d93d..00000000 --- a/core/module/search/search.php +++ /dev/null @@ -1,211 +0,0 @@ - - * @copyright Copyright (C) 2008-2018, Rémi Jean - * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ - * - * Module search - * Produit par la communauté à partit d'un développement de Sylvain Lelièvre - */ - -// Module de recherche d'un mot ou d'une phrase clef - -class search extends common { - - public static $actions = [ - 'index' => self::GROUP_VISITOR - ]; - - - public function index() { - if($this->isPost()) { - //Initialisations variables - $success = true; - $result = ''; - $notification = ''; - $total=''; - $this->setData(['search',$total,0]); - - // Récupération du mot clef passé par le formulaire de ...view/index.php, avec caractères accentués - $motclef=$this->getInput('searchMotphraseclef'); - - // Récupération de l'état de l'option mot entier passé par le même formulaire - $motentier=$this->getInput('searchMotentier', helper::FILTER_BOOLEAN); - - //Pour affichage de l'entête du résultat - $result = '

    Recherche avec le mot clef : '.$motclef.'

    '; - if ($motclef !== "" && strlen($motclef) > 2) { - foreach($this->getHierarchy(null,false,null) as $parentId => $childIds) { - if ($this->getData(['page', $parentId, 'disable']) === false && - $this->getUser('group') >= $this->getData(['page', $parentId, 'group']) && - $this->getData(['page', $parentId, 'block']) !== 'bar') { - $url = $parentId; - $titre = $this->getData(['page', $parentId, 'title']); - $contenu = $this->getData(['page', $parentId, 'content']); - // Pages sauf pages filles et articles de blog - $result .= $this->occurrence($url, $titre, $contenu, $motclef, $motentier); - } - - foreach($childIds as $childId) { - // Sous page - if ($this->getData(['page', $childId, 'disable']) === false && - $this->getUser('group') >= $this->getData(['page', $parentId, 'group']) && - $this->getData(['page', $parentId, 'block']) !== 'bar') { - $url = $childId; - $titre = $this->getData(['page', $childId, 'title']); - $contenu = $this->getData(['page', $childId, 'content']); - //Pages filles - $result .= $this->occurrence($url, $titre, $contenu, $motclef, $motentier); - - } - - // Articles d'une sous-page blog - if ($this->getData(['page', $childId, 'moduleId']) === 'blog') - { - foreach($this->getData(['module',$childId]) as $articleId => $article) { - if($this->getData(['module',$childId,$articleId,'state']) === true) { - $url = $childId . '/' . $articleId; - $titre = $article['title']; - $contenu = $article['content']; - // Articles de sous-page de type blog - $result .= $this->occurrence($url, $titre, $contenu, $motclef, $motentier); - - } - } - } - } - - // Articles d'un blog - - if ($this->getData(['page', $parentId, 'moduleId']) === 'blog' ) { - foreach($this->getData(['module',$parentId]) as $articleId => $article) { - if($this->getData(['module',$parentId,$articleId,'state']) === true) - { - $url = $parentId. '/' . $articleId; - $titre = $article['title']; - $contenu = $article['content']; - // Articles de Blog - $result .= $this->occurrence($url, $titre, $contenu, $motclef, $motentier); - - } - } - } - } - // Message de synthèse de la recherche - if ($this->getData(['search',$total])===0) { - $notification = 'Mot clef non trouvé. Avez-vous pensé aux accents ?'; - $result .='Mot clef non trouvé. Avez-vous pensé aux accents ?'; - $success = false; - } else { - $result .= 'Nombre d\'occurrences : '.$this->getData(['search',$total]); - $notification = 'Nombre d\'occurrences : '.$this->getData(['search',$total]); - $success = true; - } - } else { - $notification = 'Trop court ! Minimum 3 caractères'; - $result = 'Trop court ! Minimum 3 caractères'; - $success = false; - } - - $_POST['result'] = $result; - $_POST['occurence'] = $total; - // Valeurs en sortie, affichage du résultat - $this->addOutput([ - 'title' => '', - 'view' => 'result', - 'notification' => $notification, - 'state' => $success - ]); - } else { - // Valeurs en sortie, affichage du formulaire - $this->addOutput([ - 'title' => '', - 'view' => 'index' - ]); - } - } - - - // Fonction de recherche des occurrences dans $contenu - // Renvoie le résultat sous forme de chaîne - private function occurrence($url, $titre, $contenu, $motclef, $motentier) - { - // Nettoyage de $contenu : on enlève tout ce qui est inclus entre < et > - $contenu = $this->nettoyer_html($contenu); - // Accentuation - $contenu = html_entity_decode($contenu); - // Initialisations - $nboccu = 0; - $dejavu = ''; - $total = ''; - $resultat= ''; - // Recherche des occurrences - do { - $occu = stristr($contenu,$motclef); - if ($occu !== false) { - if ($motentier === true) { - $controle_entier=$this->test_motentier($contenu,$motclef); - } else { - $controle_entier=true; - } - if ($controle_entier) { - if ($titre !== $dejavu) { - $resultat = '


    Mot clef trouvé dans la page : '.$titre.'

    '; - } - $dejavu = $titre; - $nboccu++; - $resultat .= '

    '.$nboccu.' - "...'.substr($occu,0,200).'..."

    '; - } - // Pour recherche d'une autre occurrence dans le même contenu - $contenu = substr($occu,10); - } - } - while($occu != ''); - $this->setData(['search',$total,$this->getData(['search',$total]) + $nboccu]); - - - return $resultat; - } - - // Déclaration de la fonction nettoyer(string $contenu) : string - // Supprime de $contenu les caractères placés entre < et >, donc les balises html comme


    etc... - // Retourne $contenu nettoyée, le résultat est sensiblement différent de celui obtenu avec la fonction strip_tags() - private function nettoyer_html($contenu) - { - do { - $pos1=strpos($contenu,chr(60)); - if($pos1!==false) { - $pos2=strpos($contenu,chr(62)); - if($pos2!==false) $contenu=substr_replace($contenu," ",$pos1,($pos2 - $pos1 + 1)); - } - } - while($pos1!==false); - return $contenu; - } - - // Déclaration de la fonction test_motentier(string $chaine, string $clef) : bool - // Vérifie si dans la string $chaine, $clef est un mot entier - // $clef ne doit pas être précédé ni suivi d'une lettre maj ou min - private function test_motentier($chaine, $clef) - { - $resultat=true; - $pos1=stripos($chaine,$clef); - $avant=ord(substr($chaine,$pos1-1, 1)); - $apres=ord(substr($chaine,$pos1+strlen($clef),1)); - // Traitement pour le caractère qui précède et celui qui suit - if (($avant>=65 && $avant<=90) || - ($avant>=97 && $avant<=122) || - ($apres>=65 && $apres<=90) || - ($apres>=97 && $apres<=122) ) { - $resultat=false; - } - return $resultat; - } -} diff --git a/core/module/search/view/index/index.php b/core/module/search/view/index/index.php deleted file mode 100755 index e5243bde..00000000 --- a/core/module/search/view/index/index.php +++ /dev/null @@ -1,29 +0,0 @@ - -

    -
    -
    -

    Rechercher

    -
    -
    - 'Mot ou phrase', - 'help' => 'Tout ou partie d\'un mot ou d\'une phrase, sans guillemets. N\'oubliez pas les accents.' - ]); ?> -
    -
    - 'Ok' - ]); ?> -
    -
    -
    -
    - false - ]); ?> -
    -
    -
    -
    -
    - diff --git a/core/module/search/view/result/result.php b/core/module/search/view/result/result.php deleted file mode 100755 index 072d3607..00000000 --- a/core/module/search/view/result/result.php +++ /dev/null @@ -1,38 +0,0 @@ - -
    -
    -
    -

    Recherche

    -
    -
    - 'Mot ou phrase', - 'value' => isset($_POST['searchMotphraseclef']) === true ? $_POST['searchMotphraseclef'] : '', - 'help' => 'Tout ou partie d\'un mot ou d\'une phrase, sans guillemets. N\'oubliez pas les accents.' - ]); ?> -
    -
    - 'Ok' - ]); ?> -
    -
    -
    - isset($_POST['searchMotentier']) === true ? $_POST['searchMotentier'] : '' - ]); ?> -
    -
    -
    -
    -
    -

    Résultat(s)

    - -
    -
    -
    - diff --git a/core/module/sitemap/sitemap.php b/core/module/sitemap/sitemap.php old mode 100755 new mode 100644 index ed5ba2ae..0d14ded4 --- a/core/module/sitemap/sitemap.php +++ b/core/module/sitemap/sitemap.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class sitemap extends common { diff --git a/core/module/sitemap/view/index/index.php b/core/module/sitemap/view/index/index.php old mode 100755 new mode 100644 diff --git a/core/module/theme/theme.php b/core/module/theme/theme.php old mode 100755 new mode 100644 index 498960e5..a226d3f9 --- a/core/module/theme/theme.php +++ b/core/module/theme/theme.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ * @copyright : Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez */ @@ -669,7 +669,7 @@ class theme extends common { unlink (self::TEMP_DIR . $zipFilename); // Valeurs en sortie $this->addOutput([ - 'notification' => 'Archive '.$zipFilename.' sauvegardée dans fichiers', + 'notification' => 'Archive '.$zipFilename.' sauvegardée avec succès', 'redirect' => helper::baseUrl() . 'theme/manage', 'state' => true ]); diff --git a/core/module/theme/view/admin/admin.css b/core/module/theme/view/admin/admin.css index a7f42f05..c1a66e94 100755 --- a/core/module/theme/view/admin/admin.css +++ b/core/module/theme/view/admin/admin.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /* Thème administration */ diff --git a/core/module/theme/view/admin/admin.js.php b/core/module/theme/view/admin/admin.js.php old mode 100755 new mode 100644 index a745a90f..c23e98ed --- a/core/module/theme/view/admin/admin.js.php +++ b/core/module/theme/view/admin/admin.js.php @@ -7,7 +7,7 @@ * @author Fred Tempez * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/core/module/theme/view/admin/admin.php b/core/module/theme/view/admin/admin.php old mode 100755 new mode 100644 diff --git a/core/module/theme/view/advanced/advanced.css b/core/module/theme/view/advanced/advanced.css index bfeedf7c..654bd6be 100755 --- a/core/module/theme/view/advanced/advanced.css +++ b/core/module/theme/view/advanced/advanced.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /* Thème administration */ diff --git a/core/module/theme/view/advanced/advanced.js.php b/core/module/theme/view/advanced/advanced.js.php old mode 100755 new mode 100644 index 212f172e..464d93bb --- a/core/module/theme/view/advanced/advanced.js.php +++ b/core/module/theme/view/advanced/advanced.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/core/module/theme/view/advanced/advanced.php b/core/module/theme/view/advanced/advanced.php old mode 100755 new mode 100644 diff --git a/core/module/theme/view/body/body.css b/core/module/theme/view/body/body.css index 5ad98fd8..752c880a 100755 --- a/core/module/theme/view/body/body.css +++ b/core/module/theme/view/body/body.css @@ -8,7 +8,7 @@ * @license GNU General Public License, version 3 * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @import url("site/data/admin.css"); diff --git a/core/module/theme/view/body/body.js.php b/core/module/theme/view/body/body.js.php old mode 100755 new mode 100644 index 9950b80f..4b46e333 --- a/core/module/theme/view/body/body.js.php +++ b/core/module/theme/view/body/body.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/core/module/theme/view/body/body.php b/core/module/theme/view/body/body.php old mode 100755 new mode 100644 index 04746e48..b65db690 --- a/core/module/theme/view/body/body.php +++ b/core/module/theme/view/body/body.php @@ -41,21 +41,26 @@ 'help' => 'Le curseur horizontal règle le niveau de transparence.', 'label' => 'Icône haut de page', 'value' => $this->getData(['theme', 'body', 'toTopColor']) - ]); ?> + ]); ?>
    -
    +

    Image

    - getData(['theme', 'body', 'image'])) ? $this->getData(['theme', 'body', 'image']) : ""; - echo template::file('themeBodyImage', [ - 'label' => 'Fond', - 'type' => 1, - 'value' => $imageFile - ]); ?> +
    +
    + getData(['theme', 'body', 'image'])) ? $this->getData(['theme', 'body', 'image']) : ""; + echo template::file('themeBodyImage', [ + 'help' => 'Sélectionner une image', + 'label' => 'Fond', + 'type' => 1, + 'value' => $imageFile + ]); ?> +
    +
    diff --git a/core/module/theme/view/footer/footer.css b/core/module/theme/view/footer/footer.css index bfeedf7c..654bd6be 100755 --- a/core/module/theme/view/footer/footer.css +++ b/core/module/theme/view/footer/footer.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /* Thème administration */ diff --git a/core/module/theme/view/footer/footer.js.php b/core/module/theme/view/footer/footer.js.php old mode 100755 new mode 100644 index 16a68700..9b5e9c5c --- a/core/module/theme/view/footer/footer.js.php +++ b/core/module/theme/view/footer/footer.js.php @@ -9,7 +9,7 @@ * @license GNU General Public License, version 3 * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/core/module/theme/view/footer/footer.php b/core/module/theme/view/footer/footer.php old mode 100755 new mode 100644 index b09fee98..fcccdac8 --- a/core/module/theme/view/footer/footer.php +++ b/core/module/theme/view/footer/footer.php @@ -13,11 +13,11 @@
    -
    +

    Couleurs

    -
    +
    'colorPicker', 'label' => 'Fond', @@ -25,7 +25,9 @@ 'help' => 'Quand le pied de page est dans le site, l\'arrière plan transparent montre le fond de la page. Quand le pied de page est hors du site, l\'arrière plan transparent montre le fond du site.' ]); ?>
    -
    +
    +
    +
    'colorPicker', 'label' => 'Texte', @@ -35,52 +37,59 @@
    -
    +
    -

    Informations

    +

    Paramètres du bloc Informations

    -
    - $this->getData(['theme', 'footer','displayCopyright']) - ]); ?> -
    -
    - $this->getData(['theme', 'footer','displayVersion']) - ]); ?> -
    -
    - (bool) empty($this->getData(['config', 'legalPageId'])) ? false : $this->getData(['theme', 'footer', 'displayLegal']), - 'disabled' => (bool) empty($this->getData(['config', 'legalPageId'])) ? true : false, - 'help' => (bool) empty($this->getData(['config', 'legalPageId'])) ? 'Pour activer cette option, sélectionnez la page contenant les mentions légales dans la gestion du site' : '' - ]); ?> -
    -
    - $this->getData(['theme', 'footer', 'displayMemberBar']), - 'help' => 'Affiche les icônes de gestion du compte et de déconnexion. Uniquement pour les membres simples une fois connectés.' + $this->getData(['theme', 'footer','displayCopyright']), + 'help' => 'Affiche cette mention devant ZwiiCMS' ]); ?> -
    -
    - $this->getData(['theme', 'footer', 'displaySiteMap']), - 'help' => 'Un plan du site permet un meilleur référencement.' - ]); ?> -
    -
    - $this->getData(['theme', 'footer', 'displaySearch']) - ]); ?> -
    -
    - $this->getData(['theme', 'footer', 'loginLink']) - ]); ?> -
    + $this->getData(['theme', 'footer','displayVersion']), + 'help' => 'Affiche le numéro de version après ZwiiCMS' + ]); ?> +
    +
    +
    +
    + $this->getData(['theme', 'footer', 'displaySiteMap']), + 'help' => 'Un plan du site permet un meilleur référencement.' + ]); ?> +
    +
    + $this->getData(['theme', 'footer', 'loginLink']), + 'help' => 'Pour éviter les tentatives de piratage, enregistrez la page de connexion en favori et désactivez cette option.' + ]); ?> +
    +
    +
    +
    + $this->getData(['theme', 'footer', 'displayMemberBar']), + 'help' => 'Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés, ne s\'applique pas aux éditeurs et administrateurs.' + ]); ?> +
    +
    +
    +
    + (bool) empty($this->getData(['config', 'legalPageId'])) ? false : $this->getData(['theme', 'footer', 'displayLegal']), + 'disabled' => (bool) empty($this->getData(['config', 'legalPageId'])) ? true : false, + 'help' => (bool) empty($this->getData(['config', 'legalPageId'])) ? 'Pour activer cette option, sélectionnez la page contenant les mentions légales dans la configuration du site' : '' + ]); ?> +
    +
    + (bool) empty($this->getData(['config', 'searchPageId'])) ? false : $this->getData(['theme', 'footer', 'displaySearch']), + 'disabled' => (bool) empty($this->getData(['config', 'searchPageId'])) ? true : false, + 'help' => (bool) empty($this->getData(['config', 'searchPageId'])) ? 'Pour activer cette option, sélectionnez la page contenant un module de recherche dans la configuration du site' : '' + ]); ?>
    @@ -136,10 +145,9 @@
    -

    Configuration

    +

    Configuration des blocs

    - getData(['theme', 'footer', 'template'])) ? $module::$footerblocks[3] : $module::$footerblocks [$this->getData(['theme', 'footer', 'template'])] ;?> 'Disposition', @@ -162,39 +170,63 @@

    Contenu personnalisé

    - 'Emplacement', - 'selected' => $this->getData(['theme', 'footer', 'textPosition']), - 'class' => 'themeFooterContent' - ]); ?> - 'Alignement', - 'selected' => $this->getData(['theme', 'footer', 'textAlign']) - ]); ?> +
    +
    + 'Emplacement', + 'selected' => $this->getData(['theme', 'footer', 'textPosition']), + 'class' => 'themeFooterContent' + ]); ?> +
    +
    +
    +
    + 'Alignement', + 'selected' => $this->getData(['theme', 'footer', 'textAlign']) + ]); ?> +
    +

    Réseaux sociaux

    - 'Emplacement', - 'selected' => $this->getData(['theme', 'footer', 'socialsPosition']), - 'class' => 'themeFooterContent' - ]); ?> - 'Alignement', - 'selected' => $this->getData(['theme', 'footer', 'socialsAlign']) - ]); ?> +
    +
    + 'Emplacement', + 'selected' => $this->getData(['theme', 'footer', 'socialsPosition']), + 'class' => 'themeFooterContent' + ]); ?> +
    +
    +
    +
    + 'Alignement', + 'selected' => $this->getData(['theme', 'footer', 'socialsAlign']) + ]); ?> +
    +

    Informations

    - 'Emplacement', - 'selected' => $this->getData(['theme', 'footer', 'copyrightPosition']), - 'class' => 'themeFooterContent' - ]); ?> - 'Alignement', - 'selected' => $this->getData(['theme', 'footer', 'copyrightAlign']) - ]); ?> +
    +
    + 'Emplacement', + 'selected' => $this->getData(['theme', 'footer', 'copyrightPosition']), + 'class' => 'themeFooterContent' + ]); ?> +
    +
    +
    +
    + 'Alignement', + 'selected' => $this->getData(['theme', 'footer', 'copyrightAlign']) + ]); ?> +
    +
    diff --git a/core/module/theme/view/header/header.css b/core/module/theme/view/header/header.css index 6faa3a6a..a7139f53 100755 --- a/core/module/theme/view/header/header.css +++ b/core/module/theme/view/header/header.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @import url("site/data/admin.css"); \ No newline at end of file diff --git a/core/module/theme/view/header/header.js.php b/core/module/theme/view/header/header.js.php old mode 100755 new mode 100644 index cc10fdef..87a89cf2 --- a/core/module/theme/view/header/header.js.php +++ b/core/module/theme/view/header/header.js.php @@ -9,7 +9,7 @@ * @license GNU General Public License, version 3 * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ $(document).ready(function(){ @@ -25,7 +25,7 @@ $("input, select").on("change", function() { // Récupérer la taille de l'image var tmpImg = new Image(); - + tmpImg.onload = function() { // Informations affichées $("#themeHeaderImageHeight").html(tmpImg.height + "px"); diff --git a/core/module/theme/view/header/header.php b/core/module/theme/view/header/header.php old mode 100755 new mode 100644 index 8d3b41cf..1d9e0d2c --- a/core/module/theme/view/header/header.php +++ b/core/module/theme/view/header/header.php @@ -13,24 +13,22 @@
    -
    +

    Couleurs

    -
    +
    'colorPicker', - 'help' => 'Le curseur horizontal règle le niveau de transparence.', + 'help' => 'Le curseur horizontal règle le niveau de transparence.', 'label' => 'Fond', 'value' => $this->getData(['theme', 'header', 'backgroundColor']) ]); ?>
    -
    -
    -
    +
    'colorPicker', - 'help' => 'Le curseur horizontal règle le niveau de transparence.', + 'help' => 'Le curseur horizontal règle le niveau de transparence.', 'label' => 'Texte', 'value' => $this->getData(['theme', 'header', 'textColor']) ]); ?> @@ -38,7 +36,7 @@
    -
    +

    Image

    @@ -47,6 +45,7 @@ $imageFile = file_exists(self::FILE_DIR.'source/'.$this->getData(['theme', 'header', 'image'])) ? $this->getData(['theme', 'header', 'image']) : ""; echo template::file('themeHeaderImage', [ + 'help' => 'Sélectionner une image aux dimensions recommandées ci-dessous :', 'label' => 'Fond', 'type' => 1, 'value' => $imageFile @@ -77,15 +76,15 @@
    $this->getData(['theme', 'header', 'linkHomePage']) - ]); ?> -
    + ]); ?> +
    - Dimensions de l'image : largeur - hauteur - ratio + Largeur : | Hauteur : | ratio : -
    +
    @@ -110,7 +109,7 @@ Cover pour une image plus grande que la bannière, Contain pour une image plus petite. Les modes Auto et Etiré ne provoquent pas de modification de la hauteur de la bannière.' ]); ?> -
    +
    'Hauteur maximale', diff --git a/core/module/theme/view/index/index.css b/core/module/theme/view/index/index.css index 678d9da2..776025ed 100755 --- a/core/module/theme/view/index/index.css +++ b/core/module/theme/view/index/index.css @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/index/index.js.php b/core/module/theme/view/index/index.js.php old mode 100755 new mode 100644 index 34804d79..345e765e --- a/core/module/theme/view/index/index.js.php +++ b/core/module/theme/view/index/index.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/core/module/theme/view/index/index.php b/core/module/theme/view/index/index.php old mode 100755 new mode 100644 diff --git a/core/module/theme/view/manage/manage.css b/core/module/theme/view/manage/manage.css index bfeedf7c..654bd6be 100755 --- a/core/module/theme/view/manage/manage.css +++ b/core/module/theme/view/manage/manage.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /* Thème administration */ diff --git a/core/module/theme/view/manage/manage.php b/core/module/theme/view/manage/manage.php old mode 100755 new mode 100644 index ad86da93..ff7a28ba --- a/core/module/theme/view/manage/manage.php +++ b/core/module/theme/view/manage/manage.php @@ -26,7 +26,7 @@ 'Appliquer' ]); ?> -
    +
    @@ -49,6 +49,11 @@ ]); ?>
    +
    +
    + Le fichier de sauvegarde est généré dans le dossier Thème du gestionnaire de fichiers. +
    +

    Télécharger le thème

    @@ -59,16 +64,16 @@ 'ico' => 'download', 'value' => 'Thème site' ]); ?> -
    +
    helper::baseUrl() . 'theme/export/admin', 'ico' => 'download', 'value' => 'Thème administration' ]); ?> -
    +
    -
    +
    diff --git a/core/module/theme/view/menu/menu.css b/core/module/theme/view/menu/menu.css index 6faa3a6a..a7139f53 100755 --- a/core/module/theme/view/menu/menu.css +++ b/core/module/theme/view/menu/menu.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @import url("site/data/admin.css"); \ No newline at end of file diff --git a/core/module/theme/view/menu/menu.js.php b/core/module/theme/view/menu/menu.js.php old mode 100755 new mode 100644 index 8e222c6d..ab3848a5 --- a/core/module/theme/view/menu/menu.js.php +++ b/core/module/theme/view/menu/menu.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ $(document).ready(function(){ diff --git a/core/module/theme/view/menu/menu.php b/core/module/theme/view/menu/menu.php old mode 100755 new mode 100644 diff --git a/core/module/theme/view/site/site.css b/core/module/theme/view/site/site.css index 74fce65d..2aa6edae 100755 --- a/core/module/theme/view/site/site.css +++ b/core/module/theme/view/site/site.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/core/module/theme/view/site/site.js.php b/core/module/theme/view/site/site.js.php old mode 100755 new mode 100644 index ba211043..22a97f80 --- a/core/module/theme/view/site/site.js.php +++ b/core/module/theme/view/site/site.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /* diff --git a/core/module/theme/view/site/site.php b/core/module/theme/view/site/site.php old mode 100755 new mode 100644 diff --git a/core/module/user/user.php b/core/module/user/user.php index 8d4ac569..1eed3585 100755 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class user extends common { @@ -24,6 +24,7 @@ class user extends common { 'logout' => self::GROUP_MEMBER, 'reset' => self::GROUP_VISITOR ]; + public static $users = []; //Paramètres pour choix de la signature @@ -34,6 +35,9 @@ class user extends common { self::SIGNATURE_LASTFIRSTNAME => 'Nom Prénom' ]; + public static $userId = ''; + + public static $userLongtime = false; /** * Ajout @@ -57,33 +61,21 @@ class user extends common { $userFirstname = $this->getInput('userAddFirstname', helper::FILTER_STRING_SHORT, true); $userLastname = $this->getInput('userAddLastname', helper::FILTER_STRING_SHORT, true); $userMail = $this->getInput('userAddMail', helper::FILTER_MAIL, true); - $userPseudo = $this->getInput('userAddPseudo', helper::FILTER_STRING_SHORT, true); - $usersignature = $this->getInput('userAddSignature', helper::FILTER_STRING_SHORT, true); - // Pas de nom saisi - if (empty($userFirstname) || - empty($userLastname) || - empty($userPseudo) || - empty($this->getInput('userAddPassword', helper::FILTER_STRING_SHORT, true)) || - empty($this->getInput('userAddConfirmPassword', helper::FILTER_STRING_SHORT, true))) { - $check=false; - } - // Si tout est ok création effective - if ($check === true) { - $this->setData([ - 'user', - $userId, - [ - 'firstname' => $userFirstname, - 'forgot' => 0, - 'group' => $this->getInput('userAddGroup', helper::FILTER_INT, true), - 'lastname' => $userLastname, - 'pseudo' => $userPseudo, - 'signature' => $usersignature, - 'mail' => $userMail, - 'password' => $this->getInput('userAddPassword', helper::FILTER_PASSWORD, true) - ] - ]); - } + + // Stockage des données + $this->setData([ + 'user', + $userId, + [ + 'firstname' => $userFirstname, + 'forgot' => 0, + 'group' => $this->getInput('userAddGroup', helper::FILTER_INT, true), + 'lastname' => $userLastname, + 'mail' => $userMail, + 'password' => $this->getInput('userAddPassword', helper::FILTER_PASSWORD, true), + ] + ]); + // Envoie le mail $sent = true; if($this->getInput('userAddSendMail', helper::FILTER_BOOLEAN) && $check === true) { @@ -398,7 +390,7 @@ class user extends common { */ } else { // Cas 4 : le délai de blocage est dépassé et le compte est au max - Réinitialiser - if ($this->getData(['user',$userId,'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time() + if ($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 ]); @@ -413,8 +405,10 @@ class user extends common { ) { // Expiration $expire = $this->getInput('userLoginLongTime') ? strtotime("+1 year") : 0; - setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); + $c = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN) === true ? 'true' : 'false'; + setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false) , '', helper::isHttps(), true); setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); + setcookie('ZWII_USER_LONGTIME', $c, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); // Accès multiples avec le même compte $this->setData(['user',$userId,'accessCsrf',$_SESSION['csrf']]); // Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur @@ -467,6 +461,12 @@ class user extends common { } } } + if (!empty($_COOKIE['ZWII_USER_ID'])) { + self::$userId = $_COOKIE['ZWII_USER_ID']; + } + if (!empty($_COOKIE['ZWII_USER_LONGTIME'])) { + self::$userLongtime = $_COOKIE['ZWII_USER_LONGTIME'] == 'true' ? true : false; + } // Valeurs en sortie $this->addOutput([ 'display' => self::DISPLAY_LAYOUT_LIGHT, @@ -479,7 +479,12 @@ class user extends common { * Déconnexion */ public function logout() { - helper::deleteCookie('ZWII_USER_ID'); + // Ne pas effacer l'identifiant mais seulement le mot de passe + if (array_key_exists('ZWII_USER_LONGTIME',$_COOKIE) + AND $_COOKIE['ZWII_USER_LONGTIME'] !== 'true' ) { + helper::deleteCookie('ZWII_USER_ID'); + helper::deleteCookie('ZWII_USER_LONGTIME'); + } helper::deleteCookie('ZWII_USER_PASSWORD'); session_destroy(); // Valeurs en sortie diff --git a/core/module/user/view/add/add.css b/core/module/user/view/add/add.css index 6faa3a6a..a7139f53 100755 --- a/core/module/user/view/add/add.css +++ b/core/module/user/view/add/add.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @import url("site/data/admin.css"); \ No newline at end of file diff --git a/core/module/user/view/add/add.js.php b/core/module/user/view/add/add.js.php old mode 100755 new mode 100644 index f83d4a40..6d797f0c --- a/core/module/user/view/add/add.js.php +++ b/core/module/user/view/add/add.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/core/module/user/view/add/add.php b/core/module/user/view/add/add.php old mode 100755 new mode 100644 diff --git a/core/module/user/view/edit/edit.css b/core/module/user/view/edit/edit.css index 74fce65d..2aa6edae 100755 --- a/core/module/user/view/edit/edit.css +++ b/core/module/user/view/edit/edit.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/edit/edit.js.php b/core/module/user/view/edit/edit.js.php old mode 100755 new mode 100644 index e712a9bc..ad7e1087 --- a/core/module/user/view/edit/edit.js.php +++ b/core/module/user/view/edit/edit.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/core/module/user/view/edit/edit.php b/core/module/user/view/edit/edit.php old mode 100755 new mode 100644 diff --git a/core/module/user/view/forgot/forgot.css b/core/module/user/view/forgot/forgot.css index 74fce65d..2aa6edae 100755 --- a/core/module/user/view/forgot/forgot.css +++ b/core/module/user/view/forgot/forgot.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/forgot/forgot.php b/core/module/user/view/forgot/forgot.php old mode 100755 new mode 100644 diff --git a/core/module/user/view/index/index.css b/core/module/user/view/index/index.css index 74fce65d..2aa6edae 100755 --- a/core/module/user/view/index/index.css +++ b/core/module/user/view/index/index.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/core/module/user/view/index/index.js.php b/core/module/user/view/index/index.js.php old mode 100755 new mode 100644 index ab2f99db..53d5d62d --- a/core/module/user/view/index/index.js.php +++ b/core/module/user/view/index/index.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php old mode 100755 new mode 100644 diff --git a/core/module/user/view/login/login.css b/core/module/user/view/login/login.css index f2341432..ce4f1b21 100755 --- a/core/module/user/view/login/login.css +++ b/core/module/user/view/login/login.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /* diff --git a/core/module/user/view/login/login.php b/core/module/user/view/login/login.php old mode 100755 new mode 100644 index a25c0529..3a1af756 --- a/core/module/user/view/login/login.php +++ b/core/module/user/view/login/login.php @@ -2,7 +2,8 @@
    'Identifiant' + 'label' => 'Identifiant', + 'value' => $module::$userId ]); ?>
    @@ -14,9 +15,8 @@
    'La session est close à la fermeture du navigateur.' - ]); ?> - + 'checked' => $module::$userLongtime + ]); ?>
    Mot de passe perdu ? diff --git a/core/module/user/view/reset/reset.css b/core/module/user/view/reset/reset.css index 6faa3a6a..a7139f53 100755 --- a/core/module/user/view/reset/reset.css +++ b/core/module/user/view/reset/reset.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ @import url("site/data/admin.css"); \ No newline at end of file diff --git a/core/module/user/view/reset/reset.php b/core/module/user/view/reset/reset.php old mode 100755 new mode 100644 diff --git a/core/vendor/favicon-switcher/favicon-switcher.js b/core/vendor/favicon-switcher/favicon-switcher.js new file mode 100644 index 00000000..6a72a463 --- /dev/null +++ b/core/vendor/favicon-switcher/favicon-switcher.js @@ -0,0 +1,56 @@ +;(function(mod){ + function collectLinks() { + return Array.prototype.slice.apply( + document.head.querySelectorAll('link[rel*="icon"]') + ) + } + + function applyLink(source, target) { + target.setAttribute('type', source.getAttribute('type')) + target.setAttribute('href', source.getAttribute('href')) + } + + // eslint-disable-next-line no-unused-vars + function initSwitcher(delay) { + // Exit if media queries aren't supported + if (typeof window.matchMedia !== 'function') { + return function noop() {} + } + + var links = collectLinks() + var current = document.createElement('link') + var prevMatch + + current.setAttribute('rel', 'shortcut icon') + document.head.appendChild(current) + + function faviconApplyLoop() { + links.forEach(function(link) { + if (window.matchMedia(link.media).matches) { + if (link.media !== prevMatch) { + prevMatch = link.media + applyLink(link, current) + } + } + }) + } + + var intervalId = setInterval(faviconApplyLoop, delay || 300) + + function unsubscribe() { + clearInterval(intervalId) + links.forEach(function(link) { + document.head.appendChild(link) + }) + } + + faviconApplyLoop() + links.forEach(function(link) { + document.head.removeChild(link) + }) + + return unsubscribe + } + + initSwitcher() + })() diff --git a/core/vendor/filemanager/UploadHandler.php b/core/vendor/filemanager/UploadHandler.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/ajax_calls.php b/core/vendor/filemanager/ajax_calls.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/config/.htaccess b/core/vendor/filemanager/config/.htaccess old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/config/config.php b/core/vendor/filemanager/config/config.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/dialog.php b/core/vendor/filemanager/dialog.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/execute.php b/core/vendor/filemanager/execute.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/force_download.php b/core/vendor/filemanager/force_download.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/include/FtpClient.php b/core/vendor/filemanager/include/FtpClient.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/include/FtpException.php b/core/vendor/filemanager/include/FtpException.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/include/FtpWrapper.php b/core/vendor/filemanager/include/FtpWrapper.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/include/Response.php b/core/vendor/filemanager/include/Response.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/include/ftp_class.php b/core/vendor/filemanager/include/ftp_class.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/include/mime_type_lib.php b/core/vendor/filemanager/include/mime_type_lib.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/include/php_image_magician.php b/core/vendor/filemanager/include/php_image_magician.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/include/utils.php b/core/vendor/filemanager/include/utils.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/index.php b/core/vendor/filemanager/index.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/az_AZ.php b/core/vendor/filemanager/lang/az_AZ.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/bg_BG.php b/core/vendor/filemanager/lang/bg_BG.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/ca.php b/core/vendor/filemanager/lang/ca.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/cs.php b/core/vendor/filemanager/lang/cs.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/da.php b/core/vendor/filemanager/lang/da.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/de.php b/core/vendor/filemanager/lang/de.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/el_GR.php b/core/vendor/filemanager/lang/el_GR.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/en_EN.php b/core/vendor/filemanager/lang/en_EN.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/es.php b/core/vendor/filemanager/lang/es.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/fa.php b/core/vendor/filemanager/lang/fa.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/fr_FR.php b/core/vendor/filemanager/lang/fr_FR.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/he_IL.php b/core/vendor/filemanager/lang/he_IL.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/hr.php b/core/vendor/filemanager/lang/hr.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/hu_HU.php b/core/vendor/filemanager/lang/hu_HU.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/id.php b/core/vendor/filemanager/lang/id.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/it.php b/core/vendor/filemanager/lang/it.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/ja.php b/core/vendor/filemanager/lang/ja.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/languages.php b/core/vendor/filemanager/lang/languages.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/lt.php b/core/vendor/filemanager/lang/lt.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/mn_MN.php b/core/vendor/filemanager/lang/mn_MN.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/nb_NO.php b/core/vendor/filemanager/lang/nb_NO.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/nl.php b/core/vendor/filemanager/lang/nl.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/nn_NO.php b/core/vendor/filemanager/lang/nn_NO.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/pl.php b/core/vendor/filemanager/lang/pl.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/pt_BR.php b/core/vendor/filemanager/lang/pt_BR.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/pt_PT.php b/core/vendor/filemanager/lang/pt_PT.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/ro.php b/core/vendor/filemanager/lang/ro.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/ru.php b/core/vendor/filemanager/lang/ru.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/sk.php b/core/vendor/filemanager/lang/sk.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/sl.php b/core/vendor/filemanager/lang/sl.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/sv_SE.php b/core/vendor/filemanager/lang/sv_SE.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/th_TH.php b/core/vendor/filemanager/lang/th_TH.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/tr_TR.php b/core/vendor/filemanager/lang/tr_TR.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/uk_UA.php b/core/vendor/filemanager/lang/uk_UA.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/vi.php b/core/vendor/filemanager/lang/vi.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/lang/zh_CN.php b/core/vendor/filemanager/lang/zh_CN.php old mode 100755 new mode 100644 diff --git a/core/vendor/filemanager/upload.php b/core/vendor/filemanager/upload.php old mode 100755 new mode 100644 diff --git a/core/vendor/tinymce/init.js b/core/vendor/tinymce/init.js index 41692072..7c557af9 100755 --- a/core/vendor/tinymce/init.js +++ b/core/vendor/tinymce/init.js @@ -25,7 +25,7 @@ tinymce.init({ // Langue language: "fr_FR", // Plugins - plugins: "advlist anchor autolink autoresize autosave codemirror colorpicker contextmenu fullscreen hr image imagetools link lists media paste searchreplace stickytoolbar tabfocus table template textcolor emoticons ", + plugins: "advlist anchor autolink autoresize autosave codemirror colorpicker contextmenu fullscreen hr image imagetools link lists media paste searchreplace stickytoolbar tabfocus table template textcolor emoticons nonbreaking", // Contenu de la barre d'outils toolbar: "restoredraft | undo redo | formatselect bold italic underline forecolor backcolor | alignleft aligncenter alignright alignjustify | bullist numlist emoticons | table template | image media link | code fullscreen", // Emoticons @@ -80,7 +80,7 @@ tinymce.init({ // Pages internes link_list: baseUrl + "core/vendor/tinymce/links.php", // Contenu du menu contextuel - contextmenu: "selectall searchreplace | hr | media image link anchor | insertable cell row column deletetable", + contextmenu: "selectall searchreplace | hr | media image link anchor nonbreaking | insertable cell row column deletetable", // Fichiers CSS à intégrer à l'éditeur content_css: [ baseUrl + "core/layout/common.css", diff --git a/core/vendor/tinymce/links.php b/core/vendor/tinymce/links.php old mode 100755 new mode 100644 diff --git a/core/vendor/zwiico/css/animation.css b/core/vendor/zwiico/css/animation.css old mode 100755 new mode 100644 diff --git a/core/vendor/zwiico/css/zwiico-codes.css b/core/vendor/zwiico/css/zwiico-codes.css old mode 100755 new mode 100644 index 99c06e44..be298cf6 --- a/core/vendor/zwiico/css/zwiico-codes.css +++ b/core/vendor/zwiico/css/zwiico-codes.css @@ -28,8 +28,10 @@ .zwiico-cogs:before { content: '\e81a'; } /* '' */ .zwiico-cog-alt:before { content: '\e81b'; } /* '' */ .zwiico-trash:before { content: '\e81c'; } /* '' */ -.zwiico-edit:before { content: '\e81d'; } /* '' */ -.zwiico-flag:before { content: '\e81e'; } /* '' */ +.zwiico-plus-circled:before { content: '\e81d'; } /* '' */ +.zwiico-minus-circled:before { content: '\e81e'; } /* '' */ +.zwiico-down-big:before { content: '\e820'; } /* '' */ +.zwiico-up-big:before { content: '\e821'; } /* '' */ .zwiico-spin:before { content: '\e831'; } /* '' */ .zwiico-twitter:before { content: '\f099'; } /* '' */ .zwiico-facebook:before { content: '\f09a'; } /* '' */ @@ -38,9 +40,9 @@ .zwiico-linkedin:before { content: '\f0e1'; } /* '' */ .zwiico-download-cloud:before { content: '\f0ed'; } /* '' */ .zwiico-upload-cloud:before { content: '\f0ee'; } /* '' */ -.zwiico-github:before { content: '\f113'; } /* '' */ .zwiico-code:before { content: '\f121'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ -.zwiico-pinterest:before { content: '\f231'; } /* '' */ \ No newline at end of file +.zwiico-pinterest:before { content: '\f231'; } /* '' */ +.zwiico-clone:before { content: '\f24d'; } /* '' */ \ No newline at end of file diff --git a/core/vendor/zwiico/css/zwiico-embedded.css b/core/vendor/zwiico/css/zwiico-embedded.css old mode 100755 new mode 100644 index 2826202e..cd0ebff3 --- a/core/vendor/zwiico/css/zwiico-embedded.css +++ b/core/vendor/zwiico/css/zwiico-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'zwiico'; - src: url('../font/zwiico.eot?4304870'); - src: url('../font/zwiico.eot?4304870#iefix') format('embedded-opentype'), - url('../font/zwiico.svg?4304870#zwiico') format('svg'); + src: url('../font/zwiico.eot?53857867'); + src: url('../font/zwiico.eot?53857867#iefix') format('embedded-opentype'), + url('../font/zwiico.svg?53857867#zwiico') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'zwiico'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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ARQrLbBCLLA1Ky6xKwEUKy2wQyywNishIyAgPLAEI0IjOLErARQrsARDLrArKy2wRCywABUgR7AAI0KyAAEBFRQTLrAxKi2wRSywABUgR7AAI0KyAAEBFRQTLrAxKi2wRiyxAAEUE7AyKi2wRyywNCotsEgssAAWRSMgLiBGiiNhOLErARQrLbBJLLAII0KwSCstsEossgAAQSstsEsssgABQSstsEwssgEAQSstsE0ssgEBQSstsE4ssgAAQistsE8ssgABQistsFAssgEAQistsFEssgEBQistsFIssgAAPistsFMssgABPistsFQssgEAPistsFUssgEBPistsFYssgAAQCstsFcssgABQCstsFgssgEAQCstsFkssgEBQCstsFossgAAQystsFsssgABQystsFwssgEAQystsF0ssgEBQystsF4ssgAAPystsF8ssgABPystsGAssgEAPystsGEssgEBPystsGIssDcrLrErARQrLbBjLLA3K7A7Ky2wZCywNyuwPCstsGUssAAWsDcrsD0rLbBmLLA4Ky6xKwEUKy2wZyywOCuwOystsGgssDgrsDwrLbBpLLA4K7A9Ky2waiywOSsusSsBFCstsGsssDkrsDsrLbBsLLA5K7A8Ky2wbSywOSuwPSstsG4ssDorLrErARQrLbBvLLA6K7A7Ky2wcCywOiuwPCstsHEssDorsD0rLbByLLMJBAIDRVghGyMhWUIrsAhlsAMkUHiwARUwLQBLuADIUlixAQGOWbABuQgACABjcLEABUKyAAEAKrEABUKzCgIBCCqxAAVCsw4AAQgqsQAGQroCwAABAAkqsQAHQroAQAABAAkqsQMARLEkAYhRWLBAiFixA2REsSYBiFFYugiAAAEEQIhjVFixAwBEWVlZWbMMAgEMKrgB/4WwBI2xAgBEAAA=') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,AAEAAAAPAIAAAwBwR1NVQiCLJXoAAAD8AAAAVE9TLzI+IFPUAAABUAAAAFZjbWFwJtpD7QAAAagAAARcY3Z0IAbh/wQAADxgAAAAIGZwZ22KkZBZAAA8gAAAC3BnYXNwAAAAEAAAPFgAAAAIZ2x5ZjffJOsAAAYEAAAwJGhlYWQaY2WjAAA2KAAAADZoaGVhB38DxAAANmAAAAAkaG10eKVo//AAADaEAAAAwGxvY2EDavbMAAA3RAAAAGJtYXhwAfcMvgAAN6gAAAAgbmFtZV7wr1oAADfIAAACtXBvc3QDxgvEAAA6gAAAAddwcmVw5UErvAAAR/AAAACGAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAEDcgGQAAUAAAJ6ArwAAACMAnoCvAAAAeAAMQECAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAwOgA8k0DUv9qAFoDWACWAAAAAQAAAAAAAAAAAAUAAAADAAAALAAAAAQAAAIYAAEAAAAAARIAAwABAAAALAADAAoAAAIYAAQA5gAAAB4AEAADAA7oHugh6DHwmvDJ8Nzw4fDu8SHxZ/Ft8fzyMfJN//8AAOgA6CDoMfCZ8Mnw3PDh8O3xIfFn8W3x/PIx8k3//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAeAFoAXABcAF4AXgBeAF4AYABgAGAAYABgAGAAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATABQAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAAAAkQAAAAAAAAALwAA6AAAAOgAAAAAAQAA6AEAAOgBAAAAAgAA6AIAAOgCAAAAAwAA6AMAAOgDAAAABAAA6AQAAOgEAAAABQAA6AUAAOgFAAAABgAA6AYAAOgGAAAABwAA6AcAAOgHAAAACAAA6AgAAOgIAAAACQAA6AkAAOgJAAAACgAA6AoAAOgKAAAACwAA6AsAAOgLAAAADAAA6AwAAOgMAAAADQAA6A0AAOgNAAAADgAA6A4AAOgOAAAADwAA6A8AAOgPAAAAEAAA6BAAAOgQAAAAEQAA6BEAAOgRAAAAEgAA6BIAAOgSAAAAEwAA6BMAAOgTAAAAFAAA6BQAAOgUAAAAFQAA6BUAAOgVAAAAFgAA6BYAAOgWAAAAFwAA6BcAAOgXAAAAGAAA6BgAAOgYAAAAGQAA6BkAAOgZAAAAGgAA6BoAAOgaAAAAGwAA6BsAAOgbAAAAHAAA6BwAAOgcAAAAHQAA6B0AAOgdAAAAHgAA6B4AAOgeAAAAHwAA6CAAAOggAAAAIAAA6CEAAOghAAAAIQAA6DEAAOgxAAAAIgAA8JkAAPCZAAAAIwAA8JoAAPCaAAAAJAAA8MkAAPDJAAAAJQAA8NwAAPDcAAAAJgAA8OEAAPDhAAAAJwAA8O0AAPDtAAAAKAAA8O4AAPDuAAAAKQAA8SEAAPEhAAAAKgAA8WcAAPFnAAAAKwAA8W0AAPFtAAAALAAA8fwAAPH8AAAALQAA8jEAAPIxAAAALgAA8k0AAPJNAAAALwACAAD/+QNrAsMAJwBAAEJAPxQBAgEBRwAGAgUCBgVtAAUDAgUDawAEAwADBABtAAEAAgYBAmAAAwQAA1QAAwMAWAAAAwBMFiMZJSolJwcFGyslFBYPAQ4BByMiJjURNDY7ATIWFRcWDwEOAScjIgYHERQWFzMyHgIBFAcBBiImPQEjIiY9ATQ2NzM1NDYWFwEWAWUCAQIBCAiyQ15eQ7IICgEBAQIBCAiyJTQBNiS0BgIGAgIGC/7RCxwW+g4WFg76FhwLAS8LLgISBQ4JBAFeQwGIQ14KCAsJBg0HCAE0Jv54JTQBBAIIASwOC/7QChQPoRYO1g8UAaEOFgIJ/tAKAAAAAAEAAAAAA6UCmAAVAB1AGg8BAAEBRwACAQJvAAEAAW8AAABmFBcUAwUXKwEUBwEGIicBJjQ/ATYyHwEBNjIfARYDpRD+IBAsEP7qDw9MECwQpAFuECwQTBACFhYQ/iAPDwEWECwQTBAQpQFvEBBMDwABAAD/7wLUAoYAJAAeQBsiGRAHBAACAUcDAQIAAm8BAQAAZhQcFBQEBRgrJRQPAQYiLwEHBiIvASY0PwEnJjQ/ATYyHwE3NjIfARYUDwEXFgLUD0wQLBCkpBAsEEwQEKSkEBBMECwQpKQQLBBMDw+kpA9wFhBMDw+lpQ8PTBAsEKSkECwQTBAQpKQQEEwPLg+kpA8AAQAA//kDEgMLACMAKUAmAAQDBG8AAQABcAUBAwAAA1QFAQMDAFgCAQADAEwjMyUjMyMGBRorARUUBicjFRQGByMiJjc1IyImJzU0NjczNTQ2OwEyFhcVMzIWAxIgFuggFmsWIAHoFx4BIBboHhdrFx4B6BceAbdrFiAB6RYeASAV6R4XaxceAegWICAW6CAAAQAAAAADEgHtAA8AGEAVAAEAAAFUAAEBAFgAAAEATDUzAgUWKwEVFAYnISImJzU0NjchMhYDEiAW/VoXHgEgFgKmFx4Bt2sWIAEeF2sXHgEgAAAAA//9/7EDXwMLAA8ANwBEAEhARSkBBQMJAQIBAAJHAAQCAwIEA20AAwUCAwVrAAcAAgQHAmAABQAAAQUAYAABBgYBVAABAQZYAAYBBkwVHisTFiYmIwgFHCslNTQmKwEiBh0BFBY7ATI2EzQuASMiBwYfARYzMjc+ATIWFRQGBw4BFxUUFjsBMjY0Nj8BPgMXFA4BIi4CPgEyHgEB9AoIawgKCghrCAqPPlwxiEcJDUoEBgkFHiU4KhYbIzwBCghrCAoYEhwKHhQM13LG6MhuBnq89Lp+UmsICgoIawgKCgF/MVQudw0LNwQHJhseEhUaDA9CJRQICgoSIgsQBhocKFJ1xHR0xOrEdHTEAAQAAP+xA00C/wAGABQAGQAkAIZAFx4BAgUdFg4HBAMCGQMCAwADAQEBAARHS7ASUFhAJwAFAgVvAAIDAm8AAwADbwAAAQEAYwYBAQQEAVIGAQEBBFcABAEESxtAJgAFAgVvAAIDAm8AAwADbwAAAQBvBgEBBAQBUgYBAQEEVwAEAQRLWUASAAAhIBgXEA8JCAAGAAYUBwUVKxc3JwcVMxUBNCMiBwEGFRQzMjcBNicXASM1ARQPASc3NjIfARbLMoMzSAFfDAUE/tEEDQUEAS8DHuj+MOgDTRRd6F0UOxaDFAczgzM8RwIGDAT+0gQGDAQBLgRx6P4v6QGaHRVd6VwVFYMWAAAAAAIAAP+xA1oDCwAIAGoARUBCZVlMQQQABDsKAgEANCgbEAQDAQNHAAUEBW8GAQQABG8AAAEAbwABAwFvAAMCA28AAgJmXFtTUUlIKyoiIBMSBwUWKwE0JiIOARYyNiUVFAYPAQYHFhcWFAcOASciLwEGBwYHBisBIiY1JyYnBwYiJyYnJjQ3PgE3Ji8BLgEnNTQ2PwE2NyYnJjQ3PgEzMh8BNjc2NzY7ATIWHwEWFzc2MhcWFxYUBw4BBxYfAR4BAjtSeFICVnRWARwIB2gKCxMoBgUPUA0HB00ZGgkHBBB8CAwQGxdPBhAGRhYEBQgoCg8IZgcIAQoFaAgOFyUGBQ9QDQcITRgaCQgDEXwHDAEPHBdPBQ8HSBQEBAkoCg8IZgcKAV47VFR2VFR4fAcMARAeFRsyBg4GFVABBTwNCEwcEAoHZwkMPAUGQB4FDgYMMg8cGw8BDAd8BwwBEBkaIC0HDAcUUAU8DQhMHBAKB2cJCzsFBUMcBQ4GDDIPHBoQAQwAAAADAAD/+QPoAn0AEQAiADMARkBDCwICBAINAQADAkcABAIDAgQDbQADAAIDAGsAAAECAAFrAAYAAgQGAmAAAQUFAVQAAQEFWAAFAQVMFxYkFBUYFgcFGysBJicWFRQGLgE1NDcGBx4BIDYBNCYHIgYVFBYyNjU0NjMyNgUUBwYEICQnJjQ3NiwBBBcWA6FVgCKS0JIigFVL4AEE4v63EAtGZBAWEEQwCxAB2QtO/vj+2v74TgsLTgEIASYBCE4LATqEQTpDZ5QCkGlDOkGEcoiIAUkLEAFkRQsQEAswRBDMExOBmpqBEyYUgJoCnn4UAAABAAAAAAO2AkYAFAAZQBYFAQACAUcAAgACbwEBAABmFxQSAwUXKyUHBiInCQEGIi8BJjQ3ATYyFwEWFAOrXAseCv7Y/tgLHAtdCwsBngscCwGeC2tcCgoBKf7XCgpcCx4KAZ4KCv5iCxwAAAAC////+QQZAwsAEgApACxAKQADBANvAAECAAIBAG0AAABuAAQCAgRUAAQEAlgAAgQCTCM6IzY1BQUZKwEUDwEOASMhIi4BPwE+ATMhMhYnFSEiBg8CJyY3ETQ2OwEyFh0BITIWBBkSuxhWJv2hExwBEbwYViUCXxMewP4wNXIjvAIBAQFKM7MzSgEvNEgBPxEU3RwoDiIU3RwoDq9aNCndAwcFAgIYM0pKMxJKAAAAAAQAAP/5A6EDUgAIABEAJwA/AERAQTwBBwgJAAICAAJHCQEHCAMIBwNtAAYDBAMGBG0FAQMBAQACAwBgAAQAAgQCXAAICAwIST89JCUWIhIlORgSCgUdKyU0LgEOARY+ATc0LgEOARY+ATcVFAYHISImJzU0NjMhFxYyPwEhMhYDFg8BBiIvASY3NjsBNTQ2NzMyFgcVMzICyhQeFAIYGhiNFCASAhYcGEYgFvzLFx4BIBYBA0shViFMAQMWILYKEvoKHgr6EQkKF48WDo8OFgGPGGQPFAIYGhgCFA8PFAIYGhgCFIyzFh4BIBWzFiBMICBMIAEoFxD6Cwv6EBcV+g8UARYO+gAAAAEAAAAAAWcCfAANABdAFAABAAEBRwABAAFvAAAAZhcTAgUWKwERFAYiLwEmND8BNjIWAWUUIAn6Cgr6CxwYAlj+DA4WC/oLHAv6CxYAAAAABv///2oELwNSABEAMgA7AEQAVgBfAG9AbE8OAgMCAUcACwkICQsIbRABCAIJCAJrDwECAwkCA2sHAQUAAQAFAW0MCgIBBgABBmsABgQABgRrDgEDDQEABQMAYBEBCQkMSAAEBA0ESV5dWllWVFJQS0pJR0NCPz46ORkVFBk3IxMhEBIFHSsBBgcjIiY3NDMyHgE3MjcGFRQBFAYjISImJzQ+BTMyHgI+AT8BNjcyHgQXARQGIiY0NjIWARQGLgE+AhYFFAYnIyYnNjU0JxYzMj4BFzInFAYiJjQ2MhYBS1o6Sy1AAUUEKkIhJiUDAoNSQ/4YRFABBAwQICY6IQYkLkhQRhkpEAgiOCYgEA4B/cZUdlRUdlQBiX6wgAJ8tHoBQz4uSzlaLQMlJSFEKARFR1R2VFR2VAFeA0QsLMUWGgENFRBO/ltCTk5CHjhCODQmFhgcGgIWEBoKAhYmNDhCHAKPO1RUdlRU/u9ZfgJ6tngGhNMrLgFEA0FOEBUNGBgBjztUVHZUVAACAAD/sQLKAwwAFQAeACVAIgAFAQVvAwEBBAFvAAQCBG8AAgACbwAAAGYTFxERFzIGBRorJRQGIyEiJjU0PgMXFjI3Mh4DAxQGIi4BNh4BAspGMf4kMUYKGCo+LUnKSipCJhwIj3y0egSCrIRFPFhYPDBUVjwoAUhIJj5UVgHAWH5+sIACfAAAAQAA/5MD6AMpAAYAHUAaBQEBRAAAAQBvAwICAQFmAAAABgAGEREEBRYrNREhESEFNQPo/if+wGACyf03zc0AAAIAAP/5A5ICxQAQADEALkArLiYlGBUPDg0IAQMMAQABAkcEAQMBA28AAQABbwIBAABmKigjIiERFAUFFysBERQGByM1IxUjIiYnEQkBFjcHBgcjIicJAQYmLwEmNjcBNjIfATU0NjsBMhYdARcWFAMSFg7Wj9YPFAEBQQFBAXwiBQcCBwX+fv5+Bw0FIwQCBQGREjATiAoIawgKegYBKP71DxQB1tYWDgEPAQj++AEkKQUBAwFC/r4EAgUpBg4FAU4PD3FsCAoKCONmBBAAAAADAAD/agONA1IAFwAkAC0ANUAyAAMEAAQDAG0ABQAEAwUEYAYBAgIBWAABAQxIAAAADQBJGRgsKygnHx4YJBkkGxUHBRYrARQHBgcGIicmJyY1NDY3Njc2MhcWFx4BASIOARQeATI+ATQuARcUBiImNDYyFgONPjxnavZrZj0+Rz5BUFe0V09BPkf+OkV1RUV1inVERHUWNUw1NUw1AR53ZWM6Ozs6Y2V3WsdTWDI2NjJYU8cBMkR1inVFRXWKdUT+JjU1TDQ0AAEAAAAAAjwB7QAOABdAFAABAAEBRwABAAFvAAAAZjUUAgUWKwEUDwEGIi8BJjQ2MyEyFgI7CvoLHAv6CxYOAfQOFgHJDgv6Cwv6CxwWFgAAAgAA//kCgwMLAAcAHwAqQCcFAwIAAQIBAAJtAAICbgAEAQEEVAAEBAFYAAEEAUwjEyU2ExAGBRorEyE1NCYOARcFERQGByEiJicRNDYXMzU0NjIWBxUzMhazAR1UdlQBAdAgFv3pFx4BIBYRlMyWAhIXHgGlbDtUAlA9of6+Fh4BIBUBQhYgAWxmlJRmbB4AAgAA/7AD6ALDACUASwA/QDxJHAIAAT8BAwApAQIDA0cKAQMBRjIBAkQAAQABbwAAAwBvAAMCAgNUAAMDAlgAAgMCTEJAPjwjIiMEBRUrARQOASMiJwYHBgcjIiY1JjQ2NT8CNgc3PgI3LgEnND4BMh4BFxQGBx4BHwEWHwMUBw4BJyYnJicGIyInFjMyNjc+ASc0Jx4BAxJqtGswMkZVFRsCBgwBAgEEAwMBHAUODgRFTgFqtNa0atZQRAUMCBsJBAUEAwECCgccFFZGMjCXcCARWqRCRUwBDUhUAaVNhEwJMRcFBAoHAQQEAQMGAwMBHgUYEhAodENOhExMhNxDdicOFgohCwMFBgoBAggKAQQFFzEJSgMyLzSGSisqJ3gABQAA/8MD6AKxAAkAGgA+AEQAVwBXQFQ0GwIABFMGAgIAUkMCAQJQQiknCAEGBgEERwAFBAVvAAIAAQACAW0AAQYAAQZrAAYDAAYDawADA24ABAAABFQABAQAWAAABABMTEsTLhkkFB0HBRorJTcuATc0NwYHFgE0JgciBhUUFjI2NTQ2MzI2NxQVBgIPAQYjIicmNTQ3LgEnJjQ3PgEzMhc3NjMyFh8BFgcWExQGBxMWFxQHBgcOASM3PgE3Jic3HgEXFgE2KzA4ASKAVV4BahALRmQQFhBEMAsQyjvqOxwFCgdECRlQhjILC1b8lzIyHwUKAw4LJAsBCRVYSZ0E+gsWJ1TcfCl3yEVBXSM1YiALaU8jaj1DOkGEkAFnCxABZEULEBALMEQQdQQBaf5aaTIJJwYKByokeE0RKhKDmAo2CQYGFAYBBf79ToAbARgZXhMTJC1gakoKhGlkQD8kYjYTAAACAAD/sQNbAwsAJABHAF1AWkMlAgYJLwEFBhcBAwIIAQEDBEcACQgGCAkGbQcBBQYCBgUCbQQBAgMGAgNrAAEDAAMBAG0ACAAGBQgGYAADAQADVAADAwBYAAADAExGRSYlJTYlJjUUJAoFHSsBFBUOASMiJicHBiImPQE0NjsBMhYGDwEeATcyNjc2NzY7ATIWExUUBisBIiY2PwEmIyIGBwYHBisBIiY3NT4BMzIWFzc2MhYDSyTkmVGYPEgLHBYWDvoOFgIJTShkN0qCJwYYBAxrCAoOFBD6DhYCCU1ScEuCJwYXBQxvBwwBJOaZUZo8SAscGAEFAwGWuj45SAsWDvoOFhYcC00kKgFKPgo4DQwBuPoOFhYcC01NSj4KOA0MBgSWuj45SAsWAAAEAAD/sQOhAy4ACAARACkAQABGQEM1AQcGCQACAgACRwAJBglvCAEGBwZvAAcDB28ABAACBFQFAQMBAQACAwBgAAQEAlgAAgQCTD08IzMjIjIlORgSCgUdKyU0Jg4CHgE2NzQmDgIeATY3FRQGIyEiJic1NDYXMx4BOwEyNjczMhYDBisBFRQGByMiJic1IyImPwE2Mh8BFgLKFB4UAhgaGI0UIBICFhwYRiAW/MsXHgEgFu4MNiOPIjYN7hYgtgkYjxQPjw8UAY8XExH6Ch4K+hIdDhYCEiASBBoMDhYCEiASBBqJsxYgIBazFiABHygoHx4BUhb6DxQBFg76LBH6Cgr6EQAAAAABAAD/5wO2AikAFAAZQBYNAQABAUcCAQEAAW8AAABmFBcSAwUXKwkBBiInASY0PwE2MhcJATYyHwEWFAOr/mIKHgr+YgsLXQoeCgEoASgLHAxcCwGP/mMLCwGdCx4KXAsL/tgBKAsLXAscAAABAAD/wAKYA0QAFAAttQEBAAEBR0uwGVBYQAsAAAEAcAABAQwBSRtACQABAAFvAAAAZlm0FxcCBRYrCQIWFA8BBiInASY0NwE2Mh8BFhQCjv7XASkKCl0LHAv+YgsLAZ4KHgpdCgKq/tj+1woeCl0KCgGfCh4KAZ4LC10KHgAAAAYAAP+2A+gDBgAnADAAWACAAIsAlgC4QLVFDw4HBgUFAFZVU1FMSkkREAUECwMFaGVkY19eVFBPSxUUAQAOAgNpZ10lGAUIAoFtJCIbGQYHBn59e3l0cSMaCAEHBkdgAQJqAQgCRkJBQD89PDs4NzY1CwlFfHh3c3IFAUQACQAJbwAFAAMABQNtAAgCBgIIBm0ABgcCBgdrAAcBAgcBawQBAAADAgADYAACCAECVAACAgFWAAECAUqVk4qIb25bWkdGMzIvLisqHx4aCgUVKz0BNzY3JzcXNj8BMxcWFzcXBxYfARUHBgcXBycGDwEjJyYnByc3Jic3FBY+Ai4BBiU3FzY3JzcXNj8BFwcWFzcXBxYfAQcjBgcXBycGDwEnNSYnByc3JicDNzM2Nyc3FzY/ARcVFhc3FwcWHwEHIwYHFwcnBg8BJzUmJwcnNyYnNwYeAT4BJicjIgYTBh4BPgEmJyMiBl4IDzxEShodCGEKHRpKRDwQB15eBxA8REoaHQphCB0aSkQ8Dwh/NEwyAjZIOAFACEYIDCU2MRQVDkgCFhE5LTEKAkQIRAgOJzgvFhUORhQROy0xCAQlBjEGCBolJA0QCjAQDCkfIwYELwYxBAocKCMNEAoxDQ4pHyMGAkUEGCgcBhoSBhEcEgQkNioEIBwHGiT1YQgeGUpFPRAHXl4HED1FShkeCGEKHRpIRjwPCF5eCA88RkgaHTslNgIyTjAEOMtIAhYROS0xCgRCCEQIDic2MRQXDkYUETstMQgEQgZGCAwlNjEUFf5RMhAMKyElCAIwBTEGChspIw0QDDMPDCshJQgCMQYzBAocKSQNEBkVHgQWLhgGGAGwGyoIJjQsAiIAAAYAAP9yBC8DSQAIABIAGwB6ALYA8QCcQJnu2QIEDmpdAgUI0LxwAwAFvqygdVJMRSMdCQEAs55AAwIBOi0CBgKVgAILAwdH59sCDkWCAQtECgEICQUJCAVtAAYCBwIGB20ADgAECQ4EYAAJCAAJVAAFDQEAAQUAYAACBgECVAwBAQAHAwEHYAADCwsDVAADAwtYAAsDC0zl48fGqqiLim1sZGJaWTQyKyoTFBQUExIPBRorATQmIgYUFjI2BTQmDgEXFBYyNgM0JiIGHgEyNgcVFAYPAQYHFhcWFAcOASIvAQYHBgcGKwEiJjUnJicHBiInJjU0Nz4BNyYvAS4BPQE0Nj8BNjcmJyY0Nz4BMzIfATY3Njc2OwEyFh8BFhc3NjIXFhUUDwEGBxYfAR4BARUUBwYHFhUUBwYjIi8BBiInDgEHIicmNTQ3JicmPQE0NzY3JjU0PwE2MzIWFzcXNj8BMhcWFRQHFhcWERUUBwYHFhUUBwYjIiYnBiInDgEiJyY1NDcmJyY9ATQ3NjcmNTQ/ATYzMhYXNxc2PwEyFxYVFAcWFxYB9FR2VFR2VAGtLDgsASo6LAEsOCwBKjos2AgEVwYMEx8EBAxEEAVAFRYGBwQNaAYKDRMXQgQNBlAEBSQIDQdVBQgIBVYHCxMfBAQMRAoGBkATGAYHAw1oBgoBDRMXQQUNBVEEGBEIDQZVBgYBZlMGChwCRAEFFR0LDAsHLAMBRAMdCgdTUwcKHQM0EAEEKggRERwXBAJDAhwJB1NTBgocAkQBBSoICwwLBywERAMdCgdTUwcKHQM0EAEEKggRERwXBAJDAhwJB1MBXjtUVHZUVOMdLAIoHx0qKgJZHSoqOyoqzWcGCgEOExcbJQYMBBFCBDILBjwbDQgGVQYMMgQESw8FBQgsDBgWDQEIB2gFCgEOExcbJQYMBRBCBDIKCDwaDQgGVQYLMQQESw8EBh4VDRsTDAII/s9OCQgPDj8OAgIoGyUBAQs0ASgCAg4/Dg8ICU4JCRANPw4CAh4JNAwBASgXAScCAg4/DRAJAjNOCQkPDj8OAgInNAwBAQw0JwICDj8ODwkJTgkIEA0/DgICHgk0CwEBJxcBJwICDj8NEAgAAAMAAP+AAvgDQAALAB8AKwGYtQMBAAIBR0uwCVBYQCgABwUEBAdlAAACAQIAAW0GAQQAAgAEAmEABQUDWAADAwxIAAEBDQFJG0uwClBYQCYABwUEBAdlAAACAQIAAW0AAwAFBwMFYAYBBAACAAQCYQABAQ0BSRtLsA5QWEAoAAcFBAQHZQAAAgECAAFtBgEEAAIABAJhAAUFA1gAAwMMSAABAQ0BSRtLsA9QWEAmAAcFBAQHZQAAAgECAAFtAAMABQcDBWAGAQQAAgAEAmEAAQENAUkbS7ATUFhAKAAHBQQEB2UAAAIBAgABbQYBBAACAAQCYQAFBQNYAAMDDEgAAQENAUkbS7AVUFhAKQAHBQQFBwRtAAACAQIAAW0GAQQAAgAEAmEABQUDWAADAwxIAAEBDQFJG0uwF1BYQCcABwUEBQcEbQAAAgECAAFtAAMABQcDBWAGAQQAAgAEAmEAAQENAUkbQC4ABwUEBQcEbQAAAgECAAFtAAEBbgADAAUHAwVgBgEEAgIEUgYBBAQCWQACBAJNWVlZWVlZWUALERIyEjgaFREIBRwrExYgNwMOAiIuAScBHgEdARQGICY9ATQ2PwE2OwEyFwczLgErASIPATM3MzJ6AaB6NgJChpSERAIBsl6A4P7I4IBeKhYwXDQSDFRcGhJmFgpqVEBSAcpGRv4aDiwqKiwOAxISSiIKOlJSOgoiShIwGhqgbiAQfkIAAAAAAgAA/7oDSAMCAAgAFABEQEEFAQMEAgQDAm0GAQIHBAIHawgBAAAEAwAEXgAHAQEHUgAHBwFYAAEHAUwBABQTEhEQDw4NDAsKCQUEAAgBCAkFFCsBMhYQBiAmEDYTMzUjNSMVIxUzFTMBpK729v6k9vbiyMhmyspmAwL2/qT29gFc9v4qZsrKZsoAAAACAAD/ugNIAwIACAAMACZAIwQBAAIAbwACAwJvAAMBA28AAQFmAQAMCwoJBQQACAEIBQUUKwEyFhAGICYQNgEhFSEBpK729v6k9vYBqv4IAfgDAvb+pPb2AVz2/pBmAAABAAD/zwODAwsAHgAgQB0YDwIAAQFHAAIBAm8DAQEAAW8AAABmFTUXFAQFGCsBFAcBBiInASY0PwE2Mh8BETQ2NzMyFhURNzYyHwEWA4MV/pUWOhX+lRUVKRY6FaQqHkcdKqUUOxYpFQGCHhT+lBUVAWwUOxYpFRWkAYkdKgEsHP53pBUVKRYAAQAA/7EDgwLnAB4AIEAdEAcCAAMBRwADAANvAgEAAQBvAAEBZhcVNRQEBRgrARQPAQYiLwERFAYHIyImNREHBiIvASY0NwE2MhcBFgODFSkWOxSlKB9HHiqkFDwUKhUVAWsUPBUBaxUBNBwWKhUVpP53HSQBJhwBiaQVFSoVOxUBaxUV/pUWAAX/+v9qA+kDWAAfADwAWgB4AJgAQkA/agEFA5MBBAICRysBAEUAAAEAbwABAwFvAAMFA28AAgUEBQIEbQAFBQRYAAQEDQRJkY9/fXVzZ2VKSDAuBgUUKzcxIy4BJyY2Nz4BFzIVFx4BBw4BBwYWFxYPAQYmJyI1EzE1Njc2Nz4BFxYVBw4BJyMGBw4BBwYiLwEuATclMTMWFxYXHgEXFgYHJyImJyYvASYnJicmPwE+ARcTMTAxBgcGBw4BBwYmLwImNjc+ATc2NzYzFzIWFQExMDEGIyInLgEnJjQ/ATYWFxYXFhcWNzIfARYGBwYjLgELEwYOESACCQQCUAQCAgcLAwgMEwMHUAQJAwF4FRkdFkOYTgogAQgEKBoOM18oAwgDTwQBAwJOARgaEB44TBACBgVmBAYBAgcFCQYwWQcCHwEJBfYGCQwKIWlDBAoCAR4BAwQQIQ1LGgMIYgUG/koeHiIZTY06BARSBAkDFAwWDF5qCQMdAgQFAQKQGDwdS5hHBAMCATsCCAQQKRQyZzAIBTgDAgQCAj4BExIUCyYfCQILYAQEAQICCCshAgI6AgoEQg4SDBo0hkwFBwEBBQQKEw4VCl44BAlcBAUC/egeGyAXRnEmAgIEAl4ECAIKGw1JZwgBBgX+cgMECT81AwkEOwIBAxAHDgYvBghcBAgCAQAAAAEAAP/3A4gCwwAvAE1ASi4sKiACBQUGGQEEBRYSAgMECwEBAgRHAAYFBm8ABQQFbwAEAwRvAAMCA28AAgECbwABAAABVAABAQBYAAABAEwkFhYjESIoBwUbKwEGBxUUDgMnIicWMzI3LgEnFjMyNy4BPQEWFy4BNDceARcmNTQ2NzIXNjcGBzYDiCU1KlZ4qGGXfRMYfmI7XBITDxgYP1ImLCUsGUTAcAVqSk81PTYVOzQCbjYnF0mQhmRAAlECTQFGNgMGDWJCAhUCGU5gKlNkBRUUS2gBOQwgQCQGAAAAAQAA/7ECFwNSABQALUAqAAEABgFHAAMCA3AFAQEEAQIDAQJeAAAABlgABgYMAEkjERERERMhBwUbKwEVIyIGHQEzByMRIxEjNTM1NDYzMgIXVzAipBaOq46OdGFSA0uTKChqpf5YAailemhyAAAAAAMAAP/5A1oCxAAPAB8ALwA3QDQoAQQFCAACAAECRwAFAAQDBQRgAAMAAgEDAmAAAQAAAVQAAQEAWAAAAQBMJjUmNSYzBgUaKyUVFAYHISImJzU0NjchMhYDFRQGJyEiJic1NDYXITIWAxUUBiMhIiYnNTQ2FyEyFgNZFBD87w8UARYOAxEPFgEUEPzvDxQBFg4DEQ8WARQQ/O8PFAEWDgMRDxZkRw8UARYORw8UARYBEEgOFgEUD0gOFgEUAQ5HDhYWDkcPFgEUAAAAAAL////VAjwC5wAOAB0AI0AgAAEAAQFHAAMCA28AAgECbwABAAFvAAAAZhU0JhQEBRgrJRQPAQYiLwEmNDY3ITIWJxQGIyEiLgE/ATYyHwEWAjsK+gscC/oLFg4B9A4WARQP/gwPFAIM+goeCvoK8w8K+gsL+goeFAEWyA4WFhwL+gsL+goAAAADAAD/zANZAv8AAwAOACoASkBHIgEFAQFHBwkCAQgFCAEFbQYEAgAFAHAAAwACCAMCYAAIAQUIVAAICAVYAAUIBUwAACknISAcGxYUERANDAkGAAMAAxEKBRUrExEjETcUBisBIiY0NjIWAREjETQmIyIGBwYVESM2PQEnMxUjPgM3MhbDuMQ6LgEuODpcOAKLty4wIy4NBrgBAbgBCxgmPCJfdAH1/dcCKaspNjZSNjb+QP7DASg7QiYdERz+y9+KpRtQEhogEAF+AAAC////+QQwAwsAGAAzAEJAPyoBAQYxIwUDAAECRwAGBQEFBgFtAgEAAQMBAANtAAUAAQAFAWAAAwQEA1QAAwMEWAAEAwRMIyg2FhQjIgcFGysBNCYrATU0JisBIgYdASMiBhQfARYyPwE2BRQGByEiJjc0NjcnNDYzMhYXNjMyFhUUBx4BAsoKCH0KB2wHCn0ICgXEBRAFxAUBZXxa/aFnlAFOQgGodleQISg1O1QXSF4BTAgKxAgKCgjEChAFxAUFxAZ2WXwBkmhIfB4YdqhiUCNUOysiEXYAAAAAAv////kEMAMLABgAMwBFQEIqAQAGMSMCAQANAQIBA0cABgUABQYAbQMBAQACAAECbQAFAAABBQBgAAIEBAJUAAICBFgABAIETCMoNRQjJRQHBRsrATQvASYiDwEGFBY7ARUUFjsBMjY9ATMyNgUUBgchIiY3NDY3JzQ2MzIWFzYzMhYVFAceAQLKBcQFEAXEBQoIfQoHbAcKfQgKAWV8Wv2hZ5QBTkIBqHZXkCEoNTtUF0heAXAIBcQFBcQGDwrECAoKCMQKmVl8AZJoSHweGHaoYlAjVDsrIhF2AAMAAP+5BBYCugAUACQAOQAeQBsuEQIAAQFHAwEBAAFvAgEAAGY1NCgnFxIEBRYrJQcGIicBJjQ3ATYyHwEWFA8BFxYUAQMOAS8BLgE3Ez4BHwEeAQkBBiIvASY0PwEnJjQ/ATYyFwEWFAFYHAUOBv78BgYBBAUQBBwGBtvbBgFE0AIOBiIIBgHRAgwHIwcIAWz+/AYOBhwFBdvbBQUcBg4GAQQFRRwFBQEFBQ4GAQQGBhwFEATc2wYOAk79LwcIAwkDDAgC0AgGAQoCDv6P/vsFBRwGDgbb3AUOBhwGBv78BRAAAAsAAP9qA0oDUgAJAA8AFwAqADsAVwBfAHgAhACUAKYDVEAkpaGEfnsFFhWYARsWMQEBCQYBAgFWPjwgHAUGABI2KgIHAAZHS7AJUFhAdB8BGxYdFhsdbQYBBAUJBQQJbRMNCwMJAQUJYw8IAgcADAwHZSQjIQMeABUWHhVgIgEWIAEdGRYdYAAZDgEFBBkFXgMBAQACEgECXgASEQoCAAcSAGAcARoaDEgUEAIMDBdZABcXDUgUEAIMDBhZABgYDRhJG0uwClBYQIAkIwIhHhUeIRVtHwEbFh0WGx1tBgEEBQ0FBA1tEwENCQUNYwsBCQEFCWMPCAIHAAwMB2UAHgAVFh4VYCIBFiABHRkWHWAAGQ4BBQQZBV4DAQEAAhIBAl4AEhEKAgAHEgBgHAEaGgxIFBACDAwXWQAXFw1IFBACDAwYWQAYGA0YSRtLsAtQWEBqBgEEBQkFBAltEw0LAwkBBQljJCMhAx4AFRYeFWAiARYgHx0DGxkWG2AAGQ4BBQQZBV4DAQEAAhIBAl4AEhEKAgAHEgBgHAEaGgxIFBAPDAgFBwcXWAAXFw1IFBAPDAgFBwcYWAAYGA0YSRtLsA5QWEB0HwEbFh0WGx1tBgEEBQkFBAltEw0LAwkBBQljDwgCBwAMDAdlJCMhAx4AFRYeFWAiARYgAR0ZFh1gABkOAQUEGQVeAwEBAAISAQJeABIRCgIABxIAYBwBGhoMSBQQAgwMF1kAFxcNSBQQAgwMGFkAGBgNGEkbS7AmUFhAdR8BGxYdFhsdbQYBBAUJBQQJbRMNCwMJAQUJAWsPCAIHAAwMB2UkIyEDHgAVFh4VYCIBFiABHRkWHWAAGQ4BBQQZBV4DAQEAAhIBAl4AEhEKAgAHEgBgHAEaGgxIFBACDAwXWQAXFw1IFBACDAwYWQAYGA0YSRtAbx8BGxYdFhsdbQYBBAUJBQQJbRMNCwMJAQUJAWsPCAIHAAwMB2UkIyEDHgAVFh4VYCIBFiABHRkWHWAAGQ4BBQQZBV4DAQEAAhIBAl4AEhEKAgAHEgBgABcYDBdVHAEaGgxIFBACDAwYWQAYGA0YSVlZWVlZQEaVlZWmlaakoqCfm5mXlpKRiomDgn18enlzcmdmZWRfXltaU1JLSkZFQ0E5NzU0MzIwLykoJCMfHRsaERERERESEiMiJQUdKyUVFCMiJzU2MzIXFSM1NDIlMzUjFTMROwIRIxUGIyInJj0BIxUUFxYyPwE1NCcmIgc1IxEzNRYzMjc2NzUjFAcGIyI9ATM1NCcmIgcGHQEUFxYyNzY3NgE1NCIdARQyARQHDgEHBiAnLgEnJhA3PgE3NiAXHgEXFgEzBxUjNSYnJiczHwEVFAcGIicmPQE0NzYyFxY3ESM1BiMiJyY9ATMVFjMyNzUCHhYNDAwNFr0zMv3lPK47N6EyMhEPCgEBMgUHNB7wBQo6GDIyGRseCgW8MwEEEhpkDxZLFg8QFk4UCgIB/q0wMAGRDggyIGb+YmcgMgcPDwcyIGcBnmYhMgcO/dM5QzgIGhUQPCf1EBVLFg8PFksVELszHhwZCAQzAgoPEZx2JQyoDCYZGSZUNDT+wgEU0xcLAhLL2hwNFSI1bikOHx55/o4bHx8PLwcdBRQmMTksFRwcFSxgLBUdHg8PBQIZdScndSf+hINAIS4CDAwDLCI+AQhAIS4DCwsELCI+AkPfl5cqTTkvkydhLhQdHRUtYS0VHBwVLv7pHyMVDR3c4QwY1QAAAAAFAAD/sQNZAwsACAARABoAVABtAGNAYBIBAwUBRwAKAgcHCmUADQsOAgYFDQZgAAUABAAFBGAAAwAAAQMAYAABAAIKAQJgCQgCBwwMB1QJCAIHBwxZAAwHDE0gG2plXllSUT08Ojk4NzY1G1QgUxMUExQTEg8FGisBNCYiDgEWMjY3FAYuAT4CFjcUBiIuATYyFiUiKwEiDgEHDgEHDgIWBhYGFhQfAR4BFx4BMhY2FjYWPgE3PgE3PgImNiY2JjQvAS4BJy4BIiYGARQHDgEHBiInLgEnJhA3PgE3NiAXHgEXFgI7UnhSAlZ0VkuAtoICfrp8Px4sHAIgKCL+5gQnOxRELhEcKgwGCAQCAgICAgYKDCocEDBCKkwKSixANA0cLAoGCAQCAgICAgYKCyodEC5GJlABqgMFgHMy/jJ0gAUDAwWAdDEBADF0fgYDAV47VFR2VFQ7W4ICfrp+AoKKFR4eKh4eZgQGCAsqHBAwRCZQBlAmRBgoHCoLBgoEBAQEBAgCCgsqHBAwRCZQBlAmRBgoHCoLBgoEBP6igDF0gAUDAwZ+dTEBADF0gAUDAwZ+dTEAAv///2oD6ANSAA8AKAA0QDEcEwIDAQFHAAEAAwABA20AAwIAAwJrBAEAAAxIAAICDQJJAQAiIBgWCggADwEPBQUUKwEyFgcUBwIHBiMiLgE3ATYBHgEfARYGIyIuAjcXHgIzMjc+BAOFJzwBGblLNkNHZAE0AWQh/iwWSi8BApR5RGpAIgEXEyAgChcIDiQqODoDUjQnIzH+oUUzaI4vAUMe/b8qPgsodpY0WnJCEQ4WEhQlNCAWBgAAAAABAAD/sQLKA1MASgA/QDwjAQUCEwEBAwJHHAEBRAACBAUEAgVtAAUDBAUDawADAAEDAVwABAQAWAAAAAwESUVEOzkxLyknKCUGBRYrETQ+AxcyHgEVFA4DJyImJwcOBQ8BJyY1NDY/ASY1NDY3MhYVFA4BFjMyPgQ3NCYjIgYVFB4CFRQGIycuAypKYG46WJheFDBAYDomShEPCggOEBIiEgcFCRgZHRI6LSImMAEyJB80JBoQBgF6Y2+WDhAOEA0JHSwYDAIFPGpQOh4BSo5ZNmZgRi4CJB8/KRg4FjAoHAMGWBEzgGFxJDovUAEuIiWKRy4cMDpAPBpgbJBvGS4aGgQPMgEJLD46AAAAA////2oD6ANSAA8AHwA7AIRADyMBBAUrAQIGAAkBAQcDR0uwDFBYQCwABAUDBQRlAAMAAAYDAGAABgAHAQYHYAAFBQhYAAgIDEgAAQECWAACAg0CSRtALQAEBQMFBANtAAMAAAYDAGAABgAHAQYHYAAFBQhYAAgIDEgAAQECWAACAg0CSVlADDUhJhQTNTYXIwkFHSsFETQmIyEiBhURFBYXITI2ExEUBiMhIiYnETQ2FyEyFicVIzU0JichIgYHERQWOwEVIyImNxE0NjMhMhYDoQwG/aEICgoIAl8HCkg0Jf2hJTQBNiQCXyU01kgKCP2hBwoBDAZaWiQ2ATQlAl8lNj0CXwgKCgj9oQcKAQwCZf2hJTQ0JQJfJTYBNLFaWgcKAQwG/aEICkg2JAJfJTQ0AAABAAAAAQAA9YeAfF8PPPUACwPoAAAAANuNEP4AAAAA240Q/v/6/2oEMANYAAAACAACAAAAAAAAAAEAAANS/2oAAAQv//r/+gQwAAEAAAAAAAAAAAAAAAAAAAAwA+gAAAOgAAAD6AAAAxEAAAMRAAADEQAAA1n//QNZAAADWQAAA+gAAAPoAAAEL///A6AAAAFlAAAEL///AsoAAAPoAAADoAAAA40AAAI7AAACggAAA+gAAAPoAAADWQAAA6AAAAPoAAACygAAA+gAAAQvAAAC+AAAA0gAAANIAAADoAAAA6AAAAPo//oDoAAAAjsAAANZAAACO///A1kAAAQv//8EL///BC8AAANZAAADWQAAA+j//wLKAAAD6P//AAAAAACCALoBBAFMAXYB/AKAA0IDugPwBEgEzAT0BbgF/AYcBoQG6AcQB1gH6AiaCTAJtAnqCioLbg0SDiQOag6aDt4PIhAkEJQQzBEyEXYR3BJKErgTKhW6FpQW8hd4GBIAAAABAAAAMADyAAsAAAAAAAIASgBaAHMAAAD+C3AAAAAAAAAAEgDeAAEAAAAAAAAANQAAAAEAAAAAAAEABgA1AAEAAAAAAAIABwA7AAEAAAAAAAMABgBCAAEAAAAAAAQABgBIAAEAAAAAAAUACwBOAAEAAAAAAAYABgBZAAEAAAAAAAoAKwBfAAEAAAAAAAsAEwCKAAMAAQQJAAAAagCdAAMAAQQJAAEADAEHAAMAAQQJAAIADgETAAMAAQQJAAMADAEhAAMAAQQJAAQADAEtAAMAAQQJAAUAFgE5AAMAAQQJAAYADAFPAAMAAQQJAAoAVgFbAAMAAQQJAAsAJgGxQ29weXJpZ2h0IChDKSAyMDIwIGJ5IG9yaWdpbmFsIGF1dGhvcnMgQCBmb250ZWxsby5jb216d2lpY29SZWd1bGFyendpaWNvendpaWNvVmVyc2lvbiAxLjB6d2lpY29HZW5lcmF0ZWQgYnkgc3ZnMnR0ZiBmcm9tIEZvbnRlbGxvIHByb2plY3QuaHR0cDovL2ZvbnRlbGxvLmNvbQBDAG8AcAB5AHIAaQBnAGgAdAAgACgAQwApACAAMgAwADIAMAAgAGIAeQAgAG8AcgBpAGcAaQBuAGEAbAAgAGEAdQB0AGgAbwByAHMAIABAACAAZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AegB3AGkAaQBjAG8AUgBlAGcAdQBsAGEAcgB6AHcAaQBpAGMAbwB6AHcAaQBpAGMAbwBWAGUAcgBzAGkAbwBuACAAMQAuADAAegB3AGkAaQBjAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAECAQMBBAEFAQYBBwEIAQkBCgELAQwBDQEOAQ8BEAERARIBEwEUARUBFgEXARgBGQEaARsBHAEdAR4BHwEgASEBIgEjASQBJQEmAScBKAEpASoBKwEsAS0BLgEvATABMQAGbG9nb3V0BWNoZWNrBmNhbmNlbARwbHVzBW1pbnVzBGhlbHAGcGVuY2lsBGdlYXIDZXllAnVwBmZvbGRlcghkb3dubG9hZARsZWZ0BXVzZXJzBHVzZXIHY29tbWVudARob21lBG1pbWkEZG93bgRsb2NrBGNoYXQHZXllLW9mZgZ1cGRhdGUGdXBsb2FkCWRvd24tb3BlbglsZWZ0LW9wZW4EY29ncwdjb2ctYWx0BXRyYXNoDHBsdXMtY2lyY2xlZA1taW51cy1jaXJjbGVkCGRvd24tYmlnBnVwLWJpZwRzcGluB3R3aXR0ZXIIZmFjZWJvb2sEbWVudQRzb3J0CGxpbmtlZGluDmRvd25sb2FkLWNsb3VkDHVwbG9hZC1jbG91ZARjb2RlB3lvdXR1YmUJaW5zdGFncmFtBWJydXNoCXBpbnRlcmVzdAVjbG9uZQAAAAABAAH//wAPAAAAAAAAAAAAAAAAAAAAAAAYABgAGAAYA1j/agNY/2qwACwgsABVWEVZICBLuAAOUUuwBlNaWLA0G7AoWWBmIIpVWLACJWG5CAAIAGNjI2IbISGwAFmwAEMjRLIAAQBDYEItsAEssCBgZi2wAiwgZCCwwFCwBCZasigBCkNFY0VSW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCxAQpDRWNFYWSwKFBYIbEBCkNFY0UgsDBQWCGwMFkbILDAUFggZiCKimEgsApQWGAbILAgUFghsApgGyCwNlBYIbA2YBtgWVlZG7ABK1lZI7AAUFhlWVktsAMsIEUgsAQlYWQgsAVDUFiwBSNCsAYjQhshIVmwAWAtsAQsIyEjISBksQViQiCwBiNCsQEKQ0VjsQEKQ7ABYEVjsAMqISCwBkMgiiCKsAErsTAFJbAEJlFYYFAbYVJZWCNZISCwQFNYsAErGyGwQFkjsABQWGVZLbAFLLAHQyuyAAIAQ2BCLbAGLLAHI0IjILAAI0JhsAJiZrABY7ABYLAFKi2wBywgIEUgsAtDY7gEAGIgsABQWLBAYFlmsAFjYESwAWAtsAgssgcLAENFQiohsgABAENgQi2wCSywAEMjRLIAAQBDYEItsAosICBFILABKyOwAEOwBCVgIEWKI2EgZCCwIFBYIbAAG7AwUFiwIBuwQFlZI7AAUFhlWbADJSNhRESwAWAtsAssICBFILABKyOwAEOwBCVgIEWKI2EgZLAkUFiwABuwQFkjsABQWGVZsAMlI2FERLABYC2wDCwgsAAjQrILCgNFWCEbIyFZKiEtsA0ssQICRbBkYUQtsA4ssAFgICCwDENKsABQWCCwDCNCWbANQ0qwAFJYILANI0JZLbAPLCCwEGJmsAFjILgEAGOKI2GwDkNgIIpgILAOI0IjLbAQLEtUWLEEZERZJLANZSN4LbARLEtRWEtTWLEEZERZGyFZJLATZSN4LbASLLEAD0NVWLEPD0OwAWFCsA8rWbAAQ7ACJUKxDAIlQrENAiVCsAEWIyCwAyVQWLEBAENgsAQlQoqKIIojYbAOKiEjsAFhIIojYbAOKiEbsQEAQ2CwAiVCsAIlYbAOKiFZsAxDR7ANQ0dgsAJiILAAUFiwQGBZZrABYyCwC0NjuAQAYiCwAFBYsEBgWWawAWNgsQAAEyNEsAFDsAA+sgEBAUNgQi2wEywAsQACRVRYsA8jQiBFsAsjQrAKI7ABYEIgYLABYbUQEAEADgBCQopgsRIGK7ByKxsiWS2wFCyxABMrLbAVLLEBEystsBYssQITKy2wFyyxAxMrLbAYLLEEEystsBkssQUTKy2wGiyxBhMrLbAbLLEHEystsBwssQgTKy2wHSyxCRMrLbAeLACwDSuxAAJFVFiwDyNCIEWwCyNCsAojsAFgQiBgsAFhtRAQAQAOAEJCimCxEgYrsHIrGyJZLbAfLLEAHistsCAssQEeKy2wISyxAh4rLbAiLLEDHistsCMssQQeKy2wJCyxBR4rLbAlLLEGHistsCYssQceKy2wJyyxCB4rLbAoLLEJHistsCksIDywAWAtsCosIGCwEGAgQyOwAWBDsAIlYbABYLApKiEtsCsssCorsCoqLbAsLCAgRyAgsAtDY7gEAGIgsABQWLBAYFlmsAFjYCNhOCMgilVYIEcgILALQ2O4BABiILAAUFiwQGBZZrABY2AjYTgbIVktsC0sALEAAkVUWLABFrAsKrABFTAbIlktsC4sALANK7EAAkVUWLABFrAsKrABFTAbIlktsC8sIDWwAWAtsDAsALABRWO4BABiILAAUFiwQGBZZrABY7ABK7ALQ2O4BABiILAAUFiwQGBZZrABY7ABK7AAFrQAAAAAAEQ+IzixLwEVKi2wMSwgPCBHILALQ2O4BABiILAAUFiwQGBZZrABY2CwAENhOC2wMiwuFzwtsDMsIDwgRyCwC0NjuAQAYiCwAFBYsEBgWWawAWNgsABDYbABQ2M4LbA0LLECABYlIC4gR7AAI0KwAiVJiopHI0cjYSBYYhshWbABI0KyMwEBFRQqLbA1LLAAFrAEJbAEJUcjRyNhsAlDK2WKLiMgIDyKOC2wNiywABawBCWwBCUgLkcjRyNhILAEI0KwCUMrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyCwCEMgiiNHI0cjYSNGYLAEQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwAmIgsABQWLBAYFlmsAFjYSMgILAEJiNGYTgbI7AIQ0awAiWwCENHI0cjYWAgsARDsAJiILAAUFiwQGBZZrABY2AjILABKyOwBENgsAErsAUlYbAFJbACYiCwAFBYsEBgWWawAWOwBCZhILAEJWBkI7ADJWBkUFghGyMhWSMgILAEJiNGYThZLbA3LLAAFiAgILAFJiAuRyNHI2EjPDgtsDgssAAWILAII0IgICBGI0ewASsjYTgtsDkssAAWsAMlsAIlRyNHI2GwAFRYLiA8IyEbsAIlsAIlRyNHI2EgsAUlsAQlRyNHI2GwBiWwBSVJsAIlYbkIAAgAY2MjIFhiGyFZY7gEAGIgsABQWLBAYFlmsAFjYCMuIyAgPIo4IyFZLbA6LLAAFiCwCEMgLkcjRyNhIGCwIGBmsAJiILAAUFiwQGBZZrABYyMgIDyKOC2wOywjIC5GsAIlRlJYIDxZLrErARQrLbA8LCMgLkawAiVGUFggPFkusSsBFCstsD0sIyAuRrACJUZSWCA8WSMgLkawAiVGUFggPFkusSsBFCstsD4ssDUrIyAuRrACJUZSWCA8WS6xKwEUKy2wPyywNiuKICA8sAQjQoo4IyAuRrACJUZSWCA8WS6xKwEUK7AEQy6wKystsEAssAAWsAQlsAQmIC5HI0cjYbAJQysjIDwgLiM4sSsBFCstsEEssQgEJUKwABawBCWwBCUgLkcjRyNhILAEI0KwCUMrILBgUFggsEBRWLMCIAMgG7MCJgMaWUJCIyBHsARDsAJiILAAUFiwQGBZZrABY2AgsAErIIqKYSCwAkNgZCOwA0NhZFBYsAJDYRuwA0NgWbADJbACYiCwAFBYsEBgWWawAWNhsAIlRmE4IyA8IzgbISAgRiNHsAErI2E4IVmxKwEUKy2wQiywNSsusSsBFCstsEMssDYrISMgIDywBCNCIzixKwEUK7AEQy6wKystsEQssAAVIEewACNCsgABARUUEy6wMSotsEUssAAVIEewACNCsgABARUUEy6wMSotsEYssQABFBOwMiotsEcssDQqLbBILLAAFkUjIC4gRoojYTixKwEUKy2wSSywCCNCsEgrLbBKLLIAAEErLbBLLLIAAUErLbBMLLIBAEErLbBNLLIBAUErLbBOLLIAAEIrLbBPLLIAAUIrLbBQLLIBAEIrLbBRLLIBAUIrLbBSLLIAAD4rLbBTLLIAAT4rLbBULLIBAD4rLbBVLLIBAT4rLbBWLLIAAEArLbBXLLIAAUArLbBYLLIBAEArLbBZLLIBAUArLbBaLLIAAEMrLbBbLLIAAUMrLbBcLLIBAEMrLbBdLLIBAUMrLbBeLLIAAD8rLbBfLLIAAT8rLbBgLLIBAD8rLbBhLLIBAT8rLbBiLLA3Ky6xKwEUKy2wYyywNyuwOystsGQssDcrsDwrLbBlLLAAFrA3K7A9Ky2wZiywOCsusSsBFCstsGcssDgrsDsrLbBoLLA4K7A8Ky2waSywOCuwPSstsGossDkrLrErARQrLbBrLLA5K7A7Ky2wbCywOSuwPCstsG0ssDkrsD0rLbBuLLA6Ky6xKwEUKy2wbyywOiuwOystsHAssDorsDwrLbBxLLA6K7A9Ky2wciyzCQQCA0VYIRsjIVlCK7AIZbADJFB4sAEVMC0AS7gAyFJYsQEBjlmwAbkIAAgAY3CxAAVCsgABACqxAAVCswoCAQgqsQAFQrMOAAEIKrEABkK6AsAAAQAJKrEAB0K6AEAAAQAJKrEDAESxJAGIUViwQIhYsQNkRLEmAYhRWLoIgAABBECIY1RYsQMARFlZWVmzDAIBDCq4Af+FsASNsQIARAAA') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'zwiico'; - src: url('../font/zwiico.svg?4304870#zwiico') format('svg'); + src: url('../font/zwiico.svg?53857867#zwiico') format('svg'); } } */ @@ -26,7 +26,7 @@ font-family: "zwiico"; font-style: normal; font-weight: normal; - speak: none; + speak: never; display: inline-block; text-decoration: inherit; @@ -38,7 +38,7 @@ /* For safety - reset parent styles, that can break glyph codes*/ font-variant: normal; text-transform: none; - + /* fix buttons height, for twitter bootstrap */ line-height: 1em; @@ -81,8 +81,10 @@ .zwiico-cogs:before { content: '\e81a'; } /* '' */ .zwiico-cog-alt:before { content: '\e81b'; } /* '' */ .zwiico-trash:before { content: '\e81c'; } /* '' */ -.zwiico-edit:before { content: '\e81d'; } /* '' */ -.zwiico-flag:before { content: '\e81e'; } /* '' */ +.zwiico-plus-circled:before { content: '\e81d'; } /* '' */ +.zwiico-minus-circled:before { content: '\e81e'; } /* '' */ +.zwiico-down-big:before { content: '\e820'; } /* '' */ +.zwiico-up-big:before { content: '\e821'; } /* '' */ .zwiico-spin:before { content: '\e831'; } /* '' */ .zwiico-twitter:before { content: '\f099'; } /* '' */ .zwiico-facebook:before { content: '\f09a'; } /* '' */ @@ -91,9 +93,9 @@ .zwiico-linkedin:before { content: '\f0e1'; } /* '' */ .zwiico-download-cloud:before { content: '\f0ed'; } /* '' */ .zwiico-upload-cloud:before { content: '\f0ee'; } /* '' */ -.zwiico-github:before { content: '\f113'; } /* '' */ .zwiico-code:before { content: '\f121'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ -.zwiico-pinterest:before { content: '\f231'; } /* '' */ \ No newline at end of file +.zwiico-pinterest:before { content: '\f231'; } /* '' */ +.zwiico-clone:before { content: '\f24d'; } /* '' */ \ No newline at end of file diff --git a/core/vendor/zwiico/css/zwiico-ie7-codes.css b/core/vendor/zwiico/css/zwiico-ie7-codes.css old mode 100755 new mode 100644 index f51a4e17..d22d9c6b --- a/core/vendor/zwiico/css/zwiico-ie7-codes.css +++ b/core/vendor/zwiico/css/zwiico-ie7-codes.css @@ -28,8 +28,10 @@ .zwiico-cogs { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-cog-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-edit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-minus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-down-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-up-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-spin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -38,9 +40,9 @@ .zwiico-linkedin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-download-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-upload-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-github { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-youtube { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-instagram { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-pinterest { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file +.zwiico-pinterest { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-clone { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/core/vendor/zwiico/css/zwiico-ie7.css b/core/vendor/zwiico/css/zwiico-ie7.css old mode 100755 new mode 100644 index 0a81c4b3..9a4a01c9 --- a/core/vendor/zwiico/css/zwiico-ie7.css +++ b/core/vendor/zwiico/css/zwiico-ie7.css @@ -39,8 +39,10 @@ .zwiico-cogs { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-cog-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-trash { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-edit { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-plus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-minus-circled { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-down-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-up-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-spin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -49,9 +51,9 @@ .zwiico-linkedin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-download-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-upload-cloud { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-github { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-code { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-youtube { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-instagram { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-brush { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-pinterest { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file +.zwiico-pinterest { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-clone { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } \ No newline at end of file diff --git a/core/vendor/zwiico/css/zwiico.css b/core/vendor/zwiico/css/zwiico.css old mode 100755 new mode 100644 index a583d0c7..dab0648a --- a/core/vendor/zwiico/css/zwiico.css +++ b/core/vendor/zwiico/css/zwiico.css @@ -1,11 +1,11 @@ @font-face { font-family: 'zwiico'; - src: url('../font/zwiico.eot?1220194'); - src: url('../font/zwiico.eot?1220194#iefix') format('embedded-opentype'), - url('../font/zwiico.woff2?1220194') format('woff2'), - url('../font/zwiico.woff?1220194') format('woff'), - url('../font/zwiico.ttf?1220194') format('truetype'), - url('../font/zwiico.svg?1220194#zwiico') format('svg'); + src: url('../font/zwiico.eot?5225631'); + src: url('../font/zwiico.eot?5225631#iefix') format('embedded-opentype'), + url('../font/zwiico.woff2?5225631') format('woff2'), + url('../font/zwiico.woff?5225631') format('woff'), + url('../font/zwiico.ttf?5225631') format('truetype'), + url('../font/zwiico.svg?5225631#zwiico') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'zwiico'; - src: url('../font/zwiico.svg?1220194#zwiico') format('svg'); + src: url('../font/zwiico.svg?5225631#zwiico') format('svg'); } } */ @@ -24,7 +24,7 @@ font-family: "zwiico"; font-style: normal; font-weight: normal; - speak: none; + speak: never; display: inline-block; text-decoration: inherit; @@ -84,8 +84,10 @@ .zwiico-cogs:before { content: '\e81a'; } /* '' */ .zwiico-cog-alt:before { content: '\e81b'; } /* '' */ .zwiico-trash:before { content: '\e81c'; } /* '' */ -.zwiico-edit:before { content: '\e81d'; } /* '' */ -.zwiico-flag:before { content: '\e81e'; } /* '' */ +.zwiico-plus-circled:before { content: '\e81d'; } /* '' */ +.zwiico-minus-circled:before { content: '\e81e'; } /* '' */ +.zwiico-down-big:before { content: '\e820'; } /* '' */ +.zwiico-up-big:before { content: '\e821'; } /* '' */ .zwiico-spin:before { content: '\e831'; } /* '' */ .zwiico-twitter:before { content: '\f099'; } /* '' */ .zwiico-facebook:before { content: '\f09a'; } /* '' */ @@ -94,9 +96,9 @@ .zwiico-linkedin:before { content: '\f0e1'; } /* '' */ .zwiico-download-cloud:before { content: '\f0ed'; } /* '' */ .zwiico-upload-cloud:before { content: '\f0ee'; } /* '' */ -.zwiico-github:before { content: '\f113'; } /* '' */ .zwiico-code:before { content: '\f121'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ -.zwiico-pinterest:before { content: '\f231'; } /* '' */ \ No newline at end of file +.zwiico-pinterest:before { content: '\f231'; } /* '' */ +.zwiico-clone:before { content: '\f24d'; } /* '' */ \ No newline at end of file diff --git a/core/vendor/zwiico/font/zwiico.eot b/core/vendor/zwiico/font/zwiico.eot old mode 100755 new mode 100644 index da88ec4c..4e2aebef Binary files a/core/vendor/zwiico/font/zwiico.eot and b/core/vendor/zwiico/font/zwiico.eot differ diff --git a/core/vendor/zwiico/font/zwiico.svg b/core/vendor/zwiico/font/zwiico.svg old mode 100755 new mode 100644 index 9c061d8f..7b3fbef9 --- a/core/vendor/zwiico/font/zwiico.svg +++ b/core/vendor/zwiico/font/zwiico.svg @@ -1,7 +1,7 @@ -Copyright (C) 2019 by original authors @ fontello.com +Copyright (C) 2020 by original authors @ fontello.com @@ -64,9 +64,13 @@ - + - + + + + + @@ -84,8 +88,6 @@ - - @@ -95,6 +97,8 @@ + + \ No newline at end of file diff --git a/core/vendor/zwiico/font/zwiico.ttf b/core/vendor/zwiico/font/zwiico.ttf old mode 100755 new mode 100644 index d71fdd68..a9aebf77 Binary files a/core/vendor/zwiico/font/zwiico.ttf and b/core/vendor/zwiico/font/zwiico.ttf differ diff --git a/core/vendor/zwiico/font/zwiico.woff b/core/vendor/zwiico/font/zwiico.woff old mode 100755 new mode 100644 index 71d554a5..2d4e3e71 Binary files a/core/vendor/zwiico/font/zwiico.woff and b/core/vendor/zwiico/font/zwiico.woff differ diff --git a/core/vendor/zwiico/font/zwiico.woff2 b/core/vendor/zwiico/font/zwiico.woff2 old mode 100755 new mode 100644 index 8f472ac5..c71c8576 Binary files a/core/vendor/zwiico/font/zwiico.woff2 and b/core/vendor/zwiico/font/zwiico.woff2 differ diff --git a/core/vendor/zwiico/png/a.png b/core/vendor/zwiico/png/a.png new file mode 100755 index 00000000..f4ef6eef Binary files /dev/null and b/core/vendor/zwiico/png/a.png differ diff --git a/core/vendor/zwiico/png/b.png b/core/vendor/zwiico/png/b.png new file mode 100755 index 00000000..e14be925 Binary files /dev/null and b/core/vendor/zwiico/png/b.png differ diff --git a/core/vendor/zwiico/png/c.png b/core/vendor/zwiico/png/c.png new file mode 100755 index 00000000..dcf2125d Binary files /dev/null and b/core/vendor/zwiico/png/c.png differ diff --git a/core/vendor/zwiico/png/d.png b/core/vendor/zwiico/png/d.png new file mode 100755 index 00000000..ca9f562a Binary files /dev/null and b/core/vendor/zwiico/png/d.png differ diff --git a/core/vendor/zwiico/png/e.png b/core/vendor/zwiico/png/e.png new file mode 100755 index 00000000..ea3f028b Binary files /dev/null and b/core/vendor/zwiico/png/e.png differ diff --git a/core/vendor/zwiico/png/f.png b/core/vendor/zwiico/png/f.png new file mode 100755 index 00000000..6bfdd37e Binary files /dev/null and b/core/vendor/zwiico/png/f.png differ diff --git a/core/vendor/zwiico/png/g.png b/core/vendor/zwiico/png/g.png new file mode 100755 index 00000000..a55422c1 Binary files /dev/null and b/core/vendor/zwiico/png/g.png differ diff --git a/core/vendor/zwiico/png/h.png b/core/vendor/zwiico/png/h.png new file mode 100755 index 00000000..5bc5592d Binary files /dev/null and b/core/vendor/zwiico/png/h.png differ diff --git a/core/vendor/zwiico/png/i.png b/core/vendor/zwiico/png/i.png new file mode 100755 index 00000000..2732d8c1 Binary files /dev/null and b/core/vendor/zwiico/png/i.png differ diff --git a/core/vendor/zwiico/png/j.png b/core/vendor/zwiico/png/j.png new file mode 100755 index 00000000..7dbaf189 Binary files /dev/null and b/core/vendor/zwiico/png/j.png differ diff --git a/core/vendor/zwiico/png/k.png b/core/vendor/zwiico/png/k.png new file mode 100755 index 00000000..61c2d295 Binary files /dev/null and b/core/vendor/zwiico/png/k.png differ diff --git a/core/vendor/zwiico/png/l.png b/core/vendor/zwiico/png/l.png new file mode 100755 index 00000000..4a88e131 Binary files /dev/null and b/core/vendor/zwiico/png/l.png differ diff --git a/core/vendor/zwiico/png/m.png b/core/vendor/zwiico/png/m.png new file mode 100755 index 00000000..747bc5c6 Binary files /dev/null and b/core/vendor/zwiico/png/m.png differ diff --git a/core/vendor/zwiico/png/n.png b/core/vendor/zwiico/png/n.png new file mode 100755 index 00000000..2961ad9d Binary files /dev/null and b/core/vendor/zwiico/png/n.png differ diff --git a/core/vendor/zwiico/png/o.png b/core/vendor/zwiico/png/o.png new file mode 100755 index 00000000..dfa61db1 Binary files /dev/null and b/core/vendor/zwiico/png/o.png differ diff --git a/core/vendor/zwiico/png/p.png b/core/vendor/zwiico/png/p.png new file mode 100755 index 00000000..c5d4377e Binary files /dev/null and b/core/vendor/zwiico/png/p.png differ diff --git a/core/vendor/zwiico/png/q.png b/core/vendor/zwiico/png/q.png new file mode 100755 index 00000000..fc4729dc Binary files /dev/null and b/core/vendor/zwiico/png/q.png differ diff --git a/core/vendor/zwiico/png/r.png b/core/vendor/zwiico/png/r.png new file mode 100755 index 00000000..c6d308ce Binary files /dev/null and b/core/vendor/zwiico/png/r.png differ diff --git a/core/vendor/zwiico/png/s.png b/core/vendor/zwiico/png/s.png new file mode 100755 index 00000000..7d93e6ac Binary files /dev/null and b/core/vendor/zwiico/png/s.png differ diff --git a/core/vendor/zwiico/png/t.png b/core/vendor/zwiico/png/t.png new file mode 100755 index 00000000..1d2b985b Binary files /dev/null and b/core/vendor/zwiico/png/t.png differ diff --git a/core/vendor/zwiico/png/u.png b/core/vendor/zwiico/png/u.png new file mode 100755 index 00000000..e2db2904 Binary files /dev/null and b/core/vendor/zwiico/png/u.png differ diff --git a/index.php b/index.php old mode 100755 new mode 100644 index 19518a72..e0dfd752 --- a/index.php +++ b/index.php @@ -11,7 +11,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** @@ -28,6 +28,7 @@ setlocale (LC_TIME, 'fra_FRA', 'french'); /** * Initialisation de Zwii */ + session_start(); // Chargement des classes require 'core/class/autoload.php'; diff --git a/module/blog/blog.php b/module/blog/blog.php old mode 100755 new mode 100644 index d53d50fc..d06f43b8 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class blog extends common { @@ -504,12 +504,12 @@ class blog extends common { else { // Soumission du formulaire if($this->isPost()) { - // Check la capcha + // Check la captcha if( $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') - AND $this->getInput('blogArticleCapcha', helper::FILTER_INT) !== $this->getInput('blogArticleCapchaFirstNumber', helper::FILTER_INT) + $this->getInput('blogArticleCapchaSecondNumber', helper::FILTER_INT)) + AND $this->getInput('blogArticlecaptcha', helper::FILTER_INT) !== $this->getInput('blogArticlecaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('blogArticlecaptchaSecondNumber', helper::FILTER_INT)) { - self::$inputNotices['blogArticleCapcha'] = 'Incorrect'; + self::$inputNotices['blogArticlecaptcha'] = 'Incorrect'; } // Crée le commentaire $commentId = helper::increment(uniqid(), $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'comment'])); diff --git a/module/blog/view/add/add.css b/module/blog/view/add/add.css index 74fce65d..2aa6edae 100755 --- a/module/blog/view/add/add.css +++ b/module/blog/view/add/add.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/add/add.js.php b/module/blog/view/add/add.js.php old mode 100755 new mode 100644 index aca2fb5f..be4e7ac0 --- a/module/blog/view/add/add.js.php +++ b/module/blog/view/add/add.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/blog/view/add/add.php b/module/blog/view/add/add.php old mode 100755 new mode 100644 diff --git a/module/blog/view/article/article.js.php b/module/blog/view/article/article.js.php old mode 100755 new mode 100644 index 9c5d795f..0d0fb3e9 --- a/module/blog/view/article/article.js.php +++ b/module/blog/view/article/article.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/blog/view/article/article.php b/module/blog/view/article/article.php old mode 100755 new mode 100644 index 1bf1ba9e..942e4838 --- a/module/blog/view/article/article.php +++ b/module/blog/view/article/article.php @@ -93,6 +93,31 @@ ]); ?>
    + + 'Commentaire', + 'maxlength' => '500' + ]); ?> + getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')): ?> +
    +
    + +
    +
    + +
    +
    + 'buttonGrey', + 'value' => 'Annuler' + ]); ?> +
    +
    + 'Envoyer', + 'ico' => '' + ]); ?> +
    diff --git a/module/blog/view/comment/comment.css b/module/blog/view/comment/comment.css index 74fce65d..2aa6edae 100755 --- a/module/blog/view/comment/comment.css +++ b/module/blog/view/comment/comment.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/comment/comment.js.php b/module/blog/view/comment/comment.js.php old mode 100755 new mode 100644 index 4d83befb..e79aae5b --- a/module/blog/view/comment/comment.js.php +++ b/module/blog/view/comment/comment.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/comment/comment.php b/module/blog/view/comment/comment.php old mode 100755 new mode 100644 diff --git a/module/blog/view/config/config.css b/module/blog/view/config/config.css index 74fce65d..2aa6edae 100755 --- a/module/blog/view/config/config.css +++ b/module/blog/view/config/config.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/config/config.js.php b/module/blog/view/config/config.js.php old mode 100755 new mode 100644 index 5096f9bd..df6138c0 --- a/module/blog/view/config/config.js.php +++ b/module/blog/view/config/config.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php old mode 100755 new mode 100644 diff --git a/module/blog/view/edit/edit.css b/module/blog/view/edit/edit.css index 74fce65d..2aa6edae 100755 --- a/module/blog/view/edit/edit.css +++ b/module/blog/view/edit/edit.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/edit/edit.js.php b/module/blog/view/edit/edit.js.php old mode 100755 new mode 100644 index f7be9c2f..0297425d --- a/module/blog/view/edit/edit.js.php +++ b/module/blog/view/edit/edit.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/blog/view/edit/edit.php b/module/blog/view/edit/edit.php old mode 100755 new mode 100644 index 56d507ef..d6ff0965 --- a/module/blog/view/edit/edit.php +++ b/module/blog/view/edit/edit.php @@ -37,7 +37,7 @@
    -
    +
    'Taille optimale de l\'image de couverture : ' . ((int) substr($this->getData(['theme', 'site', 'width']), 0, -2) - (20 * 2)) . ' x 350 pixels.', 'label' => 'Image de couverture', @@ -45,13 +45,13 @@ 'value' => $this->getData(['module', $this->getUrl(0), $this->getUrl(2), 'picture']) ]); ?>
    -
    +
    'Largeur de l\'image', 'selected' => $this->getData(['module', $this->getUrl(0), $this->getUrl(2), 'pictureSize']) ]); ?>
    -
    +
    'Position', 'selected' => $this->getData(['module', $this->getUrl(0), $this->getUrl(2), 'picturePosition']), diff --git a/module/blog/view/index/index.php b/module/blog/view/index/index.php old mode 100755 new mode 100644 diff --git a/module/form/form.php b/module/form/form.php old mode 100755 new mode 100644 index 2784ebdf..6a0f2714 --- a/module/form/form.php +++ b/module/form/form.php @@ -11,7 +11,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class form extends common { @@ -32,7 +32,7 @@ class form extends common { public static $pagination; - const FORM_VERSION = '2.3'; + const FORM_VERSION = '2.4'; // Objets const TYPE_MAIL = 'mail'; @@ -71,23 +71,17 @@ class form extends common { // Soumission du formulaire if($this->isPost()) { // Configuration - // Option sélectionnée sans page choisie - $pageId = ''; - if ($this->getInput('formConfigPageId') !== "") { - // Option désactivée, réinitialiser l'id de la page sélectionnée. - $pageId = $this->getInput('formConfigPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formConfigPageId', helper::FILTER_ID) : ''; - } $this->setData([ 'module', $this->getUrl(0), 'config', [ 'button' => $this->getInput('formConfigButton'), - 'capcha' => $this->getInput('formConfigCapcha', helper::FILTER_BOOLEAN), + 'captcha' => $this->getInput('formConfigcaptcha', helper::FILTER_BOOLEAN), 'group' => $this->getInput('formConfigGroup', helper::FILTER_INT), 'user' => self::$listUsers [$this->getInput('formConfigUser', helper::FILTER_INT)], 'mail' => $this->getInput('formConfigMail') , - 'pageId' => $pageId, + 'pageId' => $this->getInput('formConfigPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formConfigPageId', helper::FILTER_ID) : '', 'subject' => $this->getInput('formConfigSubject'), 'replyto' => $this->getInput('formConfigMailReplyTo', helper::FILTER_BOOLEAN) ] @@ -285,12 +279,12 @@ class form extends common { public function index() { // Soumission du formulaire if($this->isPost()) { - // Check la capcha + // Check la captcha if( - $this->getData(['module', $this->getUrl(0), 'config', 'capcha']) - AND $this->getInput('formCapcha', helper::FILTER_INT) !== $this->getInput('formCapchaFirstNumber', helper::FILTER_INT) + $this->getInput('formCapchaSecondNumber', helper::FILTER_INT)) + $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) + AND $this->getInput('formcaptcha', helper::FILTER_INT) !== $this->getInput('formcaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('formcaptchaSecondNumber', helper::FILTER_INT)) { - self::$inputNotices['formCapcha'] = 'Incorrect'; + self::$inputNotices['formcaptcha'] = 'Incorrect'; } // Préparation le contenu du mail @@ -382,7 +376,10 @@ class form extends common { $this->addOutput([ 'notification' => ($sent === true ? 'Formulaire soumis' : $sent), 'redirect' => $redirect ? helper::baseUrl() . $redirect : '', - 'state' => ($sent === true ? true : null) + 'state' => ($sent === true ? true : null), + 'vendor' => [ + 'flatpickr' + ], ]); } // Valeurs en sortie @@ -390,6 +387,9 @@ class form extends common { 'showBarEditButton' => true, 'showPageContent' => true, 'view' => 'index', + 'vendor' => [ + 'flatpickr' + ], ]); } } diff --git a/module/form/view/config/config.js.php b/module/form/view/config/config.js.php old mode 100755 new mode 100644 index 8b4d4fb0..37afae73 --- a/module/form/view/config/config.js.php +++ b/module/form/view/config/config.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php old mode 100755 new mode 100644 index 47ada59d..85db7110 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -37,13 +37,13 @@ 'displayNone formConfigLabelWrapper' ]); ?> -
    +
    'Liste des valeurs séparées par des virgules (valeur1,valeur2,...)', 'class' => 'formConfigValues', 'classWrapper' => 'displayNone formConfigValuesWrapper' - ]); ?> + ]); ?>
    @@ -82,8 +82,8 @@ !empty($this->getData(['module', $this->getUrl(0), 'config', 'user'])) || !empty($this->getData(['module', $this->getUrl(0), 'config', 'mail'])), 'help' => 'Sélectionnez au moins un groupe, un utilisateur ou saississez un email. Votre serveur doit autoriser les envois de mail.' - ]); ?> -
    + ]); ?> +
    $this->getData(['module', $this->getUrl(0), 'config', 'subject']) ]); ?>
    -
    - +
    @@ -110,7 +110,7 @@ 'label' => 'A un membre', 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) ]); ?> -
    +
    'A une adresse email', @@ -124,7 +124,7 @@ (bool) $this->getData(['module', $this->getUrl(0), 'config', 'replyto']), 'help' => 'Cette option permet de réponse drectement à l\'expéditeur du message si celui-ci a indiqué un email valide.' - ]); ?> + ]); ?>
    @@ -141,9 +141,9 @@ 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) ]); ?>
    -
    - $this->getData(['module', $this->getUrl(0), 'config', 'capcha']) +
    + $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) ]); ?>
    diff --git a/module/form/view/data/data.css b/module/form/view/data/data.css index 74fce65d..2aa6edae 100755 --- a/module/form/view/data/data.css +++ b/module/form/view/data/data.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/form/view/data/data.js.php b/module/form/view/data/data.js.php old mode 100755 new mode 100644 index 91d0e044..9fb2aafd --- a/module/form/view/data/data.js.php +++ b/module/form/view/data/data.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/form/view/data/data.php b/module/form/view/data/data.php old mode 100755 new mode 100644 diff --git a/module/form/view/index/index.js.php b/module/form/view/index/index.js.php old mode 100755 new mode 100644 index 699b1831..697edee7 --- a/module/form/view/index/index.js.php +++ b/module/form/view/index/index.js.php @@ -7,7 +7,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2008-2018, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/form/view/index/index.php b/module/form/view/index/index.php old mode 100755 new mode 100644 index 4fe54a9a..368d534e --- a/module/form/view/index/index.php +++ b/module/form/view/index/index.php @@ -35,7 +35,7 @@ ]); ?> + ); ?>

    @@ -43,10 +43,10 @@

    - getData(['module', $this->getUrl(0), 'config', 'capcha'])): ?> + getData(['module', $this->getUrl(0), 'config', 'captcha'])): ?>
    -
    - +
    +
    diff --git a/module/gallery/gallery.php b/module/gallery/gallery.php old mode 100755 new mode 100644 index 27a7d9d2..1eef8ab4 --- a/module/gallery/gallery.php +++ b/module/gallery/gallery.php @@ -11,7 +11,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class gallery extends common { @@ -19,7 +19,7 @@ class gallery extends common { const SORT_ASC = 'SORT_ASC'; const SORT_DSC = 'SORT_DSC'; const SORT_HAND = 'SORT_HAND'; - const GALLERY_VERSION = '2.26'; + const GALLERY_VERSION = '2.4'; public static $directories = []; @@ -350,7 +350,7 @@ class gallery extends common { // Soumission du formulaire if($this->isPost()) { // Si l'id a changée - $galleryId = $this->getInput('galleryEditName', helper::FILTER_ID, true); + $galleryId = !empty($this->getInput('galleryEditName')) ? $this->getInput('galleryEditName', helper::FILTER_ID, true) : $this->getUrl(2); if($galleryId !== $this->getUrl(2)) { // Incrémente le nouvel id de la galerie $galleryId = helper::increment($galleryId, $this->getData(['module', $this->getUrl(0)])); @@ -374,20 +374,22 @@ class gallery extends common { $homePicture = $d[0]; } // Sauvegarder - $this->setData(['module', $this->getUrl(0), $galleryId, [ - 'config' => [ - 'name' => $this->getInput('galleryEditName', helper::FILTER_STRING_SHORT, true), - 'directory' => $this->getInput('galleryEditDirectory', helper::FILTER_STRING_SHORT, true), - 'homePicture' => $homePicture, - // pas de positions, on active le tri alpha - 'sort' => $this->getInput('galleryEditSort'), - 'position' => $this->getData(['module', $this->getUrl(0), $galleryId,'config','positions']) === null ? count($this->getData(['module',$this->getUrl(0)]))-1 : $this->getData(['module', $this->getUrl(0), $galleryId,'config','positions']), - 'fullScreen' => $this->getInput('galleryEditFullscreen', helper::FILTER_BOOLEAN) + if ($this->getInput('galleryEditName')) { + $this->setData(['module', $this->getUrl(0), $galleryId, [ + 'config' => [ + 'name' => $this->getInput('galleryEditName', helper::FILTER_STRING_SHORT, true), + 'directory' => $this->getInput('galleryEditDirectory', helper::FILTER_STRING_SHORT, true), + 'homePicture' => $homePicture, + // pas de positions, on active le tri alpha + 'sort' => $this->getInput('galleryEditSort'), + 'position' => $this->getData(['module', $this->getUrl(0), $galleryId,'config','positions']) === null ? count($this->getData(['module',$this->getUrl(0)]))-1 : $this->getData(['module', $this->getUrl(0), $galleryId,'config','positions']), + 'fullScreen' => $this->getInput('galleryEditFullscreen', helper::FILTER_BOOLEAN) - ], - 'legend' => $legends, - 'positions' => empty($oldPositions) ? $this->getdata(['module', $this->getUrl(0), $galleryId, 'positions']) : $oldPositions - ]]); + ], + 'legend' => $legends, + 'positions' => empty($oldPositions) ? $this->getdata(['module', $this->getUrl(0), $galleryId, 'positions']) : $oldPositions + ]]); + } // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $galleryId . '/' . $_SESSION['csrf'] , @@ -608,14 +610,14 @@ class gallery extends common { } // Initialisation des données de thème de la galerie dasn theme.json // Création des valeur par défaut absentes - if ( $this->getData(['theme', $this->getUrl(0)]) === null ) { + if ( $this->getData(['theme', 'gallery']) === null ) { require_once('module/gallery/ressource/defaultdata.php'); - $this->setData(['theme', $this->getUrl(0), theme::$defaultData]); + $this->setData(['theme', 'gallery', theme::$defaultData]); } // Soumission du formulaire if($this->isPost()) { - $this->setData(['theme', $this->getUrl(0), [ + $this->setData(['theme', 'gallery', [ 'thumbAlign' => $this->getinput('galleryThemeThumbAlign'), 'thumbWidth' => $this->getinput('galleryThemeThumbWidth'), 'thumbHeight' => $this->getinput('galleryThemeThumbHeight'), @@ -655,8 +657,8 @@ class gallery extends common { // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . $this->getUrl() . '/theme', - 'notification' => $success ? 'Modifications enregistrées' : 'Modifications non enregistées !', - 'state' => $success + 'notification' => $success !== FALSE ? 'Modifications enregistrées' : 'Modifications non enregistées !', + 'state' => $success !== FALSE ]); } // Valeurs en sortie diff --git a/module/gallery/ressource/defaultdata.php b/module/gallery/ressource/defaultdata.php old mode 100755 new mode 100644 index 7a66f120..ff71bbc3 --- a/module/gallery/ressource/defaultdata.php +++ b/module/gallery/ressource/defaultdata.php @@ -7,7 +7,7 @@ class theme extends gallery { 'thumbMargin' => '.5em', 'thumbBorder' => '.1em', 'thumbOpacity' => '.7', - 'thumbBorderColor' => 'rgba(221, 221, 221, 1)', + 'thumbBorderColor' => 'rgba(221, 221, 221, 1)', 'thumbRadius' => '.3em', 'thumbShadows' => '1px 1px 10px', 'thumbShadowsColor'=> 'rgba(125, 125, 125, 1)', diff --git a/module/gallery/view/config/config.css b/module/gallery/view/config/config.css index 424570ff..a859c8dd 100755 --- a/module/gallery/view/config/config.css +++ b/module/gallery/view/config/config.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/gallery/view/config/config.js.php b/module/gallery/view/config/config.js.php old mode 100755 new mode 100644 index 7a5fef17..f56117b3 --- a/module/gallery/view/config/config.js.php +++ b/module/gallery/view/config/config.js.php @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ $( document ).ready(function() { diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php old mode 100755 new mode 100644 diff --git a/module/gallery/view/edit/edit.css b/module/gallery/view/edit/edit.css index 74fce65d..2aa6edae 100755 --- a/module/gallery/view/edit/edit.css +++ b/module/gallery/view/edit/edit.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/gallery/view/edit/edit.js.php b/module/gallery/view/edit/edit.js.php old mode 100755 new mode 100644 index 0c376690..c36e08d7 --- a/module/gallery/view/edit/edit.js.php +++ b/module/gallery/view/edit/edit.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/gallery/view/edit/edit.php b/module/gallery/view/edit/edit.php old mode 100755 new mode 100644 diff --git a/module/gallery/view/gallery/gallery.css b/module/gallery/view/gallery/gallery.css old mode 100755 new mode 100644 diff --git a/module/gallery/view/gallery/gallery.js.php b/module/gallery/view/gallery/gallery.js.php old mode 100755 new mode 100644 index bd1f6c78..d99980d2 --- a/module/gallery/view/gallery/gallery.js.php +++ b/module/gallery/view/gallery/gallery.js.php @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/gallery/view/gallery/gallery.php b/module/gallery/view/gallery/gallery.php old mode 100755 new mode 100644 diff --git a/module/gallery/view/index/index.php b/module/gallery/view/index/index.php old mode 100755 new mode 100644 diff --git a/module/gallery/view/theme/theme.css b/module/gallery/view/theme/theme.css index 74fce65d..2aa6edae 100755 --- a/module/gallery/view/theme/theme.css +++ b/module/gallery/view/theme/theme.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/gallery/view/theme/theme.php b/module/gallery/view/theme/theme.php old mode 100755 new mode 100644 index 704cb0c7..8ada32ed --- a/module/gallery/view/theme/theme.php +++ b/module/gallery/view/theme/theme.php @@ -1,4 +1,5 @@ +
    -

    Configuration des vignettes

    +

    Vignettes + +

    'Largeur', - 'selected' => $this->getData(['theme', $this->getUrl(0),'thumbWidth']) + 'selected' => $this->getData(['theme', 'gallery','thumbWidth']) ]); ?>
    'Hauteur', - 'selected' => $this->getData(['theme', $this->getUrl(0),'thumbHeight']) + 'selected' => $this->getData(['theme', 'gallery','thumbHeight']) ]); ?>
    'Alignement', - 'selected' => $this->getData(['theme', $this->getUrl(0),'thumbAlign']) + 'selected' => $this->getData(['theme', 'gallery','thumbAlign']) ]); ?>
    'Marge', - 'selected' => $this->getData(['theme', $this->getUrl(0),'thumbMargin']) + 'selected' => $this->getData(['theme', 'gallery','thumbMargin']) ]); ?>
    @@ -46,7 +51,7 @@
    'Bordure', - 'selected' => $this->getData(['theme', $this->getUrl(0),'thumbBorder']) + 'selected' => $this->getData(['theme', 'gallery','thumbBorder']) ]); ?>
    @@ -54,13 +59,13 @@ 'class' => 'colorPicker', 'help' => 'Le curseur horizontal règle le niveau de transparence.', 'label' => 'Couleur de la bordure', - 'value' => $this->getData(['theme', $this->getUrl(0),'thumbBorderColor']) + 'value' => $this->getData(['theme', 'gallery','thumbBorderColor']) ]); ?>
    'Arrondi des angles', - 'selected' => $this->getData(['theme', $this->getUrl(0),'thumbRadius']) + 'selected' => $this->getData(['theme', 'gallery','thumbRadius']) ]); ?>
    @@ -68,7 +73,7 @@
    'Ombre', - 'selected' => $this->getData(['theme', $this->getUrl(0),'thumbShadows']) + 'selected' => $this->getData(['theme', 'gallery','thumbShadows']) ]); ?>
    @@ -76,13 +81,13 @@ 'class' => 'colorPicker', 'help' => 'Le curseur horizontal règle le niveau de transparence.', 'label' => 'Couleur de l\'ombre', - 'value' => $this->getData(['theme', $this->getUrl(0),'thumbShadowsColor']) + 'value' => $this->getData(['theme', 'gallery','thumbShadowsColor']) ]); ?>
    'Opacité au survol', - 'selected' => $this->getData(['theme', $this->getUrl(0),'thumbOpacity']) + 'selected' => $this->getData(['theme', 'gallery','thumbOpacity']) ]); ?>
    @@ -92,14 +97,18 @@
    -

    Configuration des légendes

    +

    Légendes + +

    'colorPicker', 'help' => 'Le curseur horizontal règle le niveau de transparence.', 'label' => 'Texte', - 'value' => $this->getData(['theme', $this->getUrl(0),'legendTextColor']) + 'value' => $this->getData(['theme', 'gallery','legendTextColor']) ]); ?>
    @@ -107,29 +116,30 @@ 'class' => 'colorPicker', 'help' => 'Le curseur horizontal règle le niveau de transparence.', 'label' => 'Fond', - 'value' => $this->getData(['theme', $this->getUrl(0),'legendBgColor']) + 'value' => $this->getData(['theme', 'gallery','legendBgColor']) ]); ?>
    'Hauteur', - 'selected' => $this->getData(['theme', $this->getUrl(0),'legendHeight']) + 'selected' => $this->getData(['theme', 'gallery','legendHeight']) ]); ?>
    'Alignement', - 'selected' => $this->getData(['theme', $this->getUrl(0),'legendAlign']) + 'selected' => $this->getData(['theme', 'gallery','legendAlign']) ]); ?>
    +
    -
    -
    Version n° - +
    +
    Version n° +
    -
    +
    \ No newline at end of file diff --git a/module/news/news.php b/module/news/news.php old mode 100755 new mode 100644 index 08c121d8..ac221426 --- a/module/news/news.php +++ b/module/news/news.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class news extends common { diff --git a/module/news/view/add/add.css b/module/news/view/add/add.css index 74fce65d..2aa6edae 100755 --- a/module/news/view/add/add.css +++ b/module/news/view/add/add.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/news/view/add/add.js.php b/module/news/view/add/add.js.php old mode 100755 new mode 100644 index 8ddda8b1..77bb1442 --- a/module/news/view/add/add.js.php +++ b/module/news/view/add/add.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/news/view/add/add.php b/module/news/view/add/add.php old mode 100755 new mode 100644 diff --git a/module/news/view/config/config.css b/module/news/view/config/config.css index 74fce65d..2aa6edae 100755 --- a/module/news/view/config/config.css +++ b/module/news/view/config/config.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/news/view/config/config.js.php b/module/news/view/config/config.js.php old mode 100755 new mode 100644 index 33f9871c..608f5324 --- a/module/news/view/config/config.js.php +++ b/module/news/view/config/config.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php old mode 100755 new mode 100644 diff --git a/module/news/view/edit/edit.js.php b/module/news/view/edit/edit.js.php old mode 100755 new mode 100644 index b2e01d4c..ef1444ff --- a/module/news/view/edit/edit.js.php +++ b/module/news/view/edit/edit.js.php @@ -7,7 +7,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ /** diff --git a/module/news/view/edit/edit.php b/module/news/view/edit/edit.php old mode 100755 new mode 100644 diff --git a/module/news/view/index/index.php b/module/news/view/index/index.php old mode 100755 new mode 100644 diff --git a/module/redirection/redirection.php b/module/redirection/redirection.php old mode 100755 new mode 100644 index 4e96f279..5c92521c --- a/module/redirection/redirection.php +++ b/module/redirection/redirection.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ class redirection extends common { diff --git a/module/redirection/view/config/config.css b/module/redirection/view/config/config.css index 74fce65d..2aa6edae 100755 --- a/module/redirection/view/config/config.css +++ b/module/redirection/view/config/config.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/redirection/view/config/config.php b/module/redirection/view/config/config.php old mode 100755 new mode 100644 diff --git a/module/redirection/view/index/index.css b/module/redirection/view/index/index.css index 74fce65d..2aa6edae 100755 --- a/module/redirection/view/index/index.css +++ b/module/redirection/view/index/index.css @@ -9,7 +9,7 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ diff --git a/module/redirection/view/index/index.js.php b/module/redirection/view/index/index.js.php old mode 100755 new mode 100644 index 4cfe09b5..9ed8ce32 --- a/module/redirection/view/index/index.js.php +++ b/module/redirection/view/index/index.js.php @@ -9,7 +9,7 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ * **/ diff --git a/module/redirection/view/index/index.php b/module/redirection/view/index/index.php old mode 100755 new mode 100644 diff --git a/module/search/ressource/defaultdata.php b/module/search/ressource/defaultdata.php new file mode 100644 index 00000000..4eb9eaa6 --- /dev/null +++ b/module/search/ressource/defaultdata.php @@ -0,0 +1,14 @@ + 'rgba(229, 229, 1, 1)' + ]; +} +class data extends search { + public static $defaultData = [ + 'previewLength' => 100, + 'resultHideContent' => false, + 'placeHolder' => 'Un ou plusieurs mots-clés séparés par un espace ou par +', + 'submitText' => 'Rechercher' + ]; +} \ No newline at end of file diff --git a/module/search/ressource/theme.css b/module/search/ressource/theme.css new file mode 100755 index 00000000..63462103 --- /dev/null +++ b/module/search/ressource/theme.css @@ -0,0 +1,11 @@ +.searchTitle { + font: caption; + font-style: italic; + margin-left: 1em; +} +.searchKeyword { + background: var(--keywordColor); +} +.searchResult { + margin: .3em 0 .3em 1em; +} \ No newline at end of file diff --git a/module/search/ressource/vartheme.css b/module/search/ressource/vartheme.css new file mode 100755 index 00000000..9a5c4cdb --- /dev/null +++ b/module/search/ressource/vartheme.css @@ -0,0 +1,3 @@ +.searchKeyword { + --keywordColor: #keywordColor#; +} diff --git a/module/search/search.php b/module/search/search.php new file mode 100755 index 00000000..b2a41f07 --- /dev/null +++ b/module/search/search.php @@ -0,0 +1,256 @@ + + * @copyright Copyright (C) 2008-2018, Rémi Jean + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @copyright Sylvain Lelièvre + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + * + */ + +class search extends common { + + public static $actions = [ + 'index' => self::GROUP_VISITOR, + 'config' => self::GROUP_MODERATOR + ]; + + // Variables pour l'affichage des résultats + public static $resultList = ''; + public static $resultError = ''; + public static $resultTitle = ''; + + // Variables pour le dialogue avec le formulaire + public static $motclef = ''; + public static $motentier = true; + public static $previewLength = [ + 100 => '100 caractères', + 200 => '200 caractères', + 300 => '300 caractères', + 400 => '400 caractères', + ]; + + // Message par défaut + public static $messagePlaceHolder = 'Un ou plusieurs mots-clés entre des espaces ou des guillemets'; + public static $messageButtontext = 'Rechercher'; + + const SEARCH_VERSION = '1.1'; + + // Configuration vide + public function config() { + // Initialisation des données de thème de la galerie dasn theme.json + if($this->isPost()) { + // Soumission du formulaire + $this->setData(['theme', 'search', [ + 'keywordColor' => $this->getInput('searchKeywordColor') + ]]); + $this->setData(['module', $this->getUrl(0), [ + 'submitText' => $this->getInput('searchSubmitText'), + 'placeHolder' => $this->getInput('searchPlaceHolder'), + 'resultHideContent' => $this->getInput('searchResultHideContent',helper::FILTER_BOOLEAN), + 'previewLength' => $this->getInput('searchPreviewLength',helper::FILTER_INT) + ]]); + // Création des fichiers CSS + $content = file_get_contents('module/search/ressource/vartheme.css'); + $themeCss = file_get_contents('module/search/ressource/theme.css'); + // Injection des variables + $content = str_replace('#keywordColor#',$this->getinput('searchKeywordColor'),$content ); + $success = file_put_contents('module/search/view/index/index.css',$content . $themeCss); + + // Valeurs en sortie, affichage du formulaire + $this->addOutput([ + 'redirect' => helper::baseUrl() . $this->getUrl(), + 'notification' => $success !== FALSE ? 'Modifications enregistrées' : 'Modifications non enregistées !', + 'state' => $success !== FALSE + ]); + + } + // Valeurs en sortie, affichage du formulaire + $this->addOutput([ + 'title' => 'Configuration du module', + 'view' => 'config', + 'vendor' => [ + 'tinycolorpicker' + ] + ]); + } + + public function index() { + // Création des valeurs de thème par défaut + if ( $this->getData(['theme', 'search']) === null ) { + require_once('module/search/ressource/defaultdata.php'); + $this->setData(['theme', 'search', theme::$defaultData]); + } + // Création des valeurs de réglage par défaut + if ( $this->getData(['module', 'search']) === null ) { + require_once('module/search/ressource/defaultdata.php'); + $this->setData(['module', $this->getUrl(0), data::$defaultData]); + } + + if($this->isPost()) { + //Initialisations variables + $success = true; + $result = []; + $notification = ''; + $total=''; + + // Récupération du mot clef passé par le formulaire de ...view/index.php, avec caractères accentués + self::$motclef=$this->getInput('searchMotphraseclef'); + + // Récupération de l'état de l'option mot entier passé par le même formulaire + self::$motentier=$this->getInput('searchMotentier', helper::FILTER_BOOLEAN); + + if (self::$motclef !== '' ) { + foreach($this->getHierarchy(null,false,null) as $parentId => $childIds) { + if ($this->getData(['page', $parentId, 'disable']) === false && + $this->getUser('group') >= $this->getData(['page', $parentId, 'group']) && + $this->getData(['page', $parentId, 'block']) !== 'bar') { + $url = $parentId; + $titre = $this->getData(['page', $parentId, 'title']); + $contenu = ' ' . $titre . ' ' . $this->getData(['page', $parentId, 'content']); + // Pages sauf pages filles et articles de blog + $tempData = $this->occurrence($url, $titre, $contenu, self::$motclef, self::$motentier); + if (is_array($tempData) ) { + $result [] = $tempData; + } + } + + foreach($childIds as $childId) { + // Sous page + if ($this->getData(['page', $childId, 'disable']) === false && + $this->getUser('group') >= $this->getData(['page', $parentId, 'group']) && + $this->getData(['page', $parentId, 'block']) !== 'bar') { + $url = $childId; + $titre = $this->getData(['page', $childId, 'title']); + $contenu = ' ' . $titre . ' ' . $this->getData(['page', $childId, 'content']); + //Pages filles + $tempData = $this->occurrence($url, $titre, $contenu, self::$motclef, self::$motentier); + if (is_array($tempData) ) { + $result [] = $tempData; + } + } + + // Articles d'une sous-page blog + if ($this->getData(['page', $childId, 'moduleId']) === 'blog') + { + foreach($this->getData(['module',$childId]) as $articleId => $article) { + if($this->getData(['module',$childId,$articleId,'state']) === true) { + $url = $childId . '/' . $articleId; + $titre = $article['title']; + $contenu = ' ' . $titre . ' ' . $article['content']; + // Articles de sous-page de type blog + $tempData = $this->occurrence($url, $titre, $contenu, self::$motclef, self::$motentier); + if (is_array($tempData) ) { + $result [] = $tempData; + } + } + } + } + } + + // Articles d'un blog + if ($this->getData(['page', $parentId, 'moduleId']) === 'blog' ) { + foreach($this->getData(['module',$parentId]) as $articleId => $article) { + if($this->getData(['module',$parentId,$articleId,'state']) === true) + { + $url = $parentId. '/' . $articleId; + $titre = $article['title']; + $contenu = ' ' . $titre . ' ' . $article['content']; + // Articles de Blog + $tempData = $this->occurrence($url, $titre, $contenu, self::$motclef, self::$motentier); + if (is_array($tempData) ) { + $result [] = $tempData; + } + } + } + } + } + + // Message de synthèse de la recherche + if (count($result) === 0) { + self::$resultTitle = 'Aucun résultat'; + self::$resultError = 'Avez-vous pensé aux accents ?'; + } else { + self::$resultError = ''; + self::$resultTitle = ' Résultat de votre recherche'; + rsort($result); + foreach ($result as $key => $value) { + $r [] = $value['preview']; + } + // Générer une chaine de caractères + self::$resultList= implode("", $r); + } + } + + // Valeurs en sortie, affichage du résultat + $this->addOutput([ + 'view' => 'index', + 'showBarEditButton' => true, + 'showPageContent' => !$this->getData(['module', $this->getUrl(0),'resultHideContent']) + ]); + } else { + // Valeurs en sortie, affichage du formulaire + $this->addOutput([ + 'view' => 'index', + 'showBarEditButton' => true, + 'showPageContent' => true + ]); + } + } + + + // Fonction de recherche des occurrences dans $contenu + // Renvoie le résultat sous forme de chaîne + private function occurrence($url, $titre, $contenu, $motclef, $motentier) + { + // Nettoyage de $contenu : on enlève tout ce qui est inclus entre < et > + $contenu = preg_replace ('/<[^>]*>/', ' ', $contenu); + // Accentuation + $contenu = html_entity_decode($contenu); + + // Découper le chaîne en tenant compte des quillemets + $a = str_getcsv(html_entity_decode($motclef), ' '); + + // Construire la clé de recherche selon options de recherche + $keywords = '/('; + foreach ($a as $key => $value) { + $keywords .= $motentier === true ? $value . '|' : '\b' . $value . '\b|' ; + } + $keywords = substr($keywords,0,strlen($keywords) - 1); + $keywords .= ')/i'; + $keywords = str_replace ('+', ' ',$keywords); + + // Rechercher + $valid = preg_match_all($keywords,$contenu,$matches,PREG_OFFSET_CAPTURE); + if ($valid > 0 ) { + if (($matches[0][0][1]) > 0) { + $resultat = '

    ' . $titre . '

    '; + // Création de l'aperçu + // Eviter de découper avec une valeur négative + $d = $matches[0][0][1] - 50 < 0 ? 1 : $matches[0][0][1] - 50; + // Rechercher l'espace le plus proche + $d = $d >= 1 ? strpos($contenu,' ',$d) : $d; + // Découper l'aperçu + $t = substr($contenu, $d ,$this->getData(['module',$this->getUrl(0),'previewLength'])); + // Applique une mise en évidence + $t = preg_replace($keywords, '\1',$t); + // Sauver résultat + $resultat .= '

    '.$t.'...

    '; + $resultat .= '

    ' . count($matches[0]) . (count($matches[0]) === 1 ? ' correspondance

    ' : ' correspondances

    '); + //} + return ([ + 'matches' => count($matches[0]), + 'preview' => $resultat + ]); + } + } + } +} diff --git a/core/module/config/view/restore/restore.css b/module/search/view/config/config.css similarity index 86% rename from core/module/config/view/restore/restore.css rename to module/search/view/config/config.css index 6faa3a6a..5e80538a 100755 --- a/core/module/config/view/restore/restore.css +++ b/module/search/view/config/config.css @@ -9,7 +9,8 @@ * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ + * @link http://zwiicms.fr/ */ -@import url("site/data/admin.css"); \ No newline at end of file + + @import url("site/data/admin.css"); \ No newline at end of file diff --git a/module/search/view/config/config.php b/module/search/view/config/config.php new file mode 100755 index 00000000..8280ee9a --- /dev/null +++ b/module/search/view/config/config.php @@ -0,0 +1,72 @@ + +

    +
    + 'buttonGrey', + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
    +
    + +
    +
    +
    +
    +
    +

    Paramètres du module

    +
    +
    + 'Texte du bouton', + 'value' => $this->getData(['module', $this->getUrl(0), 'submitText']) + ]); ?> +
    +
    + 'Dimension de l\'aperçu', + 'selected' => $this->getData(['module', $this->getUrl(0),'previewLength']) + ]); ?> +
    +
    +
    +
    + 'Aide dans la zone de saisie', + 'value' => $this->getData(['module', $this->getUrl(0), 'placeHolder']) + ]); ?> +
    +
    + $this->getData(['module', $this->getUrl(0), 'resultHideContent']), + ]); ?> +
    +
    +
    +
    +
    +
    +
    +
    +

    Thème + +

    +
    +
    + 'colorPicker', + 'help' => 'Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.', + 'label' => 'Surlignement', + 'value' => $this->getData(['theme', 'search', 'keywordColor']) + ]); ?> +
    +
    +
    +
    +
    + +
    Version n° + +
    \ No newline at end of file diff --git a/module/search/view/index/index.css b/module/search/view/index/index.css new file mode 100755 index 00000000..8e5dc743 --- /dev/null +++ b/module/search/view/index/index.css @@ -0,0 +1,14 @@ +.searchKeyword { + --keywordColor: rgba(229, 229, 1, 1); +} +.searchTitle { + font: caption; + font-style: italic; + margin-left: 1em; +} +.searchKeyword { + background: var(--keywordColor); +} +.searchResult { + margin: .3em 0 .3em 1em; +} \ No newline at end of file diff --git a/module/search/view/index/index.php b/module/search/view/index/index.php new file mode 100755 index 00000000..4399c591 --- /dev/null +++ b/module/search/view/index/index.php @@ -0,0 +1,39 @@ + +
    +
    +
    +
    + $this->getData(['module', $this->getUrl(0), 'placeHolder']) ? $this->getData(['module', $this->getUrl(0), 'placeHolder']) : $module::$messagePlaceHolder, + 'value' => $module::$motclef + ]); ?> +
    +
    + $this->getData(['module', $this->getUrl(0), 'submitText']) ? $this->getData(['module', $this->getUrl(0), 'submitText']) : $module::$messageButtontext + ]); ?> +
    +
    +
    +
    + $module::$motentier, + ]); ?> +
    +
    +
    +
    + +
    +
    + '.$module::$resultTitle . ''; ?> + '.$module::$resultList.'

    '; + ?> + '.$module::$resultError.'

    '; + ?> +
    +
    + + diff --git a/site/backup/.htaccess b/site/backup/.htaccess old mode 100755 new mode 100644 diff --git a/site/data/.htaccess b/site/data/.htaccess old mode 100755 new mode 100644 diff --git a/site/file/source/icones/loupe.png b/site/file/source/icones/loupe.png new file mode 100755 index 00000000..c0aec15f Binary files /dev/null and b/site/file/source/icones/loupe.png differ diff --git a/site/file/thumb/galerie/landscape/mini_desert.jpg b/site/file/thumb/galerie/landscape/mini_desert.jpg new file mode 100644 index 00000000..c5b19837 Binary files /dev/null and b/site/file/thumb/galerie/landscape/mini_desert.jpg differ diff --git a/site/file/thumb/galerie/landscape/mini_iceberg.jpg b/site/file/thumb/galerie/landscape/mini_iceberg.jpg new file mode 100644 index 00000000..b35d3cd4 Binary files /dev/null and b/site/file/thumb/galerie/landscape/mini_iceberg.jpg differ diff --git a/site/file/thumb/galerie/landscape/mini_meadow.jpg b/site/file/thumb/galerie/landscape/mini_meadow.jpg new file mode 100644 index 00000000..bb6f27a7 Binary files /dev/null and b/site/file/thumb/galerie/landscape/mini_meadow.jpg differ diff --git a/site/file/thumb/galerie/space/mini_cosmos.jpg b/site/file/thumb/galerie/space/mini_cosmos.jpg new file mode 100644 index 00000000..bc382898 Binary files /dev/null and b/site/file/thumb/galerie/space/mini_cosmos.jpg differ diff --git a/site/file/thumb/galerie/space/mini_earth.jpg b/site/file/thumb/galerie/space/mini_earth.jpg new file mode 100644 index 00000000..2b30b7e2 Binary files /dev/null and b/site/file/thumb/galerie/space/mini_earth.jpg differ diff --git a/site/file/thumb/galerie/space/mini_nebula.jpg b/site/file/thumb/galerie/space/mini_nebula.jpg new file mode 100644 index 00000000..028d4b4a Binary files /dev/null and b/site/file/thumb/galerie/space/mini_nebula.jpg differ diff --git a/site/file/thumb/icones/loupe.png b/site/file/thumb/icones/loupe.png new file mode 100755 index 00000000..4bb22f17 Binary files /dev/null and b/site/file/thumb/icones/loupe.png differ diff --git a/site/file/thumb/icones/mini_home_black.png b/site/file/thumb/icones/mini_home_black.png deleted file mode 100755 index c10adef1..00000000 Binary files a/site/file/thumb/icones/mini_home_black.png and /dev/null differ diff --git a/site/file/thumb/icones/mini_home_blue.png b/site/file/thumb/icones/mini_home_blue.png deleted file mode 100755 index 7faad994..00000000 Binary files a/site/file/thumb/icones/mini_home_blue.png and /dev/null differ diff --git a/site/tmp/.htaccess b/site/tmp/.htaccess old mode 100755 new mode 100644