From 7878bc74c6c432e9e67f58f0cd8ec628b70edda0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Thu, 13 Jan 2022 18:11:29 +0100 Subject: [PATCH 001/103] relative_url --- core/vendor/tinymce/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/tinymce/init.js b/core/vendor/tinymce/init.js index ea91fcf4..3f9edd48 100755 --- a/core/vendor/tinymce/init.js +++ b/core/vendor/tinymce/init.js @@ -114,7 +114,7 @@ tinymce.init({ // Active l'onglet avancé lors de l'ajout d'une image image_advtab: true, // Urls absolues - relative_urls: false, + relative_urls: true, // Url de base document_base_url: baseUrl, // Gestionnaire de fichiers From 0b0259ce7a714f476d2b56732ab5b3728925b56c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Thu, 13 Jan 2022 18:31:20 +0100 Subject: [PATCH 002/103] toutes url relatives --- core/core.php | 21 ++++++ core/include/update.inc.php | 49 +++++++++++++ core/module/config/config.php | 76 --------------------- core/module/config/view/restore/restore.php | 42 ------------ 4 files changed, 70 insertions(+), 118 deletions(-) diff --git a/core/core.php b/core/core.php index d13e85d6..dc61a254 100644 --- a/core/core.php +++ b/core/core.php @@ -1146,6 +1146,27 @@ class common { } + /** + * Fonction de parcours des données de module + * @param string $find donnée à rechercher + * @param string $replace donnée à remplacer + * @param array tableau à analyser + * @param int count nombres d'occurrences + * @return array avec les valeurs remplacées. + */ + private function recursive_array_replace ($find, $replace, $array, &$count) { + if (!is_array($array)) { + return str_replace($find, $replace, $array, $count); + } + + $newArray = []; + foreach ($array as $key => $value) { + $newArray[$key] = $this->recursive_array_replace($find, $replace, $value,$c); + $count += $c; + } + return $newArray; + } + /** * Génère une archive d'un dossier et des sous-dossiers * @param string fileName path et nom de l'archive diff --git a/core/include/update.inc.php b/core/include/update.inc.php index 1bf1d3b7..12d1036f 100644 --- a/core/include/update.inc.php +++ b/core/include/update.inc.php @@ -739,4 +739,53 @@ if ($this->getData(['core', 'dataVersion']) < 11202) { // Mise à jour $this->setData(['core', 'dataVersion', 11202]); +} + +// Version 11.2.04 +if ($this->getData(['core', 'dataVersion']) < 11204) { + // Supprimer l'information de redirection + $old = str_replace('?','',$this->getData(['core', 'baseUrl'])); + $new = ''; + $c3 = 0; + $success = false ; + // Boucler sur les pages + foreach($this->getHierarchy(null,null,null) as $parentId => $childIds) { + $content = $this->getPage($parentId, self::$i18n); + $titre = $this->getData(['page', $parentId, 'title']); + $content = $titre . ' ' . $content ; + $replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ; + $replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ; + + if ($c1 > 0 || $c2 > 0) { + $success = true; + $this->setPage($parentId, $replace, self::$i18n); + $c3 += $c1 + $c2; + } + foreach($childIds as $childId) { + $content = $this->getPage($childId, self::$i18n); + $content = $titre . ' ' . $content ; + $replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ; + $replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ; + if ($c1 > 0 || $c2 > 0) { + $success = true; + $this->setPage($childId, $replace, self::$i18n); + $c3 += $c1 + $c2; + } + } + } + // Traiter les modules dont la redirection + $content = $this->getdata(['module']); + $replace = $this->recursive_array_replace('href="' . $old , 'href="'. $new, $content, $c1); + $replace = $this->recursive_array_replace('src="' . $old , 'src="'. $new, $replace, $c2); + if ($content !== $replace) { + $this->setdata(['module',$replace]); + $c3 += $c1 + $c2; + $success = true; + } + + // Effacer la baseUrl + $this->deleteData(['core', 'baseUrl']); + + // Mise à jour + $this->setData(['core', 'dataVersion', 11204]); } \ No newline at end of file diff --git a/core/module/config/config.php b/core/module/config/config.php index d39997c0..834d19e4 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -23,7 +23,6 @@ class config extends common { 'generateFiles' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, 'restore' => self::GROUP_ADMIN, - 'updateBaseUrl' => self::GROUP_ADMIN, 'script' => self::GROUP_ADMIN, 'logReset' => self::GROUP_ADMIN, 'logDownload'=> self::GROUP_ADMIN, @@ -652,60 +651,6 @@ class config extends common { ]); } - /** - * Met à jour les données de site avec l'adresse transmise - */ - public function updateBaseUrl () { - // Supprimer l'information de redirection - $old = str_replace('?','',$this->getData(['core', 'baseUrl'])); - $new = helper::baseUrl(false,false); - $c3 = 0; - $success = false ; - // Boucler sur les pages - foreach($this->getHierarchy(null,null,null) as $parentId => $childIds) { - $content = $this->getPage($parentId, self::$i18n); - $titre = $this->getData(['page', $parentId, 'title']); - $content = $titre . ' ' . $content ; - $replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ; - $replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ; - - if ($c1 > 0 || $c2 > 0) { - $success = true; - $this->setPage($parentId, $replace, self::$i18n); - $c3 += $c1 + $c2; - } - foreach($childIds as $childId) { - $content = $this->getPage($childId, self::$i18n); - $content = $titre . ' ' . $content ; - $replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ; - $replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ; - if ($c1 > 0 || $c2 > 0) { - $success = true; - $this->setPage($childId, $replace, self::$i18n); - $c3 += $c1 + $c2; - } - } - } - // Traiter les modules dont la redirection - $content = $this->getdata(['module']); - $replace = $this->recursive_array_replace('href="' . $old , 'href="'. $new, $content, $c1); - $replace = $this->recursive_array_replace('src="' . $old , 'src="'. $new, $replace, $c2); - if ($content !== $replace) { - $this->setdata(['module',$replace]); - $c3 += $c1 + $c2; - $success = true; - } - // Mettre à jour la base URl - $this->setData(['core','baseUrl',helper::baseUrl(true,false)]); - // Valeurs en sortie - $this->addOutput([ - 'title' => 'Restaurer', - 'view' => 'restore', - 'notification' => $success ? $c3. ' conversion' . ($c3 > 1 ? 's' : '') . ' effectuée' . ($c3 > 1 ? 's' : '') : 'Aucune conversion', - 'state' => $success ? true : false - ]); - } - /** * Vider le fichier de log */ @@ -842,25 +787,4 @@ class config extends common { ]); } - - /** - * Fonction de parcours des données de module - * @param string $find donnée à rechercher - * @param string $replace donnée à remplacer - * @param array tableau à analyser - * @param int count nombres d'occurrences - * @return array avec les valeurs remplacées. - */ - private function recursive_array_replace ($find, $replace, $array, &$count) { - if (!is_array($array)) { - return str_replace($find, $replace, $array, $count); - } - - $newArray = []; - foreach ($array as $key => $value) { - $newArray[$key] = $this->recursive_array_replace($find, $replace, $value,$c); - $count += $c; - } - return $newArray; - } } diff --git a/core/module/config/view/restore/restore.php b/core/module/config/view/restore/restore.php index 22a63cc1..5e4ff26d 100644 --- a/core/module/config/view/restore/restore.php +++ b/core/module/config/view/restore/restore.php @@ -38,46 +38,4 @@ -
-
-
-

Conversion après la restauration

-
-
- getData(['core', 'baseUrl'])) ) { - $baseUrlValue = 'Pas de donnée dans la sauvegarde'; - $buttonClass = 'disabled'; - } elseif ($this->getData(['core', 'baseUrl']) === '') { - $baseUrlValue = '/'; - $buttonClass = helper::baseUrl(false,false) !== $this->getData(['core', 'baseUrl']) ? '' : 'disabled'; - } else { - $baseUrlValue = str_replace('?','',$this->getData(['core', 'baseUrl'])); - $buttonClass = helper::baseUrl(false,false) !== $baseUrlValue ? '' : 'disabled'; - } - echo template::text('configRestoreBaseURLToConvert', [ - 'label' => 'Dossier de l\'archive' , - 'value' => $baseUrlValue, - 'readonly' => true, - 'help' => 'Le dossier de base du site est stockée dans la sauvegarde.' - ]); ?> -
-
- 'Dossier du site actuel', - 'value' => helper::baseUrl(false,false), - 'readonly' => true - ]); ?> -
-
- helper::baseUrl() . 'config/updateBaseUrl', - 'class' => $buttonClass, - 'value' => 'convertir' - ]); ?> -
-
-
-
-
From e066336b9f7f2aec51b46b59ae2ed6ee19f3a86a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Thu, 13 Jan 2022 19:08:07 +0100 Subject: [PATCH 003/103] =?UTF-8?q?config=20mise=20=C3=A0=20jour=20avec=20?= =?UTF-8?q?la=20nouvelle=20fonction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/config/config.php | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/core/module/config/config.php b/core/module/config/config.php index 834d19e4..087d06fb 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -23,6 +23,7 @@ class config extends common { 'generateFiles' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, 'restore' => self::GROUP_ADMIN, + 'updateBaseUrl' => self::GROUP_ADMIN, 'script' => self::GROUP_ADMIN, 'logReset' => self::GROUP_ADMIN, 'logDownload'=> self::GROUP_ADMIN, @@ -382,6 +383,15 @@ class config extends common { $this->setData(['user',$users]); } } + // Conversion vers des Url relatives + if ($this->getData(['core', 'baseUrl'])) { + $url = str_replace('?','',$this->getData(['core', 'baseUrl'])); + // Suppresion de la base Url + $this->updateBaseUrl($url); + // Effacer la baseUrl + $this->deleteData(['core', 'baseUrl']); + } + // Message de notification $notification = $success === true ? 'Restaurer effectuée avec succès' : 'Erreur inconnue'; $redirect = $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/restore' : helper::baseUrl() . 'user/login/'; @@ -651,6 +661,58 @@ class config extends common { ]); } + /** + * Met à jour les données de site avec l'adresse transmise + */ + public function updateBaseUrl ($url) { + // Supprimer l'information de redirection + $c3 = 0; + $success = false ; + // Boucler sur les pages + foreach($this->getHierarchy(null,null,null) as $parentId => $childIds) { + $content = $this->getPage($parentId, self::$i18n); + $titre = $this->getData(['page', $parentId, 'title']); + $content = $titre . ' ' . $content ; + $replace = str_replace( 'href="' . $url , 'href="'. '' , stripslashes($content),$c1) ; + $replace = str_replace( 'src="' . $url , 'src="'. '' , stripslashes($replace),$c2) ; + + if ($c1 > 0 || $c2 > 0) { + $success = true; + $this->setPage($parentId, $replace, self::$i18n); + $c3 += $c1 + $c2; + } + foreach($childIds as $childId) { + $content = $this->getPage($childId, self::$i18n); + $content = $titre . ' ' . $content ; + $replace = str_replace( 'href="' . $url , 'href="'. '' , stripslashes($content),$c1) ; + $replace = str_replace( 'src="' . $url , 'src="'. '' , stripslashes($replace),$c2) ; + if ($c1 > 0 || $c2 > 0) { + $success = true; + $this->setPage($childId, $replace, self::$i18n); + $c3 += $c1 + $c2; + } + } + } + // Traiter les modules dont la redirection + $content = $this->getdata(['module']); + $replace = $this->recursive_array_replace('href="' . $url , 'href="'. '', $content, $c1); + $replace = $this->recursive_array_replace('src="' . $url , 'src="'. '', $replace, $c2); + if ($content !== $replace) { + $this->setdata(['module',$replace]); + $c3 += $c1 + $c2; + $success = true; + } + // Mettre à jour la base URl + $this->setData(['core','baseUrl',helper::baseUrl(true,false)]); + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Restaurer', + 'view' => 'restore', + 'notification' => $success ? $c3. ' conversion' . ($c3 > 1 ? 's' : '') . ' effectuée' . ($c3 > 1 ? 's' : '') : 'Aucune conversion', + 'state' => $success ? true : false + ]); + } + /** * Vider le fichier de log */ From 4473d0326545e2b2d29e75c5f6b3da1038dc3ef1 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 14 Jan 2022 09:18:09 +0100 Subject: [PATCH 004/103] =?UTF-8?q?init.js=20complet=20=20+=20changes=20+?= =?UTF-8?q?=20num=C3=A9ro=20de=20version=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 3 ++- core/include/update.inc.php | 6 +++--- core/vendor/tinymce/init.js | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c45d6f5a..b7c7069c 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,8 +6,9 @@ - Thème ; pied de page ; option pied de page fixe inopérante. - Edition des pages orphelines : "Ne pas afficher" une page contenant des sous-pages provoquait un bug d'affichage dans le menu, la page était malgré tout affichée en fin de menu. Ce problème était causé par les pages enfants dont l'affichage n'était pas modifié. Le correctif cascade l'option "Ne pas afficher" aux sous-pages. La réciproque n'est pas appliquée, il faudra rendre visible les sous-pages d'une page parente qui devient à nouveau visible. - Modifications : - - Thème ; pied de page ; options pied de page fixe et alignement avec le contenu déplacées dans les paramètres. + - **Chemin vers les données de site (images et liens internes)**. Désormais, les URL internes seront relatives, cela signifie qu'elles ne contiendront plus le domaine et le chemin d'accès au site. Cela permettra le déplacement d'un site d'un hébergement à un autre, d'un dossier d'hébergement à un autre, sans avoir à convertir les adresses internes. Les données d'un site mis à jour et importées d'une version antérieures sont automatiquement converties. En conséquence, le bloc de conversion de la fenêtre d'import est supprimé. - Mise à jour en ligne, contrôle de la clé MD5 de l'archive update.tar.gz. + - Thème ; pied de page ; options pied de page fixe et alignement avec le contenu déplacées dans les paramètres. ## Version 11.2.02 - Correction : diff --git a/core/include/update.inc.php b/core/include/update.inc.php index 12d1036f..02c137f5 100644 --- a/core/include/update.inc.php +++ b/core/include/update.inc.php @@ -741,8 +741,8 @@ if ($this->getData(['core', 'dataVersion']) < 11202) { $this->setData(['core', 'dataVersion', 11202]); } -// Version 11.2.04 -if ($this->getData(['core', 'dataVersion']) < 11204) { +// Version 11.2.03 +if ($this->getData(['core', 'dataVersion']) < 11203) { // Supprimer l'information de redirection $old = str_replace('?','',$this->getData(['core', 'baseUrl'])); $new = ''; @@ -787,5 +787,5 @@ if ($this->getData(['core', 'dataVersion']) < 11204) { $this->deleteData(['core', 'baseUrl']); // Mise à jour - $this->setData(['core', 'dataVersion', 11204]); + $this->setData(['core', 'dataVersion', 11203]); } \ No newline at end of file diff --git a/core/vendor/tinymce/init.js b/core/vendor/tinymce/init.js index 3f9edd48..385649cd 100755 --- a/core/vendor/tinymce/init.js +++ b/core/vendor/tinymce/init.js @@ -294,7 +294,7 @@ tinymce.init({ // Active l'onglet avancé lors de l'ajout d'une image image_advtab: true, // Urls absolues - relative_urls: false, + relative_urls: true, // Url de base document_base_url: baseUrl, // Contenu du bouton formats From 78c3d4e174f8364444f9487530358e71390b8d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Mon, 17 Jan 2022 19:12:07 +0100 Subject: [PATCH 005/103] News v4.0 --- module/news/changes.md | 6 ++ module/news/news.php | 125 ++++++++++++++++------------- module/news/view/config/config.php | 85 ++------------------ module/news/view/layout/layout.css | 18 +++++ module/news/view/layout/layout.php | 93 +++++++++++++++++++++ 5 files changed, 191 insertions(+), 136 deletions(-) create mode 100644 module/news/changes.md create mode 100644 module/news/view/layout/layout.css create mode 100644 module/news/view/layout/layout.php diff --git a/module/news/changes.md b/module/news/changes.md new file mode 100644 index 00000000..ea0c25f1 --- /dev/null +++ b/module/news/changes.md @@ -0,0 +1,6 @@ +# Version 4 + - Config : le nombre d'objet est fixe, constante dans news.php + - Ecran layout réservé à la configuration et au thème + - Bug avec l'initialisation, fichier css déclaré mais absent + + A faire partie CSS à amléiorer au niveau des options \ No newline at end of file diff --git a/module/news/news.php b/module/news/news.php index c2dbdabd..1bb0ae6a 100644 --- a/module/news/news.php +++ b/module/news/news.php @@ -15,7 +15,7 @@ class news extends common { - const VERSION = '3.7'; + const VERSION = '4.0'; const REALNAME = 'News'; const DELETE = true; const UPDATE = '0.0'; @@ -23,7 +23,8 @@ class news extends common { public static $actions = [ 'add' => self::GROUP_MODERATOR, - 'config' => self::GROUP_MODERATOR, + 'config' => self::GROUP_MODERATOR, // Edition des news + 'layout' => self::GROUP_MODERATOR, // paramétrage des news 'delete' => self::GROUP_MODERATOR, 'edit' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, @@ -88,7 +89,8 @@ class news extends common { // Signature de l'article public static $articleSignature = ''; - + // Nombre d'articles dans la page de config: + public static $itemsperPage = 8; /** * Flux RSS @@ -189,10 +191,63 @@ class news extends common { // Mise à jour des données de module $this->update(); + // Ids des news par ordre de publication + $newsIds = array_keys(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC')); + // Pagination fixe + $pagination = helper::pagination($newsIds, $this->getUrl(),self::$itemsperPage ); + // Liste des pages + self::$pages = $pagination['pages']; + // News en fonction de la pagination + for($i = $pagination['first']; $i < $pagination['last']; $i++) { + // Met en forme le tableau + $dateOn = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true) + ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])) + : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))); + $dateOn .= ' à '; + $dateOn .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true) + ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])) + : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))); + if ($this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) { + $dateOff = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true) + ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) + : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))); + $dateOff .= ' à '; + $dateOff .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true) + ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) + : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))); + } else { + $dateOff = 'Permanent'; + } + self::$news[] = [ + $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'title']), + $dateOn, + $dateOff, + self::$states[$this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'state'])], + template::button('newsConfigEdit' . $newsIds[$i], [ + 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsIds[$i]. '/' . $_SESSION['csrf'], + 'value' => template::ico('pencil') + ]), + template::button('newsConfigDelete' . $newsIds[$i], [ + 'class' => 'newsConfigDelete buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $newsIds[$i] . '/' . $_SESSION['csrf'], + 'value' => template::ico('cancel') + ]) + ]; + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Configuration du module', + 'view' => 'config', + 'vendor' => [ + 'tinycolorpicker' + ] + ]); + } + + public function layout() { // Soumission du formulaire if($this->isPost()) { - // Générer la feuille de CSS $style = '.newsFrame {'; $style .= 'border:' . $this->getInput('newsThemeBorderStyle',helper::FILTER_STRING_SHORT) . ' ' . $this->getInput('newsThemeBorderColor') . ' ' . $this->getInput('newsThemeBorderWidth',helper::FILTER_STRING_SHORT) . ';'; @@ -217,69 +272,26 @@ class news extends common { ]]); $this->setData(['module', $this->getUrl(0), 'config',[ - 'feeds' => $this->getInput('newsConfigShowFeeds',helper::FILTER_BOOLEAN), - 'feedsLabel' => $this->getInput('newsConfigFeedslabel',helper::FILTER_STRING_SHORT), - 'itemsperPage' => $this->getInput('newsConfigItemsperPage', helper::FILTER_INT,true), - 'itemsperCol' => $this->getInput('newsConfigItemsperCol', helper::FILTER_INT,true), - 'height' => $this->getInput('newsConfigHeight', helper::FILTER_INT,true), + 'feeds' => $this->getInput('newsLayoutShowFeeds',helper::FILTER_BOOLEAN), + 'feedsLabel' => $this->getInput('newsLayoutFeedslabel',helper::FILTER_STRING_SHORT), + 'itemsperPage' => $this->getInput('newsLayoutItemsperPage', helper::FILTER_INT,true), + 'itemsperCol' => $this->getInput('newsLayoutItemsperCol', helper::FILTER_INT,true), + 'height' => $this->getInput('newsLayoutHeight', helper::FILTER_INT,true), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) ]]); // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/layout', 'notification' => 'Modifications enregistrées', 'state' => true ]); } else { - // Ids des news par ordre de publication - $newsIds = array_keys(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC')); - // Pagination - $pagination = helper::pagination($newsIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']) ); - // Liste des pages - self::$pages = $pagination['pages']; - // News en fonction de la pagination - for($i = $pagination['first']; $i < $pagination['last']; $i++) { - // Met en forme le tableau - $dateOn = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true) - ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])) - : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))); - $dateOn .= ' à '; - $dateOn .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true) - ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])) - : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))); - if ($this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) { - $dateOff = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true) - ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) - : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))); - $dateOff .= ' à '; - $dateOff .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true) - ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) - : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))); - } else { - $dateOff = 'Permanent'; - } - self::$news[] = [ - $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'title']), - $dateOn, - $dateOff, - self::$states[$this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'state'])], - template::button('newsConfigEdit' . $newsIds[$i], [ - 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsIds[$i]. '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') - ]), - template::button('newsConfigDelete' . $newsIds[$i], [ - 'class' => 'newsConfigDelete buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $newsIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') - ]) - ]; - } // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration du module', - 'view' => 'config', + 'title' => 'Mise en page', + 'view' => 'layout', 'vendor' => [ 'tinycolorpicker' ] @@ -435,8 +447,7 @@ class news extends common { $newsIds[] = $newsId; } } - // Pagination - //$pagination = helper::pagination($newsIds, $this->getUrl(),$this->getData(['config','itemsperPage'])); + // Pagination selon le layout $pagination = helper::pagination($newsIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0),'config', 'itemsperPage'])); // Nombre de colonnes self::$nbrCol = $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol']); diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 873c9a66..70b14434 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -16,87 +16,14 @@ ]); ?>
- -
- -
-
-
-

Paramètres du module

-
-
- $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), - 'help' => 'Flux limité aux articles de la première page.' - ]); ?> -
-
- 'Etiquette RSS', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) - ]); ?> -
-
-
-
- 'Nombre de colonnes', - 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol']) - ]); ?> -
-
- 'Articles par page', - 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) - ]); ?> -
-
- 'Abrégé de l\'article', - 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'height']) - ]); ?> -
-
-
-
-
-
-
-
-

Thème du module

-
-
- 'Bordure', - 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderStyle']) - ]); ?> -
-
- 'Epaisseur', - 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderWidth']) - ]); ?> -
-
- 'colorPicker', - 'help' => 'Couleur visible en l\'absence d\'une image.
Le curseur horizontal règle le niveau de transparence.', - 'label' => 'Couleur de la bordure', - 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'borderColor']) - ]); ?> -
-
- 'colorPicker', - 'help' => 'Couleur visible en l\'absence d\'une image.
Le curseur horizontal règle le niveau de transparence.', - 'label' => 'Couleur du fond', - 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'backgroundColor']) - ]); ?> -
-
-
+ helper::baseUrl() . $this->getUrl(0) . '/layout', + 'ico' => 'puzzle', + 'value' => 'Mise en page' + ]); ?>
+ diff --git a/module/news/view/layout/layout.css b/module/news/view/layout/layout.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/module/news/view/layout/layout.css @@ -0,0 +1,18 @@ +/** + * 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-2022, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/module/news/view/layout/layout.php b/module/news/view/layout/layout.php new file mode 100644 index 00000000..06499a15 --- /dev/null +++ b/module/news/view/layout/layout.php @@ -0,0 +1,93 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+ +
+
+
+
+
+

Paramètres du module

+
+
+ $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), + 'help' => 'Flux limité aux articles de la première page.' + ]); ?> +
+
+ 'Etiquette RSS', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) + ]); ?> +
+
+
+
+ 'Nombre de colonnes', + 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol']) + ]); ?> +
+
+ 'Articles par page', + 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) + ]); ?> +
+
+ 'Abrégé de l\'article', + 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'height']) + ]); ?> +
+
+
+
+
+
+
+
+

Thème du module

+
+
+ 'Bordure', + 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderStyle']) + ]); ?> +
+
+ 'Epaisseur', + 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderWidth']) + ]); ?> +
+
+ 'colorPicker', + 'help' => 'Couleur visible en l\'absence d\'une image.
Le curseur horizontal règle le niveau de transparence.', + 'label' => 'Couleur de la bordure', + 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'borderColor']) + ]); ?> +
+
+ 'colorPicker', + 'help' => 'Couleur visible en l\'absence d\'une image.
Le curseur horizontal règle le niveau de transparence.', + 'label' => 'Couleur du fond', + 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'backgroundColor']) + ]); ?> +
+
+
+
+
+ \ No newline at end of file From 1700769354486dcf81e7961ed72e0118f43bdd8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Mon, 17 Jan 2022 19:29:36 +0100 Subject: [PATCH 006/103] Gallery 3.4 --- module/gallery/changes.md | 2 ++ module/gallery/gallery.php | 2 +- module/gallery/view/config/config.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 module/gallery/changes.md diff --git a/module/gallery/changes.md b/module/gallery/changes.md new file mode 100644 index 00000000..5eaca775 --- /dev/null +++ b/module/gallery/changes.md @@ -0,0 +1,2 @@ +# version 3.4 + - Changement de nom du bouton Thème devient mise en page \ No newline at end of file diff --git a/module/gallery/gallery.php b/module/gallery/gallery.php index 37a8a0df..67483a83 100644 --- a/module/gallery/gallery.php +++ b/module/gallery/gallery.php @@ -17,7 +17,7 @@ class gallery extends common { - const VERSION = '3.3'; + const VERSION = '3.4'; const REALNAME = 'Galerie'; const DELETE = true; const UPDATE = '0.0'; diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index 91400a98..1901704b 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -11,7 +11,7 @@
helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], - 'value' => template::ico('brush','right') . 'Thème' + 'value' => template::ico('brush','right') . 'Mise en page' ]); ?>
From 17f2e87cb85b1e9169d765bdff50e89a7c5724b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Mon, 17 Jan 2022 19:30:25 +0100 Subject: [PATCH 007/103] News 4.0 Icone bu bouton layout + version en bas du masque layout --- module/news/view/config/config.php | 2 +- module/news/view/layout/layout.php | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 70b14434..781ab96b 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -18,7 +18,7 @@
helper::baseUrl() . $this->getUrl(0) . '/layout', - 'ico' => 'puzzle', + 'ico' => 'brush', 'value' => 'Mise en page' ]); ?>
diff --git a/module/news/view/layout/layout.php b/module/news/view/layout/layout.php index 06499a15..44315e36 100644 --- a/module/news/view/layout/layout.php +++ b/module/news/view/layout/layout.php @@ -90,4 +90,7 @@ - \ No newline at end of file + +
Version n° + +
\ No newline at end of file From 7d328124f47a5f3d12db6c3ef15f6a92463714f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Mon, 17 Jan 2022 19:32:06 +0100 Subject: [PATCH 008/103] Blog 6.0 --- module/blog/blog.php | 172 ++++++++++++++++------------- module/blog/changes.md | 2 + module/blog/view/config/config.php | 34 +----- module/blog/view/layout/layout.css | 18 +++ module/blog/view/layout/layout.php | 47 ++++++++ 5 files changed, 165 insertions(+), 108 deletions(-) create mode 100644 module/blog/changes.md create mode 100644 module/blog/view/layout/layout.css create mode 100644 module/blog/view/layout/layout.php diff --git a/module/blog/blog.php b/module/blog/blog.php index 333a93dc..08222009 100644 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -15,7 +15,7 @@ class blog extends common { - const VERSION = '5.1'; + const VERSION = '6.0'; const REALNAME = 'Blog'; const DELETE = true; const UPDATE = '0.0'; @@ -32,6 +32,7 @@ class blog extends common { 'commentDelete' => self::GROUP_MODERATOR, 'commentDeleteAll' => self::GROUP_MODERATOR, 'config' => self::GROUP_MODERATOR, + 'layout' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, 'edit' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, @@ -100,6 +101,9 @@ class blog extends common { self::EDIT_OWNER => 'Propriétaire' ]; + // Nombre d'articles dans la page de config: + public static $itemsperPage = 8; + public static $users = []; @@ -398,103 +402,113 @@ class blog extends common { * Configuration */ public function config() { + + // Ids des articles par ordre de publication + $articleIds = array_keys(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC')); + // Gestion des droits d'accès + $filterData=[]; + foreach ($articleIds as $key => $value) { + if ( + ( // Propriétaire + $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_OWNER + AND ( $this->getData(['module', $this->getUrl(0), 'posts', $value,'userId']) === $this->getUser('id') + OR $this->getUser('group') === self::GROUP_ADMIN ) + ) + + OR ( + // Groupe + $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) !== self::EDIT_OWNER + AND $this->getUser('group') >= $this->getData(['module',$this->getUrl(0), 'posts', $value,'editConsent']) + ) + OR ( + // Tout le monde + $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_ALL + ) + ) { + $filterData[] = $value; + } + } + $articleIds = $filterData; + // Pagination + $pagination = helper::pagination($articleIds, $this->getUrl(),self::$itemsperPage); + // Liste des pages + self::$pages = $pagination['pages']; + // Articles en fonction de la pagination + for($i = $pagination['first']; $i < $pagination['last']; $i++) { + // Nombre de commentaires à approuver et approuvés + $approvals = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'comment' ]),'approval', 'SORT_DESC'); + if ( is_array($approvals) ) { + $a = array_values($approvals); + $toApprove = count(array_keys($a,false)); + $approved = count(array_keys($a,true)); + } else { + $toApprove = 0; + $approved = count($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i],'comment'])); + } + // Met en forme le tableau + $date = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true) + ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])) + : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))); + $heure = mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true) + ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])) + : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))); + self::$articles[] = [ + '' . + $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'title']) . + '', + $date .' à '. $heure, + self::$states[$this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'state'])], + // Bouton pour afficher les commentaires de l'article + template::button('blogConfigComment' . $articleIds[$i], [ + 'class' => ($toApprove || $approved ) > 0 ? '' : 'buttonGrey' , + 'href' => ($toApprove || $approved ) > 0 ? helper::baseUrl() . $this->getUrl(0) . '/comment/' . $articleIds[$i] : '', + 'value' => $toApprove > 0 ? $toApprove . '/' . $approved : $approved + ]), + template::button('blogConfigEdit' . $articleIds[$i], [ + 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $articleIds[$i] . '/' . $_SESSION['csrf'], + 'value' => template::ico('pencil') + ]), + template::button('blogConfigDelete' . $articleIds[$i], [ + 'class' => 'blogConfigDelete buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $articleIds[$i] . '/' . $_SESSION['csrf'], + 'value' => template::ico('cancel') + ]) + ]; + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Configuration du module', + 'view' => 'config' + ]); + } + + public function layout() { // Mise à jour des données de module $this->update(); // Soumission du formulaire if($this->isPost()) { $this->setData(['module', $this->getUrl(0), 'config',[ - 'feeds' => $this->getInput('blogConfigShowFeeds',helper::FILTER_BOOLEAN), - 'feedsLabel' => $this->getInput('blogConfigFeedslabel',helper::FILTER_STRING_SHORT), - 'itemsperPage' => $this->getInput('blogConfigItemsperPage', helper::FILTER_INT,true), + 'feeds' => $this->getInput('blogLayoutShowFeeds',helper::FILTER_BOOLEAN), + 'feedsLabel' => $this->getInput('blogLayoutFeedslabel',helper::FILTER_STRING_SHORT), + 'itemsperPage' => $this->getInput('blogLayoutItemsperPage', helper::FILTER_INT,true), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) ]]); // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/layout', 'notification' => 'Modifications enregistrées', 'state' => true ]); } else { - // Ids des articles par ordre de publication - $articleIds = array_keys(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC')); - // Gestion des droits d'accès - $filterData=[]; - foreach ($articleIds as $key => $value) { - if ( - ( // Propriétaire - $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_OWNER - AND ( $this->getData(['module', $this->getUrl(0), 'posts', $value,'userId']) === $this->getUser('id') - OR $this->getUser('group') === self::GROUP_ADMIN ) - ) - - OR ( - // Groupe - $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) !== self::EDIT_OWNER - AND $this->getUser('group') >= $this->getData(['module',$this->getUrl(0), 'posts', $value,'editConsent']) - ) - OR ( - // Tout le monde - $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_ALL - ) - ) { - $filterData[] = $value; - } - } - $articleIds = $filterData; - // Pagination - $pagination = helper::pagination($articleIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0),'config', 'itemsperPage'])); - // Liste des pages - self::$pages = $pagination['pages']; - // Articles en fonction de la pagination - for($i = $pagination['first']; $i < $pagination['last']; $i++) { - // Nombre de commentaires à approuver et approuvés - $approvals = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'comment' ]),'approval', 'SORT_DESC'); - if ( is_array($approvals) ) { - $a = array_values($approvals); - $toApprove = count(array_keys($a,false)); - $approved = count(array_keys($a,true)); - } else { - $toApprove = 0; - $approved = count($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i],'comment'])); - } - // Met en forme le tableau - $date = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true) - ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])) - : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))); - $heure = mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true) - ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])) - : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))); - self::$articles[] = [ - '' . - $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'title']) . - '', - $date .' à '. $heure, - self::$states[$this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'state'])], - // Bouton pour afficher les commentaires de l'article - template::button('blogConfigComment' . $articleIds[$i], [ - 'class' => ($toApprove || $approved ) > 0 ? '' : 'buttonGrey' , - 'href' => ($toApprove || $approved ) > 0 ? helper::baseUrl() . $this->getUrl(0) . '/comment/' . $articleIds[$i] : '', - 'value' => $toApprove > 0 ? $toApprove . '/' . $approved : $approved - ]), - template::button('blogConfigEdit' . $articleIds[$i], [ - 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $articleIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') - ]), - template::button('blogConfigDelete' . $articleIds[$i], [ - 'class' => 'blogConfigDelete buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $articleIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') - ]) - ]; - } // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration du module', - 'view' => 'config' + 'title' => 'Mise en page', + 'view' => 'layout' ]); } } + /** * Suppression */ diff --git a/module/blog/changes.md b/module/blog/changes.md new file mode 100644 index 00000000..6a7d7be0 --- /dev/null +++ b/module/blog/changes.md @@ -0,0 +1,2 @@ +# version 6 + - mise à la norme avec le module news : le formulaire est sorti de l'écran principal \ No newline at end of file diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 736151c9..0430fdb2 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -16,35 +16,11 @@ ]); ?>
- -
- -
-
-
-

Paramètres du module

-
-
- $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), - ]); ?> -
-
- 'Texte de l\'étiquette', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) - ]); ?> -
-
-
-
- 'Articles par page', - 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) - ]); ?> -
-
-
+ helper::baseUrl() . $this->getUrl(0) . '/layout', + 'ico' => 'brush', + 'value' => 'Mise en page' + ]); ?>
diff --git a/module/blog/view/layout/layout.css b/module/blog/view/layout/layout.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/module/blog/view/layout/layout.css @@ -0,0 +1,18 @@ +/** + * 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-2022, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/module/blog/view/layout/layout.php b/module/blog/view/layout/layout.php new file mode 100644 index 00000000..f845302b --- /dev/null +++ b/module/blog/view/layout/layout.php @@ -0,0 +1,47 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+ +
+
+
+
+
+

Paramètres du module

+
+
+ $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), + ]); ?> +
+
+ 'Texte de l\'étiquette', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) + ]); ?> +
+
+
+
+ 'Articles par page', + 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) + ]); ?> +
+
+
+
+
+ +
Version n° + +
+ From d21bd7232da5f35b7836630d32d7c386f6f75881 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Tue, 18 Jan 2022 16:55:48 +0100 Subject: [PATCH 009/103] Form 3.0 WIP --- module/form/form.php | 113 +++++++++++++----- module/form/view/config/config.js.php | 93 +++------------ module/form/view/config/config.php | 164 ++++++-------------------- module/form/view/index/index.php | 2 + module/form/view/layout/layout.css | 18 +++ module/form/view/layout/layout.js.php | 72 +++++++++++ module/form/view/layout/layout.php | 144 ++++++++++++++++++++++ 7 files changed, 372 insertions(+), 234 deletions(-) create mode 100644 module/form/view/layout/layout.css create mode 100644 module/form/view/layout/layout.js.php create mode 100644 module/form/view/layout/layout.php diff --git a/module/form/form.php b/module/form/form.php index 627ad4da..af1b181f 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -16,7 +16,7 @@ class form extends common { - const VERSION = '2.11'; + const VERSION = '3.0'; const REALNAME = 'Formulaire'; const DELETE = true; const UPDATE = '0.0'; @@ -24,6 +24,7 @@ class form extends common { public static $actions = [ 'config' => self::GROUP_MODERATOR, + 'layout' => self::GROUP_MODERATOR, 'data' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, 'deleteall' => self::GROUP_MODERATOR, @@ -38,6 +39,9 @@ class form extends common { public static $pagination; + // Nombre d'articles dans la page de config: + public static $itemperPage = 20; + // Objets const TYPE_MAIL = 'mail'; @@ -75,38 +79,31 @@ class form extends common { '100' => '100%' ]; + public static $formOffset = [ + 'none' => 'Aucune', + '1' => 'Une colonne', + '2' => 'Deux colonnes', + '3' => 'Trois colonnes', + '4' => 'Quatre colonnes', + ]; + + public static $formWidth = [ + '6' => 'Six colonne', + '7' => 'Sept colonnes', + '8' => 'Huit colonnes', + '9' => 'Neuf colonnes', + '10' => 'Dix colonnes', + '11' => 'Onze colonnes', + '12' => 'Douze colonnes', + ]; + + /** * Configuration */ public function config() { - // Liste des utilisateurs - $userIdsFirstnames = helper::arrayCollumn($this->getData(['user']), 'firstname'); - ksort($userIdsFirstnames); - self::$listUsers [] = ''; - foreach($userIdsFirstnames as $userId => $userFirstname) { - self::$listUsers [] = $userId; - } // Soumission du formulaire if($this->isPost()) { - // Configuration - $this->setData([ - 'module', - $this->getUrl(0), - 'config', - [ - 'button' => $this->getInput('formConfigButton'), - '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' => $this->getInput('formConfigPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formConfigPageId', helper::FILTER_ID) : '', - 'subject' => $this->getInput('formConfigSubject'), - 'replyto' => $this->getInput('formConfigMailReplyTo', helper::FILTER_BOOLEAN), - 'signature' => $this->getInput('formConfigSignature'), - 'logoUrl' => $this->getInput('formConfigLogo'), - 'logoWidth' => $this->getInput('formConfigLogoWidth') - ] - ]); // Génération des données vides if ($this->getData(['module', $this->getUrl(0), 'data']) === null) { $this->setData(['module', $this->getUrl(0), 'data', []]); @@ -148,6 +145,66 @@ class form extends common { ]); } + + public function layout() { + // Liste des utilisateurs + $userIdsFirstnames = helper::arrayCollumn($this->getData(['user']), 'firstname'); + ksort($userIdsFirstnames); + self::$listUsers [] = ''; + foreach ($userIdsFirstnames as $userId => $userFirstname) { + self::$listUsers [] = $userId; + } + // Soumission du formulaire + if ($this->isPost()) { + // Configuration + $this->setData([ + 'module', + $this->getUrl(0), + 'config', + [ + 'button' => $this->getInput('formLayoutButton'), + 'captcha' => $this->getInput('formLayoutCaptcha', helper::FILTER_BOOLEAN), + 'group' => $this->getInput('formLayoutGroup', helper::FILTER_INT), + 'user' => self::$listUsers [$this->getInput('formLayoutUser', helper::FILTER_INT)], + 'mail' => $this->getInput('formLayoutMail') , + 'pageId' => $this->getInput('formLayoutPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formLayoutPageId', helper::FILTER_ID) : '', + 'subject' => $this->getInput('formLayoutSubject'), + 'replyto' => $this->getInput('formLayoutMailReplyTo', helper::FILTER_BOOLEAN), + 'signature' => $this->getInput('formLayoutSignature'), + 'logoUrl' => $this->getInput('formLayoutLogo'), + 'logoWidth' => $this->getInput('formLayoutLogoWidth') + ] + ]); + // Génération des données vides + if ($this->getData(['module', $this->getUrl(0), 'data']) === null) { + $this->setData(['module', $this->getUrl(0), 'data', []]); + } + // Valeurs en sortie + $this->addOutput([ + 'notification' => 'Modifications enregistrées', + 'redirect' => helper::baseUrl() . $this->getUrl(), + 'state' => true + ]); + } else { + // Liste des pages + foreach($this->getHierarchy(null, false) as $parentPageId => $childrenPageIds) { + self::$pages[$parentPageId] = $this->getData(['page', $parentPageId, 'title']); + foreach($childrenPageIds as $childKey) { + self::$pages[$childKey] = '    ' . $this->getData(['page', $childKey, 'title']); + } + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Paramètres', + 'vendor' => [ + 'html-sortable', + 'flatpickr' + ], + 'view' => 'layout' + ]); + } + } + /** * Données enregistrées */ @@ -155,7 +212,7 @@ class form extends common { $data = $this->getData(['module', $this->getUrl(0), 'data']); if($data) { // Pagination - $pagination = helper::pagination($data, $this->getUrl(),self::ITEMSPAGE); + $pagination = helper::pagination($data, $this->getUrl(), self::$itemsperPages); // Liste des pages self::$pages = $pagination['pages']; // Inverse l'ordre du tableau diff --git a/module/form/view/config/config.js.php b/module/form/view/config/config.js.php index 1522ee3d..2d64a2aa 100644 --- a/module/form/view/config/config.js.php +++ b/module/form/view/config/config.js.php @@ -54,6 +54,15 @@ function add(inputUid, input) { position(); } +/** + * Afficher/cacher les options supplémentaires + */ + $(document).on("click", ".formConfigMoreToggle", function() { + + $(this).parents(".formConfigInput").find(".formConfigMore").slideToggle(); + $(this).parents(".formConfigInput").find(".formConfigMoreLabel").slideToggle(); +}); + /** * Calcul des positions */ @@ -76,14 +85,6 @@ if(inputs) { }); } -/** - * Afficher/cacher les options supplémentaires - */ -$(document).on("click", ".formConfigMoreToggle", function() { - - $(this).parents(".formConfigInput").find(".formConfigMore").slideToggle(); - $(this).parents(".formConfigInput").find(".formConfigMoreLabel").slideToggle(); -}); /** * Crée un nouveau champ à partir des champs cachés @@ -96,6 +97,12 @@ $("#formConfigAdd").on("click", function() { /** * Actions sur les champs */ + +// Validation auto après ajout d'un champ +$("a#formConfigAdd.button").click(function () { + $("#formConfigForm").submit(); +}); + // Tri entre les champs sortable("#formConfigInputs", { forcePlaceholderSize: true, @@ -143,73 +150,3 @@ $("#formConfigInputs") }); // Simule un changement de type au chargement de la page $(".formConfigType").trigger("change"); - -/** - * Affiche/cache les options de la case à cocher du mail - */ -$("#formConfigMailOptionsToggle").on("change", function() { - if($(this).is(":checked")) { - $("#formConfigMailOptions").slideDown(); - } - else { - $("#formConfigMailOptions").slideUp(function() { - $("#formConfigGroup").val(""); - $("#formConfigSubject").val(""); - $("#formConfigMail").val(""); - $("#formConfigUser").val(""); - }); - } -}).trigger("change"); - -/** - * Affiche/cache les options de la case à cocher de la redirection - */ -$("#formConfigPageIdToggle").on("change", function() { - if($(this).is(":checked")) { - $("#formConfigPageIdWrapper").slideDown(); - } - else { - $("#formConfigPageIdWrapper").slideUp(function() { - $("#formConfigPageId").val(""); - }); - } -}).trigger("change"); - -/** -* Paramètres par défaut au chargement -*/ -$( document ).ready(function() { - - /** - * Masquer ou afficher la sélection du logo - */ - if ($("#formConfigSignature").val() !== "text") { - $("#formConfigLogoWrapper").addClass("disabled"); - $("#formConfigLogoWrapper").slideDown(); - $("#formConfigLogoWidthWrapper").addClass("disabled"); - $("#formConfigLogoWidthWrapper").slideDown(); - } else { - $("#formConfigLogoWrapper").removeClass("disabled"); - $("#formConfigLogoWrapper").slideUp(); - $("#formConfigLogoWidthWrapper").removeClass("disabled"); - $("#formConfigLogoWidthWrapper").slideUp(); - } -}); - -/** - * Masquer ou afficher la sélection du logo - */ -var formConfigSignatureDOM = $("#formConfigSignature"); -formConfigSignatureDOM.on("change", function() { - if ($(this).val() !== "text") { - $("#formConfigLogoWrapper").addClass("disabled"); - $("#formConfigLogoWrapper").slideDown(); - $("#formConfigLogoWidthWrapper").addClass("disabled"); - $("#formConfigLogoWidthWrapper").slideDown(); - } else { - $("#formConfigLogoWrapper").removeClass("disabled"); - $("#formConfigLogoWrapper").slideUp(); - $("#formConfigLogoWidthWrapper").removeClass("disabled"); - $("#formConfigLogoWidthWrapper").slideUp(); - } -}); diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 6631a20a..60cf1b6c 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -49,140 +49,48 @@ -
-
- 'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' - ]); ?> -
-
- helper::baseUrl() . $this->getUrl(0) . '/data', - 'value' => 'Gérer les données' - ]); ?> -
-
+
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+ helper::baseUrl() . $this->getUrl(0) . '/data', + 'value' => 'Données' + ]); ?> +
+
+ helper::baseUrl() . $this->getUrl(0) . '/layout', + 'value' => 'Paramètres', + 'ico' => 'cog-alt' + ]); ?> +
+
+
+
+

Liste des champs

+
+
+
-
-
-

Configuration

- 'Laissez vide afin de conserver le texte par défaut.', - 'label' => 'Texte du bouton de soumission', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) - ]); ?> - (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || - !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.' - ]); ?> -
-
-
- 'Laissez vide afin de conserver le texte par défaut.', - 'label' => 'Sujet du mail', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) - ]); ?> -
-
- -
-
- 'Aux groupes à partir de', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), - 'help' => 'Editeurs = éditeurs + administrateurs
Membres = membres + éditeurs + administrateurs' - ]); ?> -
-
- 'A un membre', - 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) - ]); ?> -
-
- 'A une adresse email', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), - 'help' => 'Un email ou une liste de diffusion' - ]); ?> -
-
-
-
- (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.' - ]); ?> -
-
-
-
-
- 'Sélectionner le type de signature', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) - ]); ?> -
-
- 'Sélectionnez le logo du site', - 'label' => 'Logo', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) - ]); ?> -
-
- 'Sélectionner la largeur du logo', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) - ]); ?> -
-
-
-
- (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) - ]); ?> -
-
- 'displayNone', - 'label' => 'Sélectionner une page du site :', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) - ]); ?> -
-
- $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) - ]); ?> -
-
-

Liste des champs

-
- -
-
-
-
- template::ico('plus') - ]); ?> -
-
-
+
+ template::ico('plus'), + 'class' => 'buttonGreen' + ]); ?>
+
+
Version n° diff --git a/module/form/view/index/index.php b/module/form/view/index/index.php index 6eba5cc9..8d3b9a91 100644 --- a/module/form/view/index/index.php +++ b/module/form/view/index/index.php @@ -1,4 +1,5 @@ getData(['module', $this->getUrl(0), 'input'])): ?> +
getData(['module', $this->getUrl(0), 'input']) as $index => $input): ?> @@ -61,6 +62,7 @@ ]); ?>
+
diff --git a/module/form/view/layout/layout.css b/module/form/view/layout/layout.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/module/form/view/layout/layout.css @@ -0,0 +1,18 @@ +/** + * 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-2022, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/module/form/view/layout/layout.js.php b/module/form/view/layout/layout.js.php new file mode 100644 index 00000000..8970a0fe --- /dev/null +++ b/module/form/view/layout/layout.js.php @@ -0,0 +1,72 @@ + + + +/* +* Affiche/cache les options de la case à cocher du mail +*/ +$("#formLayoutMailOptionsToggle").on("change", function() { + if($(this).is(":checked")) { + $("#formLayoutMailOptions").slideDown(); + } + else { + $("#formLayoutMailOptions").slideUp(function() { + $("#formLayoutGroup").val(""); + $("#formLayoutSubject").val(""); + $("#formLayoutMail").val(""); + $("#formLayoutUser").val(""); + }); + } +}).trigger("change"); + +/** +* Affiche/cache les options de la case à cocher de la redirection +*/ +$("#formLayoutPageIdToggle").on("change", function() { + if($(this).is(":checked")) { + $("#formLayoutPageIdWrapper").slideDown(); + } + else { + $("#formLayoutPageIdWrapper").slideUp(function() { + $("#formLayoutPageId").val(""); + }); + } +}).trigger("change"); + +/** +* Paramètres par défaut au chargement +*/ +$( document ).ready(function() { + + /** + * Masquer ou afficher la sélection du logo + */ + if ($("#formLayoutSignature").val() !== "text") { + $("#formLayoutLogoWrapper").addClass("disabled"); + $("#formLayoutLogoWrapper").slideDown(); + $("#formLayoutLogoWidthWrapper").addClass("disabled"); + $("#formLayoutLogoWidthWrapper").slideDown(); + } else { + $("#formLayoutLogoWrapper").removeClass("disabled"); + $("#formLayoutLogoWrapper").slideUp(); + $("#formLayoutLogoWidthWrapper").removeClass("disabled"); + $("#formLayoutLogoWidthWrapper").slideUp(); + } +}); + +/** +* Masquer ou afficher la sélection du logo +*/ +var formLayoutSignatureDOM = $("#formLayoutSignature"); +formLayoutSignatureDOM.on("change", function() { + if ($(this).val() !== "text") { + $("#formLayoutLogoWrapper").addClass("disabled"); + $("#formLayoutLogoWrapper").slideDown(); + $("#formLayoutLogoWidthWrapper").addClass("disabled"); + $("#formLayoutLogoWidthWrapper").slideDown(); + } else { + $("#formLayoutLogoWrapper").removeClass("disabled"); + $("#formLayoutLogoWrapper").slideUp(); + $("#formLayoutLogoWidthWrapper").removeClass("disabled"); + $("#formLayoutLogoWidthWrapper").slideUp(); + } +}); \ No newline at end of file diff --git a/module/form/view/layout/layout.php b/module/form/view/layout/layout.php new file mode 100644 index 00000000..83e80079 --- /dev/null +++ b/module/form/view/layout/layout.php @@ -0,0 +1,144 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+ +
+
+
+
+
+

Validation du formulaire

+
+
+ $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) + ]); ?> +
+
+ 'Laissez vide afin de conserver le texte par défaut.', + 'label' => 'Etiquette du bouton de soumission', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) + ]); ?> +
+
+
+
+ (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) + ]); ?> +
+
+ 'displayNone', + 'label' => 'Page du site :', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) + ]); ?> +
+
+
+
+
+
+
+
+

Courriel

+ (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || + !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 saisissez un email. Votre serveur doit autoriser les envois de mail.' + ]); ?> +
+
+
+ 'Laissez vide afin de conserver le texte par défaut.', + 'label' => 'Sujet du mail', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) + ]); ?> +
+
+ +
+
+ 'Aux groupes à partir de', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), + 'help' => 'Editeurs = éditeurs + administrateurs
Membres = membres + éditeurs + administrateurs' + ]); ?> +
+
+ 'A un membre', + 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) + ]); ?> +
+
+ 'A une adresse email', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), + 'help' => 'Un email ou une liste de diffusion' + ]); ?> +
+
+
+
+ 'Sélectionner le type de signature', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) + ]); ?> +
+
+ 'Sélectionnez le logo du site', + 'label' => 'Logo', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) + ]); ?> +
+
+ 'Sélectionner la largeur du logo', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) + ]); ?> +
+
+
+
+ (bool) $this->getData(['module', $this->getUrl(0), 'config', 'replyto']), + 'help' => 'Cette option permet de réponse directement à l\'expéditeur du message si celui-ci a indiqué un email valide.' + ]); ?> +
+
+
+
+
+
+
+
+
+

Gabarit

+
+
+ +
+
+ +
+
+
+
+
+
\ No newline at end of file From 02d48bd72405c32346f312c9604aaf94a06aa4b8 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Wed, 19 Jan 2022 11:43:16 +0100 Subject: [PATCH 010/103] layout -> option --- module/form/form.php | 28 ++++---- module/form/view/config/config.php | 4 +- module/form/view/layout/layout.js.php | 72 ------------------- .../{layout/layout.css => option/option.css} | 0 module/form/view/option/option.js.php | 72 +++++++++++++++++++ .../{layout/layout.php => option/option.php} | 34 ++++----- 6 files changed, 105 insertions(+), 105 deletions(-) delete mode 100644 module/form/view/layout/layout.js.php rename module/form/view/{layout/layout.css => option/option.css} (100%) create mode 100644 module/form/view/option/option.js.php rename module/form/view/{layout/layout.php => option/option.php} (84%) diff --git a/module/form/form.php b/module/form/form.php index af1b181f..e677542b 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -24,7 +24,7 @@ class form extends common { public static $actions = [ 'config' => self::GROUP_MODERATOR, - 'layout' => self::GROUP_MODERATOR, + 'option' => self::GROUP_MODERATOR, 'data' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, 'deleteall' => self::GROUP_MODERATOR, @@ -146,7 +146,7 @@ class form extends common { } - public function layout() { + public function option() { // Liste des utilisateurs $userIdsFirstnames = helper::arrayCollumn($this->getData(['user']), 'firstname'); ksort($userIdsFirstnames); @@ -162,17 +162,17 @@ class form extends common { $this->getUrl(0), 'config', [ - 'button' => $this->getInput('formLayoutButton'), - 'captcha' => $this->getInput('formLayoutCaptcha', helper::FILTER_BOOLEAN), - 'group' => $this->getInput('formLayoutGroup', helper::FILTER_INT), - 'user' => self::$listUsers [$this->getInput('formLayoutUser', helper::FILTER_INT)], - 'mail' => $this->getInput('formLayoutMail') , - 'pageId' => $this->getInput('formLayoutPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formLayoutPageId', helper::FILTER_ID) : '', - 'subject' => $this->getInput('formLayoutSubject'), - 'replyto' => $this->getInput('formLayoutMailReplyTo', helper::FILTER_BOOLEAN), - 'signature' => $this->getInput('formLayoutSignature'), - 'logoUrl' => $this->getInput('formLayoutLogo'), - 'logoWidth' => $this->getInput('formLayoutLogoWidth') + 'button' => $this->getInput('formOptionButton'), + 'captcha' => $this->getInput('formOptionCaptcha', helper::FILTER_BOOLEAN), + 'group' => $this->getInput('formOptionGroup', helper::FILTER_INT), + 'user' => self::$listUsers [$this->getInput('formOptionUser', helper::FILTER_INT)], + 'mail' => $this->getInput('formOptionMail') , + 'pageId' => $this->getInput('formOptionPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formOptionPageId', helper::FILTER_ID) : '', + 'subject' => $this->getInput('formOptionSubject'), + 'replyto' => $this->getInput('formOptionMailReplyTo', helper::FILTER_BOOLEAN), + 'signature' => $this->getInput('formOptionSignature'), + 'logoUrl' => $this->getInput('formOptionLogo'), + 'logoWidth' => $this->getInput('formOptionLogoWidth') ] ]); // Génération des données vides @@ -200,7 +200,7 @@ class form extends common { 'html-sortable', 'flatpickr' ], - 'view' => 'layout' + 'view' => 'option' ]); } } diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 60cf1b6c..e992f834 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -66,8 +66,8 @@
helper::baseUrl() . $this->getUrl(0) . '/layout', - 'value' => 'Paramètres', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/option', + 'value' => 'Options', 'ico' => 'cog-alt' ]); ?>
diff --git a/module/form/view/layout/layout.js.php b/module/form/view/layout/layout.js.php deleted file mode 100644 index 8970a0fe..00000000 --- a/module/form/view/layout/layout.js.php +++ /dev/null @@ -1,72 +0,0 @@ - - - -/* -* Affiche/cache les options de la case à cocher du mail -*/ -$("#formLayoutMailOptionsToggle").on("change", function() { - if($(this).is(":checked")) { - $("#formLayoutMailOptions").slideDown(); - } - else { - $("#formLayoutMailOptions").slideUp(function() { - $("#formLayoutGroup").val(""); - $("#formLayoutSubject").val(""); - $("#formLayoutMail").val(""); - $("#formLayoutUser").val(""); - }); - } -}).trigger("change"); - -/** -* Affiche/cache les options de la case à cocher de la redirection -*/ -$("#formLayoutPageIdToggle").on("change", function() { - if($(this).is(":checked")) { - $("#formLayoutPageIdWrapper").slideDown(); - } - else { - $("#formLayoutPageIdWrapper").slideUp(function() { - $("#formLayoutPageId").val(""); - }); - } -}).trigger("change"); - -/** -* Paramètres par défaut au chargement -*/ -$( document ).ready(function() { - - /** - * Masquer ou afficher la sélection du logo - */ - if ($("#formLayoutSignature").val() !== "text") { - $("#formLayoutLogoWrapper").addClass("disabled"); - $("#formLayoutLogoWrapper").slideDown(); - $("#formLayoutLogoWidthWrapper").addClass("disabled"); - $("#formLayoutLogoWidthWrapper").slideDown(); - } else { - $("#formLayoutLogoWrapper").removeClass("disabled"); - $("#formLayoutLogoWrapper").slideUp(); - $("#formLayoutLogoWidthWrapper").removeClass("disabled"); - $("#formLayoutLogoWidthWrapper").slideUp(); - } -}); - -/** -* Masquer ou afficher la sélection du logo -*/ -var formLayoutSignatureDOM = $("#formLayoutSignature"); -formLayoutSignatureDOM.on("change", function() { - if ($(this).val() !== "text") { - $("#formLayoutLogoWrapper").addClass("disabled"); - $("#formLayoutLogoWrapper").slideDown(); - $("#formLayoutLogoWidthWrapper").addClass("disabled"); - $("#formLayoutLogoWidthWrapper").slideDown(); - } else { - $("#formLayoutLogoWrapper").removeClass("disabled"); - $("#formLayoutLogoWrapper").slideUp(); - $("#formLayoutLogoWidthWrapper").removeClass("disabled"); - $("#formLayoutLogoWidthWrapper").slideUp(); - } -}); \ No newline at end of file diff --git a/module/form/view/layout/layout.css b/module/form/view/option/option.css similarity index 100% rename from module/form/view/layout/layout.css rename to module/form/view/option/option.css diff --git a/module/form/view/option/option.js.php b/module/form/view/option/option.js.php new file mode 100644 index 00000000..2148e0c6 --- /dev/null +++ b/module/form/view/option/option.js.php @@ -0,0 +1,72 @@ + + + +/* +* Affiche/cache les options de la case à cocher du mail +*/ +$("#formOptionMailOptionsToggle").on("change", function() { + if($(this).is(":checked")) { + $("#formOptionMailOptions").slideDown(); + } + else { + $("#formOptionMailOptions").slideUp(function() { + $("#formOptionGroup").val(""); + $("#formOptionSubject").val(""); + $("#formOptionMail").val(""); + $("#formOptionUser").val(""); + }); + } +}).trigger("change"); + +/** +* Affiche/cache les options de la case à cocher de la redirection +*/ +$("#formOptionPageIdToggle").on("change", function() { + if($(this).is(":checked")) { + $("#formOptionPageIdWrapper").slideDown(); + } + else { + $("#formOptionPageIdWrapper").slideUp(function() { + $("#formOptionPageId").val(""); + }); + } +}).trigger("change"); + +/** +* Paramètres par défaut au chargement +*/ +$( document ).ready(function() { + + /** + * Masquer ou afficher la sélection du logo + */ + if ($("#formOptionSignature").val() !== "text") { + $("#formOptionLogoWrapper").addClass("disabled"); + $("#formOptionLogoWrapper").slideDown(); + $("#formOptionLogoWidthWrapper").addClass("disabled"); + $("#formOptionLogoWidthWrapper").slideDown(); + } else { + $("#formOptionLogoWrapper").removeClass("disabled"); + $("#formOptionLogoWrapper").slideUp(); + $("#formOptionLogoWidthWrapper").removeClass("disabled"); + $("#formOptionLogoWidthWrapper").slideUp(); + } +}); + +/** +* Masquer ou afficher la sélection du logo +*/ +var formOptionSignatureDOM = $("#formOptionSignature"); +formOptionSignatureDOM.on("change", function() { + if ($(this).val() !== "text") { + $("#formOptionLogoWrapper").addClass("disabled"); + $("#formOptionLogoWrapper").slideDown(); + $("#formOptionLogoWidthWrapper").addClass("disabled"); + $("#formOptionLogoWidthWrapper").slideDown(); + } else { + $("#formOptionLogoWrapper").removeClass("disabled"); + $("#formOptionLogoWrapper").slideUp(); + $("#formOptionLogoWidthWrapper").removeClass("disabled"); + $("#formOptionLogoWidthWrapper").slideUp(); + } +}); \ No newline at end of file diff --git a/module/form/view/layout/layout.php b/module/form/view/option/option.php similarity index 84% rename from module/form/view/layout/layout.php rename to module/form/view/option/option.php index 83e80079..b9aa005c 100644 --- a/module/form/view/layout/layout.php +++ b/module/form/view/option/option.php @@ -1,7 +1,7 @@ - +
- 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'ico' => 'left', @@ -9,7 +9,7 @@ ]); ?>
- +
@@ -18,12 +18,12 @@

Validation du formulaire

- $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) ]); ?>
- 'Laissez vide afin de conserver le texte par défaut.', 'label' => 'Etiquette du bouton de soumission', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) @@ -32,12 +32,12 @@
- (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) ]); ?>
- 'displayNone', 'label' => 'Page du site :', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) @@ -51,16 +51,16 @@

Courriel

- (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || !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 saisissez un email. Votre serveur doit autoriser les envois de mail.' ]); ?> -
+
- 'Laissez vide afin de conserver le texte par défaut.', 'label' => 'Sujet du mail', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) @@ -73,20 +73,20 @@ ?>
- 'Aux groupes à partir de', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), 'help' => 'Editeurs = éditeurs + administrateurs
Membres = membres + éditeurs + administrateurs' ]); ?>
- 'A un membre', 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) ]); ?>
- 'A une adresse email', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), 'help' => 'Un email ou une liste de diffusion' @@ -95,20 +95,20 @@
- 'Sélectionner le type de signature', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) ]); ?>
- 'Sélectionnez le logo du site', 'label' => 'Logo', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) ]); ?>
- 'Sélectionner la largeur du logo', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) ]); ?> @@ -116,7 +116,7 @@
- (bool) $this->getData(['module', $this->getUrl(0), 'config', 'replyto']), 'help' => 'Cette option permet de réponse directement à l\'expéditeur du message si celui-ci a indiqué un email valide.' ]); ?> From 76761079beebf7a37251f2cdfb3ad545675739dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Wed, 19 Jan 2022 19:08:15 +0100 Subject: [PATCH 011/103] v11.3 --- core/core.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core.php b/core/core.php index dc61a254..de7ed36a 100644 --- a/core/core.php +++ b/core/core.php @@ -45,8 +45,8 @@ class common { // Numéro de version const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/'; - const ZWII_VERSION = '11.2.03'; - const ZWII_UPDATE_CHANNEL = "test"; + const ZWII_VERSION = '11.3.00'; + const ZWII_UPDATE_CHANNEL = "v11"; public static $actions = []; public static $coreModuleIds = [ From 74d28667d90d515911be12bf08022e04cfe818d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Wed, 19 Jan 2022 19:14:14 +0100 Subject: [PATCH 012/103] update version de test --- core/core.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.php b/core/core.php index de7ed36a..02b1a01f 100644 --- a/core/core.php +++ b/core/core.php @@ -46,7 +46,7 @@ class common { // Numéro de version const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/'; const ZWII_VERSION = '11.3.00'; - const ZWII_UPDATE_CHANNEL = "v11"; + const ZWII_UPDATE_CHANNEL = "test"; public static $actions = []; public static $coreModuleIds = [ From 29ba48850c176653de9b138f8ad6d2b343833642 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 09:33:29 +0100 Subject: [PATCH 013/103] form option alignement + gabarit --- module/form/form.php | 45 +++++++---- module/form/view/index/index.php | 122 +++++++++++++++-------------- module/form/view/option/option.php | 18 ++++- 3 files changed, 109 insertions(+), 76 deletions(-) diff --git a/module/form/form.php b/module/form/form.php index e677542b..55730e8e 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -79,22 +79,26 @@ class form extends common { '100' => '100%' ]; - public static $formOffset = [ - 'none' => 'Aucune', - '1' => 'Une colonne', - '2' => 'Deux colonnes', - '3' => 'Trois colonnes', - '4' => 'Quatre colonnes', + public static $optionOffset = [ + 0 => 'Aucune', + 1 => 'Une colonne', + 2 => 'Deux colonnes' ]; - public static $formWidth = [ - '6' => 'Six colonne', - '7' => 'Sept colonnes', - '8' => 'Huit colonnes', - '9' => 'Neuf colonnes', - '10' => 'Dix colonnes', - '11' => 'Onze colonnes', - '12' => 'Douze colonnes', + public static $optionWidth = [ + 6 => 'Six colonnes', + 7 => 'Sept colonnes', + 8 => 'Huit colonnes', + 9 => 'Neuf colonnes', + 10 => 'Dix colonnes', + 11 => 'Onze colonnes', + 12 => 'Douze colonnes', + ]; + + public static $optionAlign = [ + '' => 'A gauche', + 'textAlignCenter' => 'Au centre', + 'textAlignRight' => 'A droite' ]; @@ -156,6 +160,12 @@ class form extends common { } // Soumission du formulaire if ($this->isPost()) { + // Débordement + $width = $this->getInput('formOptionWidth'); + if ($this->getInput('formOptionWidth',helper::FILTER_INT) + $this->getInput('formOptionOffset',helper::FILTER_INT) > 12 ) { + $width = (string) $this->getInput('formOptionWidth',helper::FILTER_INT) - $this->getInput('formOptionOffset',helper::FILTER_INT); + } + // Configuration $this->setData([ 'module', @@ -172,7 +182,10 @@ class form extends common { 'replyto' => $this->getInput('formOptionMailReplyTo', helper::FILTER_BOOLEAN), 'signature' => $this->getInput('formOptionSignature'), 'logoUrl' => $this->getInput('formOptionLogo'), - 'logoWidth' => $this->getInput('formOptionLogoWidth') + 'logoWidth' => $this->getInput('formOptionLogoWidth'), + 'offset' =>$this->getInput('formOptionOffset'), + 'width' =>$width, + 'align' =>$this->getInput('formOptionAlign'), ] ]); // Génération des données vides @@ -181,7 +194,7 @@ class form extends common { } // Valeurs en sortie $this->addOutput([ - 'notification' => 'Modifications enregistrées', + 'notification' => 'Modifications enregistrées' , 'redirect' => helper::baseUrl() . $this->getUrl(), 'state' => true ]); diff --git a/module/form/view/index/index.php b/module/form/view/index/index.php index 8d3b9a91..c2251225 100644 --- a/module/form/view/index/index.php +++ b/module/form/view/index/index.php @@ -1,69 +1,75 @@ getData(['module', $this->getUrl(0), 'input'])): ?> -
- - getData(['module', $this->getUrl(0), 'input']) as $index => $input): ?> - - 'formInput_' . $index, - 'label' => $input['name'] - ]); ?> - - $key) { - $values[$value] = trim($value); - } - ?> - 'formInput_' . $index, - 'label' => $input['name'] - ]); ?> - - 'formInput_' . $index, - 'label' => $input['name'] - ]); ?> - - 'formInput_' . $index, - 'label' => $input['name'] - ]); ?> - - 'formInput_' . $index, - 'label' => $input['name'], - 'vendor' => 'flatpickr' - ]); ?> - - - -

- -
-

+
+
+ + getData(['module', $this->getUrl(0), 'input']) as $index => $input): ?> + + 'formInput_' . $index, + 'label' => $input['name'] + ]); ?> + + $key) { + $values[$value] = trim($value); + } + ?> + 'formInput_' . $index, + 'label' => $input['name'] + ]); ?> + + 'formInput_' . $index, + 'label' => $input['name'] + ]); ?> + + 'formInput_' . $index, + 'label' => $input['name'] + ]); ?> + + 'formInput_' . $index, + 'label' => $input['name'], + 'vendor' => 'flatpickr' + ]); ?> + + + +

+ +
+

+ + + getData(['module', $this->getUrl(0), 'config', 'captcha'])): ?> +
+
+ $this->getData(['config','connect', 'captchaStrong']), + 'type' => $this->getData(['config','connect', 'captchaType']) + ]); ?> +
+
- - getData(['module', $this->getUrl(0), 'config', 'captcha'])): ?>
-
- $this->getData(['config','connect', 'captchaStrong']), - 'type' => $this->getData(['config','connect', 'captchaType']) +
+ $this->getData(['module', $this->getUrl(0), 'config', 'button']) ? $this->getData(['module', $this->getUrl(0), 'config', 'button']) : 'Envoyer', + 'ico' => '' ]); ?>
- -
-
- $this->getData(['module', $this->getUrl(0), 'config', 'button']) ? $this->getData(['module', $this->getUrl(0), 'config', 'button']) : 'Envoyer', - 'ico' => '' - ]); ?> -
- +
+ \ No newline at end of file diff --git a/module/form/view/option/option.php b/module/form/view/option/option.php index b9aa005c..f8635892 100644 --- a/module/form/view/option/option.php +++ b/module/form/view/option/option.php @@ -132,10 +132,24 @@

Gabarit

- + 'Alignement du formulaire', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'align']) + ]); ?> +
+
+
+
+ 'Décalage à gauche', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'offset']) + ]); ?>
- + 'Largeur', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'width']) + ]); ?>
From bb9dbdd799624cfb23a5438e99be931661776e9c Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 09:34:04 +0100 Subject: [PATCH 014/103] forme v3 suite --- module/form/changes.md | 3 + module/form/view/option/option.php | 236 ++++++++++++++--------------- 2 files changed, 121 insertions(+), 118 deletions(-) create mode 100644 module/form/changes.md diff --git a/module/form/changes.md b/module/form/changes.md new file mode 100644 index 00000000..c8442301 --- /dev/null +++ b/module/form/changes.md @@ -0,0 +1,3 @@ +# Version 3 + - Déplacement des options de formulaires + - Gabarit du formulaire sur la page \ No newline at end of file diff --git a/module/form/view/option/option.php b/module/form/view/option/option.php index f8635892..47fb53e1 100644 --- a/module/form/view/option/option.php +++ b/module/form/view/option/option.php @@ -1,135 +1,56 @@ -
-
- 'buttonGrey', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' - ]); ?> -
-
- -
-
-
-
-
-

Validation du formulaire

-
-
- $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) - ]); ?> -
-
- 'Laissez vide afin de conserver le texte par défaut.', - 'label' => 'Etiquette du bouton de soumission', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) - ]); ?> -
-
-
-
- (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) - ]); ?> -
-
- 'displayNone', - 'label' => 'Page du site :', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) - ]); ?> -
-
+
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
+
+
-
-
-
-
-

Courriel

- (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || - !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 saisissez un email. Votre serveur doit autoriser les envois de mail.' - ]); ?> -
+
+
+
+

Validation du formulaire

-
- + $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) + ]); ?> +
+
+ 'Laissez vide afin de conserver le texte par défaut.', - 'label' => 'Sujet du mail', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) - ]); ?> -
-
- -
-
- 'Aux groupes à partir de', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), - 'help' => 'Editeurs = éditeurs + administrateurs
Membres = membres + éditeurs + administrateurs' - ]); ?> -
-
- 'A un membre', - 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) - ]); ?> -
-
- 'A une adresse email', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), - 'help' => 'Un email ou une liste de diffusion' - ]); ?> -
-
-
-
- 'Sélectionner le type de signature', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) - ]); ?> -
-
- 'Sélectionnez le logo du site', - 'label' => 'Logo', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) - ]); ?> -
-
- 'Sélectionner la largeur du logo', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) + 'label' => 'Etiquette du bouton de soumission', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) ]); ?>
- (bool) $this->getData(['module', $this->getUrl(0), 'config', 'replyto']), - 'help' => 'Cette option permet de réponse directement à l\'expéditeur du message si celui-ci a indiqué un email valide.' - ]); ?> + (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) + ]); ?> +
+
+ 'displayNone', + 'label' => 'Page du site :', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) + ]); ?>
-
-
-
-
-

Gabarit

+
+
+
+

Gabarit

- 'Largeur', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'width']) ]); ?> @@ -155,4 +76,83 @@
+
+
+
+

Courriel

+ (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || + !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 saisissez un email. Votre serveur doit autoriser les envois de mail.' + ]); ?> +
+
+
+ 'Laissez vide afin de conserver le texte par défaut.', + 'label' => 'Sujet du mail', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) + ]); ?> +
+
+ +
+
+ 'Aux groupes à partir de', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), + 'help' => 'Editeurs = éditeurs + administrateurs
Membres = membres + éditeurs + administrateurs' + ]); ?> +
+
+ 'A un membre', + 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) + ]); ?> +
+
+ 'A une adresse email', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), + 'help' => 'Un email ou une liste de diffusion' + ]); ?> +
+
+
+
+ 'Sélectionner le type de signature', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) + ]); ?> +
+
+ 'Sélectionnez le logo du site', + 'label' => 'Logo', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) + ]); ?> +
+
+ 'Sélectionner la largeur du logo', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) + ]); ?> +
+
+
+
+ (bool) $this->getData(['module', $this->getUrl(0), 'config', 'replyto']), + 'help' => 'Cette option permet de réponse directement à l\'expéditeur du message si celui-ci a indiqué un email valide.' + ]); ?> +
+
+
+
+
+
\ No newline at end of file From 9de918120f464a58b47c86afd9a96d5e141a1de6 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 09:53:40 +0100 Subject: [PATCH 015/103] layout -> option --- module/blog/blog.php | 14 +++++++------- module/blog/view/config/config.php | 14 +++++++------- .../view/{layout/layout.css => option/option.css} | 0 .../view/{layout/layout.php => option/option.php} | 12 ++++++------ 4 files changed, 20 insertions(+), 20 deletions(-) rename module/blog/view/{layout/layout.css => option/option.css} (100%) rename module/blog/view/{layout/layout.php => option/option.php} (76%) diff --git a/module/blog/blog.php b/module/blog/blog.php index 08222009..ff862cd2 100644 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -32,7 +32,7 @@ class blog extends common { 'commentDelete' => self::GROUP_MODERATOR, 'commentDeleteAll' => self::GROUP_MODERATOR, 'config' => self::GROUP_MODERATOR, - 'layout' => self::GROUP_MODERATOR, + 'option' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, 'edit' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, @@ -482,20 +482,20 @@ class blog extends common { ]); } - public function layout() { + public function option() { // Mise à jour des données de module $this->update(); // Soumission du formulaire if($this->isPost()) { $this->setData(['module', $this->getUrl(0), 'config',[ - 'feeds' => $this->getInput('blogLayoutShowFeeds',helper::FILTER_BOOLEAN), - 'feedsLabel' => $this->getInput('blogLayoutFeedslabel',helper::FILTER_STRING_SHORT), - 'itemsperPage' => $this->getInput('blogLayoutItemsperPage', helper::FILTER_INT,true), + 'feeds' => $this->getInput('blogOptionShowFeeds',helper::FILTER_BOOLEAN), + 'feedsLabel' => $this->getInput('blogOptionFeedslabel',helper::FILTER_STRING_SHORT), + 'itemsperPage' => $this->getInput('blogOptionItemsperPage', helper::FILTER_INT,true), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) ]]); // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/layout', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/option', 'notification' => 'Modifications enregistrées', 'state' => true ]); @@ -503,7 +503,7 @@ class blog extends common { // Valeurs en sortie $this->addOutput([ 'title' => 'Mise en page', - 'view' => 'layout' + 'view' => 'option' ]); } } diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 0430fdb2..1be3aab5 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -8,18 +8,18 @@ 'value' => 'Retour' ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/add', 'ico' => 'plus', - 'value' => 'Article' + 'value' => '' ]); ?>
-
- helper::baseUrl() . $this->getUrl(0) . '/layout', - 'ico' => 'brush', - 'value' => 'Mise en page' +
+ helper::baseUrl() . $this->getUrl(0) . '/option', + 'ico' => 'cogs', + 'value' => '' ]); ?>
diff --git a/module/blog/view/layout/layout.css b/module/blog/view/option/option.css similarity index 100% rename from module/blog/view/layout/layout.css rename to module/blog/view/option/option.css diff --git a/module/blog/view/layout/layout.php b/module/blog/view/option/option.php similarity index 76% rename from module/blog/view/layout/layout.php rename to module/blog/view/option/option.php index f845302b..f86d3cd8 100644 --- a/module/blog/view/layout/layout.php +++ b/module/blog/view/option/option.php @@ -1,7 +1,7 @@ - +
- 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'ico' => 'left', @@ -9,7 +9,7 @@ ]); ?>
- +
@@ -18,12 +18,12 @@

Paramètres du module

- $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), ]); ?>
- 'Texte de l\'étiquette', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) ]); ?> @@ -31,7 +31,7 @@
- 'Articles par page', 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) ]); ?> From 334f3c8e8ad7da0c23976313f2a1040697dafd5d Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 10:25:20 +0100 Subject: [PATCH 016/103] blog icones sans texte --- module/blog/view/config/config.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 1be3aab5..ab4c20d5 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -9,18 +9,19 @@ ]); ?>
- helper::baseUrl() . $this->getUrl(0) . '/add', - 'ico' => 'plus', - 'value' => '' - ]); ?> -
-
helper::baseUrl() . $this->getUrl(0) . '/option', 'ico' => 'cogs', 'value' => '' ]); ?> + +
+
+ helper::baseUrl() . $this->getUrl(0) . '/add', + 'ico' => 'plus', + 'value' => '' + ]); ?>
From 3aa29f8fa28ae2dfb49e40f51f3746e5e40a9015 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 10:32:32 +0100 Subject: [PATCH 017/103] blog form et gallery icone dans value --- module/blog/view/config/config.php | 6 ++---- module/form/view/config/config.php | 9 ++++----- module/gallery/view/config/config.php | 4 ++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index ab4c20d5..e3e18509 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -11,16 +11,14 @@
helper::baseUrl() . $this->getUrl(0) . '/option', - 'ico' => 'cogs', - 'value' => '' + 'value' => template::ico('cogs') ]); ?>
helper::baseUrl() . $this->getUrl(0) . '/add', - 'ico' => 'plus', - 'value' => '' + 'value' => template::ico('plus') ]); ?>
diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index e992f834..45784d4b 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -58,17 +58,16 @@ 'value' => 'Retour' ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/data', - 'value' => 'Données' + 'value' => template::ico('code') ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => 'Options', - 'ico' => 'cog-alt' + 'value' => template::ico('cogs') ]); ?>
diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index 1901704b..4790c1dc 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -8,10 +8,10 @@ 'value' => 'Retour' ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], - 'value' => template::ico('brush','right') . 'Mise en page' + 'value' => template::ico('brush') ]); ?>
From a7e287b74c67522103e252c5a2893553392d0e9e Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 10:37:00 +0100 Subject: [PATCH 018/103] news layout -> option --- module/news/news.php | 18 +++++++++--------- module/news/view/config/config.php | 12 +++++------- .../{layout/layout.css => option/option.css} | 0 .../{layout/layout.php => option/option.php} | 16 ++++++++-------- 4 files changed, 22 insertions(+), 24 deletions(-) rename module/news/view/{layout/layout.css => option/option.css} (100%) rename module/news/view/{layout/layout.php => option/option.php} (86%) diff --git a/module/news/news.php b/module/news/news.php index 1bb0ae6a..c47c8dca 100644 --- a/module/news/news.php +++ b/module/news/news.php @@ -24,7 +24,7 @@ class news extends common { public static $actions = [ 'add' => self::GROUP_MODERATOR, 'config' => self::GROUP_MODERATOR, // Edition des news - 'layout' => self::GROUP_MODERATOR, // paramétrage des news + 'option' => self::GROUP_MODERATOR, // paramétrage des news 'delete' => self::GROUP_MODERATOR, 'edit' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, @@ -244,7 +244,7 @@ class news extends common { ]); } - public function layout() { + public function option() { // Soumission du formulaire if($this->isPost()) { @@ -272,18 +272,18 @@ class news extends common { ]]); $this->setData(['module', $this->getUrl(0), 'config',[ - 'feeds' => $this->getInput('newsLayoutShowFeeds',helper::FILTER_BOOLEAN), - 'feedsLabel' => $this->getInput('newsLayoutFeedslabel',helper::FILTER_STRING_SHORT), - 'itemsperPage' => $this->getInput('newsLayoutItemsperPage', helper::FILTER_INT,true), - 'itemsperCol' => $this->getInput('newsLayoutItemsperCol', helper::FILTER_INT,true), - 'height' => $this->getInput('newsLayoutHeight', helper::FILTER_INT,true), + 'feeds' => $this->getInput('newsOptionShowFeeds',helper::FILTER_BOOLEAN), + 'feedsLabel' => $this->getInput('newsOptionFeedslabel',helper::FILTER_STRING_SHORT), + 'itemsperPage' => $this->getInput('newsOptionItemsperPage', helper::FILTER_INT,true), + 'itemsperCol' => $this->getInput('newsOptionItemsperCol', helper::FILTER_INT,true), + 'height' => $this->getInput('newsOptionHeight', helper::FILTER_INT,true), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) ]]); // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/layout', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/option', 'notification' => 'Modifications enregistrées', 'state' => true ]); @@ -291,7 +291,7 @@ class news extends common { // Valeurs en sortie $this->addOutput([ 'title' => 'Mise en page', - 'view' => 'layout', + 'view' => 'option', 'vendor' => [ 'tinycolorpicker' ] diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 781ab96b..6cf7dbbd 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -8,18 +8,16 @@ 'value' => 'Retour' ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/add', - 'ico' => 'plus', - 'value' => 'News' + 'value' => template::ico('plus') ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/layout', - 'ico' => 'brush', - 'value' => 'Mise en page' + 'href' => helper::baseUrl() . $this->getUrl(0) . '/option', + 'value' => template::ico('brush') ]); ?>
diff --git a/module/news/view/layout/layout.css b/module/news/view/option/option.css similarity index 100% rename from module/news/view/layout/layout.css rename to module/news/view/option/option.css diff --git a/module/news/view/layout/layout.php b/module/news/view/option/option.php similarity index 86% rename from module/news/view/layout/layout.php rename to module/news/view/option/option.php index 44315e36..00a3e417 100644 --- a/module/news/view/layout/layout.php +++ b/module/news/view/option/option.php @@ -1,7 +1,7 @@ - +
- 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'ico' => 'left', @@ -9,7 +9,7 @@ ]); ?>
- +
@@ -18,13 +18,13 @@

Paramètres du module

- $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), 'help' => 'Flux limité aux articles de la première page.' ]); ?>
- 'Etiquette RSS', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) ]); ?> @@ -32,19 +32,19 @@
- 'Nombre de colonnes', 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol']) ]); ?>
- 'Articles par page', 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) ]); ?>
- 'Abrégé de l\'article', 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'height']) ]); ?> From 16d848f884420d07a98247c1069c234443300903 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 10:50:40 +0100 Subject: [PATCH 019/103] Boutons courts dans les modules --- module/blog/blog.php | 2 +- module/blog/view/add/add.php | 9 ++++----- module/blog/view/config/config.php | 7 +++---- module/blog/view/option/option.php | 7 +++---- module/form/form.php | 2 +- module/form/view/config/config.php | 7 +++---- module/gallery/view/config/config.php | 7 +++---- module/gallery/view/edit/edit.php | 7 +++---- module/news/news.php | 2 +- module/news/view/add/add.php | 9 ++++----- module/news/view/config/config.php | 7 +++---- module/news/view/option/option.php | 7 +++---- module/redirection/view/config/config.php | 7 +++---- module/search/view/config/config.php | 7 +++---- 14 files changed, 38 insertions(+), 49 deletions(-) diff --git a/module/blog/blog.php b/module/blog/blog.php index ff862cd2..c2f98d2c 100644 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -502,7 +502,7 @@ class blog extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Mise en page', + 'title' => 'Options de configuration', 'view' => 'option' ]); } diff --git a/module/blog/view/add/add.php b/module/blog/view/add/add.php index 7f50b45e..22e51de4 100644 --- a/module/blog/view/add/add.php +++ b/module/blog/view/add/add.php @@ -1,17 +1,16 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
true, - 'value' => 'Enregistrer en brouillon' + 'value' => 'Brouillon' ]); ?> true diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index e3e18509..b08d8c7b 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), 'posts', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/option', 'value' => template::ico('cogs') diff --git a/module/blog/view/option/option.php b/module/blog/view/option/option.php index f86d3cd8..721eb6a7 100644 --- a/module/blog/view/option/option.php +++ b/module/blog/view/option/option.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
diff --git a/module/form/form.php b/module/form/form.php index 55730e8e..496272ba 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -208,7 +208,7 @@ class form extends common { } // Valeurs en sortie $this->addOutput([ - 'title' => 'Paramètres', + 'title' => 'Options de configuration', 'vendor' => [ 'html-sortable', 'flatpickr' diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 45784d4b..44e663b5 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -50,15 +50,14 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/data', 'value' => template::ico('code') diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index 4790c1dc..acf5c757 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], 'value' => template::ico('brush') diff --git a/module/gallery/view/edit/edit.php b/module/gallery/view/edit/edit.php index df001bf7..240c85fa 100644 --- a/module/gallery/view/edit/edit.php +++ b/module/gallery/view/edit/edit.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
diff --git a/module/news/news.php b/module/news/news.php index c47c8dca..69fc7c43 100644 --- a/module/news/news.php +++ b/module/news/news.php @@ -290,7 +290,7 @@ class news extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Mise en page', + 'title' => 'Options de configuration', 'view' => 'option', 'vendor' => [ 'tinycolorpicker' diff --git a/module/news/view/add/add.php b/module/news/view/add/add.php index b4427b96..59e3b9da 100644 --- a/module/news/view/add/add.php +++ b/module/news/view/add/add.php @@ -1,17 +1,16 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
true, - 'value' => 'Enregistrer en brouillon' + 'value' => 'Brouillon' ]); ?> true diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 6cf7dbbd..0a855f6e 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0),'posts', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/add', 'value' => template::ico('plus') diff --git a/module/news/view/option/option.php b/module/news/view/option/option.php index 00a3e417..463439ec 100644 --- a/module/news/view/option/option.php +++ b/module/news/view/option/option.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
diff --git a/module/redirection/view/config/config.php b/module/redirection/view/config/config.php index ff421b39..b786dbf1 100644 --- a/module/redirection/view/config/config.php +++ b/module/redirection/view/config/config.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
diff --git a/module/search/view/config/config.php b/module/search/view/config/config.php index 68b6ab8f..ac8bcfc5 100644 --- a/module/search/view/config/config.php +++ b/module/search/view/config/config.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
From a49fda965799266f63dd01ab8245dd98173d130c Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 13:28:33 +0100 Subject: [PATCH 020/103] =?UTF-8?q?R=C3=A9duction=20des=20boutons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/addon/view/index/index.php | 14 ++++------ core/module/addon/view/store/store.php | 7 ++--- .../module/addon/view/upload/upload.help.html | 6 ---- core/module/addon/view/upload/upload.php | 18 +++++------- core/module/config/view/backup/backup.php | 7 ++--- core/module/config/view/index/index.php | 12 ++++---- core/module/page/view/edit/edit.php | 28 ++++++++----------- core/module/theme/view/admin/admin.php | 14 +++++----- core/module/theme/view/advanced/advanced.php | 10 +++---- core/module/theme/view/body/body.php | 12 ++++---- core/module/theme/view/footer/footer.php | 12 ++++---- core/module/theme/view/header/header.php | 12 ++++---- core/module/theme/view/manage/manage.php | 7 ++--- core/module/theme/view/menu/menu.php | 12 ++++---- core/module/theme/view/site/site.php | 12 ++++---- core/module/translate/view/index/index.php | 16 +++++------ core/module/user/view/add/add.php | 7 ++--- core/module/user/view/edit/edit.php | 12 ++++---- core/module/user/view/forgot/forgot.php | 5 ++-- core/module/user/view/import/import.php | 14 ++++------ core/module/user/view/index/index.php | 20 ++++++------- module/blog/view/edit/edit.php | 9 +++--- module/gallery/view/theme/theme.php | 7 ++--- module/news/view/edit/edit.php | 7 ++--- 24 files changed, 116 insertions(+), 164 deletions(-) delete mode 100644 core/module/addon/view/upload/upload.help.html diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index e1e9c61f..db1265dc 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -1,22 +1,20 @@
-
+
'buttonGrey', 'href' => helper::baseUrl(), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'https://doc.zwiicms.fr/les-modules', + 'href' => 'https://doc.zwiicms.fr/modules-utilisation-generique', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
-
+
helper::baseUrl() . 'addon/store', 'value' => 'Catalogue en ligne' diff --git a/core/module/addon/view/store/store.php b/core/module/addon/view/store/store.php index e1324a6a..ba0e292c 100644 --- a/core/module/addon/view/store/store.php +++ b/core/module/addon/view/store/store.php @@ -1,10 +1,9 @@
-
+
'buttonGrey', - 'href' => helper::baseUrl() . 'addon/upload', - 'ico' => 'left', - 'value' => 'Retour' + 'href' => helper::baseUrl() . 'addon', + 'value' => template::ico('left') ]); ?>
diff --git a/core/module/addon/view/upload/upload.help.html b/core/module/addon/view/upload/upload.help.html deleted file mode 100644 index fbf87085..00000000 --- a/core/module/addon/view/upload/upload.help.html +++ /dev/null @@ -1,6 +0,0 @@ -

INSTALLER OU METTRE A JOUR

-

Avant de choisir le fichier ZIP du module à installer vous devez le télécharger sur votre serveur en utilisant le 'Catalogue en ligne'.

-

D'autres modules sont également disponibles sur le forum de ZwiiCMS, -téléversez les sur votre serveur avec 'Gérer les fichiers'.

-

Lors d'une mise à jour Zwii contrôle la version du module à installer, pour réinstaller un module de même numéro de version vous devez cocher 'Mise à jour forcée'. - Il est déconseillé d'installer un module plus ancien.

diff --git a/core/module/addon/view/upload/upload.php b/core/module/addon/view/upload/upload.php index 016418c6..6bdfb29d 100644 --- a/core/module/addon/view/upload/upload.php +++ b/core/module/addon/view/upload/upload.php @@ -1,30 +1,26 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'addon', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'https://doc.zwiicms.fr/installation-d-un-module', + 'target' => '_blank', 'class' => 'buttonHelp', - 'ico' => 'help', - 'value' => 'Aide' + 'value' => template::ico('help') ]); ?>
-
+
'Valider', 'ico' => 'check' ]); ?>
-
- -
-
diff --git a/core/module/config/view/backup/backup.php b/core/module/config/view/backup/backup.php index 070ab2cd..25071a93 100644 --- a/core/module/config/view/backup/backup.php +++ b/core/module/config/view/backup/backup.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'Sauvegarder', 'uniqueSubmission' => true diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php index 3738b0e0..e9644297 100644 --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -1,23 +1,21 @@
-
+
'buttonGrey', 'href' => helper::baseUrl(false), - 'ico' => 'home', - 'value' => 'Accueil' + 'value' => template::ico('home') ]); ?>
-
+
'buttonHelp', 'href' => 'https://doc.zwiicms.fr/configuration-du-site', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide' + 'value' => template::ico('help') ]); ?>
-
+
diff --git a/core/module/page/view/edit/edit.php b/core/module/page/view/edit/edit.php index dc7625c6..6cf6be20 100644 --- a/core/module/page/view/edit/edit.php +++ b/core/module/page/view/edit/edit.php @@ -1,37 +1,33 @@
-
+
getUrl(2); ?> getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code')$href = helper::baseUrl(); ?> 'buttonGrey', 'href' => $href, - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('home') ]); ?>
-
+
'https://doc.zwiicms.fr/edition-des-pages', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
-
- 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'], - 'value' => 'Supprimer', - 'ico' => 'cancel' + 'value' => template::ico('cancel') + ]); ?> +
+
+ helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'], + 'value' => template::ico('clone') ]); ?>
diff --git a/core/module/theme/view/admin/admin.php b/core/module/theme/view/admin/admin.php index 1ab92938..f2c2ffb2 100644 --- a/core/module/theme/view/admin/admin.php +++ b/core/module/theme/view/admin/admin.php @@ -1,24 +1,24 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+ +
'buttonRed', 'href' => helper::baseUrl() . 'theme/reset/admin' . '&csrf=' . $_SESSION['csrf'], - 'value' => 'Réinitialiser', - 'ico' => 'cancel' + 'value' => template::ico('cancel') ]); ?>
diff --git a/core/module/theme/view/advanced/advanced.php b/core/module/theme/view/advanced/advanced.php index f1895306..3b507b25 100644 --- a/core/module/theme/view/advanced/advanced.php +++ b/core/module/theme/view/advanced/advanced.php @@ -1,19 +1,17 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
helper::baseUrl() . 'theme/reset/custom' . '&csrf=' . $_SESSION['csrf'], 'class' => 'buttonRed', - 'ico' => 'cancel', - 'value' => 'Réinitialiser' + 'value' => template::ico('cancel') ]); ?>
diff --git a/core/module/theme/view/body/body.php b/core/module/theme/view/body/body.php index 6e1f536d..51243668 100644 --- a/core/module/theme/view/body/body.php +++ b/core/module/theme/view/body/body.php @@ -1,23 +1,21 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'https://doc.zwiicms.fr/arriere-plan', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
-
+
diff --git a/core/module/theme/view/footer/footer.php b/core/module/theme/view/footer/footer.php index 75eaf355..2473d806 100644 --- a/core/module/theme/view/footer/footer.php +++ b/core/module/theme/view/footer/footer.php @@ -1,23 +1,21 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'https://doc.zwiicms.fr/pied-de-page', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
-
+
diff --git a/core/module/theme/view/header/header.php b/core/module/theme/view/header/header.php index 60020003..6d17ee56 100644 --- a/core/module/theme/view/header/header.php +++ b/core/module/theme/view/header/header.php @@ -1,23 +1,21 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'https://doc.zwiicms.fr/banniere', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
-
+
diff --git a/core/module/theme/view/manage/manage.php b/core/module/theme/view/manage/manage.php index 42658cd9..90b994d3 100644 --- a/core/module/theme/view/manage/manage.php +++ b/core/module/theme/view/manage/manage.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'buttonRed', 'href' => helper::baseUrl() . 'theme/reset/manage' . '&csrf=' . $_SESSION['csrf'], diff --git a/core/module/theme/view/menu/menu.php b/core/module/theme/view/menu/menu.php index 1db6aa40..e1a03b9b 100644 --- a/core/module/theme/view/menu/menu.php +++ b/core/module/theme/view/menu/menu.php @@ -1,23 +1,21 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'https://doc.zwiicms.fr/menu', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
-
+
diff --git a/core/module/theme/view/site/site.php b/core/module/theme/view/site/site.php index 0184fb0a..67ee75fc 100644 --- a/core/module/theme/view/site/site.php +++ b/core/module/theme/view/site/site.php @@ -1,23 +1,21 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'https://doc.zwiicms.fr/site61863d315ffe0', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
-
+
diff --git a/core/module/translate/view/index/index.php b/core/module/translate/view/index/index.php index 69821aaa..383b944a 100644 --- a/core/module/translate/view/index/index.php +++ b/core/module/translate/view/index/index.php @@ -1,27 +1,25 @@
-
+
'buttonGrey', 'href' => helper::baseUrl(), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'https://doc.zwiicms.fr/prise-en-charge-des-langues-etrangeres', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('cancel'), 'class' => 'buttonHelp' ]); ?>
-
+
helper::baseUrl() . 'translate/copy', - 'value' => 'Utilitaire de copie', - 'ico' => 'cog-alt', + 'value' => 'Copie inter-langues', + 'ico' => 'cogs', 'disabled' => $module::$siteTranslate ]); ?>
diff --git a/core/module/user/view/add/add.php b/core/module/user/view/add/add.php index d84c8ed1..bd806a49 100644 --- a/core/module/user/view/add/add.php +++ b/core/module/user/view/add/add.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'user', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
diff --git a/core/module/user/view/edit/edit.php b/core/module/user/view/edit/edit.php index aa739b33..30a91c97 100644 --- a/core/module/user/view/edit/edit.php +++ b/core/module/user/view/edit/edit.php @@ -1,23 +1,21 @@
-
- getUser('group') === self::GROUP_ADMIN): ?> +
+ getUser('group') === self::GROUP_ADMIN): ?> 'buttonGrey', 'href' => helper::baseUrl() . 'user', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?> 'buttonGrey', 'href' => helper::baseUrl(false), - 'ico' => 'home', - 'value' => 'Accueil' + 'value' => template::ico('home') ]); ?>
-
+
diff --git a/core/module/user/view/forgot/forgot.php b/core/module/user/view/forgot/forgot.php index 29dc17e8..3e163deb 100644 --- a/core/module/user/view/forgot/forgot.php +++ b/core/module/user/view/forgot/forgot.php @@ -3,11 +3,10 @@ 'label' => 'Identifiant' ]); ?>
-
+
helper::baseUrl() . 'user/login/' . $this->getUrl(2), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index 81e6a929..e879b7e1 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -1,23 +1,21 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'user', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'https://doc.zwiicms.fr/importation-d-une-liste-d-utilisateurs', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
-
+
'Importer' ]); ?> @@ -28,7 +26,7 @@

Importation de fichier plat CSV

-
+
'Liste d\'utilisateurs :' ]); ?> diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index 98fc2388..1e0730ce 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -1,33 +1,29 @@
-
+
'buttonGrey', 'href' => helper::baseUrl(false), - 'ico' => 'home', - 'value' => 'Accueil' + 'value' => template::ico('home') ]); ?>
-
+
'https://doc.zwiicms.fr/gestion-des-utilisateurs', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
-
+
helper::baseUrl() . 'user/import', - 'ico' => 'plus', - 'value' => 'Importation' + 'value' => template::ico('download') ]); ?>
-
+
helper::baseUrl() . 'user/add', - 'ico' => 'plus', - 'value' => 'Utilisateur' + 'value' => template::ico('plus') ]); ?>
diff --git a/module/blog/view/edit/edit.php b/module/blog/view/edit/edit.php index 404467b8..b60da969 100644 --- a/module/blog/view/edit/edit.php +++ b/module/blog/view/edit/edit.php @@ -1,17 +1,16 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
true, - 'value' => 'Enregistrer en brouillon' + 'value' => 'Brouillon' ]); ?> true diff --git a/module/gallery/view/theme/theme.php b/module/gallery/view/theme/theme.php index 8da3639e..a585cc73 100644 --- a/module/gallery/view/theme/theme.php +++ b/module/gallery/view/theme/theme.php @@ -1,15 +1,14 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('cancel') ]); ?>
-
+
diff --git a/module/news/view/edit/edit.php b/module/news/view/edit/edit.php index 927be92d..2cc71bc0 100644 --- a/module/news/view/edit/edit.php +++ b/module/news/view/edit/edit.php @@ -4,14 +4,13 @@ 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
true, - 'value' => 'Enregistrer en brouillon' + 'value' => 'Brouillon' ]); ?> true From 318458b9489ac35894060af49df09dc22d24bf0c Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 13:39:42 +0100 Subject: [PATCH 021/103] =?UTF-8?q?Template=20button,=20propri=C3=A9t?= =?UTF-8?q?=C3=A9=20help?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/class/template.class.php | 6 ++++-- core/module/page/view/edit/edit.php | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/class/template.class.php b/core/class/template.class.php index 16cbef01..47c24f93 100644 --- a/core/class/template.class.php +++ b/core/class/template.class.php @@ -19,15 +19,17 @@ class template { 'name' => $nameId, 'target' => '', 'uniqueSubmission' => false, - 'value' => 'Bouton' + 'value' => 'Bouton', + 'help' => '' ], $attributes); // Retourne le html return sprintf( - '%s', + '%s', helper::sprintAttributes($attributes, ['class', 'disabled', 'ico', 'value']), $attributes['disabled'] ? 'disabled' : '', $attributes['class'], $attributes['uniqueSubmission'] ? 'uniqueSubmission' : '', + $attributes['help'] ? ' title="' . $attributes['help'] . '" ': '', ($attributes['ico'] ? template::ico($attributes['ico'], 'right') : '') . $attributes['value'] ); } diff --git a/core/module/page/view/edit/edit.php b/core/module/page/view/edit/edit.php index 6cf6be20..72ccf753 100644 --- a/core/module/page/view/edit/edit.php +++ b/core/module/page/view/edit/edit.php @@ -21,7 +21,8 @@ 'buttonRed', 'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Effacer la page' ]); ?>
From 297016a87f1d19214e1c847bc06a7935250e131b Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 15:40:56 +0100 Subject: [PATCH 022/103] Aide des boutons --- core/module/addon/view/import/import.php | 7 +++---- core/module/addon/view/index/index.php | 13 ++++++++----- core/module/addon/view/upload/upload.php | 3 ++- core/module/config/view/index/index.php | 3 ++- core/module/page/view/edit/edit.php | 6 ++++-- core/module/theme/view/admin/admin.php | 3 ++- core/module/theme/view/advanced/advanced.php | 4 +++- core/module/theme/view/manage/manage.php | 6 +++--- core/module/translate/view/copy/copy.php | 11 ++++++----- core/module/translate/view/index/index.php | 13 +++++++------ core/module/user/view/import/import.help.html | 4 ---- core/module/user/view/import/import.php | 3 ++- core/module/user/view/index/index.php | 9 ++++++--- 13 files changed, 48 insertions(+), 37 deletions(-) delete mode 100644 core/module/user/view/import/import.help.html diff --git a/core/module/addon/view/import/import.php b/core/module/addon/view/import/import.php index 7cc41dac..8ccc44ce 100644 --- a/core/module/addon/view/import/import.php +++ b/core/module/addon/view/import/import.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'addon', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'Appliquer' ]); ?> diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index db1265dc..2b3a1767 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -11,19 +11,22 @@ 'href' => 'https://doc.zwiicms.fr/modules-utilisation-generique', 'target' => '_blank', 'value' => template::ico('help'), - 'class' => 'buttonHelp' + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
-
+
helper::baseUrl() . 'addon/store', - 'value' => 'Catalogue en ligne' + 'value' => template::ico('plus') . template::ico('plus'), + "help" => 'Lister le catalogue en ligne' ]); ?>
-
+
helper::baseUrl() . 'addon/upload', - 'value' => 'Installer' + 'value' => template::ico('plus'), + "help" => 'Ajouter à partir d\'une archive ZIP' ]); ?>
diff --git a/core/module/addon/view/upload/upload.php b/core/module/addon/view/upload/upload.php index 6bdfb29d..57114be4 100644 --- a/core/module/addon/view/upload/upload.php +++ b/core/module/addon/view/upload/upload.php @@ -12,7 +12,8 @@ 'href' => 'https://doc.zwiicms.fr/installation-d-un-module', 'target' => '_blank', 'class' => 'buttonHelp', - 'value' => template::ico('help') + 'value' => template::ico('help'), + 'help' => 'Consulter l\'aide en ligne' ]); ?>
diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php index e9644297..b7cb0008 100644 --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -12,7 +12,8 @@ 'class' => 'buttonHelp', 'href' => 'https://doc.zwiicms.fr/configuration-du-site', 'target' => '_blank', - 'value' => template::ico('help') + 'value' => template::ico('help'), + 'help' => 'Consulter l\'aide en ligne' ]); ?>
diff --git a/core/module/page/view/edit/edit.php b/core/module/page/view/edit/edit.php index 72ccf753..5e8b3645 100644 --- a/core/module/page/view/edit/edit.php +++ b/core/module/page/view/edit/edit.php @@ -14,7 +14,8 @@ 'href' => 'https://doc.zwiicms.fr/edition-des-pages', 'target' => '_blank', 'value' => template::ico('help'), - 'class' => 'buttonHelp' + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
@@ -28,7 +29,8 @@
helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'], - 'value' => template::ico('clone') + 'value' => template::ico('clone'), + 'help' => 'Dupliquer la page' ]); ?>
diff --git a/core/module/theme/view/admin/admin.php b/core/module/theme/view/admin/admin.php index f2c2ffb2..7169918e 100644 --- a/core/module/theme/view/admin/admin.php +++ b/core/module/theme/view/admin/admin.php @@ -18,7 +18,8 @@ 'buttonRed', 'href' => helper::baseUrl() . 'theme/reset/admin' . '&csrf=' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Réinitialiser avec le thème par défaut' ]); ?>
diff --git a/core/module/theme/view/advanced/advanced.php b/core/module/theme/view/advanced/advanced.php index 3b507b25..598b8507 100644 --- a/core/module/theme/view/advanced/advanced.php +++ b/core/module/theme/view/advanced/advanced.php @@ -11,7 +11,9 @@ helper::baseUrl() . 'theme/reset/custom' . '&csrf=' . $_SESSION['csrf'], 'class' => 'buttonRed', - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Réinitialiser la feuille de style' + ]); ?>
diff --git a/core/module/theme/view/manage/manage.php b/core/module/theme/view/manage/manage.php index 90b994d3..c6c3ac22 100644 --- a/core/module/theme/view/manage/manage.php +++ b/core/module/theme/view/manage/manage.php @@ -7,12 +7,12 @@ 'value' => template::ico('left') ]); ?>
-
+
'buttonRed', 'href' => helper::baseUrl() . 'theme/reset/manage' . '&csrf=' . $_SESSION['csrf'], - 'value' => 'Réinitialiser', - 'ico' => 'cancel' + 'value' => template::ico('cancel'), + 'help' => 'Réinitialiser avec le thème par défaut' ]); ?>
diff --git a/core/module/translate/view/copy/copy.php b/core/module/translate/view/copy/copy.php index 4cb9e1fd..890128b8 100644 --- a/core/module/translate/view/copy/copy.php +++ b/core/module/translate/view/copy/copy.php @@ -1,15 +1,16 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . 'translate', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
- +
+ 'Copier' + ]); ?>
diff --git a/core/module/translate/view/index/index.php b/core/module/translate/view/index/index.php index 383b944a..719a5bbd 100644 --- a/core/module/translate/view/index/index.php +++ b/core/module/translate/view/index/index.php @@ -11,16 +11,17 @@ 'https://doc.zwiicms.fr/prise-en-charge-des-langues-etrangeres', 'target' => '_blank', - 'value' => template::ico('cancel'), - 'class' => 'buttonHelp' + 'value' => template::ico('help'), + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
-
+
helper::baseUrl() . 'translate/copy', - 'value' => 'Copie inter-langues', - 'ico' => 'cogs', - 'disabled' => $module::$siteTranslate + 'value' => template::ico('cogs'), + 'disabled' => $module::$siteTranslate, + 'help' => 'Utilitaire de copie de site inter-langues' ]); ?>
diff --git a/core/module/user/view/import/import.help.html b/core/module/user/view/import/import.help.html deleted file mode 100644 index 0be5e2dd..00000000 --- a/core/module/user/view/import/import.help.html +++ /dev/null @@ -1,4 +0,0 @@ -

IMPORT

-

Pour réaliser un fichier CSV d'utilisateurs les en-têtes obligatoires sont : id, nom, prenom, email et groupe ( 1 : membre - 2 : éditeur - 3 : administrateur )

-

Voir ce modèle à compléter avec un tableur.

-

Enregistrez au format CSV, séparateur ; ou , ou : puis téléversez votre fichier avec 'Gérer les fichiers'.

diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index e879b7e1..e6d1ee43 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -12,7 +12,8 @@ 'href' => 'https://doc.zwiicms.fr/importation-d-une-liste-d-utilisateurs', 'target' => '_blank', 'value' => template::ico('help'), - 'class' => 'buttonHelp' + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index 1e0730ce..aa82d8fb 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -11,19 +11,22 @@ 'href' => 'https://doc.zwiicms.fr/gestion-des-utilisateurs', 'target' => '_blank', 'value' => template::ico('help'), - 'class' => 'buttonHelp' + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
helper::baseUrl() . 'user/import', - 'value' => template::ico('download') + 'value' => template::ico('plus') . template::ico('plus'), + 'help' => 'Importer des utilisateurs en masse' ]); ?>
helper::baseUrl() . 'user/add', - 'value' => template::ico('plus') + 'value' => template::ico('plus'), + 'help' => 'Ajouter un utilisateur' ]); ?>
From e094a79a24dbfdd7d7287d9dd795e04ae7df647a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Thu, 20 Jan 2022 17:11:12 +0100 Subject: [PATCH 023/103] version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5b6615e0..163a8b84 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# ZwiiCMS 11.2.03 +# ZwiiCMS 11.3 Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation. From 4a0848c00378cf8ca312e53de0bf46358b0b9577 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 21 Jan 2022 10:58:13 +0100 Subject: [PATCH 024/103] =?UTF-8?q?Aide=20sur=20les=20boutons=20d'ic=C3=B4?= =?UTF-8?q?nes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/addon/addon.php | 15 ++-- core/module/addon/view/store/store.php | 2 +- core/module/translate/view/index/index.php | 2 +- core/module/user/user.php | 6 +- core/vendor/tippy/init.js | 81 ++++++++++++---------- module/blog/blog.php | 9 ++- module/blog/view/config/config.php | 6 +- module/form/view/config/config.php | 6 +- module/form/view/data/data.php | 17 +++-- module/form/view/option/option.php | 7 +- module/gallery/gallery.php | 6 +- module/gallery/view/config/config.php | 3 +- module/gallery/view/gallery/gallery.php | 5 +- module/gallery/view/theme/theme.php | 2 +- module/news/view/config/config.php | 14 ++-- 15 files changed, 105 insertions(+), 76 deletions(-) diff --git a/core/module/addon/addon.php b/core/module/addon/addon.php index 3c528df4..1e9b0f6e 100644 --- a/core/module/addon/addon.php +++ b/core/module/addon/addon.php @@ -302,15 +302,18 @@ class addon extends common { // Module non installé $ico = template::ico('download'); $class = ''; + $help = 'Installer le module'; // Le module est installé if (array_key_exists($key,$infoModules) === true) { $class = 'buttonGreen'; $ico = template::ico('update'); + $help = 'Mettre à jour ce module'; } // Le module est installé et utilisé if (in_array($key,$inPages) === true) { $class = 'buttonRed'; $ico = template::ico('update'); + $help = 'Mettre à jour le module'; } self::$storeList [] = [ $store[$key]['category'], @@ -323,7 +326,8 @@ class addon extends common { template::button('moduleExport' . $key, [ 'class' => $class, 'href' => helper::baseUrl(). $this->getUrl(0) . '/uploadItem/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => $ico + 'value' => $ico, + 'help' => $help ]) ]; } @@ -380,19 +384,22 @@ class addon extends common { ? template::button('moduleDelete' . $key, [ 'class' => 'moduleDelete buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Supprimer le module '. $key ]) : '', implode(', ',array_keys($inPages,$key)) !== '' ? template::button('moduleExport' . $key, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('download') + 'value' => template::ico('download'), + 'help' => 'Exporter les données du module avec sa page' ]) : '', implode(', ',array_keys($inPages,$key)) === '' ? template::button('moduleExport' . $key, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('upload') + 'value' => template::ico('upload'), + 'help' => 'Importer les données du module avec sa page' ]) : '' ]; diff --git a/core/module/addon/view/store/store.php b/core/module/addon/view/store/store.php index ba0e292c..8646d8cf 100644 --- a/core/module/addon/view/store/store.php +++ b/core/module/addon/view/store/store.php @@ -8,7 +8,7 @@
- Mettre à jour']); ?> + \ No newline at end of file diff --git a/core/module/translate/view/index/index.php b/core/module/translate/view/index/index.php index 719a5bbd..777a920d 100644 --- a/core/module/translate/view/index/index.php +++ b/core/module/translate/view/index/index.php @@ -21,7 +21,7 @@ 'href' => helper::baseUrl() . 'translate/copy', 'value' => template::ico('cogs'), 'disabled' => $module::$siteTranslate, - 'help' => 'Utilitaire de copie de site inter-langues' + 'help' => 'Copie de sites inter-langues' ]); ?>
diff --git a/core/module/user/user.php b/core/module/user/user.php index 82a22882..dab81c76 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -346,12 +346,14 @@ class user extends common { self::$groups[$this->getData(['user', $userId, 'group'])], template::button('userEdit' . $userId, [ 'href' => helper::baseUrl() . 'user/edit/' . $userId . '/back/'. $_SESSION['csrf'], - 'value' => template::ico('pencil') + 'value' => template::ico('pencil'), + 'help' => 'Editer ' . $userId ]), template::button('userDelete' . $userId, [ 'class' => 'userDelete buttonRed', 'href' => helper::baseUrl() . 'user/delete/' . $userId. '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Supprimer ' . $userId ]) ]; } diff --git a/core/vendor/tippy/init.js b/core/vendor/tippy/init.js index 976da1e6..210a5f14 100755 --- a/core/vendor/tippy/init.js +++ b/core/vendor/tippy/init.js @@ -1,38 +1,49 @@ /** * Initialisation de Tippy */ -$(document).ready(function() { - // Tooltip des aides - tippy(".helpButton", { - arrow: true, - arrowType: "round", - placement: "top" - }); - // Tooltip des attributs title - tippy("[data-tippy-content]", { - arrow: true, - placement: "top" - }); - // Pour les images map, pas de flèche, bulle haut suivant le curseur - - tippy('img[title], a[title], area[title]', { - - content(reference) { - const title = reference.getAttribute('title') - reference.removeAttribute('title') - return title - }, - - placement: "top", - followCursor: true, - animation: "fade", - animateFill: true - }); - // Pour les images map, pas de flèche, bulle haut suivant le curseur - tippy("#image-map", { - placement: "top", - followCursor: true, - animation: "fade", - animateFill: true - }); -}); +$(document).ready(function () { + + // Tooltip des attributs title + tippy("[data-tippy-content]", { + arrow: true, + placement: "top" + }); + + // Pour les images map, pas de flèche, bulle haut suivant le curseur + tippy('img[title], a[title]:not(.button), area[title]', { + + content(reference) { + const title = reference.getAttribute('title') + reference.removeAttribute('title') + return title + }, + + placement: "top", + followCursor: true, + animation: "fade", + animateFill: true + }); + + // Tooltip des aides + tippy('a.button[title]', { + content(reference) { + const title = reference.getAttribute('title') + reference.removeAttribute('title') + return title + }, + delay: [1000,250], + placement: "bottom", + followCursor: false, + arrow: true, + animateFill: true, + arrowType: "round", + }); + + // Pour les images map, pas de flèche, bulle haut suivant le curseur + tippy("#image-map", { + placement: "top", + followCursor: true, + animation: "fade", + animateFill: true + }); +}); \ No newline at end of file diff --git a/module/blog/blog.php b/module/blog/blog.php index c2f98d2c..b25c4b0f 100644 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -462,16 +462,19 @@ class blog extends common { template::button('blogConfigComment' . $articleIds[$i], [ 'class' => ($toApprove || $approved ) > 0 ? '' : 'buttonGrey' , 'href' => ($toApprove || $approved ) > 0 ? helper::baseUrl() . $this->getUrl(0) . '/comment/' . $articleIds[$i] : '', - 'value' => $toApprove > 0 ? $toApprove . '/' . $approved : $approved + 'value' => $toApprove > 0 ? $toApprove . '/' . $approved : $approved, + 'help' => ($toApprove || $approved ) > 0 ? 'Editer / Approuver les commentaires' : '' ]), template::button('blogConfigEdit' . $articleIds[$i], [ 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $articleIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') + 'value' => template::ico('pencil'), + 'help' => 'Editer l\'article' ]), template::button('blogConfigDelete' . $articleIds[$i], [ 'class' => 'blogConfigDelete buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $articleIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Effacer l\'article' ]) ]; } diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index b08d8c7b..0a34ab28 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -10,14 +10,16 @@
helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs') + 'value' => template::ico('cogs'), + 'help' => 'Options de configuration' ]); ?>
helper::baseUrl() . $this->getUrl(0) . '/add', - 'value' => template::ico('plus') + 'value' => template::ico('plus'), + 'help' => 'Rédiger un article' ]); ?>
diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 44e663b5..4da4e856 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -60,13 +60,15 @@
helper::baseUrl() . $this->getUrl(0) . '/data', - 'value' => template::ico('code') + 'value' => template::ico('code'), + 'help' => 'Voir et exporter les données du formulaire' ]); ?>
helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs') + 'value' => template::ico('cogs'), + 'help' => 'Options de configuration' ]); ?>
diff --git a/module/form/view/data/data.php b/module/form/view/data/data.php index d0a22868..147548a7 100644 --- a/module/form/view/data/data.php +++ b/module/form/view/data/data.php @@ -1,25 +1,24 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
'formDataDeleteAll buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/deleteall' . '/' . $_SESSION['csrf'], - 'ico' => 'cancel', - 'value' => 'Tout effacer' + 'value' => template::ico('cancel'), + 'help' => 'Effacer toutes les données' ]); ?>
-
+
helper::baseUrl() . $this->getUrl(0) . '/export2csv' . '/' . $_SESSION['csrf'], - 'ico' => 'download', - 'value' => 'Export CSV' + 'value' => template::ico('download'), + 'help' => 'Exporter toutes les données' ]); ?>
diff --git a/module/form/view/option/option.php b/module/form/view/option/option.php index 47fb53e1..fe479465 100644 --- a/module/form/view/option/option.php +++ b/module/form/view/option/option.php @@ -1,14 +1,13 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
-
+
diff --git a/module/gallery/gallery.php b/module/gallery/gallery.php index 67483a83..e2d99e61 100644 --- a/module/gallery/gallery.php +++ b/module/gallery/gallery.php @@ -346,12 +346,14 @@ class gallery extends common { $gallery['config']['directory'], template::button('galleryConfigEdit' . $galleryId , [ 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $galleryId . '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') + 'value' => template::ico('pencil'), + 'help' => 'Configuration de la galerie ' ]), template::button('galleryConfigDelete' . $galleryId, [ 'class' => 'galleryConfigDelete buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $galleryId . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Supprimer cette galerie' ]) ]; // Tableau des id des galleries pour le drag and drop diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index acf5c757..526cdaab 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -10,7 +10,8 @@
helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], - 'value' => template::ico('brush') + 'value' => template::ico('brush'), + 'help' => 'Thème de cette galerie' ]); ?>
diff --git a/module/gallery/view/gallery/gallery.php b/module/gallery/view/gallery/gallery.php index 9e617583..235aac0d 100644 --- a/module/gallery/view/gallery/gallery.php +++ b/module/gallery/view/gallery/gallery.php @@ -1,10 +1,9 @@
-
+
'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
diff --git a/module/gallery/view/theme/theme.php b/module/gallery/view/theme/theme.php index a585cc73..a66c589d 100644 --- a/module/gallery/view/theme/theme.php +++ b/module/gallery/view/theme/theme.php @@ -5,7 +5,7 @@ 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'value' => template::ico('cancel') + 'value' => template::ico('left') ]); ?>
diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 0a855f6e..5341b1c8 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -8,15 +8,17 @@ ]); ?>
- helper::baseUrl() . $this->getUrl(0) . '/add', - 'value' => template::ico('plus') + helper::baseUrl() . $this->getUrl(0) . '/option', + 'value' => template::ico('cogs'), + 'help' => 'Options de configuration' ]); ?>
- helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('brush') + helper::baseUrl() . $this->getUrl(0) . '/add', + 'value' => template::ico('plus'), + 'help' => 'Rédiger une news' ]); ?>
From 9b2221bed2955fdbc16e2fefad3b243bbf6c101d Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 21 Jan 2022 13:50:21 +0100 Subject: [PATCH 025/103] =?UTF-8?q?supprime=20le=20syst=C3=A8me=20d'aide?= =?UTF-8?q?=20interne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.js.php | 20 -------------------- core/core.php | 2 +- core/layout/common.css | 16 ---------------- core/module/addon/view/index/index.php | 4 ---- 4 files changed, 1 insertion(+), 41 deletions(-) diff --git a/core/core.js.php b/core/core.js.php index 0f3343f2..c400b0e8 100644 --- a/core/core.js.php +++ b/core/core.js.php @@ -491,26 +491,6 @@ $(document).ready(function(){ }; }); - /** - * Active le système d'aide interne - * - */ - - $(".buttonHelp").click(function() { - $(".helpDisplayContent").slideToggle(); - /** - if( $(".buttonHelp").css('opacity') > '0.75'){ - $(".buttonHelp").css('opacity','0.5'); - } - else{ - $(".buttonHelp").css('opacity','1'); - } - */ - }); - - $(".helpDisplayContent").click(function() { - $(".helpDisplayContent").slideToggle(); - }); /** * Remove ID Facebook from URL diff --git a/core/core.php b/core/core.php index 02b1a01f..95349f5b 100644 --- a/core/core.php +++ b/core/core.php @@ -2287,7 +2287,7 @@ class core extends common { $css .= '.blogDate {color:' . $this->getData(['theme', 'text', 'textColor']) . ';}.blogPicture img{border:1px solid ' . $this->getData(['theme', 'text', 'textColor']) . '; box-shadow: 1px 1px 5px ' . $this->getData(['theme', 'text', 'textColor']) . ';}'; // Couleur fixée dans admin.css //$css .= '.button.buttonGrey,.button.buttonGrey:hover{color:' . $this->getData(['theme', 'text', 'textColor']) . '}'; - $css .= '.container, .helpDisplayContent{max-width:' . $this->getData(['theme', 'site', 'width']) . '}'; + $css .= '.container {max-width:' . $this->getData(['theme', 'site', 'width']) . '}'; $margin = $this->getData(['theme', 'site', 'margin']) ? '0' : '20px'; // Marge supplémentaire lorsque le pied de page est fixe if ( $this->getData(['theme', 'footer', 'fixed']) === true && diff --git a/core/layout/common.css b/core/layout/common.css index 1cbc0049..f844a69c 100755 --- a/core/layout/common.css +++ b/core/layout/common.css @@ -1744,22 +1744,6 @@ th.col12 { width: 60%; } -/* Système d'aide */ - -.helpDisplayContent { - display: none; - width: 100%; - padding: 10px 10px; - -webkit-box-shadow: 5px 5px 11px 0px #222222; - box-shadow: 5px 5px 11px 0px #222222; - border-radius: 5px; - z-index: 30; -} - -.helpDisplayContent, .helpDisplayButton { - cursor: pointer; -} - /* Bannière masquable en petit écran*/ @media screen and (max-width: 768px) { .bannerDisplay{ diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index 2b3a1767..254d9834 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -30,10 +30,6 @@ ]); ?>
- -
- -
From e37460f4f8f36daee0a4fb4be3fd90e98b5dd767 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 21 Jan 2022 14:31:36 +0100 Subject: [PATCH 026/103] =?UTF-8?q?Nouveau=20jeu=20d'ic=C3=B4nes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/addon/view/index/index.php | 2 +- core/module/config/view/setup/setup.php | 2 +- core/module/theme/view/index/index.php | 4 ++-- core/module/translate/view/index/index.php | 2 +- core/module/user/view/index/index.php | 2 +- core/vendor/zwiico/css/zwiico-codes.css | 5 ++++- core/vendor/zwiico/css/zwiico-embedded.css | 17 ++++++++++------- core/vendor/zwiico/css/zwiico-ie7-codes.css | 5 ++++- core/vendor/zwiico/css/zwiico-ie7.css | 5 ++++- core/vendor/zwiico/css/zwiico.css | 19 +++++++++++-------- core/vendor/zwiico/font/zwiico.eot | Bin 21864 -> 23016 bytes core/vendor/zwiico/font/zwiico.svg | 12 +++++++++--- core/vendor/zwiico/font/zwiico.ttf | Bin 21704 -> 22856 bytes core/vendor/zwiico/font/zwiico.woff | Bin 13744 -> 14380 bytes core/vendor/zwiico/font/zwiico.woff2 | Bin 11876 -> 12256 bytes module/blog/view/config/config.php | 2 +- module/form/view/config/config.php | 2 +- module/gallery/view/config/config.php | 4 ++-- module/news/news.php | 6 ++++-- module/news/view/config/config.php | 2 +- 20 files changed, 57 insertions(+), 34 deletions(-) diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index 254d9834..f5ee7fc6 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -18,7 +18,7 @@
helper::baseUrl() . 'addon/store', - 'value' => template::ico('plus') . template::ico('plus'), + 'value' => template::ico('shopping-basket'), "help" => 'Lister le catalogue en ligne' ]); ?>
diff --git a/core/module/config/view/setup/setup.php b/core/module/config/view/setup/setup.php index 97c603c0..90f5b36a 100644 --- a/core/module/config/view/setup/setup.php +++ b/core/module/config/view/setup/setup.php @@ -137,7 +137,7 @@ helper::baseUrl() . 'config/copyBackups', 'value' => 'Copie sauvegardes auto', - 'ico' => 'download-cloud' + 'ico' => 'docs' ]); ?>
diff --git a/core/module/theme/view/index/index.php b/core/module/theme/view/index/index.php index 85f0a16f..d2b5ec4e 100644 --- a/core/module/theme/view/index/index.php +++ b/core/module/theme/view/index/index.php @@ -32,7 +32,7 @@
'cogs', + 'ico' => 'sliders', 'href' => helper::baseUrl() . $this->getUrl(0) . '/manage', 'value' => 'Gestion' ]); ?> @@ -77,7 +77,7 @@
'cogs', + 'ico' => 'sliders', 'href' => helper::baseUrl() . $this->getUrl(0) . '/manage', 'value' => 'Gestion' ]); ?> diff --git a/core/module/translate/view/index/index.php b/core/module/translate/view/index/index.php index 777a920d..fabc4e6a 100644 --- a/core/module/translate/view/index/index.php +++ b/core/module/translate/view/index/index.php @@ -19,7 +19,7 @@
helper::baseUrl() . 'translate/copy', - 'value' => template::ico('cogs'), + 'value' => template::ico('docs'), 'disabled' => $module::$siteTranslate, 'help' => 'Copie de sites inter-langues' ]); ?> diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index aa82d8fb..0e626198 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -18,7 +18,7 @@
helper::baseUrl() . 'user/import', - 'value' => template::ico('plus') . template::ico('plus'), + 'value' => template::ico('table') , 'help' => 'Importer des utilisateurs en masse' ]); ?>
diff --git a/core/vendor/zwiico/css/zwiico-codes.css b/core/vendor/zwiico/css/zwiico-codes.css index 970120b4..b56b4010 100755 --- a/core/vendor/zwiico/css/zwiico-codes.css +++ b/core/vendor/zwiico/css/zwiico-codes.css @@ -24,7 +24,6 @@ .zwiico-eye-off:before { content: '\e815'; } /* '' */ .zwiico-down-open:before { content: '\e816'; } /* '' */ .zwiico-upload:before { content: '\e817'; } /* '' */ -.zwiico-cogs:before { content: '\e818'; } /* '' */ .zwiico-left-open:before { content: '\e819'; } /* '' */ .zwiico-down-big:before { content: '\e81a'; } /* '' */ .zwiico-cog-alt:before { content: '\e81b'; } /* '' */ @@ -43,7 +42,9 @@ .zwiico-spin:before { content: '\e831'; } /* '' */ .zwiico-twitter:before { content: '\f099'; } /* '' */ .zwiico-facebook:before { content: '\f09a'; } /* '' */ +.zwiico-docs:before { content: '\f0c5'; } /* '' */ .zwiico-menu:before { content: '\f0c9'; } /* '' */ +.zwiico-table:before { content: '\f0ce'; } /* '' */ .zwiico-sort:before { content: '\f0dc'; } /* '' */ .zwiico-mail-alt:before { content: '\f0e0'; } /* '' */ .zwiico-linkedin:before { content: '\f0e1'; } /* '' */ @@ -53,5 +54,7 @@ .zwiico-puzzle:before { content: '\f12e'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ +.zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */ +.zwiico-shopping-basket:before { content: '\f291'; } /* '' */ diff --git a/core/vendor/zwiico/css/zwiico-embedded.css b/core/vendor/zwiico/css/zwiico-embedded.css index 254910dd..f65cff8b 100755 --- 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?12761171'); - src: url('../font/zwiico.eot?12761171#iefix') format('embedded-opentype'), - url('../font/zwiico.svg?12761171#zwiico') format('svg'); + src: url('../font/zwiico.eot?96425754'); + src: url('../font/zwiico.eot?96425754#iefix') format('embedded-opentype'), + url('../font/zwiico.svg?96425754#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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') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') 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?12761171#zwiico') format('svg'); + src: url('../font/zwiico.svg?96425754#zwiico') format('svg'); } } */ @@ -82,7 +82,6 @@ .zwiico-eye-off:before { content: '\e815'; } /* '' */ .zwiico-down-open:before { content: '\e816'; } /* '' */ .zwiico-upload:before { content: '\e817'; } /* '' */ -.zwiico-cogs:before { content: '\e818'; } /* '' */ .zwiico-left-open:before { content: '\e819'; } /* '' */ .zwiico-down-big:before { content: '\e81a'; } /* '' */ .zwiico-cog-alt:before { content: '\e81b'; } /* '' */ @@ -101,7 +100,9 @@ .zwiico-spin:before { content: '\e831'; } /* '' */ .zwiico-twitter:before { content: '\f099'; } /* '' */ .zwiico-facebook:before { content: '\f09a'; } /* '' */ +.zwiico-docs:before { content: '\f0c5'; } /* '' */ .zwiico-menu:before { content: '\f0c9'; } /* '' */ +.zwiico-table:before { content: '\f0ce'; } /* '' */ .zwiico-sort:before { content: '\f0dc'; } /* '' */ .zwiico-mail-alt:before { content: '\f0e0'; } /* '' */ .zwiico-linkedin:before { content: '\f0e1'; } /* '' */ @@ -111,5 +112,7 @@ .zwiico-puzzle:before { content: '\f12e'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ +.zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */ +.zwiico-shopping-basket:before { content: '\f291'; } /* '' */ diff --git a/core/vendor/zwiico/css/zwiico-ie7-codes.css b/core/vendor/zwiico/css/zwiico-ie7-codes.css index 53add187..fd911f26 100755 --- a/core/vendor/zwiico/css/zwiico-ie7-codes.css +++ b/core/vendor/zwiico/css/zwiico-ie7-codes.css @@ -24,7 +24,6 @@ .zwiico-eye-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-down-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-cogs { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-left-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-down-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-cog-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -43,7 +42,9 @@ .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 = ' '); } +.zwiico-docs { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-table { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-sort { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-linkedin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -53,5 +54,7 @@ .zwiico-puzzle { *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-sliders { *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 = ' '); } +.zwiico-shopping-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/core/vendor/zwiico/css/zwiico-ie7.css b/core/vendor/zwiico/css/zwiico-ie7.css index 27b17215..07e0eade 100755 --- a/core/vendor/zwiico/css/zwiico-ie7.css +++ b/core/vendor/zwiico/css/zwiico-ie7.css @@ -35,7 +35,6 @@ .zwiico-eye-off { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-down-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-upload { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -.zwiico-cogs { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-left-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-down-big { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-cog-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -54,7 +53,9 @@ .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 = ' '); } +.zwiico-docs { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.zwiico-table { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-sort { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-mail-alt { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-linkedin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } @@ -64,5 +65,7 @@ .zwiico-puzzle { *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-sliders { *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 = ' '); } +.zwiico-shopping-basket { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/core/vendor/zwiico/css/zwiico.css b/core/vendor/zwiico/css/zwiico.css index fb871d13..af882668 100755 --- 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?28623358'); - src: url('../font/zwiico.eot?28623358#iefix') format('embedded-opentype'), - url('../font/zwiico.woff2?28623358') format('woff2'), - url('../font/zwiico.woff?28623358') format('woff'), - url('../font/zwiico.ttf?28623358') format('truetype'), - url('../font/zwiico.svg?28623358#zwiico') format('svg'); + src: url('../font/zwiico.eot?37992248'); + src: url('../font/zwiico.eot?37992248#iefix') format('embedded-opentype'), + url('../font/zwiico.woff2?37992248') format('woff2'), + url('../font/zwiico.woff?37992248') format('woff'), + url('../font/zwiico.ttf?37992248') format('truetype'), + url('../font/zwiico.svg?37992248#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?28623358#zwiico') format('svg'); + src: url('../font/zwiico.svg?37992248#zwiico') format('svg'); } } */ @@ -79,7 +79,6 @@ .zwiico-eye-off:before { content: '\e815'; } /* '' */ .zwiico-down-open:before { content: '\e816'; } /* '' */ .zwiico-upload:before { content: '\e817'; } /* '' */ -.zwiico-cogs:before { content: '\e818'; } /* '' */ .zwiico-left-open:before { content: '\e819'; } /* '' */ .zwiico-down-big:before { content: '\e81a'; } /* '' */ .zwiico-cog-alt:before { content: '\e81b'; } /* '' */ @@ -98,7 +97,9 @@ .zwiico-spin:before { content: '\e831'; } /* '' */ .zwiico-twitter:before { content: '\f099'; } /* '' */ .zwiico-facebook:before { content: '\f09a'; } /* '' */ +.zwiico-docs:before { content: '\f0c5'; } /* '' */ .zwiico-menu:before { content: '\f0c9'; } /* '' */ +.zwiico-table:before { content: '\f0ce'; } /* '' */ .zwiico-sort:before { content: '\f0dc'; } /* '' */ .zwiico-mail-alt:before { content: '\f0e0'; } /* '' */ .zwiico-linkedin:before { content: '\f0e1'; } /* '' */ @@ -108,5 +109,7 @@ .zwiico-puzzle:before { content: '\f12e'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ +.zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */ +.zwiico-shopping-basket:before { content: '\f291'; } /* '' */ diff --git a/core/vendor/zwiico/font/zwiico.eot b/core/vendor/zwiico/font/zwiico.eot index d3dda558726c9c07e269cc404ffaa0375f9a163b..a88a5b8914eaed422f2e1a7624596d1d68b09485 100755 GIT binary patch delta 2899 zcmai0du&tZ6+h?R>udY^apTvuorhz`i4&3#=ixYngv23$1IqD*c0@wnNBBD{@eWR7C8Z>+8Tk zn|7~$=k=ZManJeA_ucfbF+GcXdI+FzXqpdlm!ph+I&?I77yzFJfNzh+M&kVYe_clU zIRI7t=>ADJ+38t#f{5|?cr>=X;p;=BpCMHr9ZAH=UPSs2iEE$SB}Ld4_^KIrrbZt@PG`N@x7xXC$Ij%2e684 za40r%FwPW$Op)U%N-WQ*U#J_v7<08P| z+o_-67EGqT!fu>S1sH#F5Rk?I+z4!5swXZ`uR-9DW`r7W0|y$pm)QHM6RcL$%i}PAlPNtNv#)Y~Oge!UL25Da z0-%KC0-%)S0-%iK0>DLb0Z>kI0TcvC7XTiT3xEoe3ji<41tg)8lmeiNvQxJ#4BpnSpI zX$6#>di5Wzv-@0~rlblWw~I})8!6Bg6r&dCgm@_CMc~U&3)OB$tz!FWJMzHtQ9S}^ zRiKT63e=oR9i?3nMK{HulqSjN3D3-APtVN6&VAyt-$s|j_^!F^Y32y| zKSvJrZt09$!UIxJyjdi#(y zzGly|IuI#je&~h)7>2!+?Bnnz910zH<)xh??aP|fYW{`qtnG1{c$OL3u*9R)pc;Wf zX(`e(yxPJ?O$J77)G!RIW}>2&VFiu>WFe|kF=#g9W|^aT7|duM`1$GAQ$K#~`$wme zhxa97yCb7pw|w)NZ#?BIJYFkbURTu`@YP`jueMnw3S4jnKCY_@?PaL6;}iZ*wm+%o z{gX7o;s8%NEKa!C-bN|)Qa0Ntn{A$E30;C_RxO~OpVbKeA!3=JUbJNY@jn{m&gV5k zGEcK#JnB(s$lD*0zF_5oxiW}>D&|gAVB>CiLYdqcR||q#CLcev;f06d$N#Une6jnD zhkgFAaJDKy^9)x7FgSap@%M(Lma6I4g<@u z1FKerLQRbxcWJ4^VYMbz99>i4RpB+OL%pHil|Ajj#_p!>B|f*`<1Z~QEq9eUN*pD{ zPOIH&muv=sv#2bzRMu3&+w0nF-qxySiL%JkcJfhHsTOUXRtwo>&NfT5#i$JBVhsfC zRHKjSDqGS^&Ysq}Ief(^Nyg(cNoQSCQ|wSSG9^lAEjlJzQ8MCJMpDG%iqbPRm34)} z;l4r_+5Aa3jIO@Eg}HE;Il9>G7!8sAVzD0$k731)t{^JUU9-!(E@P6Hk2dZA9c?zc z75sEzt%VpI4DIV(5p1lj80dehZ%v@3VQEdZ(2osh#By}e{{Yow1#h=mT^MZ3%M@CYyD`{+yokJHZ)pyq z+S?`{j#O4H6nsKCdaE0-n$7_^Ep6Tko=f^&wY4ryNLAxpXm!@8LfW$0+Oj_zt!PF^ zsZ1q9S}LXZyR6p;Nb;N+t)&iXvKm>Vbzv&7ZkcX<^ERt^jbgm5dA-oSF2MVoiw36; z->T{IG1+6qZme+PMD6l=Cc6?H#om?BnoL!;%EV)#F&|jx9&A{ z<@Z2W)4f|x7v^O*{b10|MbIf=JPwWzZA>Jw)Ec%t{Y4fw@Idj%>(sJLXvGv>Dl`5nYQq~@K zTq+StZkC=Yy)Gt>}@RZL^T#<6DKAXC< z`lz^L?`VRHMfU7dO^$3IkEB+w*-))cjPKkLnMkO%PwY#KY2!QhOhzUmiAgarwl_{% Rbm{hy#O}!KTWkJg{5L9vfMNgu delta 1746 zcmaKsZERCj7{{M;?(MmE?ba9Q+q$lMX}hv+^ko}u$2K-*Tegk}C@({FP)2DXbgSD? zUUWrKF(`@TDgi=_8chg^W?DgFV&WSjieLDmF=!y+Lq7oNh$Kje^||c^@r&o?cmL=A zJm=-PxhE%|Bl$CgrPcxbxb`Ru@E0~5YCPI^Flz!Js{vrkXgZ#0x^m=K^fLhb@1xI6 z)ngo6REsb5_DnLp)${j0^z~>flkv$6#xWNaQN`r0z1uH`Pul?4n*gE9sYHBRo%*5* zpm!MaffNRWEcXlgx6nIM>8U+Gq}La3Vc>HN+}Jff8sFy1V88D;`l)n$PllQ_hX9sW zqOTu|rxPQEnN8?h0qEJx_~ex5*n1MdV>i${G82i+^trBc0Bc*N<75-rFa1S&iC^lV z-h>+nt^vdWT&dTJs>E4t;Nc!7Z1^D@s2h&vU3q`uWZ_cbYTKo zY@ytF-b=D(fII>g)ao)&gDQIjtf;a_pcYm32yP2`*&|SgDtiR#QDu)n1FGy1XhfAg z0(Ml{BUx}@M-Cw1M3p@PO{lU*z=bM%1Qwyn9)V_5e;IHC6i$?Z7Sxkv0RLa%QW;o` zdbJFAP_NqzGSGpVECWkW(`6ul`k)L1 z0q)>hG7v&2K=Dg%fTOwBgfH}2hV~qn=NNve4~F3YyaC7HeBarKMlCRf0@km4a?Q%v zpiZmcRh%M~*fzR(WbNuzLk2woHRX0BpK+QMB7G_CXsoGb0-Jtu|K6!*?G}*;Y~>b0 zcM_2f^)K)1?dk3c1p`Y|6|oogJU=<1AcIf=*@{;|fk#ro9RQIsDzXE>1j>YI5C|2> zG*19H3fvB$BB2|BQnDEcC9B?%4!=G=w&|%A(e^g4r^Q`ovnZLVrH2FqL08Ze=q2qY zqbX<-jCI5yFu^3an1>lWZmlpfB51qAS&S*;VkxE(vmGnjXkZ{j z`oySM=?wVw2K4|n>N*$ul{74dMYSvBH5$}Wy{>DqU*w(4&qRyUQKeP-w3W?ucE)>| zpI2HJ*)im=Qp+J4;mwPz%(8&#tP6NYz|GfN1&iZuT(nikvXP#0DLs)`wXIa$K(t#U zj>rW^2Q0N+&H!zD+{cH0o-c&&FBO8tnI0C>&*tm>XHA>7vZcW(QlG-llr_y*NoBjH z9P+bvEUp>rtv1+rqsPotW-?Rb7MnU+X=AR-x=bg1OAIyxs7`B8`VO zT-dDXz6%;Ij}iFe+BcugYw><@C-38i(TnowE;aeoJW`n2p|ndoQiz0NPm(JM?zuMhpOKytyN#EdG!bCD;lL{M!Qt|vNo@C>rUxz zE_i$4alNST*PqtkG(2ti*61_7YtouWEN5z7srl2oy|i0rP93cvcr%+ -Copyright (C) 2021 by original authors @ fontello.com +Copyright (C) 2022 by original authors @ fontello.com @@ -56,8 +56,6 @@ - - @@ -94,8 +92,12 @@ + + + + @@ -114,9 +116,13 @@ + + + + diff --git a/core/vendor/zwiico/font/zwiico.ttf b/core/vendor/zwiico/font/zwiico.ttf index 2f35e6fbae2d23244f2a090c4aab396d55c5f1b5..9a170755a81e12e8b38e3e37b20f6d0fab9cd626 100755 GIT binary patch delta 2882 zcmai0eQZ_=V$xbelPxdw)5fGapHs|#3XSXLPBC7;6O7{Xa}JTvLv_;5Q7(o zk3utVL;I-K@gXCm!nT66Dw|YIlnka#Q@eF(MOTRmX)FDMq0%8{rWHA8Ln|Wo&hv9% zpiO&Ezw>?XeLm-&dwuz5c=-Yz_oWU4;Ijbm)zSEHf`9kJrKFz+&@_(jpY)KOo^{8G zh%Y8$@sXx44v~JARAX#7nIL-!>E9!+i;chZ;-Xi#y$!%$2k4p|iw^IoyeR$%U=_tf zXp9Wn_c;gYpO9WX7N0zL_0OB~e<#C3GGxd1jt-x^`W-(&FWKNweE493DV4qpuzHMi z&z|9UbbI!#uaHg)G8YqjlaoEC-rNe%7bd+gF%eCC{Zi*8fWbFU{A(+w($8ZLo=Bg> zKxz<>rU2XsY(Z)yF3_Ms;E)!CI`9AoI`4^$BU77c&YsS`m;E4nC3`)4GkbT=JJ&Q9 zn~Trgn0t7y`QC|q9)Kbta0o~l2nG>?UBRx-j!@f@KvUzQx|-@LZ>d8x>UpS4poc<#9B%Z; z^LL2lt`d<;Zb>0ILz3ScnV!y_nVycH|Jd!ggKnAeUvoP$%*z!20tGaB^ar|5~VBvJum=6 zu$PK`3|@yr;RCOHbLVi!(q^ref9Y#$SGdeP%WT=O$g9_(7J*V}Eip2@*2>4sCPpjj z7>3m{F-gy`0>=Qd5Hn~Pv{-Pn!qGAW7PJif_{^#F55E8HBU7ov`;zh9(a~*Nzx>>n zp79qSpN+3q<)HOwa1*(30D*kEz(|RF3MGGuU@N~e!f(!n3 zDyfgE*-q7L_qNFB7IZUO0ge2OPWTTID+KL=CHI&A;ZO!&&OKPG*l z>Um3b2!l1u-J0OW-O7RrxiPL41g%0odSt_kkHnAupSyBl_>D(nem#G#CP?cH)dVp# zb3O1YQ%X-=^%lE@nWe_Df`bk{b*rp`2)rKtVFMcYPBd{$f2rBdYDfeL~mRQ$7mzw$0As zE21om#}tyuxu>SsExG8FB%`h5sANM~#D9pSNXJxV#ne>J9gal$ibE9h$B_uS`}*c* zBN67v!my(>MeehOaWp+f)G)e&s6BVhoL>G8rg-IO;||c#W~W;rKo{0ph{M6~zE#UZ zOX{n64zb^adI=;we8Y%B35t>+#(+9oZ;)bU1UmXy zJ!>}xun9%1L^u5(pq{Ma9d?@=L+u5bQcH3VhMJIRj_}t~yOvUr}FQaapvX1)b#zl}#DBobvCsT_YgL zvlg_KJIQ4eS6 zStFBMiB2&i+EPq`VRfcZe#yo-O^-z(Bgq_nfFv^(=F;u^&E17P(A|9hw#$tL*+YLY z=;k6Anbjjs zcBOyOGnV#**BWR_b_?NbKA#>B*O(MJlg~4MP)4Uug_rgVCxuUpFB^Yr+HN{(dS4tD z?@Qg%Po&!=gC##TKWlm3GHc0MPg)eMH)^cQnbxqkHygCWlAH zqvZHK$9L|CP9!xW6Z?{5`ozvXlhKK2a#Bi;?M;vtTRbwH+#Q|Ktogn8Z@l7s A-v9sr delta 1729 zcmaKsZERCj7{{M;?(MmE?ba9Q+q$-UX}hv+bnOOh$2RstS4JTMiU>{%-6$J`Zgm|x zL|1$v7}NxEkpLQ_#t-NRvrs|eC*K9dFMQDuG>{O}7$6-92@+y`Ztn*1i|6Kd|L6Za z=jFM%C+ET$a^Vwl#FeuEkPQH^eI%XCG+uuDSM;+0{FRaCr|K|{EvCnpc4uZZJ?#Jc zMf7!OD@T*r48}1R6H&#{J^OZEik@}?u(tprm&Q`b9ktpYH2^(ZFdrJjfRN*UL4O3j zdn`RQ{X=?l=@te)$H0v}6C=qT-VFA8PoSSlC#N&iqB{i8SBbuEJef`S!inF(fwul=!CMFxPZci~uNJQtZ_m}w`R7LG(sK{)1WP3V%me06mh;z&xBi=# z`l!P}a4je7!DqbuWMJ~qBORt$EPzP{?w+)PYIO340iBiK*dlo=-%4^;fC2(G)M^E& zL6toMc2wCT;6RlLP-Txm zBdY8X@S@5dfhDN2N1zEcr~p2I;z)Uc>$I1<;D-x&j1H z@tnv2E?&H?0BrzsSiKCiqv8TGuncun0hXht6(EHAKmo!4cW^Bkh#(Z8^d&dQ(fpt6 z3uBI%hMH<7u$h(rHxcRD{=VLx?yk;AIJ8_- z5r1j=h3uq?tbq#1RU8Br9!V8<07S~D$PNG#C=+HtAXFeTJOSV+aJzttgl+{&$u=OA ztba#3{Kmxi(9^49?QO08W?!w-re>DrZW0cKyE3Et)N6S#2u!*Qnn85d?wvXV4y5OUP1=~z(77}y@*WmsqRr#3(yIgd%BETu<6BvfSKF7kFchrP${{+yTbJ0G zZ4oor7xC_pkFT=}Huv46=&X+C2D+6}x(DLb&T@5wu`ZpMkPD6t+8mvp5N&%bz(;;w zD1`4X7lOrE9v0Hi7V7Amw3l^i-K>6v{#AX!;4{2uxVh-q;uA*E*l#>-ylHyI z^o==Se&3?ECTyS9yk7H%eP?;Mj{NvQ1;LwnI`$a}=Dn*|5YizH4^B!~20v8sBNL-p mY5$tn_;hM~uT&M^s8bD3?#+%>WOj{Dr6yC^{K5FQ+J6C|Z;5CC diff --git a/core/vendor/zwiico/font/zwiico.woff b/core/vendor/zwiico/font/zwiico.woff index 825a9e5f02a89e652bfc151ab97d654952598775..96cd15bf36b1f726321cfb98960e1b928ef68ed5 100755 GIT binary patch delta 12280 zcmXw<1B@n3*MwrzXIwr$(C`Rv%%j&0kvjUC&z=bJbA|4y!S>OS|WPIp(OQmD1A zbU<~N7ZU>l2Ku=;Xn_#^yK73sqw)j1jcpAbfPjEkf4Bew0;2`*pWrZdb0Gu*0v-Hu z!TbRK1CW`6x$TcO3j_py`6Iy^(Z70`8#@2wLihfJA^#6Va~n^yA8ix}h|(Mgh-Z*0 zO1Im>)X)S7i23)Ahv^44f+qMZiysjP2*CUk03!T>6k_-nhJ~$*$B!}Sr|j~>&D`eq zg^j)OkCFN1r|k6~Npm6OwuT-*4`%t#L--#c*a)F^hPI|ZTGG#p_yYlfH0j;c={VRs z|9IFif3%bzO@cqAQrp4F^e30S_P@G-5*2|Zfz1;$fXM;rqqqMo|$BR#MRnW>T>Zc2e;V22e>3=2IyTCQ#`P)>D}eMo>8pmQ#6) zj3fbsnue0Z^A(uFg|Nt=i;^jmwDT1L!i6-+p^MTflkD>q=EH^3D4>gSC>KHV6-dH_ zHVNN~Q{voYe2Fg8(}mX>&U(l%GuA}7em_RISXg16t}e39hnKk)Dl30Wm=}{LbQH@a zco(}Rw8-$1*=Jx&^D()m`q)`97Ic@*M1?>M?;wz#Y=ShDf5EifhTktKv+y-1*lps*0Zf!PRq2kW2=Mu1frcT79rT4VGbwJ1yk6Os$t z+%ASK)7dmxWp(E(Ieb?wv-s@h$vLc9+uS!7*&kW=->;cTdSeSub#>2~_9i*aukTmA zzu(_`uD_oVrAD;@`iH|DQYQI{d23$49NBlcy6FB=Jjp30gh9uUJrblqmNfCCtHJ^S zScL5>`)-`9p}MLzAo3=0w)u1Lq61{Z^VQ`oDv~P5-9a@6G=0Gg-Ctgx{pU5`J3|=H z`rVy51JB`nFP<`S0yC~S#vkM=!!b?@6LAHQ=IawH707P}W| z(Zm3He@ywB;9u)W6`Ms;ZB{RRe|%B51yXugT5Es5kZA&2;1-W7$nsGr#VaXR0o0>0 z?JYv`x(r1CDklmsizF6o_~_ufUwvSrYPR{p33-{-+tC3!G+gm7Q%c)C5Yg3i3@S!c5vRklC! z@fQGOuSq10miupWrT3tMCE+Ra%z+|f&yjSGhY+8dQ99~CNt-28R|G?B%ZJcU%y2*> zKfyn(j|*w8+Z}+}6X~BW+x;$F^jdd12Mo9|7`V1|=QIt_AfK0)TC#WD3<)?T*|CU? zn|9d%h#WZZ@Ogb>| zd+lAO(5{?HH#?KyGw}6CuW%(!HFm-)=owMRrtv#m9!`pKYTdTb!jdBg~t7Ho-Z2$HzU8W$-%GbaGj5my@JYQg2@ZQzQLq{EK4YofHys~cq zUC?e0oH%Z`xDJUTJHgDvJFm)>( zb?N=?g52@2J$c6JX0vJ{Q2eXcr&8q6_iQoiE?6BM+?&8)1`N?=i<>-}LdxZC`=MBD z@KFTO6Wg6>K@>8%T@CIt^K{}Z0wO5@c*=5i8t7@uP*Pji5F6xcE~0f^!*B9AvKY)x zLUXi|PJ-hSV%#`ZK)Is&7AE9BlWAX}`atHrZBmXR#;jx8=y7P;hv_N2oQ#f)-P#!Ets`>n>Es8K!pdK6*{pz`RxJG5XU5b`@1`FvH(~`ATdj zf4q@DEyD&RzL8;J6M~t(&r1#-rHHI7P`jLAc(NS7Nc-jGcrMen)Fu%9p;w=AhZG5M zaZm}}!+>}Yv~OWvHiIDixS~q$s?!f9J7}g?c!C;-LHtq|$oH+o+DYHmKR2TYLU!&JJ| zS=5iwN^{dI-w7jhs4v_iI5N6mN~BWq_hl+Xa0&=S-lzesGu z*t*(hXkN(;QaLG;Lbg(+ab<}7%jnhsUh$NhB}#v?3ykqdNCra4-?6&%7epYC%zh+g z?;zm!LUGf-Hz);)Ht3`{hRQjx3OSze{G;{jM8yFco8wwBq zRLSpq@bzv8y1dC<*{)-C9CyypxrM<0dJx)W>H8}AwwSP0TL(Cvc5dL9**tMxiHB>7 z=ZiDJnKlS1tS8N>^BYA<_1H4BeDYF2C4o!r?~~1N zWFQlFUlVnMj!er&6k>Gkpa*?CufW^S&&n9i!?7*7g_PEN4TCWy&v5upxkKp^=K9mG zBTa}t1Y7j-d=XXb$y=ij{awKvS{;bWo}|6l;OjB9bMrFt893SLZU4$<70kiEkn_;i z#m6tLJ<<>xel?AnTADZW_GOGX0#*1v@Ja)Tu`d2!z zV%x;R#|Iu?!^XZ-kk5z>F)IK6zE=Qk^> zK{dXHt{jfPL>P8;oKUoj=c7PSwl$&8r}@3~LpH-UUG`VS69}y1d5I36I3du~9ynhg zF|Q!*p#B1us<2N#T|RYx;)+v`oo_I5-SFjtaWgyWAsj1m?)sVAl!7D1x3Z%03R3ej10~#PzH};>kj$@(u0%`s<{^@XX@H$wX3Y&P4)N6aH-+= z)JBC^{B1siC`G#9S|n-iS=9~=qZXkQ7neffNZHCvp7~JOnVpQPS=VG{+dckv!F{}m z{@;+d{W;s%S01uCoz2UB@7CgYAakfUU+)`XwM*rM^nP+3B*S!<+F8z?I zvME}3ZU^6Qe8@Bw6YPBghto$+mvHE;B^KbebX^?{{+7T<3$ARI3-V1yjK5Vny!Lgr z?KGd@jFRQ(<`&-IyI~{v;=4}6cW{;0U4AX=`isrlx)YMolD5AxxWF7ZNDU2$??KBYLOI~N?PC#13P!3{3cSmPUB^ci6-?XJMO+!;IxWF&Q< z8*IPZ$-ucL*GYI~)H~>c6*c`eNdqz=OqV#xD-C%4F!)*H(8yrf)FS zVk+}OYh$5)ISm$Lg9~~Gh81C?H=QoO)~AXo&r~>~Qz4NlXo+>r0_f7g|+xnC#*9^ znDN!U%*?%$URq0-QQrCs?t}q2eMf86zEP8&y|odHuR&=4achvfm$8 z&n-QhwRI(Q8#3`w_0`KQL;=2S@Dy4&pk zNb)xlPJ-qr^dwrvDb)s`)aMqeXICYgt8=E(XRoeeM{yU;4k>^*!&&M*(UVEc5VLVC z6pop^W4m+On2iG%k_A!Uac5k@g_W0GDvpPZi5WaEPcMnu2}2x)+|v9A)VY=@RBnPE zlA|p@Ljw`b1|&%S-EDFrQ6IYgvH zQ!tOdZBv}%h@bxdKD_Rn){*w+dk%JyV;&YAB*A|dTxDWyTa8;Bv`tIAnSm#Ao`G*M zF)BlN59b-WIZlfsTR(=z@uA&M&pkCt!XI1dFNiL0Mo!TgY@ie?1#4fI*p9Wrx+Ut; z;hG~cM_rqP7^`W{CW;55GB)p=usamRo==aq84|jrOcKqe+ZM+!RlHzg()U|rU6%pAW;?BP16dit zP6}6RBJ57M)`LWrZ+M{Z?I}=HTTG=;=k6-{D)V>|MQVvWq8(D`^K8)x6QmEUhP}<| zInVL%p%2j2Glsp!psU*~_ zBi~>l<{hrtx#VwBM>*b89g&Z3SqC|GIp!SPboQ%R&%ep0^um{)903t+$`0XeGLE9whRB_`YMttydfn%9l~bt%ol$Kd%wU$iEN~ zF#>eOFwLsCQ9n4BV(8bop}qXV2`{Ncs>{B|yFz{QP8_tF`;(}J(9bzADt_=xF>S1U2*m~d^hSQlPy(6r?bqeA+-Rl!62LWC?v>WC| zfCb`J;3(gS`8o=`=I(q>xdhxF z8hKAwoc~PjP5Q>1xagT65oZe#*&JhyOJo{JPcP?kpJBmOt49LTvoF<00({zC#nGXK zV20MQY%&aVgb82r%XO3QaLbcQiEX!NsT8X(K=>#+Hj(({ zAuI<&N-~<9>s2$platl=boir=ESt&FC+0ji9*&&0^#vG8t<=wy8)#UzJ{Su z3?>YBA3@592c5is5Gkc0f~;A=FqTygy5m%pFO66|=N>rw^|+JIx6|s!kh5%p}q0Rdpdurx0XW)qU?RIpB=(_0UgYMg=PL>$Vw8f@2 zz`EpTc0amguLq(L#*sh~7#6Q1$cga$Asn!eeYz^c{Qnd^!xLSnk;xq-bRG1iGy89K z;FU_)03nA~&c{^N2i|~C+=x4@!F1BnG9gE7c_0A;*MU=z5-J*j!~ycSW@UG^%=e+~ zURSzIy3J}Di(T!D&g55TQ6R6Ju;cX~>Uf|~qOOW51UT-s1!F{tGMj%DW(*Br3HMZE zUhXa3M=>wxCNQbVZ4&P5;VU0h94j)d4PCC&xrUinSfA3Xbtwuw*S$r9Q1UnUcBp1- zI$X4)lCmFFUy$lb-vCb5N2LrFkWn3QM;|Ye9E{zdwS22q>XmNV+F^TIiKrfDzmiw? zMc;l|$sQESwSvDMw9Bug$pa{M*fU|>=Tu|c?yBG9)7xNMH>J!J26{nCP@=@__K7=l z$k^3TYLNA?zV!}%P^ghuY>^;qTVZY_Oj2yf0OhR zO}-+9&;36O>dxL{tYs5b?dBEz|7Ib(~rQ}cMfev zT_16ik$v(&Nd!!fu3cK2x7g!f|C_^cmGj%8G_kDzOE>bW!*|mh*ay}@xrPDWF?hg|DIO~9;01oM!rbb#~-W=Qlxc?)nRkFJdLBKxXBzt4)ym8i>J z3|mvQrZFBDEJwSUCD~w*OTfu6oyyWL#;GehX_3uxQb6lyaV9HPkU{J0VQF|HP1#yg zgr%AL!l`J8Y(a(q1#_Ln{qgy>$$o%cA=ye$Bi6B-VUDhLSCQn12~|g~J^{($T3LwY z1|}+nU;t3`O4&X%B;S=)?V?8)xNTOWU7=&y7eWWAMQ1l^8g4)|-GbMPz*5(5Xw80) z@9~K8a(Ld`-Qwixdh+>&NSNL7{-*0IF|u9r)Gu^@Yac1MV9h5s{nmu(Vv76afMeB+d&2QhQQES*y|A znozn=r3~H~Y$|EbmOc6lmZmaSTGl+(u>?@%-#m<;rr^&sXd%FRZZYf^H^=HR+aM__ zN32E>ckW<1<@ucQBH_s8yp9q92iCKW&)v1^ZZNpQjC{ppQX;26`c_@tRGZbkGm+l5 zA>dnal&}mj*&Fpo?is}{^a4AosT`QjWTlEt>+6o^SYXngY)A_tfNoA<*#HFz;Tm8} z7}4by2NYqF5^IuRIKaRg1u!`BeyF+r zoP8L8uxh-%`3GZ;@Z5K^5}(DuCqvNj5%i+{NKwGKy%PG4!23|v(DHl(`cAO^lGmmG z%*ZW}bBp)Jb4pZT5>r(=%I)}Is00vk?}rL9PP52{{tyhWvdg_kb{_Cv<;grf2V;s< z@-pzfw%9JkBIBJU(dLUZ$d^6q^X=KHn8>XCYuoR5^bFey4{AxD|M7Npyr?CWZ zh$5ORUx810yyP7g?TaH^;b@1nK7wyC_SAWs`IYVQ0k6QEKiiS&4k!$wmv`lYtbZB9~WCeid{6!AJ9Q9!< zOm;KnOj{oW6)zz~bV{p;*9+_S%dXl&vN1aD6w&S_@1$S5kUH-Z)XSrcSurKcA;fGF;w+{E-PlSVE$|g+!{UAz_jd`fZ`;^b%*mOEHB&Vq{MdUE+ zcjM*4x*3ouvKp-ys03*1N}k6rzX44j!KdD4r;-2ysqtXVsjp3Mx$Mnr^BNjtBxqxv zVyb}Ylu52N9>|BySK#lzZFWVQ9)4EZ(Mce83%i4_1eVSE?rD3E$8n8|Zn_oX!zdVa z2^dX=Lpby}cuvYO={%MpaWbXLwEUwJSc?P$uh9xUDl`8Z`3m5%EHx8BDa1-|EPACO zQhwWnen={ZhVD`CBQ>XgiC#qQ4k%ApcX~E|=JA`y(P%Gn4;?v&{k1$*d|&3{aDw9w z89L0ax~%5gW$NY4y1#uh>+5ap5@Ht=PffvPhn35Row=5^-l=|biUMH}&8sFIG4;eN z{CNW7sw8v;F9I-e3UYd8977=1MD5)>2iXVdsBMX_qu6+vS+{Be`PYIOoRH+OU!qjs zZ@bvj#O&9{@&4Li9($E`NY0l&h2O5R4W85GG2>4%7y-rBC=L^zh{`n0=OljV3+3a6 zYD0=5jI#Ha92ts&e(e^`7Nm|*kMtJg3?iG7sfLyqSs9>O90}hmsL-;P3f%#TZ$q8x zpY%TN+htvzJRKv{O_w1xtS#&}h!UU6w}S1n(IZ4dEo;|jrf9sW)N~MpEI|fvFRJSt zi&iOwz6xsE8JqGQGr~bXEd^k(hn(kRsRq(nO0~rJ9Wg(~0*;ukz28h1zOny;%k~(( z)y$%-ECafIn9O>0#g<-Y=t<0Yu6xdz9qyO`cMsM!cq*U!$5B?k5!vklK1E*#<7I4 z#2&k@Wbijg5Ffi?-_XQ7#b|Xbqw5%-IJlNHfdOoj=;U!sF@8T6*6OgoDKz~{aWz4i zz)RdFJRYSOzjXFwZ+@iCrioZq_avmBS1k9h#|FDs&IF9t(0`jg0yJO8@6}>DG9psTwAeHZsP7uk zbv;uom#jMwRST1u9|^t^K-_LqSNZJD_&u)gSJ+FPYrL@cUP{XD9)}FS9W<0s!)?2r zefw6g_18bAYqUQQR;GO)(-+13?QSc2@&LXMBO)Y<38h2nX<0b&jaV17CELvx44Wqf zQA?&aR3aq!A2EfoSC#AWFaN6k*4*`ELQ4Zvk*8los=du}+1z!Sx2{z3yjazjrx-ih zUg0s!2R#hqp3|2k@{)C@+1nS^&{4>ymDR1+61On(% zDU46^en-QaXuI(ez^JT$)$7!a$U-z_*exJo@VBogo&*YUs}G%RS0ZTF!MzOB-U_%A zqWUWg^1JlEc=>U?IS?D)uL>&iI0db<=f0XJUh*EA!QV0{jVA3?!=3Jb`-T*0^O*?pj z3n|DZ6Xu$8csiDVr^EJV!HgxWtL7h_S+@b#zJDP zq*+`I7FITk=-OW}lC?73#5s*N?}e3+slPD3LVYQk^?7?#vNMQy=*{BI( zpVYOYAkqQD%DiwSL61jO!LS|rW&B}b#9z&^S11f$UlsXcCDm>cOy>I+OukU|xe8T& z)n5Q?jIKA|%IMhA9spGR07Bn2(#+?zV~rHF&eG> z{JM|YTxa@YrW*Qmcow&sxsY14^G3}Gfur^B$XKW~E1WG_f|WfI4*jb-r9%u|I`^J% zDE;G8)oBhvhT8n4piQYF+^h|Wq={Z#)beub7Y|;IwsPQ#9{mpRw&J@5@^_%xECAic zy~g*{EGHA{>;M>Wd(ffcg{h@Zh7%?huGzF};Su}U{?RU?MLKx<-xjf=cm6`R`s$CT zA$&GAw~nQDy-}y93d=bRDe7Q%>8JG&fqD?e#{%9|Md|pETt<092C7(*1X#!-}Z4^Yd zb|4$da|3CBK5f9?{j#G{k-@PLxUF!z5!futz6eDUTwSxo5%Qa6(;DH!Sx6gq4%14z z7HRQ>aJ6YtzJUk4DA2ogi`g)IQbD*PEd`CnxXA%Oja^5YBnf;c1$Ra6TZoGB5WHGU^N8NDR2d~YWu z1fLJV^1gQ{1mCOsvAiGa2z(A_TZt4`uR9Piw1BJa7Wb9@sde@lxu{rJglhc-U8>ZG zEIiwPCi!I8@Qj{kPaep(s2LA@4_9f>6C|~Rij1m4lIl*+N~q4uUU5xv28o!TK1G?5 zBSljEy5$;)_(M6t;3uRwqEUGbMLwgawNALP5eA@8H`A~5)cK{!unVKUquuO zwBQ59#6DHOIw=}gEM+j|QW=YAP|tc+{z3IrjSa1Sz0pP1559ymXmeoY+?RNN@#oFhn^ky751l><07dz^Vpzbkq1V2h8(58rbBe5v~-dv!m$ zBZV^PwROo_GxBTjgL@5dgqRiD0Cn8^#qiuqPNRT{BVF6vuLzTnPXf4h6{*h`Sm-vD6Q z?LWT;WQ9y(I%7Aq)-QqO1VE}4B$Z+iL(3Hv9m3Q&5+OeX#VGz%(F*P>{lRa{W6Y)(tvO&29Wvo|M_ zVe7|c75O-cve|h-kEZr>X#7VYs}8tTZuVnU5_qFwizfb}FKB(ji4Q+y*p^Q1_A<&! zi=EYA)B8rsIb8~czLJ=xAOHDOB174cty~aJiQ^vKYHlKT6{B2Gm-VNv_nM0Wh`Qk@y?(=+dkJjZ`=k3c)MaFnlc=0I`kyvm+pt}kR&-BOuH7MqSdWJHY5C z93yP%XGdd+8$Q0wR)Nl{?*Vym1Fdqu`e4~MHf+X{KdjQ(_L7aOBpK`NdmWPZfv&@B8f|% zmPp_EMT5}-k3FZX!ifEjrpwyUKpx$giqw<8h27 zT?OeYEiqT+*@PN0k>Px(3KNThfQpr6a7C&AMB(j|AN|+%J80h(ojdtFNZ3 zT|1c+<8aLAXzVTG~)_5s8;6`vsjFkw|i5#{jSVNsKEG7AL!~o|tmE(MzI1A&ETAdtP zFOFs-_pLQeO`}k`FkC(t0|KSpto0V#e>@GAPDVC`I@FcpW>G=>yKZa$puq@Ewn8+2 z?~56lf46Ci$Z8Z{cSo`}%!v(V_ z5+#j4O9D*Wzq|ZUK{2sku~fDfaODG5GA!gMrOB*^zR;J9(#N7R`BY;0X+sHqONcx6 zcwp%Z1Oiw?lPy_BPf)LvobapLZ|$zoam41~+qP6d_`HkNyFP0%GXSid^FyZ_T#k%> zgB7i`yaRb;8XK4x7yudJ7f&thzuI;)-7xn6Mf~1Ck*Erp`v!c@7*UzW06B4D{uRgv z;;M$32m1dU__v&)-d?4r@0D+T+Cx|YC?r$^P@wz*@PowPjI8{%T(y3sx&mDW-g$R~ z%zxAWxG*4c_YL}6O$RQ0fn)$Pb0ZUvn7}1Lq@jd6U~GIym^=$_j42KG0s&?I;WkRl zWn`0qPJ&*A^?~h$(}RnF8-}-me?s6xC`33y)IcmnQb1Ng9z^~^NkVx;gG7@->qI9; zk3;{$aKP-wfyOz&&BcAg3&1z}IkF4<15YA06Fy*0uKzb`$Tx`5ul-<<#&dqJ}^n(w=*J83Zz#kwK^$Q)DuH5#^*M-w}J`P^e{8VWak+2Ba zU>Z*{ehllGV~>qf8aM!)SwpYFzhFHf&9Protl9#r-o zR*XZ`v4?-ENAQYAV2ej6`1LI?fg>P5{w0dxCBptChTtV!|0P=aV{ADRx*BO7T2wc0 z(jdUROdYZsjEXHm>rV4*XH{SW9mbMqiJF$%MNZXxx{;}q#;bs<-qXPZPkGUs&ACit zUQ~nYDm>b(ctiV2EM-{A@F=a(+~}Y?Y65%V+11NZh9z9t(lN`;78|FgI2j;}i;G?D z^AT@CpETFlBG?I=5E(zH0y`g@H)Tv+md0dc)R1X9H`Y^6vP{E=N^gd2oP8nxSG$n@ zGwmVUX31HwicvWTEk<-c&U=g6Xj((R$OS52NlAWDvJ2oDL4Frx*EO^aO)euogiKG5 zntXiQpI4-1b^L1Zs>6lmScx~GjkBR49%3OsP0%_=s|Y7Mu_?kg@dez2pKA(~$js{d EKV%!td;kCd delta 11659 zcmXY118|;A+YK7qwi-9KZQD*`HE3|hd15wB+Ss;j8;#xA#+Ub>e`n6@?%C_i&d%YlLUDP!TOT~0|Qu4KMB%LP{II^6V~=_o?u`spF*(D z&cOBt?LW@!9L+uhS^j+1-Ts3)jZ?k7iRWj>teBs5(*FQ~gA(RoVsG)uv40LE01OPG z!SJ$L&&kpCQ^VH$$$5WrluXHg5}jNuKD8X5abQ2e5>>!uz%3Iqz^MUNbL8jW1E>S- zp(gmssb~^t7+`KFh*6%I`}2H?dLp<3S04@0UU)ZtK|RJ!qUbb}b9}jQDoI(&y>zum z_rl=oOa7L{s-*F3g0#7qcBGxpI-P6@7uuUV(A55|?a9#dip96#r9}%i?S@vC?HgMu z=X?y-1?vK_eu#4xt+K$1`CU(GOn& zqs^zQC5?MqUJ)@GN7fO{Io?eM#sh1%syW8mepdSO+Cg3dyV?OxzSCp9hvlL%@UUC% zom4?)&k?w)TfWV2TZ|XD*V!mOdlh0#n&6f~+%C zMaMI)MHx~P#2C_9#Tn9O#ThbOB+66KCCk%mCCk%PrOGp|rR-7@r0vpKW$e;sW$ZFs zWKUDk`MIfstZ8?OC#wiz9Z8<3}9-w}yBhn`5e{@phcHu81iU97vNpuUQE$S@o#@&7q9C7>1$dgkjekz(^_+caH>gZDu>iO#Ri(QULc#fr^ zIi25w%YkW=3ALs_x}K>d!QRk^SSvPYX9TmAt@kOkA>b7rK60VtC^IAmsnOaCT zJs8VS%U>5^942LV@+*>i2d}LzDc7QR11J7Q7%eNqmls@_vKmH3nidneDaa2w_oeGH z?ot~#GzM|3mf;{kAI9LP}$K(JTfgo?p}7 z<2Dq~DOC{$Ulqe?FsZr!1ZRV{`-mcZ$7hDFZX#NaCL*m-D6PkywNs<57yf0B*nY}! zghGTdnR(L-wIpi zcco;x5_eFz$u#0=Q$$gcR7RY5xlfJqnbkp%L3yB-qdv37qNvc}f;woQ)-VR_RWjZ& z3Cq>B5s+FEIAOeJF|3D;H}_bC9en9--veC3l0cR(Gc}Heeow`oLrZ=)zXsCw|6)ES zR<69-yW9RsQSAZgp)3z|t(a+DVG9j)|$g{Rj?frFDh&DaNfC8AU4jTniYOkx0RJ34?~u*r>iu0)q)DuOLoHWIFX}p zqR0OFqz2QF3wv8R{LayfaSVuKAOh6Ov!lLp7oH~6&yZA0x8LO3xk7hjh!=62UIu2W z5MG1dDoJpEE!!~9D{r5{sUFTe$v20T8g7$ulFq}Q(!&qIO1;R+5@6x;=4(5TI_e25 zj(Em|^>z0m-&4SZb8~(b zcEASrByQZnxom?&c~wVM**BmXN%O$TENg-L9{t>|7$z}j14^g-`L|=CKG+|b$_)|q z2NDq^-FN2xF@NN2hvw%dgd!j!uX>F7^6uisJs=F3$)#n(EA4ObS$n(M35Vi$)hqQH zM*%E*pEpOZHPP&@eV2~iAD;Z>7e2mWmA_fjJwf+xghVDC%4}bZx5O$hlC*W} zl(7n|>i19rudgYkxxq}DB35yx%N|F_)@uWz65W;id2p87zX&f4gZO}T)zdZlLsPk> z=nu?Cpi=0fKIYUFe-g-1EW>!;;MMsscq2LP%Ba_+5edZ{PSiZ&>8P}F+7@~4&gsei zQ53uGielGY`x08ASk&M;{6rLcND(Xaj;185_cK$lrkKO-bhG(p4e_}J!R%bOHivT- zCc#bw#ZsD1?ivq4I@2u_L^u`xioPNC#Dgfh{IZM?20Jxp;0Z)H=(bVEvzwmp+5FZ+ z(_2l1%{sa`>euqXb>|c*UOwi4w+#@9pMk}vJ(#u}r^B^2g8C^FX+4i~=_?=ET7q^R zEgs#}X)lWHv|FL4OXJU$J4JiW^$T=eIF{=hrz>h?)KiSFj=roL-Py|+@La$JoY;0U z%CwGQJV|!c`7pe5Q1X7$^eNXM zPd+HhZcO|Ur*T!Jk!U(z5@mX7BB@k(=;84DFDoA#hhU@0+gA7Ld-j5#!Hw2#wq_B5 z6drzXUNFD_Um8M}&Teg*iR4mZWISI=g6oDu-j2iEuUa7619kxaHjj#HAyY5|Ig4xX z(xWGB#K_v&VdbNN6#8^3Y)dyXqsA8WV{;nwlGBQPVUCXaI!}$_owJDWL{TD(PXCEo zY!{=>>0(Ds?sl)vquUtp^SQg%&}UuYP1+7y;sUCsT*X?}j0nK1PbNp6?;sNsA>+>j z&Q(V*Lm=jzpfPRoW!E9eel`YN-Wg3X&hllq8SuXa-SZ_ZFoKnTd3 z_Up~zYKZytGUn3tCJrHXG1;e~*9@L5h3!7Gn@&f9 zo`A9uXw|X`xK?N3;xP7QB-S5p?FAN(XqVE$=yrizof(@0)!u4e6Ldghv`SxoWQf); z^4$UL2od(^dK?+y0kuIo7F|+VeCTP|*vh3T6LSfz9~}C>beP$!&fE0>Yo??lgjr#L zq5aHc-5#R_eo$o8x&3jGYVEJjuCw5A4Df6>j}Nj&+kT9f{_acrv{>+^*C3&cQcm-+ z{or*gl^HcB0K{@HQl$BNAg*{CPXjBiY^DF{M;%{tTmmf(Mmc zfrW!8vomLIBCO1!DWd%pDdE-f?pOWE)S7_1j-eA5F9b^*cDq`A(Mn6qX?z}J7=RK5 zE2=0(vh_H;5^W&m%&1{|R@j) zIee`rh{(xRzW3Bb#rmf?_b++P1fZlg*;pGsy^__ww>h3x88??S+*Hux7rYm$Azqkh zWs>Pmp-f4sg=Ct1vboc4_{aV7ZJux5S8deW)Z^vU6)mDRdd6o@0#zjqSI)`FHU1cy zj=(c&!ax08{G4yxZ6jfn1jO&MAIB^VmjJWmOC|?Db&W+R+AKItmu5*7T|ew zEYl`4#Q#i6RXMOEz3?pKVO<=OG_2C91Ajd7;9*eG!QBl!=bGc}@MCT5o-0lXP_J}~ z1D7z=Mx;fdIV-w4 z64uq9R&V}Fi*jA9A&%~8$QycQ$rQnhrMSx&*bj#wouY%C?p<+(0Jyv%e7+iCQ z(rQv^`J)Bl{M`TCG-1F@yev~T%`s2lkCVv$g#4ErXuf`WtQ&vJEx@1r=L6AY2_K!? z);Ww4ipt~8>#WiV^M~7aL0h-;uPydg2DH8|klV`+{v;u5w z0v*s}$JX;L+|%6xt6{BTz9?(-w$$ewP$s1TzLA+q4RdZgdDN`Fb1SVkeO zzrdZdE`neyDp5%FM15sb~7@0E6@R00CN zYjeGIx^8I{($}g2tddowvgH{nwPP<1$%DAlMyJ9!lWDpg1ps#(H?&ahAFR`P-_*vk z4sMGg3i+Ib@2D#w>73TnwhZ^{Y1tI9-wzw<>JbqH=0C-`5ty@$QJB0WEj-7oekR7A z5T|){PR_gk;N()Ywy?r`_-S^;$OEU&#tBI>`2|>y zqUha{&WUZO3IRu}^b@gauot^ufhe`o6d+Lk4qTi<=l9<@c|s9&&cBRp#Ql*L z!~U3GhbsFqrWcC|&luQSvKWlT@Z5+5Oy$>ynr2l99cGSl_&&A5Ol z4)ebzA$4~I$}O)v@V|&OZQq7GS6hR^e}xM2Pwgw5Z%Eq6S0ss`r?j+5)Mv)0)eDNr zLrj5Q79YsZZJ&1rJj zeSZOqvi_+-x_cus$EL?go0vLKn^gyKip=)9NfiHiaR$nAvd6h^C{>OVBx9Pq+!xCz zYJ;g3T)-ubANOUOrymLJPL5_Jl;tjO&*XZ4H6@g&loB3d#by2AUw91?Q&D%GH{n_r za1m;7Q>T_O7+;E>KN^PZPVE~gFLWIs&TuqzuG@aoN5bnT$4_czq<9Mb6L;n2vAcD3 zmBY7VeL;4`29M9{#h!$pnp9W^R@E-Rgkw}REkYeT1@u)#MVAs?84la49?slujVv(J ze{y@dn+egg`d^OHn#YuaRMlpuU%vJcFx+INM-C1ZV1;DNucXxh+LWNQ&|sGPeslz9 zNE?kNG>K06{QxC>M(Ku>y2iSWAKN}TWoK-EZr{?YQny`K5%}$*!4im0JusV>ZQFKJ zo9AfFfSUa9b-R06`L|m7@082~T8mh_Y?om`HT~=Ks5RI89@s{q>!c+b-)o6fu@3}f}R%2sw^RNfVpdEd*|4Kc@z@q5r+r?OL zzrUVa$eK@X!hRkZZQSD-G0zSOf#F>7aQZe2&|m)d2v*ZPTf@Vg9rav6)7qpq@#6j7 zMc@&soLI zMhU9Ur8Ft8CiDUb5*$U!xiI4o-kbwB#71G9|3+cjnwD=IqjXXA0lSK6K_e-7@OJry zw@)#|ukpVt|F{8^;0WqA90uO_gHJ49NIRQoZbS8y$OI0VI~)3%PnIEYpN_X8Y3hw< zr`x?Sz0_J3U$CwC?=CEgc~dLRcHQ?wg1~7{x)3ANV4vL(&Ma@Es(^R3rb&6kp+0QV zDSj0(`_(#lf&CmRn|&ZZ+^Ai0p{A|7RRny6T-zM{EsPaLSJbdaPyHP=!P<01_Dg6X z#18h@)6`0J2|COy#CEwRTd3XxD!oRM$=(t4A}L4la82+~}ci*eabE7e*bMw%6K?Tg=u^BllUI0IF@{hJa&(dDXAdS4&<|u4x9V!gu&%G&;zAibTXlHp zGYXy_7~3-)-*mX8*ci9%k|(zdxia3)Ar>X>JcDFr2HT(?12s+&RxQfoD!OlWkwxNM zIY~lIb$Gw(GtzR`}}@s1q56=m()+k3Yz}63mJRR4*U~Yxn0(e zb!xrF0q^6pwZ*~X^}Lyv$NPmsT(AvgXdYus|A_FEZVx&0wAxa?>yV5XPCwT(JYPiX zk~p}14M7C>+m*W*GyTMWrQu zQz5%j%TBajTs&;0Dm)&jxbBHJx!H*W53VI;=G*2fy5Z_IH8-D!ZaQr%n565UTa}FGqd<*}1<>83iklQdI?% z!=pUv1TqUdxOcQViq#pt*ot5+oN{#KnN%T~9e2m4Uws;x`Ytr(V+5Uyd0_nF1!dg| zqY0e=tm_dDhY}Wtrx*WCSk^TOD}m#2o|7)S$&wxwSJh~IXhSFNZtL+HgW!y1%D=2l z;*1s)eyWszM?CG_94uV~lq~ofqw+AY= za1s+&4X&M$#manB(c5qF+e_|U5MYjR8vmjLB)3kJ>r>!_D38n4@NWw9y~e_ZeLIxE zMaPQt$E|$n>BBf7n{L=JL52f4$}xvLKWcEgxB&g=mf8@rpDM zQPG7+olU4<+cM!jm(k=`Odh_ePo9`&WWPzIhN#BoIzWuFA|1~qYDed&Ys_?{us+hv<5w9J0TR6Z4D3b4woR%iswVA4vpNug<{{9H#OUb0g2+%q zPoatO8pWh@G}Y-%3?G;i?2~u=uFAGtU_k5oXQD=mI;jYe1z&lJH@$|$+zpBNR$eq7 z1GM10$Ez>%W37{lQ#BQk-Fz%IRY7uE$t}WpMvgfWpy*)|bGN=7i1M?D4nMn<5WpC* zggMsJD5{^txl%yDbrbqmJ2u&4UA9mJZI`|x$!3^+cnW%|$X7lQuBM_JwY4MP*aUC16GqNmRBOsBHjXI#$hMu&}LrWIsMi74?y!^Rcv6tHVS3{reGE=a-M^7tZ| zby#TyJVr^Z1=hv-(D1NrnTNE{O=r21OnA_An$n8hs$v#K+JXD<;#%IUNUCJ z_U}W$qV&rd0k%16$TLe!Q#qq6c4rF2VUl`{Sdxb^oOR{Yv(cKsa5V4m;HtJ@O0=pu zuixHiXod^_wfCsfw++|Aco7a9Cl29Ck!27Z41+zqIj;$>vlfFH69%eEaH;<4IBDIu z^{y?_sEiv{G8l)MY>!?^glb3|jn1S)%i9Pb5WDv8it+qxefyrmx&M99nPw zbX{5tbj1t;9eiv0Q)wmlu~3j#Dpj4o}i?MJmkt~?A zBwA4oloY&spjKd)S`P&uvpkUh_3=-688ZUC$EL$hu`4ZX;wS$^hr=X=N1{dp!x(~V zmsWfsE$4HMt}NBh2p`wZR+cy0Km-f(cJM=nTi)(WdCnVBMEm7nX)#*^2gL{AS&vCU zTun>_AAh+1^rzr)S^b-RiCv_`={&Zx#3{=aM%((8;Bb>G7Q_3*b9KqcR+-4|MkzCD zpztuC+pH%U7nUH7lHMApGG-Iu&OJ);Mw+;{QV9>t1JT}s<8HQWt$BH)VCXyqH6;S8 zx(Kw1%pUFP(xtb%j7 zt_2qyMJ}3FV;!riJitvQHjkSYm)Y;BAe(=$&D-5=E>`gOMbzQhP6~J@qNY(PbK?p3 z>-}h~_20u)x?gFs1%_o^uxT3s>dRQAz{~IRHrz}Xm|R6|eM9fr5tdFs)BMD+4$M?b ze@p%b2Z|aYS)0>e0mDq3Ma!xBM^$^;vuUmWF4q7XmY7-Q*Kt;ZGp8Sn6q*KNa&&(r z;3fhj)Xahwz_R&k?gAF&TRax| zcu_EFuhG>;m}$#XFB3cg({sv9KJK5aJA7Ar8zql+j^5)xOjk%M8|<4o<0QoYMVQ&1 z!V(eM5+6&{nor6Zd#9wIu%nRC?ETYZ*IncvP1jo7k*S#BuWw5YnxRpDi7rUB?besP z6P&PZ{4PQNv3{`5z@@vd?XYilvBGZ|1dI^e(u01%)uva(PPB~!K6VsXwu%-ha%uHT z6KkXT`HkdvW66Cs-6h7ME=oex^4r(sjb&w4E3%x+gPJglo2D49fr%*LJGNEf-)`YG z22vS%A4(J=@)~&qsnl60VXHc*Vae78X8Sy01H13h$gd85w^Nt8UCV}1x?)dK&uLwP z!)u&aoqV)8&)EtAJ+qGy&w7D%XefR${2pv8Fb`2e1@iV~c!@#t6Nk zGzS6g;r^XD-N7IOR~mj6O(OT@H$MLqDf}G)0X zrg?&zNUmS61$HJHaKM3@rcqC~bHc5nn+obYJL806v-bwTsZIHxt{jDhq`nv`S9ByQrKMTyfWJ2M{XU4VC87YQNZ&?h_#3dcfP0_csBR6ZrnV* zkhZ`wBaEAs(Q}g`(M7M`k3+4<_&6irAX44A`TbOU_CB9+|DniIuHYE}KZ7x({{g&^ zh`I}C3a%D5iVLcD2`$g=9L4npCLil&&54l-H1QRMQ6Ps2zcm%kH5Hx|DJ|&Ua7XAf zEuyfVyK2(MzPMffCibFibN(?zGwXe=%UxczS{ETeY6NspRsQW0daB~w+^hlg1JXXy z*#Mz!a&T5TL1BmDGj~WDQgE$eO4=dNdTFk3W27ZMbiodpB#nQ?xbUv3KXL6JmR!ck z8pn~w|DMF^?4F(7CgNb}XV!oUJQ)UYhbw>0LF&oGHti1Y?8*;F){z6b<-{D2b6K+{6?i<$^ zSZbojtp~I)j3dryBq^O1iSc_-ufx1|5mq5qZo*J4FX>Lms&iTdQA< z+K~TU@0&=Py{deE0=9R0Uigf^x$KA7b#b`vY|q}CK{72k*^a2rHy182lW`H4jq@Ty z+=0pNg`?^TNO=Vm9aJ57-k0$NGNgZ_??ad8s8%O|nd=klC~MdM#Eav@@5^@nzhB=19skSh9~7`=Q7bbOJk*T zM6Pmy1BWPW-kJldS<2G&N$B83upVnpbA6?1KUNvHGp8g&I{VZF&~V#;N*Ch?>1=A< z#m1-B=t+4HMpH|KoVSC_t(&}vU~;>oui*TO+6ls`;B~jcyANqMAH4C%-NP#haoLCG ze~vVBV`DIR(}Med?N_gyMtF~DMqm=S=YrhLaFQP%cS4Z^{yY%F`^Lr);SgY6kI3Tx zXJh*m{pVWj?#})ASo$zxfJPKX!!(8iOSXenOAKb?;6p{yMBs#^zW)$fc1Xql!y~UC z+=>IrGTss9IP9?j0?w*KOY5K`f^MbA*S>J!oI8MCz-qU-PCng{iH~fY;t2T&%ZP+X z-N;{%bCG9J;8Chkc~JvVkI?AQGSN=alQ2>-VKGH9i!o2J^s#!ezhP(NpyC?hml6aM zY!F(08tlNpcoKiI69W^nkSv%XN~a{c&N*AW4*BGYf5CAUqqVIKXx&s$aad#K(vtq= zo6jac!*&LtY$H4|WKVu63B*WvI&Y!j;sSR9F~cTpQdx~a{E(!&_!D3|gmv5$Q?|!9 z#KG=-(L8x|Au#FwxJ`U?t!OpwXJPz#7=mzB}~XusSF4?>r)wVS8i+T^Hiz< zPVHeeo-S+sC6A{kPpie;HMI*uiGD*DqbUvZN$S}7tlG=s8TuQ;;gfbrg{ug6r=PF= zVkwn&X-GBbecl-PN;m2@!y?R373{Qb$*PRfC)WFltl{t(HXf(Dy|tt7n7Yh0?i;pE zO;aKy_^#z9e*jd9fDrM>W4sSR-b{m81fqn=*@8GSVOgr~K)wX>M7GZD%x|N`l5Y9t zC}c}`8`V3C8sZd|X6FhzJ+Gs7H>s5h1{&%~r~PJ9e`CmqbhhCmFpPko6E%Bqf*NBn zoCayR2;n`y-zhJ;Mifed=R0<=7#4_E2|v~j3F?!55rEH$@XWMV{_ZhPiaC*mo-qHt z;>BU1)povh2@u<&+C~h>1iP>AGEC)pJ9u#?Sv$ijGv#_2_&7wQKMlzFA{ByIWjh!P~T#MYq)EFV$R^^w00vsNTHqz^+=OQDrg zF1B_$Udx>%$e3D~P_J)gFf^|_ApKQD2^XmE1%huG`&99*{uyW7lq%3lB@hT6eH*Nl zU#Pbj96`#s&2O0n8psz3Se$-GjMR+dDW?5ysOW7$4oGgrN#H$153@7hV9c59sCBik zUyqx;zdVMuheuoZiQ@yK>LcM3ladlz8tL|TStYLm#Z4H3x)941pXQ%uXfT7&o^= zLWt-~8AWMaCE5RfO>T^VHKg|6BzvW)l6&8kz8_@Ldh^>&#;G?2p|K-T!4mq!bx+^( zemqEaY!-_pGCTI19{TW6v$^pg*+?xa92gqf11l`*NCSDHU)SE)3KX}ZqgkogvR?5B zNoFA;TW0m_EYJZ;k0+mq>5R-NQuvt(V}i(n$mRiloBg9C%H+ue46FbF0}SAiV!;Cu z5o2bc^PI!HP#2DK&Y=qzeW7#ZTzj?noBsW+op?T3t1g*}iOkcK3ss*_Cw6CXSHTpfjix*}Nq){940a5ZO`W41?IH!ai~rtUq{~ia8TP_8qStni9GO@qebK?f(O;2!Yt(jlfwrCf9_IzM+V zI=ORMy2?da8lI11rGMkkJa~Yx5lwLv4Yq6-O{*uy_t?)b5VSS5v54&b-QNvkt2&I0 z^wQmFgBekg5Jc)D;jY(%03MB!AV*iWc2W3Dh2~HnGzDu~ynRPG)3FpJUhhGp0Xk_5 z_K3zczDrC{mvi61o#h{1zT=k)3e%ui)#Ay^I{MG-yY{wwl{hx8c^KUy5K%--A_hh+ zW;@kpvnk7hF4toyykU^?5|w;no=m6Y`7OIxEpDEU{I@Q-=7FC)&bP?Qs_9|xzS{wA z1ie1T8~xEgm%PXel{}I~sgJ$^kLu(~JgJfYzj!#fc=!Z_M2HgO!j&6$9%w+G=vMH; zz{KLshc7>D{sIIF5-dchFySIZio(GajfYPlMyxpTghT+*#sd0la^ctMUhgjfjrS0! z0-*v#szR(9B&tKI24reNt`-#9gHjPx+J{;P(C83a9YLpK=yd{vVi=Xcq!ealuqcOB zZP=)QtvawvVV}Ywg<}e*6wWDJQn;pYOW~fvBZX%QuN2-Xd{X!-(hXF(?SN{xN1(>- zZ=u%hOHk+bHK=#{0W`S%BQ(1G6EwN~4>Y^|7+T!%g;sYWq0OB#Xm_UuI^1~(o$kDY zE_b=m?XDeqPKtl`$NrC6kTu^|VD*Z~L_ihCzu5UALVE%n7oQGI<3 zjwQVZmWtgHS)AN`04jxN4&SKaeoi|x_A399dYp>hTsk!4S2uDkZwF{XIn>4D>T6_Zipvsb3ns%=zC3Qg=o z&t!(;w4w?0LG7^xZ9Y`SeQ+Bhl(=FVM;MBEWxRj@b9o0=A}m==`W&szhP-iWK`bsOazBMBf&8Y zBR|c7MCqR}66cGi*#DG0S!(L*-K4QUs zV#5LAz(L~fs)4XRkk-fQo)^@VS4E-e-x&W-=DS|CKyd5?xmFTTLu=9 zh9#K8!_Y8~hNWm&hKA*6Sb>I>Xjp}Y)o6R_fks%Np*FDS16|qcU4GJFv0h#?jZk>X zcz5}jL;%HjwKz*n2*Qm2yiNeuaZx^zX zrDv$EL-LAJSx&d_hprmokBr9k23I;&7jM2cwcQ{YW@}S>uePysAp531JIAR$08Q$I zt@P|fjcPxw;2`Nv9;;8hgO~nP+pL+X8fVwkY1uiCNO@>m2Ekn^m#Pe!E@6>cXogm3 zGPb#`8J%M?JS_>IkAldcD1$g>gdPXhih6Z`n+(XL03o6boXDFVhb3D$)NusFg)wPb z^kTzst<$}15D;=^1hzDD_kDd?dQE%)tVcG3>HcbUA_*qb%b8YvjYh0V-b&z<(zT}L zhbt`mEeQ@TE9u%y$sq3OfoGNR+Jg+v&63ld=Cd#_2wQ0ds503OulYr>TE}~5^FX_!&sJ#Y#Nd2c4Uwzrp+GT zUeKVHIn?#z$lidv_LsIeKO=?`%*bIn?EM>=Ggek|R&j)hU37OCA|?;C$XUrXLXy+R zDI>k)t%7p%8&agbyFJsD8DwNBDhYpb_1s%WZVo16b41`@Q}(QV2F|rV}`>_ zj>Sxl!%U9HEKg|019BoBkdyF$oQwzhDL7#jIu)zXX;_6$$0~FNOUao;$yr3n*+k!Z z4l=#m)6d;AIhcme!y$P-#nl9d`31KrX@(0G30nlb3b`!wI^2)fg!}Q@a6ewB0k~cfxIqzdBlHd6P2mB&IXr;3ga`0e4Zv-R z!0n3cxdZ>cSNp(etry+bpS@UPRb7WpkH*dxbk$G?L=gh{AEFcky&{)#7tbO56yitm zB99{RiU^94c>|Y_qlXfutD0S7u*Nh2+t-qmm3lmgFor(eb@F1-TfM>mbxAa=y`seR z2%`_JuraVHAqWYVIW$9vqOqT1fl5iTAs9kJ@li3Klj-8-BdhdQqFbYnS4kZF$S6nVGND2?MdUE8UqjS()qlZl_`gU}1OqmAuP5a}@z_Pimc2*$6Tj&*^@ zF0uEDH69Mfg}-J+sQ=4t@m9SSLxcbT_t-~khT;1L;xSAzjj;%T861N3Vs{oN=-sDj z8}K7F`hDJl5T%<~+r}+s%yLix8a-$f-J;CaVTR;tFc!@;K>qDVaI%&Mo)t2iJS!5W zD*{8IWglcALfi*{20yu@^(>ANw{eXgs`l>V;%E;u2jr5Z1KXX;MeX*OOQqy-JEyf! z3X|0Q;X5u6%^z9JrBp)q0Y0~=rkbw@)Tl}egQvS?%14NY(3|ZUml+rN1fuhHJ>!L; z1zBX1p=|4wo1h_$h3U@abT(oRU9FkbSevTAF8_>COS|UG?w8(YVBp_uEk?f&C>Hi$ zoL1PN?)RkJMI~7OG4T*X;vRz4XR2DE2gDnS)s9_GXI-8rX|Ov>94f=vxc9Z%|jcL35@Xx3QRO z7i~@2e8diV=c$GK-m*@1A1@Mjzs2y-kZFDX_R~rbq0TC`jtYv7>i(ifrt+QkNqC`n*W%v6m6)rl2xCNmM5NdV=4K0%SsNG1M*VF zI6NL&uY}ROIkDP>3{^V-+<>lE+sPVVU^7<50`SXiF@#K$S4ZG2I5=)0#EmdR@Q+F( z!}$ynP1w1pqiYMS&~aDako!FST=hjn4;0 zu$D?^ea)q*9WP0Vh}IwOEa7H!&8s zv)EZxw4$JaR(4lOOO%_x_Lnt<)~$vxutM|w4PG2*vC^vw=1;QIIV?_sgt|E|HwV=p zX|rB->cWXMJtMw7ijVl*^3NEIbe;^Y`CdRGdmm)>ht*R%Yvxw(F4@8j0DUYlRp(`c=d4R3Yg(cC zmm0k2CFqH6D4l{y=kPFJX|d8^TNKL8-#b}|=5rr((7;?EqRk!jj(d@NOFP;9rz>|o z5LD4ZV;{xHg^v2XBLvz zq3Whm&tgHfw>6>84%v>p#p4e59*H3%qmVr*)W=%oE`5S`_X4_DS)eVfJtRS;QgSOR z+EHZkz20A%WcQvzoQ08f;t*>6Jjh}xSM(-mquWNvq{vCAgG>iNu|gf$4RbGMi!lzv z!d12!;2${ks}x$ZICkkBevjQ3cmK@!52utI+B^2H9zG z^7q7%=^Fi-L8C)`%TBUfl+z&%?u^j659hF{3XCOHT9@ewUi4sTOEjovE_K}Izs1`J zpFhf7yxe@aS*WE=qnc{ucjQkzcO-eyr!Me!4!v-!i&t8Yw2JkNWe;WBrQM~|FCI^( zpS`>h^8^uJBSQCF;n()D{ny3Sy#%8AzD%r16qy3JL16g9sd4piU^sqgakv@6cB!4y z`rZPLTQE0mT#zrVO5KO{w-C=1g2G+p2EO6(&|cuyREAwc=Soarn@p8dYzqsp0&0HM%5ja4F-;wL=h0wFy5^s$&d zs+3!wr5?rSmp|O|(d7z=p8xJc=K##0wpwvQ9-jnP(MSG~X$$e$ zo?>{+^5ULj@ltl)(w={P2kIpB4nj&%{yu?{3%$1!sVYby4PgcYG}JzR`B|ZU99T_!CMJNzIDW>-XhNgi&xXd!YZ` z;QQ7yVQ6oTBJ=4WD6d}WqCc7{Ib+?>JBS}^9YY*Yl>%s5Ug$phA=}*^%d&gOK>Bu? zg}|WshF#p?S8|j@W1#vL zK-_{67Ot*6v-lr|2;c-RB@t-cTOkz2akC~KCB0g8o`)!bVH1mNL?EI@6>%utnM@0R zf~x?~bW@ZfJNg%78~`fHboua&Zn@2yy|r|5>#DKaIlbLIcyr0bFW3RWQE%T;?7Bdz z!HabWS+*?-HIhJZ2jZC!LJR^dO3-^w6F-j5G&<87jr@^5`V~ir%LCohCsO{f9Fc(> zq3I>HldFS+;-C)n!ONHJxzpKbOpoeNkFw0t`l+7q5I-c#bh(ty1^!MPdy`vNX-zI~ ze_JVcf`DM3Xab*0!UZ==z~OpH{2urw84Wbhx-ql7FM4Bey}u&vE~bw?aPDZ&^M5*c z{Og_S=_N{+mWc~#$likttlu#+edT*hmuAh#*K$I~aE00~)Mx9Ku`OSm4tA#*0Mq!@ zP43?9)pbh*ns0MBfNRGHw0&of>}so+t!+yoawszDAOoiEd_yr%Zc*XcH#=u@;sCUk za(z!!(Uvn8AJN`tf(QL*5uA6b0(X_gMcM)gkp&DLn}*z|qdn1RK7@bRy(f)(x|Nn; zcN@nglF`SJk3a8Y)(dSF&VhS+#2ebViLg0>+pAc$?y@?D=Y&_>Oo`j(>R~z@DUzVw zAs)4B!-{i5cSR>|X`35nzO^oXZ>^cZJZhbpw!WOQ+GbRvP3;>a4W0#0p+%&HKkCO3 z%?7yXtLfFU2HRFpM%}h2w821;|C*6;9$TC$S~rZ-R3$sF!A)VQr3b3gMS5q0JlVph z$lDsW|Fyb=Qqbn~DKaWP(?@sfQnN^kUxvxpCR}5;MY+fwrkp6HCo9v1GHS6>DuRB& z+O@QnPzy%omz`X@yZsVW$~+8-gyBU-@SI5GvRgK@{*OPd&n`aV&y6toxw(HV=9>8; z{magRPle-EX7fRoBPcj1_#oq;G<%43aND+pj$IyN(1k8SeNTs&4wcyluOsXO6%hSE zFC9}F7CuA&^qERUTpm{x70JEZLgYXY$9W%Iaod&FiFE|_6f3&|cc*n=R{;p@wlv#r z#ib%DZ!VVJVz;iNaK~pL-8f;Dubrg5&lG?Q=+NadtrQJ4i>lF}Xv@cfHhV8Ejj%@2 z4WNFy2^@Gsg=YsS2J)K$PqoCJ?BaInL7O2cFyHMA0yX^%0p9s@U**gS8hF8{09Pk8 z!jq>~^CpuYE7vH#QXQURF(Kn2O~hN`w{rB5gboA_{?6&$d!*VlXi=7t1`M%ciIUeZ z3`4$7vGv;<>0eqJVT|DS<{?HiD0C)%;g+$fF)C~io48jjq0Js47V?^)0r_?2e3q8`ulTrG1yT|o=#i|Tg}mLnJ?PLkwnK$(Y(ZJ zu7Yp#vJs}1#aSI1#QPg?+g0)s-ZhkluIXonL|DwT&A2Fe>s)}2>>YO1v;q#&hBU1MrV zAXVW;$tR?oz`44tO|92tM=DDt)nTVGX!g)=Qx2^ILDOan*Eg6*g=cTw8t7eA0hubs zQZwKRwx_HBiIsLqlA{$}kOd2vvW;mhPUL6x)r+;+FRdl8b0qgtt9%R}g5Wo%B~Jlm?WnNnlO?(~;SUrx z^Ft$>4!r!jfCZNpFWpVP`X46OcW+un&!nb`<0dpI5Ml%$ccC2-*KUyXTK_Ea!!6e^6lXE;d!*%NCE;+lol1Ld( z^9e8&c1alsw)kNex{ipxXD;5_ z$yRx<8kPnwV8TH&AD=a{2mFlJ9@E|*(|+PvPw;*mpb9)-7_hYDU^(gq&WiO1gM)&D zcUErh%3*CkxQ5sxtdTvvHUs0h-7KiGN-va+B}gRiou8iFyZe}qStWCn(YI$eU!?Dq z`@FC$689HBGp8F)P+lw)P63y(x$Lp|p+s;yuE>I8xlk&|NX{>V62LT27A}QCl)#|W# zHHxd-daa{x;=c&=U>m?Yr5vO*(1q-?>*{351KRlzNFfe()g*e;?g(ykEUez*?T3!t z8pq``|k0;?z z?CaQ`n%bw~1GD%LZ62KCO@J?+x!v_z3GRJY8$l?|A^{D==7JJE(Nn6i0K;6i(yaAR z6X)_G)mSaP#aCmqH~GqP)QPZfg_{B89HvB>@oAvOcbM%bYx-D|{dctZWTGkTn$|4` zR=aF7hm8Fo=Kd`eG@C50L_dpn3ROTJ5X|kIIqHR+hMmGj45)}8b3fV+x}A79kj0XD zWDm1i1jEe;ID>S3OiFv734#k~Y17oDx^!^x>d+vfq}r9A$k4bsR!d^BXk}@9h4BBC z!jkxem5IeIIg0NRbz)-%H%o9dOOVbL8xwVB&$nE86C`Wu?}wXY{Tx~VazP&N17)c> zKz9)zwz>JwKbwII-#)br`!Z~LydnGy0)8Kw{1Xj7axs`cgLTyVV@EMF{=qDVaEd3E z9;7V%-XhNOlY`6*FsN!ca}%BdQ+BwJPAvCG%M!}GqZ6kKc`2FR3aK4FR)lvZAwRWzl~e z=O?{e34Gb;5ODa$QdvRz$XHSuLf+2qWAN=rR<}5Lucs~9-Ii5T#ix>c8e^@R##d+9U;nvMXA~J+r z(5>zOyMb656;zxN8{Nf5AX^dvgtTiWM;b89O2dg281H|9$8+)Q zGzlO!``f!eYCfTA+_S_bfYzhvE7LwUMOm_Ai#%Co)W?!nAOLVw|GCXR^749V0N3t@ zU|LW?+$F-*6cxQR2v-Q02F$Vb0DQ^v>q*6}OWG8T=V^u9PQT>imSdL43JgAoVRnm^ z01Arhu9Yi5b;y9>la`|W$pwhvHJQGi?S-jhX1RwS)wB6;ZJ`vYpHPLR74$*6b47J% znY*TW6y>IhYxJnyJ2;?wV_bQ6Zx$H7cl!k8O&qG zqQ(|2G{c8q{&`}cE$&*J$nsUJ+P80i@fvu7sxN%~^`l#lX!8Y+N>~FlL%>AO?M2!` z!D4B>U}Le8%6sZU6_7&&o~w&dmiL2MAURpHm&SeA7V|JbO35dlUinB~{>c%3pjt2Ro_jyJ=_WS9H4n zw@ba6nAaxAYYfSd(A$2`gO0bo0?&pEGSNecU}9uW8|P;ZYJ^gs0c~h#g+^UTJuYjwIG{I}r$xz02K2M~(@H zKBJSD*Up0x65iAB2_hJ4f<1iZ<-m2+jR?R_C&7XUb|0OzeDIuSBv-Qh%N$)5KqF5d zm?qOs2he%+z~~il0{<(%C@FSlw0raoCn|w}aJ>?JkC9r;pL@cu4N2QBw6#VzMtg1W zVr@^Kj>PhqXrAkeKyGn-_^)P-`PcA*@RzyiiQ8Fdoo90pCusPKY-3x`LOt_Y32}QV z@wr#wKe#6a%;%+q?Ii@1SK)lPG+z2}IBvL=o~rtg5cv7az{1EEshZqhBMKvaHET34 zPep({@BcFBO$p2gyq~-XRP4-v=}4 zCFmfLJA}H4J>{6r??6Ewh>W{G5}9#$+HvaDl5|jm8dReuUvn>=ni{QL=V8a?S9jlm zGf)RDojz!5M@J*t^@FPw(_uq5`2a`bRx}b&!!{e{9*bs@mES0Pl@tSI;C&ZVc=nH* z%Ab{Mm@1n}@OgrAbmiSQ73u~m?*^=`tb z_>A*@7QcX~K46^b?=4DpESvEKtyM*JLj!g6`K7xZ)Mw<*AEs?na_O_Ztl^}gIb3ps zx})<7y+Jh}7SD7DM=yMTW;T}W@(0;EaTNrg|AW0qF)$3|#ov}@Zjp8)0+yfxPZ($L zkF;f&-N$&prNq7(OG}K-qw;>dO)-%3qD^sQ+^dw^-PxAT6YHVpe?*W5 zAMJih0O0>8$p0Zf1pvbp@lQE=9H}Tt8FGzw#!{anza3Bs{r~?VLSW)Natlf}aUIoz zBEm!#`NySvuc+>iEux66t|Lz@zfp;Lgv!Q=*YzT2CMMcsv};!TwDxdR)|N-xE}4VKfmA4CB1~a>9R!+V zf>2W9(}vmxGrSHAFJ`1yHf3eynYIg5+ zI2Z)Y0{A)=a<1pewv&fISfdCHxJ+&n7P8o*Kwh*X00u^w$qi(_Nix^zxMgBGmAyRM zb{-0W28JiF(za9cxb*dxmY7l{=FXoSuvV=K zYx0y)tAi&Ej6rcmjEkF2XfhZ{_%Jh`XxZW*B@{CS(@ zbrYDgH5A0I3NECsgD0&bk%z53)^;?53_O?2mE}~+6ZAVk#FT4E*c$-ggg}9NB;=_b zjNq0a+67~s6$Q6l!OcH^iUcUNL4pQqsk5tCnMrd?pK!>xCLKw(Ob=m?% za0*5-!Q3Mq>3g{U77@9DZDiohaBb_OEjgwvy)ILeqEfIHB z96nkz%+r~GoIf$3V5UQg2wEoM(i7Vt<}5VABLR`u=fBwYSa{7$ybtfE1Yi0@Q4`L*y|qRnmN*)vPTiTi6g~XwqaU+k*xpCMq&&?l8i(5Gl#p zjmrbe@>os}ykK`GYAC`3^#(z29NQ%X3#STEQ8wWVht!zruDEm=`M4rt4wct zexSl%wo%iLnnoRM^ z920-rHjH!5=!97=Cbk4)Rqt6!4($CpYaj6b22xM(xEYjaWU*mpJZPKZD8<9VKc^zR z#)tuF7)can8KI<-jEcbNy&VVoR z5GxuB#;L+Jd`LM+|qJ0PueWY+V|J6e_qZ&!}Y0J!UhZp%P|17KpP1Zk22!us&^w5>Z`_3PxhNo z-}80Y^TpOZ;GX;be!CnG>(z2TtIHzKd}q99iF0svOsbDxgGYtT5@R+PTar=Hw3ORs zmLEEOCl}vGEq&KjDDmfwRr0&@)Dk)|P1~iA3{@7w1`gq&vK%tU_()|{B`X@ERo1yc z!{`_BAcajy`O&=x9E5{!Y=2_&;QFXtzb1~*n& z8U}(BJYr(iU)3DhDrD_zpGF52EEeVSQkiLIl_Mgyzwm>jDV*^{^aXHY%RS zFO-AIE``+vj=95QU%nO>$3FyI?)cmDVAy*79g9=F5ZiHPf89SUVQE{oLg`!7H4gW8#l2jZ+F`L` zi0|XC&z@alJ4PMDn?JYr_w{t!nyXu_jb)`J#rb*W99XAGQOF@l{OPdYZP%+=UC1N~ zd;+SJ%Dfch)fTvd1qV8n(tXadUnygm<{QC$Jm8^s5bCI%JE$xcWm{6tyn%b*i^EM3DMVrykTWM6X3LWh3Q^<(kmuof%& zGJGt81(sSY$0UfRO$Hs*SP3Hz9og$vp}QAHWnwXRouy&ux||yhJU-Dy6>>4uQ7VZ) zuAgq6&Zg-qTZKsyjUzXR`W|;0ggxr~ka0-wli&{!8Zy<$LHi?%wh|XpSM)3Pai4Fx zIw>1Mhk&MGAMhFE;rfFf;#I%}ie*V7!8{(YpfQ=~vRTclx-@Op!*7NXkL#u|og6}K zANDm&fo?yn_I0a~{?w-5H^u=a%=|sS(;w7a^6g9VH#ZxR6@U*@THXD5&J#R|Mx>Two&_dmg;X*@e9@##YEeW?NEH+c4R-SB6zd`z)l*Nj57ss1ps zr)m+<()5RyvNCa*I;7TQ8U@7b@h)XpJgbx21OLBCqBRQD^hgI4MS3kxESW@=1W6nt z`eK#%=l6OJ>=LW5ElGs$!j7AOlbk99eDKcDjc`h{>gBO~(n zPnisBriJ&EbDvRzg?MA3uZs1G<9O{WUP|mF?zA|U)5-eAgGFJ>>&u>%qSTC4nOZ?L z`K`=p5ds$tae`=(JOyf$aImnU$btni67tbFgNRc34=S6DR3*u>Z^r&5t^jO7$9hAPl)PPM#@f(;#KgFz3cG; z(PD}vw)=T<#S>ow2_+&?i6JP4vk4BD#}^1iVu@5HClyLlmD)_BHMg*|vbM3cvv+WG za&~cbbN2{RShH00E7rAi67kGo6ppVzer{V5Vwa`xuQ|agL#REQ6pZX1oD9bbyiqg6 z;AdH4MrPA-BsB?v%_Ky9ldx})cxMvApw(kqQpz@*lM+I=NeEx(7mS(_&6}oFDWd_> z;yLS7N@&yrT|Avv9qZGq6;(1+WxE-y#W*=5G`{2{bR52|fmjZ;nTkWZNr*cKK+zx( z<|M?3Ge{6OiTf@l^;ZQ*3E}wCVjRK@=%1`Ign!d<{5A=Z`=m%18-XDP)T3iMOovqT z7dWK{$FA*2i1k(>1y-+r%?Pypg+lq<_|=wU+EqF>@{8M-!OH8Mn?eyL3}9y literal 11876 zcmV-qE}PMJPew8T0RR9104`(z4*&oF0942T04@vw0RR9100000000000000000000 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 diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 0a34ab28..df44db80 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -10,7 +10,7 @@
helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs'), + 'value' => template::ico('sliders'), 'help' => 'Options de configuration' ]); ?> diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 4da4e856..49050a8d 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -67,7 +67,7 @@
helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs'), + 'value' => template::ico('sliders'), 'help' => 'Options de configuration' ]); ?>
diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index 526cdaab..5f1fc67f 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -10,8 +10,8 @@
helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], - 'value' => template::ico('brush'), - 'help' => 'Thème de cette galerie' + 'value' => template::ico('sliders'), + 'help' => 'Options de configuration' ]); ?>
diff --git a/module/news/news.php b/module/news/news.php index 69fc7c43..0f7a2aac 100644 --- a/module/news/news.php +++ b/module/news/news.php @@ -225,12 +225,14 @@ class news extends common { self::$states[$this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'state'])], template::button('newsConfigEdit' . $newsIds[$i], [ 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsIds[$i]. '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') + 'value' => template::ico('pencil'), + 'help' => 'Editer cette nouvelle' ]), template::button('newsConfigDelete' . $newsIds[$i], [ 'class' => 'newsConfigDelete buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $newsIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Effacer cette nouvelle' ]) ]; } diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 5341b1c8..5527854a 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -10,7 +10,7 @@
helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs'), + 'value' => template::ico('sliders'), 'help' => 'Options de configuration' ]); ?>
From 28988342a38e51be7cf6ca15cdaa8945709830d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Fri, 21 Jan 2022 19:11:51 +0100 Subject: [PATCH 027/103] effacement du dossier des sauvegarde auto --- core/module/config/config.php | 45 +++++++++--- core/module/config/view/index/index.js.php | 84 ++++++++++++---------- core/module/config/view/setup/setup.php | 24 +++++-- core/module/user/view/index/index.php | 2 +- 4 files changed, 101 insertions(+), 54 deletions(-) diff --git a/core/module/config/config.php b/core/module/config/config.php index 087d06fb..4b10d9fe 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -19,6 +19,7 @@ class config extends common { public static $actions = [ 'backup' => self::GROUP_ADMIN, 'copyBackups'=> self::GROUP_ADMIN, + 'delBackups'=> self::GROUP_ADMIN, 'configMetaImage' => self::GROUP_ADMIN, 'generateFiles' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, @@ -593,7 +594,7 @@ class config extends common { $this->generateFiles(); // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Modifications enregistrées ' , 'state' => true @@ -625,7 +626,7 @@ class config extends common { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index' ]); } @@ -725,7 +726,7 @@ class config extends common { file_put_contents(self::DATA_DIR . 'journal.log',$d); // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Journal réinitialisé avec succès', 'state' => true @@ -733,7 +734,7 @@ class config extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Aucun journal à effacer', 'state' => false @@ -761,7 +762,7 @@ class config extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Aucun fichier journal à télécharger', 'state' => false @@ -798,7 +799,7 @@ class config extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Aucune liste noire à télécharger', 'state' => false @@ -815,7 +816,7 @@ class config extends common { $this->setData(['blacklist',[]]); // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Liste noire réinitialisée avec succès', 'state' => true @@ -823,7 +824,7 @@ class config extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Pas de liste à effacer', 'state' => false @@ -842,11 +843,37 @@ class config extends common { $this->copyDir(self::BACKUP_DIR, self::FILE_DIR . 'source/backup' ); // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Copie terminée', 'state' => true ]); } + /** + * Vider le dosser des sauvegardes automatisées + */ + public function delBackups() { + $path = realpath(self::BACKUP_DIR); + $success = $fail = 0; + foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) + { + if (strpos($filename,'.zip')) { + + $r = unlink($filename); + $success = $r === true ? $succes + 1 : $success; + $fail = $r === false ? $fail + 1 : $fail; + } + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Configuration du site', + 'view' => 'index', + 'notification' => 'Suppression terminée :
' . $success . ' fichiers effacé(s)
' . $fail . ' échec(s)', + 'state' => true + ]); + } + + + } diff --git a/core/module/config/view/index/index.js.php b/core/module/config/view/index/index.js.php index ee94b0e5..b50acb6d 100644 --- a/core/module/config/view/index/index.js.php +++ b/core/module/config/view/index/index.js.php @@ -10,7 +10,17 @@ * @link http://zwiicms.fr/ */ -$( document).ready(function() { +$(document).ready(function () { + + /** + * Confirmation de suppression + */ + $("#configBackupDelButton").on("click", function () { + var _this = $(this); + return core.confirm("Êtes-vous sûr de vouloir supprimer les sauvegardes automatisées ?", function () { + $(location).attr("href", _this.attr("href")); + }); + }); // Positionnement inital des options //----------------------------------------------------------------------------------------------------- @@ -45,36 +55,36 @@ $( document).ready(function() { $("#connectCaptchaStrongWrapper").addClass("disabled"); $("#connectCaptchaStrongWrapper").slideDown(); $("#connectCaptchaTypeWrapper").addClass("disabled"); - $("#connectCaptchaTypeWrapper").slideDown(); + $("#connectCaptchaTypeWrapper").slideDown(); } else { $("#connectCaptchaStrongWrapper").removeClass("disabled"); $("#connectCaptchaStrongWrapper").slideUp(); $("#connectCaptchaTypeWrapper").removeClass("disabled"); $("#connectCaptchaTypeWrapper").slideUp(); - $( "#connectCaptchaStrong" ).prop( "checked", false ); + $("#connectCaptchaStrong").prop("checked", false); } var configLayout = getCookie("configLayout"); if (configLayout == null) { configLayout = "setup"; - setCookie("configLayout","setup"); + setCookie("configLayout", "setup"); } $("#localeContainer").hide(); $("#socialContainer").hide(); $("#connectContainer").hide(); $("#networkContainer").hide(); $("#setupContainer").hide(); - $("#" + configLayout + "Container" ).show(); + $("#" + configLayout + "Container").show(); $("#config" + capitalizeFirstLetter(configLayout) + "Button").addClass("activeButton"); // Gestion des événements //--------------------------------------------------------------------------------------------------------------------- - /** + /** * Afficher et masquer options smtp */ - $("input[name=smtpEnable]").on("change", function() { + $("input[name=smtpEnable]").on("change", function () { if ($("input[name=smtpEnable]").is(':checked')) { $("#smtpParam").addClass("disabled"); $("#smtpParam").slideDown(); @@ -88,7 +98,7 @@ $( document).ready(function() { * Afficher et masquer options Auth */ - $("select[name=smtpAuth]").on("change", function() { + $("select[name=smtpAuth]").on("change", function () { if ($("select[name=smtpAuth]").val() == true) { $("#smtpAuthParam").addClass("disabled"); $("#smtpAuthParam").slideDown(); @@ -102,7 +112,7 @@ $( document).ready(function() { * Options de blocage de connexions * Contrôle la cohérence des sélections et interdit une seule valeur Aucune */ - $("select[name=connectAttempt]").on("change", function() { + $("select[name=connectAttempt]").on("change", function () { if ($("select[name=connectAttempt]").val() === "999") { $("select[name=connectTimeout]").val(0); } else { @@ -111,7 +121,7 @@ $( document).ready(function() { } } }); - $("select[name=connectTimeout]").on("change", function() { + $("select[name=connectTimeout]").on("change", function () { if ($("select[name=connectTimeout]").val() === "0") { $("select[name=connectAttempt]").val(999); } else { @@ -124,20 +134,20 @@ $( document).ready(function() { /** * Captcha strong si captcha sélectionné */ - $("input[name=connectCaptcha]").on("change", function() { - + $("input[name=connectCaptcha]").on("change", function () { + if ($("input[name=connectCaptcha]").is(':checked')) { $("#connectCaptchaStrongWrapper").addClass("disabled"); $("#connectCaptchaStrongWrapper").slideDown(); $("#connectCaptchaTypeWrapper").addClass("disabled"); - $("#connectCaptchaTypeWrapper").slideDown(); - + $("#connectCaptchaTypeWrapper").slideDown(); + } else { $("#connectCaptchaStrongWrapper").removeClass("disabled"); $("#connectCaptchaStrongWrapper").slideUp(); $("#connectCaptchaTypeWrapper").removeClass("disabled"); $("#connectCaptchaTypeWrapper").slideUp(); - $( "#connectCaptchaStrong" ).prop( "checked", false ); + $("#connectCaptchaStrong").prop("checked", false); } }); @@ -145,7 +155,7 @@ $( document).ready(function() { /** * Sélection de la page de configuration à afficher */ - $("#configSetupButton").on("click", function() { + $("#configSetupButton").on("click", function () { $("#localeContainer").hide(); $("#socialContainer").hide(); $("#connectContainer").hide(); @@ -156,9 +166,9 @@ $( document).ready(function() { $("#configSocialButton").removeClass("activeButton"); $("#configConnectButton").removeClass("activeButton"); $("#configNetworkButton").removeClass("activeButton"); - setCookie("configLayout","setup"); + setCookie("configLayout", "setup"); }); - $("#configLocaleButton").on("click", function() { + $("#configLocaleButton").on("click", function () { $("#setupContainer").hide(); $("#socialContainer").hide(); $("#connectContainer").hide(); @@ -169,9 +179,9 @@ $( document).ready(function() { $("#configSocialButton").removeClass("activeButton"); $("#configConnectButton").removeClass("activeButton"); $("#configNetworkButton").removeClass("activeButton"); - setCookie("configLayout","locale"); + setCookie("configLayout", "locale"); }); - $("#configSocialButton").on("click", function() { + $("#configSocialButton").on("click", function () { $("#connectContainer").hide(); $("#setupContainer").hide(); $("#localeContainer").hide(); @@ -182,9 +192,9 @@ $( document).ready(function() { $("#configSocialButton").addClass("activeButton"); $("#configConnectButton").removeClass("activeButton"); $("#configNetworkButton").removeClass("activeButton"); - setCookie("configLayout","social"); + setCookie("configLayout", "social"); }); - $("#configConnectButton").on("click", function() { + $("#configConnectButton").on("click", function () { $("#setupContainer").hide(); $("#localeContainer").hide(); $("#socialContainer").hide(); @@ -195,9 +205,9 @@ $( document).ready(function() { $("#configSocialButton").removeClass("activeButton"); $("#configConnectButton").addClass("activeButton"); $("#configNetworkButton").removeClass("activeButton"); - setCookie("configLayout","connect"); + setCookie("configLayout", "connect"); }); - $("#configNetworkButton").on("click", function() { + $("#configNetworkButton").on("click", function () { $("#setupContainer").hide(); $("#localeContainer").hide(); $("#socialContainer").hide(); @@ -208,49 +218,49 @@ $( document).ready(function() { $("#configSocialButton").removeClass("activeButton"); $("#configConnectButton").removeClass("activeButton"); $("#configNetworkButton").addClass("activeButton"); - setCookie("configLayout","network"); + setCookie("configLayout", "network"); }); - + /** * Aspect de la souris - */ - $("#socialMetaImage, #socialSiteMap, #configBackupCopyButton").click(function(event) { + */ + $("#socialMetaImage, #socialSiteMap, #configBackupCopyButton").click(function (event) { $('body, .button').css('cursor', 'wait'); }); // Mise en évidence des erreurs de saisie dans les boutons de sélection var containers = ["setup", "locale", "social", "connect", "network"]; - $.each( containers, function( index, value ){ + $.each(containers, function (index, value) { var a = $("div#" + value + "Container").find("input.notice").not(".displayNone"); if (a.length > 0) { - $("#config" + capitalizeFirstLetter(value) + "Button").addClass("buttonNotice"); + $("#config" + capitalizeFirstLetter(value) + "Button").addClass("buttonNotice"); } else { - $("#config" + capitalizeFirstLetter(value) + "Button").removeClass("buttonNotice"); + $("#config" + capitalizeFirstLetter(value) + "Button").removeClass("buttonNotice"); } }); }); -function setCookie(name,value,days) { +function setCookie(name, value, days) { var expires = ""; if (days) { var date = new Date(); - date.setTime(date.getTime() + (days*24*60*60*1000)); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toUTCString(); } - document.cookie = name + "=" + (value || "") + expires + "; path=/; samesite=lax"; + document.cookie = name + "=" + (value || "") + expires + "; path=/; samesite=lax"; } function getCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); - for(var i=0;i < ca.length;i++) { + for (var i = 0; i < ca.length; i++) { var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1,c.length); - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); + while (c.charAt(0) == ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); } return null; } diff --git a/core/module/config/view/setup/setup.php b/core/module/config/view/setup/setup.php index 90f5b36a..20e7e1ff 100644 --- a/core/module/config/view/setup/setup.php +++ b/core/module/config/view/setup/setup.php @@ -118,28 +118,38 @@ ]); ?>
-
-
+
+
helper::baseUrl() . 'config/backup', - 'value' => 'Sauvegarder', + 'value' => 'Sauvegarder les données du site', 'ico' => 'download-cloud' ]); ?>
-
+
helper::baseUrl() . 'config/restore', - 'value' => 'Restaurer', + 'value' => 'Restaurer les données du site', 'ico' => 'upload-cloud' ]); ?>
-
+
+
+
helper::baseUrl() . 'config/copyBackups', - 'value' => 'Copie sauvegardes auto', + 'value' => 'Copier sauvegardes auto', 'ico' => 'docs' ]); ?>
+
+ helper::baseUrl() . 'config/delBackups', + 'value' => 'Vider dossier sauvegardes auto', + 'ico' => 'cancel', + 'class' => 'buttonRed' + ]); ?> +
diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index 0e626198..1a89a67e 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -18,7 +18,7 @@
helper::baseUrl() . 'user/import', - 'value' => template::ico('table') , + 'value' => template::ico('upload') , 'help' => 'Importer des utilisateurs en masse' ]); ?>
From 4486995404162e168d389b95da32cc45593ce97f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Fri, 21 Jan 2022 19:12:24 +0100 Subject: [PATCH 028/103] url store --- core/module/addon/addon.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/module/addon/addon.php b/core/module/addon/addon.php index 1e9b0f6e..3379395f 100644 --- a/core/module/addon/addon.php +++ b/core/module/addon/addon.php @@ -30,7 +30,7 @@ class addon extends common { ]; // URL des modules - const BASEURL_STORE = 'https://store.zwiicms.fr/'; + const BASEURL_STORE = 'https://www.zwiicms.fr/'; const MODULE_STORE = '?modules/'; // Gestion des modules From 21d8c58b96f0bb61875934df18d1cdea89ed4c49 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Wed, 26 Jan 2022 10:22:41 +0100 Subject: [PATCH 029/103] bug autoupdate --- core/class/helper.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/helper.class.php b/core/class/helper.class.php index 99f33ee2..6940bd1c 100644 --- a/core/class/helper.class.php +++ b/core/class/helper.class.php @@ -281,7 +281,7 @@ class helper { if($version = helper::getOnlineVersion()) { //return (trim($version) !== common::ZWII_VERSION); - return ((version_compare(common::ZWII_VERSION,$version,'<')) === -1); + return ((version_compare(common::ZWII_VERSION,$version)) === -1); } else { return false; From 29aaf0c3468a131ae1ff7f63799269ffd12f7395 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Wed, 26 Jan 2022 11:40:48 +0100 Subject: [PATCH 030/103] nom addon -> plugin +export wip --- core/module/addon/view/import/import.php | 30 --- .../{addon/addon.php => plugin/plugin.php} | 241 +++++++++++------- .../view/dataExport/dataExport.css} | 0 .../plugin/view/dataExport/dataExport.php | 30 +++ .../view/dataImport/dataImport.css} | 0 .../plugin/view/dataImport/dataImport.php | 35 +++ .../store.css => plugin/view/index/index.css} | 0 .../view/index/index.help.html | 0 .../{addon => plugin}/view/index/index.js.php | 0 .../{addon => plugin}/view/index/index.php | 6 +- .../{addon => plugin}/view/item/item.css | 0 .../{addon => plugin}/view/item/item.php | 0 .../view/store/store.css} | 0 .../{addon => plugin}/view/store/store.php | 2 +- core/module/plugin/view/upload/upload.css | 18 ++ .../{addon => plugin}/view/upload/upload.php | 4 +- 16 files changed, 231 insertions(+), 135 deletions(-) delete mode 100644 core/module/addon/view/import/import.php rename core/module/{addon/addon.php => plugin/plugin.php} (73%) rename core/module/{addon/view/import/import.css => plugin/view/dataExport/dataExport.css} (100%) create mode 100644 core/module/plugin/view/dataExport/dataExport.php rename core/module/{addon/view/index/index.css => plugin/view/dataImport/dataImport.css} (100%) create mode 100644 core/module/plugin/view/dataImport/dataImport.php rename core/module/{addon/view/store/store.css => plugin/view/index/index.css} (100%) rename core/module/{addon => plugin}/view/index/index.help.html (100%) rename core/module/{addon => plugin}/view/index/index.js.php (100%) rename core/module/{addon => plugin}/view/index/index.php (88%) rename core/module/{addon => plugin}/view/item/item.css (100%) rename core/module/{addon => plugin}/view/item/item.php (100%) rename core/module/{addon/view/upload/upload.css => plugin/view/store/store.css} (100%) rename core/module/{addon => plugin}/view/store/store.php (87%) create mode 100644 core/module/plugin/view/upload/upload.css rename core/module/{addon => plugin}/view/upload/upload.php (93%) diff --git a/core/module/addon/view/import/import.php b/core/module/addon/view/import/import.php deleted file mode 100644 index 8ccc44ce..00000000 --- a/core/module/addon/view/import/import.php +++ /dev/null @@ -1,30 +0,0 @@ - -
-
- 'buttonGrey', - 'href' => helper::baseUrl() . 'addon', - 'value' => template::ico('left') - ]); ?> -
-
- 'Appliquer' - ]); ?> -
-
-
-
-
-

Installer des données de module

-
-
- 'Archive ZIP :', - 'type' => 2 - ]); ?> -
-
-
-
-
\ No newline at end of file diff --git a/core/module/addon/addon.php b/core/module/plugin/plugin.php similarity index 73% rename from core/module/addon/addon.php rename to core/module/plugin/plugin.php index 3379395f..ebf47770 100644 --- a/core/module/addon/addon.php +++ b/core/module/plugin/plugin.php @@ -16,21 +16,21 @@ * @link http://zwiicms.fr/ */ -class addon extends common { +class plugin extends common { public static $actions = [ 'index' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN, - 'export' => self::GROUP_ADMIN, - 'import' => self::GROUP_ADMIN, + 'dataExport' => self::GROUP_ADMIN, + 'dataImport' => self::GROUP_ADMIN, // les données d'un module 'store' => self::GROUP_ADMIN, - 'item' => self::GROUP_ADMIN, - 'upload' => self::GROUP_ADMIN, - 'uploadItem'=> self::GROUP_ADMIN + 'item' => self::GROUP_ADMIN, // détail d'un objet + 'upload' => self::GROUP_ADMIN, // Téléverser catalogue + 'uploadItem'=> self::GROUP_ADMIN // Téléverser par archive ]; // URL des modules - const BASEURL_STORE = 'https://www.zwiicms.fr/'; + const BASEURL_STORE = 'https://store.zwiicms.fr/'; const MODULE_STORE = '?modules/'; // Gestion des modules @@ -43,6 +43,9 @@ class addon extends common { public static $storeList = []; public static $storeItem = []; + // Liste de pages + public static $pagesList = []; + /* * Effacement d'un module installé et non utilisé @@ -53,7 +56,7 @@ class addon extends common { if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); @@ -81,7 +84,7 @@ class addon extends common { } // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'notification' => $notification, 'state' => $success ]); @@ -271,7 +274,7 @@ class addon extends common { *} */ $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon/store', + 'redirect' => helper::baseUrl() . 'plugin/store', 'notification' => $moduleFile . ' téléchargé dans le dossier modules du gestionnaire de fichiers', 'state' => true ]); @@ -390,16 +393,16 @@ class addon extends common { : '', implode(', ',array_keys($inPages,$key)) !== '' ? template::button('moduleExport' . $key, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), - 'help' => 'Exporter les données du module avec sa page' + 'help' => 'Exporter les données du module' ]) : '', implode(', ',array_keys($inPages,$key)) === '' ? template::button('moduleExport' . $key, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload'), - 'help' => 'Importer les données du module avec sa page' + 'help' => 'Importer les données du module' ]) : '' ]; @@ -415,95 +418,114 @@ class addon extends common { /* * Export des données d'un module externes ou interne à module.json */ - public function export(){ + public function dataExport(){ // Jeton incorrect if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); } else { - // Lire les données du module - $infoModules = helper::getModules(); - // Créer un dossier par défaut - $tmpFolder = self::TEMP_DIR . uniqid(); - //$tmpFolder = self::TEMP_DIR . 'test'; - if (!is_dir($tmpFolder)) { - mkdir($tmpFolder, 0755); - } - // Clés moduleIds dans les pages - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - // Parcourir les pages utilisant le module - foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) { - // Export des pages hébergeant le module - $pageParam[$pageId] = $this->getData(['page',$pageId]); - // Export du contenu de la page - //$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content'])); - $pageContent[$pageId] = $this->getPage($pageId, self::$i18n); - // Export de fr/module.json - $moduleId = 'fr/module.json'; - $moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']); - // Création de l'arborescence des langues - // Pas de nom dossier de langue - dossier par défaut - $t = explode ('/',$moduleId); - if ( is_array($t)) { - $lang = 'fr'; - } else { - $lang = $t[0]; + // Soumission du formulaire + if($this->isPost()) { + // Lire les données du module + $infoModules = helper::getModules(); + // Créer un dossier par défaut + $tmpFolder = self::TEMP_DIR . uniqid(); + //$tmpFolder = self::TEMP_DIR . 'test'; + if (!is_dir($tmpFolder)) { + mkdir($tmpFolder, 0755); } - // Créer le dossier temporaire si inexistant sinon le nettoie et le créer - if (!is_dir($tmpFolder . '/' . $lang)) { - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } else { - $this->removeDir($tmpFolder . '/' . $lang); - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } - // Créer le dossier temporaire des données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory']) { - if (!is_dir($tmpFolder . '/' . $moduleDir)) { - mkdir ($tmpFolder . '/' . $moduleDir, 0755, true) ; + $page = $this->getInput('pluginExportSelectPage'); + + // Clés moduleIds dans les pages + $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + // Parcourir les pages utilisant le module + foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) { + // Export des pages hébergeant le module + $pageParam[$pageId] = $this->getData(['page',$pageId]); + // Export du contenu de la page + //$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content'])); + $pageContent[$pageId] = $this->getPage($pageId, self::$i18n); + // Export de fr/module.json + $moduleId = 'fr/module.json'; + $moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']); + // Création de l'arborescence des langues + // Pas de nom dossier de langue - dossier par défaut + $t = explode ('/',$moduleId); + if ( is_array($t)) { + $lang = 'fr'; + } else { + $lang = $t[0]; + } + // Créer le dossier temporaire si inexistant sinon le nettoie et le créer + if (!is_dir($tmpFolder . '/' . $lang)) { + mkdir ($tmpFolder . '/' . $lang, 0755, true); + } else { + $this->removeDir($tmpFolder . '/' . $lang); + mkdir ($tmpFolder . '/' . $lang, 0755, true); + } + // Créer le dossier temporaire des données du module + if ($infoModules[$this->getUrl(2)]['dataDirectory']) { + if (!is_dir($tmpFolder . '/' . $moduleDir)) { + mkdir ($tmpFolder . '/' . $moduleDir, 0755, true) ; + } + } + // Sauvegarde si données non vides + $tmpData [$pageId] = $this->getData(['module',$pageId ]); + if ($tmpData [$pageId] !== null) { + file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); + } + // Export des données localisées dans le dossier de données du module + if ($infoModules[$this->getUrl(2)]['dataDirectory'] && + is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) { + $this->copyDir ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir); } } - // Sauvegarde si données non vides - $tmpData [$pageId] = $this->getData(['module',$pageId ]); - if ($tmpData [$pageId] !== null) { - file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); + // Enregistrement des pages dans le dossier de langue identique à module + if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) { + file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageParam)); + mkdir ($tmpFolder . '/' . $lang . '/content', 0755); + file_put_contents($tmpFolder . '/' . $lang . '/content/' . $this->getData(['page', $pageId, 'content']), $pageContent); } - // Export des données localisées dans le dossier de données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory'] && - is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) { - $this->copyDir ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir); + // création du zip + $fileName = $this->getUrl(2) . '.zip'; + $this->makeZip ($fileName, $tmpFolder, []); + if (file_exists($fileName)) { + ob_start(); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . $fileName . '"'); + header('Content-Length: ' . filesize($fileName)); + ob_clean(); + ob_end_flush(); + readfile( $fileName); + unlink($fileName); + $this->removeDir($tmpFolder); + exit(); + } else { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'notification' => 'Quelque chose s\'est mal passé', + 'state' => false + ]); } - } - // Enregistrement des pages dans le dossier de langue identique à module - if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) { - file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageParam)); - mkdir ($tmpFolder . '/' . $lang . '/content', 0755); - file_put_contents($tmpFolder . '/' . $lang . '/content/' . $this->getData(['page', $pageId, 'content']), $pageContent); - } - // création du zip - $fileName = $this->getUrl(2) . '.zip'; - $this->makeZip ($fileName, $tmpFolder, []); - if (file_exists($fileName)) { - ob_start(); - header('Content-Type: application/octet-stream'); - header('Content-Disposition: attachment; filename="' . $fileName . '"'); - header('Content-Length: ' . filesize($fileName)); - ob_clean(); - ob_end_flush(); - readfile( $fileName); - unlink($fileName); - $this->removeDir($tmpFolder); - exit(); } else { + + // Liste des pages contenant le module + $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + foreach( $inPages as $key=>$value){ + if ($value === $this->getUrl(2)) { + self::$pagesList[] = $key; + } + } // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', - 'notification' => 'Quelque chose s\'est mal passé', - 'state' => false + 'title' => 'Export des données de module', + 'view' => 'dataExport' ]); } } @@ -512,12 +534,12 @@ class addon extends common { /* * Importer des données d'un module externes ou interne à module.json */ - public function import(){ + public function dataImport(){ // Jeton incorrect if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); @@ -526,18 +548,32 @@ class addon extends common { // Soumission du formulaire if($this->isPost()) { // Récupérer le fichier et le décompacter - $zipFilename = $this->getInput('addonImportFile', helper::FILTER_STRING_SHORT, true); + $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); + $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); $tempFolder = uniqid(); mkdir (self::TEMP_DIR . $tempFolder, 0755); $zip = new ZipArchive(); if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { $zip->extractTo(self::TEMP_DIR . $tempFolder ); } + + // copie du contenu de la page + $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); + // Supprimer les fichiers importés + unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); + // Import des fichiers placés ailleurs que dans les dossiers localisés. + $this->copyDir (self::TEMP_DIR . $tempFolder, self::DATA_DIR ); + + // Import des données localisées page.json et module.json // Pour chaque dossier localisé - $dataTarget = array(); - $dataSource = array(); + // $dataTarget = array(); + // $dataSource = array(); + + + // Liste des pages de même nom dans l'archive et le site + /* $list = ''; foreach (self::$i18nList as $key=>$value) { // Les Pages et les modules @@ -561,20 +597,16 @@ class addon extends common { if( $list === ''){ file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); } - // copie du contenu de la page - $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); - // Supprimer les fichiers importés - unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); } } } + */ - // Import des fichiers placés ailleurs que dans les dossiers localisés. - $this->copyDir (self::TEMP_DIR . $tempFolder,self::DATA_DIR ); // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); $zip->close(); + /* if( $list !== '' ){ $success = false; strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; @@ -582,18 +614,29 @@ class addon extends common { else{ $success = true; $notification = 'Import réussi'; - } + }*/ // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => $success, 'notification' => $notification ]); } + + // Liste des pages ne contenant pas de module + self::$pagesList = $this->getData(['page']); + foreach(self::$pagesList as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true || + $this->getData(['page',$page,'moduleId']) !== '') { + unset(self::$pagesList[$page]); + } + } + // Valeurs en sortie $this->addOutput([ 'title' => 'Importer des données de module', - 'view' => 'import' + 'view' => 'dataImport' ]); } } diff --git a/core/module/addon/view/import/import.css b/core/module/plugin/view/dataExport/dataExport.css similarity index 100% rename from core/module/addon/view/import/import.css rename to core/module/plugin/view/dataExport/dataExport.css diff --git a/core/module/plugin/view/dataExport/dataExport.php b/core/module/plugin/view/dataExport/dataExport.php new file mode 100644 index 00000000..e9d1ee50 --- /dev/null +++ b/core/module/plugin/view/dataExport/dataExport.php @@ -0,0 +1,30 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'plugin', + 'value' => template::ico('left') + ]); ?> +
+
+ 'Appliquer' + ]); ?> +
+
+
+
+
+

Installer des données de module

+
+
+ 'Export depuis la page ' . template::flag('site', '20px'), + 'help' => 'Pour exporter les données de module d\'une autre langue traduite, sélectionnez-la puis revenez sur cet écran' + ]); ?> +
+
+
+
+
\ No newline at end of file diff --git a/core/module/addon/view/index/index.css b/core/module/plugin/view/dataImport/dataImport.css similarity index 100% rename from core/module/addon/view/index/index.css rename to core/module/plugin/view/dataImport/dataImport.css diff --git a/core/module/plugin/view/dataImport/dataImport.php b/core/module/plugin/view/dataImport/dataImport.php new file mode 100644 index 00000000..ea365be6 --- /dev/null +++ b/core/module/plugin/view/dataImport/dataImport.php @@ -0,0 +1,35 @@ + +
+
+ 'buttonGrey', + 'href' => helper::baseUrl() . 'plugin', + 'value' => template::ico('left') + ]); ?> +
+
+ 'Appliquer' + ]); ?> +
+
+
+
+
+

Installer des données de module

+
+
+ 'Archive ZIP :', + 'type' => 2 + ]); ?> +
+
+ 'Importer le module dans la page ' . template::flag('site', '20px') + ]); ?> +
+
+
+
+
\ No newline at end of file diff --git a/core/module/addon/view/store/store.css b/core/module/plugin/view/index/index.css similarity index 100% rename from core/module/addon/view/store/store.css rename to core/module/plugin/view/index/index.css diff --git a/core/module/addon/view/index/index.help.html b/core/module/plugin/view/index/index.help.html similarity index 100% rename from core/module/addon/view/index/index.help.html rename to core/module/plugin/view/index/index.help.html diff --git a/core/module/addon/view/index/index.js.php b/core/module/plugin/view/index/index.js.php similarity index 100% rename from core/module/addon/view/index/index.js.php rename to core/module/plugin/view/index/index.js.php diff --git a/core/module/addon/view/index/index.php b/core/module/plugin/view/index/index.php similarity index 88% rename from core/module/addon/view/index/index.php rename to core/module/plugin/view/index/index.php index f5ee7fc6..e95c77ce 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -17,21 +17,21 @@
helper::baseUrl() . 'addon/store', + 'href' => helper::baseUrl() . 'plugin/store', 'value' => template::ico('shopping-basket'), "help" => 'Lister le catalogue en ligne' ]); ?>
helper::baseUrl() . 'addon/upload', + 'href' => helper::baseUrl() . 'plugin/upload', 'value' => template::ico('plus'), "help" => 'Ajouter à partir d\'une archive ZIP' ]); ?>
- + diff --git a/core/module/addon/view/item/item.css b/core/module/plugin/view/item/item.css similarity index 100% rename from core/module/addon/view/item/item.css rename to core/module/plugin/view/item/item.css diff --git a/core/module/addon/view/item/item.php b/core/module/plugin/view/item/item.php similarity index 100% rename from core/module/addon/view/item/item.php rename to core/module/plugin/view/item/item.php diff --git a/core/module/addon/view/upload/upload.css b/core/module/plugin/view/store/store.css similarity index 100% rename from core/module/addon/view/upload/upload.css rename to core/module/plugin/view/store/store.css diff --git a/core/module/addon/view/store/store.php b/core/module/plugin/view/store/store.php similarity index 87% rename from core/module/addon/view/store/store.php rename to core/module/plugin/view/store/store.php index 8646d8cf..154bc4c7 100644 --- a/core/module/addon/view/store/store.php +++ b/core/module/plugin/view/store/store.php @@ -2,7 +2,7 @@
'buttonGrey', - 'href' => helper::baseUrl() . 'addon', + 'href' => helper::baseUrl() . 'plugin', 'value' => template::ico('left') ]); ?>
diff --git a/core/module/plugin/view/upload/upload.css b/core/module/plugin/view/upload/upload.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/core/module/plugin/view/upload/upload.css @@ -0,0 +1,18 @@ +/** + * 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-2022, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/core/module/addon/view/upload/upload.php b/core/module/plugin/view/upload/upload.php similarity index 93% rename from core/module/addon/view/upload/upload.php rename to core/module/plugin/view/upload/upload.php index 57114be4..c4104450 100644 --- a/core/module/addon/view/upload/upload.php +++ b/core/module/plugin/view/upload/upload.php @@ -3,12 +3,12 @@
'buttonGrey', - 'href' => helper::baseUrl() . 'addon', + 'href' => helper::baseUrl() . 'plugin', 'value' => template::ico('left') ]); ?>
- 'https://doc.zwiicms.fr/installation-d-un-module', 'target' => '_blank', 'class' => 'buttonHelp', From 2638a58aac5f3c6583cb31aac9989ffea18d0965 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Wed, 26 Jan 2022 11:41:36 +0100 Subject: [PATCH 031/103] addon -> plugin --- core/core.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core.php b/core/core.php index 782cbbb9..40db44b7 100644 --- a/core/core.php +++ b/core/core.php @@ -58,7 +58,7 @@ class common { 'theme', 'user', 'translate', - 'addon' + 'plugin' ]; public static $accessList = [ 'user', @@ -2036,7 +2036,7 @@ class common { } if($this->getUser('group') >= self::GROUP_ADMIN) { $rightItems .= '
  • ' . template::ico('brush') . '
  • '; - $rightItems .= '
  • ' . template::ico('puzzle') . '
  • '; + $rightItems .= '
  • ' . template::ico('puzzle') . '
  • '; if ($this->getData(['config', 'i18n', 'enable']) === true) { $rightItems .= '
  • ' . template::ico('flag') . '
  • '; } From 53246e956721479b794f12a6d9bf173da98828e7 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 27 Jan 2022 10:21:54 +0100 Subject: [PATCH 032/103] =?UTF-8?q?m=C3=A9thode=20non=20priv=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.php b/core/core.php index 40db44b7..cc65690c 100644 --- a/core/core.php +++ b/core/core.php @@ -1154,7 +1154,7 @@ class common { * @param int count nombres d'occurrences * @return array avec les valeurs remplacées. */ - private function recursive_array_replace ($find, $replace, $array, &$count) { + public function recursive_array_replace ($find, $replace, $array, &$count) { if (!is_array($array)) { return str_replace($find, $replace, $array, $count); } From 4c6be2f63ccd37a4dd0d700413ac1e08a6f4421f Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 28 Jan 2022 14:28:37 +0100 Subject: [PATCH 033/103] Gestion des modules Ok avec langues --- core/module/plugin/plugin.php | 249 +++++++++--------- .../plugin/view/dataExport/dataExport.css | 18 -- .../plugin/view/dataExport/dataExport.php | 30 --- core/module/plugin/view/index/index.php | 9 +- truc | 1 + 5 files changed, 130 insertions(+), 177 deletions(-) delete mode 100644 core/module/plugin/view/dataExport/dataExport.css delete mode 100644 core/module/plugin/view/dataExport/dataExport.php create mode 100644 truc diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index ebf47770..12ec3994 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -9,9 +9,9 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2022, Frédéric Tempez - * @author Sylvain Lelièvre * @copyright Copyright (C) 2020-2021, Sylvain Lelièvre + * @copyright Copyright (C) 2018-2022, Frédéric Tempez + * @author Sylvain Lelièvre * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ @@ -21,7 +21,7 @@ class plugin extends common { public static $actions = [ 'index' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN, - 'dataExport' => self::GROUP_ADMIN, + 'dataExport' => self::GROUP_ADMIN, // Fonction muette d'exportation 'dataImport' => self::GROUP_ADMIN, // les données d'un module 'store' => self::GROUP_ADMIN, 'item' => self::GROUP_ADMIN, // détail d'un objet @@ -35,6 +35,7 @@ class plugin extends common { // Gestion des modules public static $modInstal = []; + public static $modOrphans = []; // pour tests public static $valeur = []; @@ -82,6 +83,7 @@ class plugin extends common { $success = false; $notification = 'La suppression a échouée'; } + // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', @@ -298,7 +300,7 @@ class plugin extends common { // Clés moduleIds dans les pages $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); foreach( $inPages as $key=>$value){ - $inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value; + $pagesInfos[ $this->getData(['page', $key, 'title' ]) ] = $value; } // Parcourir les données des modules foreach ($store as $key=>$value) { @@ -325,7 +327,7 @@ class plugin extends common { mb_detect_encoding(strftime('%d %B %Y', $store[$key]['versionDate']), 'UTF-8', true) ? strftime('%d %B %Y', $store[$key]['versionDate']) : utf8_encode(strftime('%d %B %Y', $store[$key]['versionDate'])), - implode(', ', array_keys($inPagesTitle,$key)), + implode(', ', array_keys($pagesInfos,$key)), template::button('moduleExport' . $key, [ 'class' => $class, 'href' => helper::baseUrl(). $this->getUrl(0) . '/uploadItem/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre @@ -368,131 +370,137 @@ class plugin extends common { // $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory'] $infoModules = helper::getModules(); - // Clés moduleIds dans les pages - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - foreach( $inPages as $key=>$value){ - $inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value; + // Tableau des langues installées + foreach (self::$i18nList as $key => $value) { + if ($this->getData(['config','i18n', $key]) === 'site' || + $key === 'fr') { + $i18nSites[$key] = $value; + } + } + + // Langue actuelle + $savei18n = self::$i18n; + // Parcourir les langues du site traduit + foreach ($i18nSites as $keyI18n=>$vaueI18n) { + self::$i18n = $keyI18n; + // Clés moduleIds dans les pages de la langue sélectionnée + $pagesModules = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + // Générer ls liste des pages avec module pour la sauvegarde ou le backup + foreach( $pagesModules as $key=>$value ) { + if (!empty($value)) { + $pagesInfos [self::$i18n] [$key] ['pageId'] = $key ; + $pagesInfos [self::$i18n] [$key] ['title'] = $this->getData(['page', $key, 'title' ]) ; + $pagesInfos [self::$i18n] [$key] ['moduleId'] = $value; + } + } } - // Parcourir les données des modules + // Restaurer la langue actuelle + self::$i18n = $savei18n; + + //var_dump($pagesModules); + //var_dump($pagesInfos); + + // Générer la liste des modules orphelins foreach ($infoModules as $key=>$value) { - // Construire le tableau de sortie - self::$modInstal[] = [ - $key, - $infoModules[$key]['realName'], - $infoModules[$key]['version'], - implode(', ', array_keys($inPagesTitle,$key)), - //|| ('delete',$infoModules[$key]) && $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' - $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' - ? template::button('moduleDelete' . $key, [ - 'class' => 'moduleDelete buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel'), - 'help' => 'Supprimer le module '. $key - ]) - : '', - implode(', ',array_keys($inPages,$key)) !== '' - ? template::button('moduleExport' . $key, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('download'), - 'help' => 'Exporter les données du module' - ]) - : '', - implode(', ',array_keys($inPages,$key)) === '' - ? template::button('moduleExport' . $key, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('upload'), - 'help' => 'Importer les données du module' - ]) - : '' - ]; + if (!array_search($key, $pagesModules) ) { + $orphans[] = $key; + } + } + // Mise ene forme du tableau des modules orphelins + if (isset($orphans)) { + foreach ($orphans as $key) { + // Construire le tableau de sortie + self::$modOrphans [] = [ + $infoModules [$key] ['realName'], + $key, + $infoModules [$key] ['version'], + '', + '', + '', + '', + $infoModules[$key] ['delete'] === true + ? template::button('moduleDelete' . $key, [ + 'class' => 'moduleDelete buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' .$key . '/' . $_SESSION['csrf'], + 'value' => template::ico('cancel'), + 'help' => 'Supprimer le module' + ]) + : '', + + ]; + } + } + + // Parcourir les langues du site traduit + foreach ($pagesInfos as $keyI18n=>$valueI18n) { + // Modules affectés à des pages + + foreach ($valueI18n as $keyPage=>$value) { + + // Construire le tableau de sortie + self::$modInstal[] = [ + $infoModules[$pagesInfos[$keyI18n][$keyPage]['moduleId']] ['realName'], + $pagesInfos[$keyI18n][$keyPage]['moduleId'], + $infoModules[$pagesInfos [$keyI18n][$keyPage]['moduleId']] ['version'], + template::flag($keyI18n, '20px'), + $pagesInfos [$keyI18n][$keyPage]['title'] . ' (' .$keyPage . ')', + template::button('moduleExport' . $keyPage, [ + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('download'), + 'help' => 'Exporter les données du module' + ]), + template::button('moduleImport' . $keyPage, [ + 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('upload'), + 'help' => 'Importer les données du module' + ]) + ]; + } } // Valeurs en sortie $this->addOutput([ - 'title' => 'Gestion des modules', + 'title' => 'Gestion des modules installés', 'view' => 'index' ]); } + /* - * Export des données d'un module externes ou interne à module.json + * Export des données d'un module */ - public function dataExport(){ + public function dataExport() { // Jeton incorrect - if ($this->getUrl(3) !== $_SESSION['csrf']) { + if ($this->getUrl(4) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); - } - else { - // Soumission du formulaire - if($this->isPost()) { - // Lire les données du module - $infoModules = helper::getModules(); - // Créer un dossier par défaut - $tmpFolder = self::TEMP_DIR . uniqid(); - //$tmpFolder = self::TEMP_DIR . 'test'; - if (!is_dir($tmpFolder)) { - mkdir($tmpFolder, 0755); - } - $page = $this->getInput('pluginExportSelectPage'); + } else { - // Clés moduleIds dans les pages - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - // Parcourir les pages utilisant le module - foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) { - // Export des pages hébergeant le module - $pageParam[$pageId] = $this->getData(['page',$pageId]); - // Export du contenu de la page - //$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content'])); - $pageContent[$pageId] = $this->getPage($pageId, self::$i18n); - // Export de fr/module.json - $moduleId = 'fr/module.json'; - $moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']); - // Création de l'arborescence des langues - // Pas de nom dossier de langue - dossier par défaut - $t = explode ('/',$moduleId); - if ( is_array($t)) { - $lang = 'fr'; - } else { - $lang = $t[0]; - } - // Créer le dossier temporaire si inexistant sinon le nettoie et le créer - if (!is_dir($tmpFolder . '/' . $lang)) { - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } else { - $this->removeDir($tmpFolder . '/' . $lang); - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } - // Créer le dossier temporaire des données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory']) { - if (!is_dir($tmpFolder . '/' . $moduleDir)) { - mkdir ($tmpFolder . '/' . $moduleDir, 0755, true) ; - } - } - // Sauvegarde si données non vides - $tmpData [$pageId] = $this->getData(['module',$pageId ]); - if ($tmpData [$pageId] !== null) { - file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); - } - // Export des données localisées dans le dossier de données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory'] && - is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) { - $this->copyDir ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir); - } - } - // Enregistrement des pages dans le dossier de langue identique à module - if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) { - file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageParam)); - mkdir ($tmpFolder . '/' . $lang . '/content', 0755); - file_put_contents($tmpFolder . '/' . $lang . '/content/' . $this->getData(['page', $pageId, 'content']), $pageContent); - } - // création du zip - $fileName = $this->getUrl(2) . '.zip'; + // Créer un dossier par défaut + $tmpFolder = self::TEMP_DIR . uniqid(); + if (!is_dir($tmpFolder)) { + mkdir($tmpFolder, 0755); + } + + // Copie des infos sur le module + $moduleData = $this->getData(['module', $this->getUrl(3) ]); + $success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData)); + + // Le dossier du module s'il existe + if (is_dir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3) ) ) { + // Copier le dossier des données + $success = $this->copyDir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3), $tmpFolder . '/' . self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3)); + } + + // création du zip + if ($success) + { + $fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '.zip'; $this->makeZip ($fileName, $tmpFolder, []); if (file_exists($fileName)) { ob_start(); @@ -505,29 +513,15 @@ class plugin extends common { unlink($fileName); $this->removeDir($tmpFolder); exit(); - } else { - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl() . 'plugin', - 'notification' => 'Quelque chose s\'est mal passé', - 'state' => false - ]); } } else { - - // Liste des pages contenant le module - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - foreach( $inPages as $key=>$value){ - if ($value === $this->getUrl(2)) { - self::$pagesList[] = $key; - } - } // Valeurs en sortie $this->addOutput([ - 'title' => 'Export des données de module', - 'view' => 'dataExport' + 'redirect' => helper::baseUrl() . 'plugin', + 'notification' => 'Quelque chose s\'est mal passé', + 'state' => false ]); - } + } } } @@ -641,4 +635,5 @@ class plugin extends common { } } + } diff --git a/core/module/plugin/view/dataExport/dataExport.css b/core/module/plugin/view/dataExport/dataExport.css deleted file mode 100644 index 52709ea6..00000000 --- a/core/module/plugin/view/dataExport/dataExport.css +++ /dev/null @@ -1,18 +0,0 @@ -/** - * 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-2022, Frédéric Tempez - * @license GNU General Public License, version 3 - * @link http://zwiicms.fr/ - */ - - -/** NE PAS EFFACER -* admin.css -*/ \ No newline at end of file diff --git a/core/module/plugin/view/dataExport/dataExport.php b/core/module/plugin/view/dataExport/dataExport.php deleted file mode 100644 index e9d1ee50..00000000 --- a/core/module/plugin/view/dataExport/dataExport.php +++ /dev/null @@ -1,30 +0,0 @@ - -
    -
    - 'buttonGrey', - 'href' => helper::baseUrl() . 'plugin', - 'value' => template::ico('left') - ]); ?> -
    -
    - 'Appliquer' - ]); ?> -
    -
    -
    -
    -
    -

    Installer des données de module

    -
    -
    - 'Export depuis la page ' . template::flag('site', '20px'), - 'help' => 'Pour exporter les données de module d\'une autre langue traduite, sélectionnez-la puis revenez sur cet écran' - ]); ?> -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index e95c77ce..6b2e7744 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -29,9 +29,14 @@ "help" => 'Ajouter à partir d\'une archive ZIP' ]); ?>
    -
    +
    > +

    Modules non utilisés :

    + + - +

    Modules utilisés :

    + diff --git a/truc b/truc new file mode 100644 index 00000000..ed62dafb --- /dev/null +++ b/truc @@ -0,0 +1 @@ +{"config":{"previewLength":"100","resultHideContent":"","placeHolder":"Un ou plusieurs mots-cl\u00e9s s\u00e9par\u00e9s par un espace ou par +","submitText":"Rechercher","versionData":"2.2"},"theme":{"keywordColor":"rgba(229, 229, 1, 1)","style":"site\/data\/search\/recherche\/theme.css"}} \ No newline at end of file From 4bc8b9b080eeee8240fb262c5c5d4e15528f1a3c Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 28 Jan 2022 15:13:04 +0100 Subject: [PATCH 034/103] =?UTF-8?q?R=C3=A9sourdre=20la=20lecture=20des=20m?= =?UTF-8?q?odules=20et=20des=20pages=20dans=20chaque=20langue=20traduite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.php | 5 ++++- core/module/plugin/plugin.php | 31 +++++++++++++++++++------------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/core/core.php b/core/core.php index cc65690c..a2d86727 100644 --- a/core/core.php +++ b/core/core.php @@ -504,6 +504,8 @@ class common { } + + /** * Effacer les données de la page * @param string pageId @@ -513,7 +515,8 @@ class common { return unlink(self::DATA_DIR . $lang . '/content/' . $this->getData(['page', $page, 'content'])); - } + } + /** * Sauvegarde des données diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 12ec3994..3fed22d9 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -366,9 +366,7 @@ class plugin extends common { */ public function index() { - // Lister les modules - // $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory'] - $infoModules = helper::getModules(); + // Tableau des langues installées foreach (self::$i18nList as $key => $value) { @@ -377,9 +375,10 @@ class plugin extends common { $i18nSites[$key] = $value; } } + // Lister les modules + $infoModules = helper::getModules(); - // Langue actuelle - $savei18n = self::$i18n; + // Parcourir les langues du site traduit foreach ($i18nSites as $keyI18n=>$vaueI18n) { self::$i18n = $keyI18n; @@ -395,8 +394,7 @@ class plugin extends common { } } - // Restaurer la langue actuelle - self::$i18n = $savei18n; + //var_dump($pagesModules); //var_dump($pagesInfos); @@ -472,7 +470,7 @@ class plugin extends common { */ public function dataExport() { // Jeton incorrect - if ($this->getUrl(4) !== $_SESSION['csrf']) { + if ($this->getUrl(5) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', @@ -487,20 +485,28 @@ class plugin extends common { mkdir($tmpFolder, 0755); } + // Sauvegarder la langue active + $saveI18n = self::$i18n; + + self::$i18n = $this->getUrl(2); + // Copie des infos sur le module - $moduleData = $this->getData(['module', $this->getUrl(3) ]); + $moduleData = $this->getData(['module', $this->getUrl(4) ]); $success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData)); // Le dossier du module s'il existe - if (is_dir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3) ) ) { + if (is_dir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4) ) ) { // Copier le dossier des données - $success = $this->copyDir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3), $tmpFolder . '/' . self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3)); + $success = $this->copyDir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4), $tmpFolder . '/' . self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4)); } + // Restaurer la langue active + //self::$i18n = $saveI18n; + // création du zip if ($success) { - $fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '.zip'; + $fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '-' . $this->getUrl(4) . '.zip'; $this->makeZip ($fileName, $tmpFolder, []); if (file_exists($fileName)) { ob_start(); @@ -636,4 +642,5 @@ class plugin extends common { } + } From 798b1df09347da7279f735c49f7b412e858043a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Sat, 29 Jan 2022 19:22:09 +0100 Subject: [PATCH 035/103] moduels orphelins ok --- core/module/plugin/plugin.php | 50 +++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 3fed22d9..58a78270 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -368,44 +368,54 @@ class plugin extends common { - // Tableau des langues installées + // Tableau des langues rédigées foreach (self::$i18nList as $key => $value) { if ($this->getData(['config','i18n', $key]) === 'site' || $key === 'fr') { $i18nSites[$key] = $value; } } - // Lister les modules + + // Lister les modules installés $infoModules = helper::getModules(); - // Parcourir les langues du site traduit - foreach ($i18nSites as $keyI18n=>$vaueI18n) { - self::$i18n = $keyI18n; - // Clés moduleIds dans les pages de la langue sélectionnée - $pagesModules = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + // Parcourir les langues du site traduit et recherche les modules affectés à des pages + foreach ($i18nSites as $keyi18n=>$vauei18n) { + + // Clés moduleIds dans les pages de la langue + $pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/' . 'page.json'), true); + + // Extraire les clés des modules + $pagesModules [$keyi18n] = array_filter(helper::arrayCollumn($pages['page'],'moduleId', 'SORT_DESC'), 'strlen'); + // Générer ls liste des pages avec module pour la sauvegarde ou le backup - foreach( $pagesModules as $key=>$value ) { + foreach( $pagesModules [$keyi18n] as $key=>$value ) { if (!empty($value)) { - $pagesInfos [self::$i18n] [$key] ['pageId'] = $key ; - $pagesInfos [self::$i18n] [$key] ['title'] = $this->getData(['page', $key, 'title' ]) ; - $pagesInfos [self::$i18n] [$key] ['moduleId'] = $value; + $pagesInfos [$keyi18n] [$key] ['pageId'] = $key ; + $pagesInfos [$keyi18n] [$key] ['title'] = $this->getData(['page', $key, 'title' ]) ; + $pagesInfos [$keyi18n] [$key] ['moduleId'] = $value; } } } - - //var_dump($pagesModules); - //var_dump($pagesInfos); - - // Générer la liste des modules orphelins - foreach ($infoModules as $key=>$value) { - if (!array_search($key, $pagesModules) ) { - $orphans[] = $key; + // Recherche des modules orphelins dans toutes les langues + $orphans = array_flip(array_keys ($infoModules)); + foreach ($i18nSites as $keyi18n=>$valuei18n) { + // Générer la liste des modules orphelins + foreach ($infoModules as $key=>$value) { + //echo $key . '

    '; + //echo array_search($key, $pagesModules[$keyi18n]); + if (array_search($key, $pagesModules[$keyi18n]) ) { + unset($orphans [$key]); + } + } } - // Mise ene forme du tableau des modules orphelins + $orphans = array_flip($orphans); + + // Mise en forme du tableau des modules orphelins if (isset($orphans)) { foreach ($orphans as $key) { // Construire le tableau de sortie From c73722c5b4f53d28f7d3c1d031acfc1e1f720a2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Sat, 29 Jan 2022 19:26:58 +0100 Subject: [PATCH 036/103] Commentaires et nettoyage --- core/module/plugin/plugin.php | 22 +++++++++---------- core/module/plugin/view/index/index.help.html | 8 ------- core/module/plugin/view/index/index.php | 2 +- 3 files changed, 11 insertions(+), 21 deletions(-) delete mode 100644 core/module/plugin/view/index/index.help.html diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 58a78270..bd25d95c 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -440,26 +440,24 @@ class plugin extends common { } } - // Parcourir les langues du site traduit - foreach ($pagesInfos as $keyI18n=>$valueI18n) { - // Modules affectés à des pages - + // Mise en forme du tableau des modules employés dans les pages + // Avec les commandes de sauvegarde et de restauration + foreach ($pagesInfos as $keyi18n=>$valueI18n) { foreach ($valueI18n as $keyPage=>$value) { - // Construire le tableau de sortie self::$modInstal[] = [ - $infoModules[$pagesInfos[$keyI18n][$keyPage]['moduleId']] ['realName'], - $pagesInfos[$keyI18n][$keyPage]['moduleId'], - $infoModules[$pagesInfos [$keyI18n][$keyPage]['moduleId']] ['version'], - template::flag($keyI18n, '20px'), - $pagesInfos [$keyI18n][$keyPage]['title'] . ' (' .$keyPage . ')', + $infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']] ['realName'], + $pagesInfos[$keyi18n][$keyPage]['moduleId'], + $infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'], + template::flag($keyi18n, '20px'), + $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', template::button('moduleExport' . $keyPage, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' ]), template::button('moduleImport' . $keyPage, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataImport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload'), 'help' => 'Importer les données du module' ]) diff --git a/core/module/plugin/view/index/index.help.html b/core/module/plugin/view/index/index.help.html deleted file mode 100644 index 8af49c96..00000000 --- a/core/module/plugin/view/index/index.help.html +++ /dev/null @@ -1,8 +0,0 @@ -

    MODULES INSTALLES

    -Les modules installés sont listés dans le tableau avec leur nom usuel (alias) et leur numéro de version. -Si le module est utilisé le nom de la page ou des pages apparaît, dans le cas contraire une icône permet de le supprimer. -

    EXPORTER IMPORTER

    -

    Exporter produit une archive au nom du module contenant les pages concernées ainsi que les données et ressources utilisées par le module dans ces pages.

    -

    Vous pouvez vous en servir comme d'une sauvegarde partielle ou pour transférer les pages et les données du module vers un autre site.

    -

    Une fois le module installé l'import permet de restaurer les pages et les données sauvegardées. Vous devrez avoir au préalable transféré le fichier zip d'un export sur votre serveur par 'Gérer les fichiers'. -Si une page de même nom existe sur votre site vous serez invité à modifier son nom.

    diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 6b2e7744..0db22a00 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -31,7 +31,7 @@
    > -

    Modules non utilisés :

    +

    Modules installés non utilisés par une page :

    From 5bc2ecdab82ea85cb0c2b32939f9e976368b3ee2 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 31 Jan 2022 14:24:45 +0100 Subject: [PATCH 037/103] Sauvegarde des modules --- core/core.php | 2 +- core/module/plugin/plugin.php | 116 ++++++++++++++++++++---- core/module/plugin/view/index/index.php | 20 ++-- 3 files changed, 110 insertions(+), 28 deletions(-) diff --git a/core/core.php b/core/core.php index a2d86727..aaef6c2c 100644 --- a/core/core.php +++ b/core/core.php @@ -1176,7 +1176,7 @@ class common { * @param string folder path à zipper * @param array filter dossiers à exclure */ - public function makeZip ($fileName, $folder, $filter ) { + public function makeZip ($fileName, $folder, $filter = [] ) { $zip = new ZipArchive(); $zip->open($fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE); //$directory = 'site/'; diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index bd25d95c..f7841e1c 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -21,6 +21,7 @@ class plugin extends common { public static $actions = [ 'index' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN, + 'save' => self::GROUP_ADMIN, // Sauvegarde le module dans un fichier ZIP ou dans le gestionnaire 'dataExport' => self::GROUP_ADMIN, // Fonction muette d'exportation 'dataImport' => self::GROUP_ADMIN, // les données d'un module 'store' => self::GROUP_ADMIN, @@ -34,8 +35,9 @@ class plugin extends common { const MODULE_STORE = '?modules/'; // Gestion des modules - public static $modInstal = []; - public static $modOrphans = []; + public static $modulesData = []; + public static $modulesOrphan = []; + public static $modulesInstalled = []; // pour tests public static $valeur = []; @@ -236,7 +238,7 @@ class plugin extends common { } /*** - * Installation d'un module par le catalogue + * Installation d'un module depuis le catalogue */ public function uploadItem() { // Jeton incorrect @@ -366,8 +368,6 @@ class plugin extends common { */ public function index() { - - // Tableau des langues rédigées foreach (self::$i18nList as $key => $value) { if ($this->getData(['config','i18n', $key]) === 'site' || @@ -375,13 +375,11 @@ class plugin extends common { $i18nSites[$key] = $value; } } - // Lister les modules installés $infoModules = helper::getModules(); - // Parcourir les langues du site traduit et recherche les modules affectés à des pages - foreach ($i18nSites as $keyi18n=>$vauei18n) { + foreach ($i18nSites as $keyi18n=>$valuei18n) { // Clés moduleIds dans les pages de la langue $pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/' . 'page.json'), true); @@ -401,12 +399,11 @@ class plugin extends common { // Recherche des modules orphelins dans toutes les langues - $orphans = array_flip(array_keys ($infoModules)); + $orphans = $installed = array_flip(array_keys ($infoModules)); foreach ($i18nSites as $keyi18n=>$valuei18n) { // Générer la liste des modules orphelins foreach ($infoModules as $key=>$value) { - //echo $key . '

    '; - //echo array_search($key, $pagesModules[$keyi18n]); + // Supprimer les éléments affectés if (array_search($key, $pagesModules[$keyi18n]) ) { unset($orphans [$key]); } @@ -419,14 +416,11 @@ class plugin extends common { if (isset($orphans)) { foreach ($orphans as $key) { // Construire le tableau de sortie - self::$modOrphans [] = [ + self::$modulesOrphan [] = [ $infoModules [$key] ['realName'], $key, $infoModules [$key] ['version'], '', - '', - '', - '', $infoModules[$key] ['delete'] === true ? template::button('moduleDelete' . $key, [ 'class' => 'moduleDelete buttonRed', @@ -440,17 +434,43 @@ class plugin extends common { } } + // Modules installés non orphelins + // Mise en forme du tableau des modules utilisés + if (isset($installed)) { + foreach (array_flip($installed) as $key) { + // Construire le tableau de sortie + self::$modulesInstalled [] = [ + $infoModules [$key] ['realName'], + $key, + $infoModules [$key] ['version'], + '', + template::button('moduleSave' . $key, [ + 'href' => helper::baseUrl() . $this->getUrl(0) . '/save/filemanager/' .$key . '/' . $_SESSION['csrf'], + 'value' => template::ico('download-cloud'), + 'help' => 'Sauvegarder le module dans le gestionnaire de fichiers' + ]), + template::button('moduleDownload' . $key, [ + 'href' => helper::baseUrl() . $this->getUrl(0) . '/save/download/' .$key . '/' . $_SESSION['csrf'], + 'value' => template::ico('download'), + 'help' => 'Sauvegarder et télécharger le module' + ]) + + ]; + } + } + + // Mise en forme du tableau des modules employés dans les pages // Avec les commandes de sauvegarde et de restauration foreach ($pagesInfos as $keyi18n=>$valueI18n) { foreach ($valueI18n as $keyPage=>$value) { // Construire le tableau de sortie - self::$modInstal[] = [ + self::$modulesData[] = [ $infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']] ['realName'], $pagesInfos[$keyi18n][$keyPage]['moduleId'], $infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'], template::flag($keyi18n, '20px'), - $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', + '' . $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', template::button('moduleExport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), @@ -473,6 +493,64 @@ class plugin extends common { } + /** + * Sauvergarde un module sans les données + */ + + public function save() { + // Jeton incorrect + if ($this->getUrl(4) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } else { + + // Créer un dossier temporaire + $tmpFolder = self::TEMP_DIR . uniqid(); + if (!is_dir($tmpFolder)) { + mkdir($tmpFolder, 0755); + } + + //Nom de l'archive + $fileName = $this->getUrl(3) . '.zip'; + $this->makeZip ($tmpFolder . '/' . $fileName, 'module/' . $this->getUrl(3)); + + switch ($this->getUrl(2)) { + case 'filemanager': + if (!file_exists(self::FILE_DIR . 'source/modules')) { + mkdir(self::FILE_DIR . 'source/modules'); + } + $success = copy($tmpFolder . '/' . $fileName , self::FILE_DIR . 'source/modules/' . $this->getUrl(3) . '.zip' ); + // Nettoyage + unlink($tmpFolder . '/' . $fileName); + $this->removeDir($tmpFolder); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'notification' => $success ? $this->getUrl(3) . '.zip copié dans le dossier Module du gestionnaire de fichier' : 'Erreur de copie', + 'state' => $success + ]); + break; + case 'download': + default: + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . $fileName . '"'); + header('Content-Length: ' . filesize($tmpFolder . '/' . $fileName)); + ob_clean(); + ob_end_flush(); + readfile( $tmpFolder . '/' .$fileName); + unlink($tmpFolder . '/' . $fileName); + $this->removeDir($tmpFolder); + exit(); + break; + } + + } + } + /* * Export des données d'un module */ @@ -487,7 +565,7 @@ class plugin extends common { ]); } else { - // Créer un dossier par défaut + // Créer un dossier temporaire $tmpFolder = self::TEMP_DIR . uniqid(); if (!is_dir($tmpFolder)) { mkdir($tmpFolder, 0755); @@ -515,7 +593,7 @@ class plugin extends common { if ($success) { $fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '-' . $this->getUrl(4) . '.zip'; - $this->makeZip ($fileName, $tmpFolder, []); + $this->makeZip ($fileName, $tmpFolder); if (file_exists($fileName)) { ob_start(); header('Content-Type: application/octet-stream'); diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 0db22a00..9026697a 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -8,7 +8,7 @@

    'https://doc.zwiicms.fr/modules-utilisation-generique', + 'href' => 'https://doc.zwiicms.fr/gestion-des-modules', 'target' => '_blank', 'value' => template::ico('help'), 'class' => 'buttonHelp', @@ -29,14 +29,18 @@ "help" => 'Ajouter à partir d\'une archive ZIP' ]); ?>
    -
    > -

    Modules installés non utilisés par une page :

    - +
    + +

    Suppression des modules orphelins

    + - -

    Modules utilisés :

    - + +

    Sauvegarde des modules

    + + + +

    Sauvegarde des données des modules installés

    + From 760257e3b28b76c020d7688c93211c8eeec2c8d1 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Tue, 1 Feb 2022 16:56:02 +0100 Subject: [PATCH 038/103] importData WIP --- core/module/plugin/plugin.php | 211 ++++++++++++------------ core/module/plugin/view/index/index.php | 28 ++-- core/module/plugin/view/store/store.php | 7 + truc | 1 - 4 files changed, 129 insertions(+), 118 deletions(-) delete mode 100644 truc diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index f7841e1c..21b70c20 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -475,12 +475,14 @@ class plugin extends common { 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' - ]), + ]) + /* template::button('moduleImport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataImport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload'), 'help' => 'Importer les données du module' ]) + */ ]; } } @@ -524,9 +526,7 @@ class plugin extends common { mkdir(self::FILE_DIR . 'source/modules'); } $success = copy($tmpFolder . '/' . $fileName , self::FILE_DIR . 'source/modules/' . $this->getUrl(3) . '.zip' ); - // Nettoyage - unlink($tmpFolder . '/' . $fileName); - $this->removeDir($tmpFolder); + // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', @@ -542,12 +542,12 @@ class plugin extends common { ob_clean(); ob_end_flush(); readfile( $tmpFolder . '/' .$fileName); - unlink($tmpFolder . '/' . $fileName); - $this->removeDir($tmpFolder); exit(); break; } - + // Nettoyage + unlink($tmpFolder . '/' . $fileName); + $this->removeDir($tmpFolder); } } @@ -570,24 +570,26 @@ class plugin extends common { if (!is_dir($tmpFolder)) { mkdir($tmpFolder, 0755); } - - // Sauvegarder la langue active - $saveI18n = self::$i18n; - - self::$i18n = $this->getUrl(2); + // Copie des infos sur le module - $moduleData = $this->getData(['module', $this->getUrl(4) ]); + $modulesData = json_decode(file_get_contents(self::DATA_DIR . $this->getUrl(2) . '/module.json' ), true); + $moduleData [$this->getUrl(4)] = $modulesData['module'] [$this->getUrl(4)]; $success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData)); // Le dossier du module s'il existe if (is_dir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4) ) ) { // Copier le dossier des données - $success = $this->copyDir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4), $tmpFolder . '/' . self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4)); - } + $success .= $this->copyDir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4), $tmpFolder); + } + + // Descripteur de l'archive + $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode([ + 'langue' => $this->getUrl(2), + 'page' => $this->getUrl(3), + 'module' => $this->getUrl(4) + ])); - // Restaurer la langue active - //self::$i18n = $saveI18n; // création du zip if ($success) @@ -621,110 +623,109 @@ class plugin extends common { * Importer des données d'un module externes ou interne à module.json */ public function dataImport(){ - // Jeton incorrect - if ($this->getUrl(3) !== $_SESSION['csrf']) { - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl() . 'plugin', - 'state' => false, - 'notification' => 'Action non autorisée' - ]); - } - else { - // Soumission du formulaire - if($this->isPost()) { - // Récupérer le fichier et le décompacter - $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); - $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); - $tempFolder = uniqid(); - mkdir (self::TEMP_DIR . $tempFolder, 0755); - $zip = new ZipArchive(); - if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { - $zip->extractTo(self::TEMP_DIR . $tempFolder ); - } - // copie du contenu de la page - $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); - // Supprimer les fichiers importés - unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); - // Import des fichiers placés ailleurs que dans les dossiers localisés. - $this->copyDir (self::TEMP_DIR . $tempFolder, self::DATA_DIR ); - + // Soumission du formulaire + if($this->isPost()) { + // Jeton incorrect + if ($this->getUrl(3) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } + // Récupérer le fichier et le décompacter + $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); + $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); + $tempFolder = uniqid(); + mkdir (self::TEMP_DIR . $tempFolder, 0755); + $zip = new ZipArchive(); + if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { + $zip->extractTo(self::TEMP_DIR . $tempFolder ); + } - // Import des données localisées page.json et module.json - // Pour chaque dossier localisé - // $dataTarget = array(); - // $dataSource = array(); - + // copie du contenu de la page + $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); + // Supprimer les fichiers importés + unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); + // Import des fichiers placés ailleurs que dans les dossiers localisés. + $this->copyDir (self::TEMP_DIR . $tempFolder, self::DATA_DIR ); + - - // Liste des pages de même nom dans l'archive et le site - /* - $list = ''; - foreach (self::$i18nList as $key=>$value) { - // Les Pages et les modules - foreach (['page','module'] as $fileTarget){ - if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) { - // Le dossier de langue existe - // faire la fusion - $dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true); - // Des pages de même nom que celles de l'archive existent - if( $fileTarget === 'page' ){ - foreach( $dataSource as $keydataSource=>$valuedataSource ){ - foreach( $this->getData(['page']) as $keypage=>$valuepage ){ - if( $keydataSource === $keypage){ - $list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']); - } + // Import des données localisées page.json et module.json + // Pour chaque dossier localisé + // $dataTarget = array(); + // $dataSource = array(); + + + + // Liste des pages de même nom dans l'archive et le site + /* + $list = ''; + foreach (self::$i18nList as $key=>$value) { + // Les Pages et les modules + foreach (['page','module'] as $fileTarget){ + if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) { + // Le dossier de langue existe + // faire la fusion + $dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true); + // Des pages de même nom que celles de l'archive existent + if( $fileTarget === 'page' ){ + foreach( $dataSource as $keydataSource=>$valuedataSource ){ + foreach( $this->getData(['page']) as $keypage=>$valuepage ){ + if( $keydataSource === $keypage){ + $list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']); } } } - $dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true); - $data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource); - if( $list === ''){ - file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); - } + } + $dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true); + $data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource); + if( $list === ''){ + file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); } } } - */ - - - // Supprimer le dossier temporaire - $this->removeDir(self::TEMP_DIR . $tempFolder); - $zip->close(); - /* - if( $list !== '' ){ - $success = false; - strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; - } - else{ - $success = true; - $notification = 'Import réussi'; - }*/ - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl() . 'plugin', - 'state' => $success, - 'notification' => $notification - ]); } + */ - // Liste des pages ne contenant pas de module - self::$pagesList = $this->getData(['page']); - foreach(self::$pagesList as $page => $pageId) { - if ($this->getData(['page',$page,'block']) === 'bar' || - $this->getData(['page',$page,'disable']) === true || - $this->getData(['page',$page,'moduleId']) !== '') { - unset(self::$pagesList[$page]); - } + + // Supprimer le dossier temporaire + $this->removeDir(self::TEMP_DIR . $tempFolder); + $zip->close(); + /* + if( $list !== '' ){ + $success = false; + strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; } - + else{ + $success = true; + $notification = 'Import réussi'; + }*/ // Valeurs en sortie $this->addOutput([ - 'title' => 'Importer des données de module', - 'view' => 'dataImport' + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => $success, + 'notification' => $notification ]); } + + // Liste des pages ne contenant pas de module + self::$pagesList = $this->getData(['page']); + foreach(self::$pagesList as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true || + $this->getData(['page',$page,'moduleId']) !== '') { + unset(self::$pagesList[$page]); + } + } + + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Importer des données de module', + 'view' => 'dataImport' + ]); } diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 9026697a..1453ba39 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -15,20 +15,13 @@ 'help' => 'Consulter l\'aide en ligne' ]); ?>
    -
    +
    helper::baseUrl() . 'plugin/store', 'value' => template::ico('shopping-basket'), - "help" => 'Lister le catalogue en ligne' + "help" => 'Catalogue de modules en ligne' ]); ?> -
    -
    - helper::baseUrl() . 'plugin/upload', - 'value' => template::ico('plus'), - "help" => 'Ajouter à partir d\'une archive ZIP' - ]); ?> -
    +

    Suppression des modules orphelins

    @@ -39,8 +32,19 @@ -

    Sauvegarde des données des modules installés

    - +
    +
    +

    Sauvegarde des données des modules installés

    +
    +
    + helper::baseUrl() . 'dataImport', + 'value' => template::ico('upload'), + "help" => 'Importer des données de module' + ]); ?> +
    +
    + diff --git a/core/module/plugin/view/store/store.php b/core/module/plugin/view/store/store.php index 154bc4c7..9aabc4a0 100644 --- a/core/module/plugin/view/store/store.php +++ b/core/module/plugin/view/store/store.php @@ -6,6 +6,13 @@ 'value' => template::ico('left') ]); ?>
    +
    + helper::baseUrl() . 'plugin/upload', + 'value' => template::ico('plus'), + "help" => 'Importer depuis une archive ZIP' + ]); ?> +
    diff --git a/truc b/truc deleted file mode 100644 index ed62dafb..00000000 --- a/truc +++ /dev/null @@ -1 +0,0 @@ -{"config":{"previewLength":"100","resultHideContent":"","placeHolder":"Un ou plusieurs mots-cl\u00e9s s\u00e9par\u00e9s par un espace ou par +","submitText":"Rechercher","versionData":"2.2"},"theme":{"keywordColor":"rgba(229, 229, 1, 1)","style":"site\/data\/search\/recherche\/theme.css"}} \ No newline at end of file From de24c11189606dee83d1cbc5307c8e4dcd529f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Wed, 2 Feb 2022 17:04:44 +0100 Subject: [PATCH 039/103] oredre des tableaux --- core/module/plugin/plugin.php | 4 +- core/module/plugin/view/index/index.php | 63 ++++++++++++++++--------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 21b70c20..266039d5 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -475,14 +475,12 @@ class plugin extends common { 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' - ]) - /* + ]), template::button('moduleImport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataImport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload'), 'help' => 'Importer les données du module' ]) - */ ]; } } diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 1453ba39..d8c015dd 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -16,35 +16,54 @@ ]); ?>
    - helper::baseUrl() . 'plugin/store', 'value' => template::ico('shopping-basket'), "help" => 'Catalogue de modules en ligne' ]); ?> -
    +
    - -

    Suppression des modules orphelins

    - - -

    Sauvegarde des modules

    - +
    +
    +
    +

    Sauvegarde des modules installés

    + +
    +
    +
    + + -
    -
    -

    Sauvegarde des données des modules installés

    +
    +
    +
    +

    Données des modules installés

    +
    +
    + helper::baseUrl() . 'dataImport', + 'value' => template::ico('upload'), + "help" => 'Importer des données de module dans une page libre' + ]); ?> +
    +
    +
    +
    + +
    +
    -
    - helper::baseUrl() . 'dataImport', - 'value' => template::ico('upload'), - "help" => 'Importer des données de module' - ]); ?> -
    - - - - + + +
    +
    +
    +

    Désinstallation des modules orphelins

    + +
    +
    +
    + \ No newline at end of file From 78c28ca79f20a2d099681e67b3bf62cfdc18dd56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Wed, 2 Feb 2022 17:59:07 +0100 Subject: [PATCH 040/103] dataImport WIP --- core/module/plugin/plugin.php | 99 +++++++++---------------- core/module/plugin/view/index/index.php | 2 +- 2 files changed, 37 insertions(+), 64 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 266039d5..f08ca7e3 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -572,7 +572,7 @@ class plugin extends common { // Copie des infos sur le module $modulesData = json_decode(file_get_contents(self::DATA_DIR . $this->getUrl(2) . '/module.json' ), true); - $moduleData [$this->getUrl(4)] = $modulesData['module'] [$this->getUrl(4)]; + $moduleData = $modulesData['module'] [$this->getUrl(4)]; $success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData)); // Le dossier du module s'il existe @@ -584,8 +584,8 @@ class plugin extends common { // Descripteur de l'archive $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode([ 'langue' => $this->getUrl(2), - 'page' => $this->getUrl(3), - 'module' => $this->getUrl(4) + 'moduleid' => $this->getUrl(3), + 'pageId' => $this->getUrl(4) ])); @@ -622,85 +622,36 @@ class plugin extends common { */ public function dataImport(){ - // Soumission du formulaire + // Soumission du formulaire d'importation du module dans une page libre if($this->isPost()) { - // Jeton incorrect - if ($this->getUrl(3) !== $_SESSION['csrf']) { - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl() . 'plugin', - 'state' => false, - 'notification' => 'Action non autorisée' - ]); - } // Récupérer le fichier et le décompacter $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); $tempFolder = uniqid(); + $success = false; + $notification = ''; + + // Extraction dans un dossier temporaire mkdir (self::TEMP_DIR . $tempFolder, 0755); $zip = new ZipArchive(); if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { $zip->extractTo(self::TEMP_DIR . $tempFolder ); } - - // copie du contenu de la page - $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); - // Supprimer les fichiers importés - unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); - // Import des fichiers placés ailleurs que dans les dossiers localisés. - $this->copyDir (self::TEMP_DIR . $tempFolder, self::DATA_DIR ); - - // Import des données localisées page.json et module.json - // Pour chaque dossier localisé - // $dataTarget = array(); - // $dataSource = array(); + // Lire le descripteur + $descripteur = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/descripteur.json'), true); + // Intégration des données du module importé + $moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/module.json'), true ); - // Liste des pages de même nom dans l'archive et le site - /* - $list = ''; - foreach (self::$i18nList as $key=>$value) { - // Les Pages et les modules - foreach (['page','module'] as $fileTarget){ - if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) { - // Le dossier de langue existe - // faire la fusion - $dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true); - // Des pages de même nom que celles de l'archive existent - if( $fileTarget === 'page' ){ - foreach( $dataSource as $keydataSource=>$valuedataSource ){ - foreach( $this->getData(['page']) as $keypage=>$valuepage ){ - if( $keydataSource === $keypage){ - $list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']); - } - } - } - } - $dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true); - $data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource); - if( $list === ''){ - file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); - } - } - } - } - */ + + // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); $zip->close(); - /* - if( $list !== '' ){ - $success = false; - strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; - } - else{ - $success = true; - $notification = 'Import réussi'; - }*/ // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', @@ -708,6 +659,28 @@ class plugin extends common { 'notification' => $notification ]); } + // Bouton d'importation des données d'un module spécifique + if (count(explode('/',$this->getUrl())) === 6) { + // Jeton incorrect + if ($this->getUrl(3) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } + + // Traitement + + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => true, + 'notification' => 'Okay' + ]); + } + // Liste des pages ne contenant pas de module self::$pagesList = $this->getData(['page']); diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index d8c015dd..b39a782f 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -43,7 +43,7 @@
    helper::baseUrl() . 'dataImport', + 'href' => helper::baseUrl() . 'plugin/dataImport', 'value' => template::ico('upload'), "help" => 'Importer des données de module dans une page libre' ]); ?> From 0e004a6f521ee3ab633b854e8f3a1b93473588a6 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 08:55:14 +0100 Subject: [PATCH 041/103] descripteur d'export --- core/module/plugin/plugin.php | 31 ++++++++++++++++--------- core/module/plugin/view/index/index.php | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index f08ca7e3..35cf0852 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -24,6 +24,7 @@ class plugin extends common { 'save' => self::GROUP_ADMIN, // Sauvegarde le module dans un fichier ZIP ou dans le gestionnaire 'dataExport' => self::GROUP_ADMIN, // Fonction muette d'exportation 'dataImport' => self::GROUP_ADMIN, // les données d'un module + 'dataDelete' => self::GROUP_ADMIN, 'store' => self::GROUP_ADMIN, 'item' => self::GROUP_ADMIN, // détail d'un objet 'upload' => self::GROUP_ADMIN, // Téléverser catalogue @@ -475,12 +476,14 @@ class plugin extends common { 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' - ]), - template::button('moduleImport' . $keyPage, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataImport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('upload'), - 'help' => 'Importer les données du module' + ]), + template::button('moduleDelete' . $keyPage, [ + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataDelete/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('cancel'), + 'class' => 'buttonRed', + 'help' => 'Détacher le module de la page', ]) + ]; } } @@ -494,7 +497,7 @@ class plugin extends common { /** - * Sauvergarde un module sans les données + * Sauvegarde un module sans les données */ public function save() { @@ -549,6 +552,15 @@ class plugin extends common { } } + + /* + * Détacher un module d'une page + */ + public function dataDelete() { + + } + + /* * Export des données d'un module */ @@ -582,11 +594,8 @@ class plugin extends common { } // Descripteur de l'archive - $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode([ - 'langue' => $this->getUrl(2), - 'moduleid' => $this->getUrl(3), - 'pageId' => $this->getUrl(4) - ])); + $infoModule = helper::getModules(); + $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode( $infoModule [$this->getUrl(3)] )); // création du zip diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index b39a782f..4c30c408 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -66,4 +66,4 @@
    - \ No newline at end of file + From 418b3b20c3fa1bbf0558e353eaff3ab5aa198087 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 09:47:52 +0100 Subject: [PATCH 042/103] =?UTF-8?q?Modules=20dans=20la=20langue=20s=C3=A9l?= =?UTF-8?q?ectionn=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/plugin/plugin.php | 30 ++++++++++++++++--------- core/module/plugin/view/index/index.php | 27 +++++++++++----------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 35cf0852..020d6a3e 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -463,14 +463,17 @@ class plugin extends common { // Mise en forme du tableau des modules employés dans les pages // Avec les commandes de sauvegarde et de restauration - foreach ($pagesInfos as $keyi18n=>$valueI18n) { + //foreach ($pagesInfos as $keyi18n=>$valueI18n) { + + $keyi18n = self::$i18n; + $valueI18n = $pagesInfos[self::$i18n]; foreach ($valueI18n as $keyPage=>$value) { // Construire le tableau de sortie self::$modulesData[] = [ $infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']] ['realName'], $pagesInfos[$keyi18n][$keyPage]['moduleId'], $infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'], - template::flag($keyi18n, '20px'), + //template::flag($keyi18n, '20px'), '' . $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', template::button('moduleExport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre @@ -486,7 +489,8 @@ class plugin extends common { ]; } - } + + //} // Valeurs en sortie $this->addOutput([ @@ -554,7 +558,7 @@ class plugin extends common { /* - * Détacher un module d'une page + * Détacher un module d'une page en supprimant les données du module */ public function dataDelete() { @@ -563,6 +567,11 @@ class plugin extends common { /* * Export des données d'un module + * Structure de l'adresse reçue + * 2 : i18n id + * 3 : moduleId + * 4 : pageId + * 5 : CSRF */ public function dataExport() { // Jeton incorrect @@ -595,7 +604,7 @@ class plugin extends common { // Descripteur de l'archive $infoModule = helper::getModules(); - $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode( $infoModule [$this->getUrl(3)] )); + $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode( [$this->getUrl(3) => $infoModule [$this->getUrl(3)]] )); // création du zip @@ -650,13 +659,12 @@ class plugin extends common { // Lire le descripteur $descripteur = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/descripteur.json'), true); - // Intégration des données du module importé + // Lecture des données du module $moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/module.json'), true ); - - - - - + // Chargement des données du module importé + $this->setData(['module', array_first_key($descripteur), $moduleData ]); + // Intégration des données du module importé dans la page + $this->setData(['page', 'moduleId', array_first_key($descripteur) ]); // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 4c30c408..1b593a1b 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -28,13 +28,23 @@

    Sauvegarde des modules installés

    - +
    + +
    +
    +
    +

    Désinstallation des modules orphelins

    + +
    +
    +
    +
    @@ -51,19 +61,10 @@
    - +
    - - -
    -
    -
    -

    Désinstallation des modules orphelins

    - -
    -
    -
    - +
    + \ No newline at end of file From 3e202102ea0b97b6ab24bce2e7fb8031527f9e70 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 10:41:59 +0100 Subject: [PATCH 043/103] Filtre des pages de l'import --- core/module/plugin/plugin.php | 17 +++++++++++------ .../plugin/view/dataImport/dataImport.php | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 020d6a3e..d0612cdf 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -662,9 +662,9 @@ class plugin extends common { // Lecture des données du module $moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/module.json'), true ); // Chargement des données du module importé - $this->setData(['module', array_first_key($descripteur), $moduleData ]); + $this->setData(['module', $targetPage, $moduleData ]); // Intégration des données du module importé dans la page - $this->setData(['page', 'moduleId', array_first_key($descripteur) ]); + $this->setData(['page', $targetPage ,'moduleId', array_key_first($descripteur) ]); // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); @@ -699,15 +699,20 @@ class plugin extends common { } - // Liste des pages ne contenant pas de module - self::$pagesList = $this->getData(['page']); + /** + * Liste des pages sans module + * et ne sont pas des barres latérales + */ + self::$pagesList = $this->getHierarchy(null, null, null); foreach(self::$pagesList as $page => $pageId) { if ($this->getData(['page',$page,'block']) === 'bar' || - $this->getData(['page',$page,'disable']) === true || - $this->getData(['page',$page,'moduleId']) !== '') { + //$this->getData(['page',$page,'disable']) === true || + $this->getData(['page',$page,'moduleId']) !== '' + ) { unset(self::$pagesList[$page]); } } + self::$pagesList = array_keys(self::$pagesList); // Valeurs en sortie $this->addOutput([ diff --git a/core/module/plugin/view/dataImport/dataImport.php b/core/module/plugin/view/dataImport/dataImport.php index ea365be6..43b00552 100644 --- a/core/module/plugin/view/dataImport/dataImport.php +++ b/core/module/plugin/view/dataImport/dataImport.php @@ -25,7 +25,7 @@ ]); ?>
    - 'Importer le module dans la page ' . template::flag('site', '20px') ]); ?>
    From ac7d71e349b8e1fe79d410cf173d0d2cc11ab215 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 10:58:16 +0100 Subject: [PATCH 044/103] Delete Module WIP --- core/module/plugin/plugin.php | 38 ++++++++++++++++++---- core/module/plugin/view/index/index.js.php | 10 ++++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index d0612cdf..5156254f 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -475,15 +475,15 @@ class plugin extends common { $infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'], //template::flag($keyi18n, '20px'), '' . $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', - template::button('moduleExport' . $keyPage, [ + template::button('dataExport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' ]), - template::button('moduleDelete' . $keyPage, [ + template::button('dataDelete' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataDelete/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('cancel'), - 'class' => 'buttonRed', + 'class' => 'buttonRed dataDelete', 'help' => 'Détacher le module de la page', ]) @@ -559,8 +559,31 @@ class plugin extends common { /* * Détacher un module d'une page en supprimant les données du module + * 2 : i18n id + * 3 : moduleId + * 4 : pageId + * 5 : CSRF */ public function dataDelete() { + // Jeton incorrect + if ($this->getUrl(5) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } else { + $this->setData(['page', $this->getUrl(4), 'moduleId', '']); + $this->deleteData(['module', $this->getUrl(4)]); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'notification' => 'Le module ' . $this->getUrl(3) . ' de la page '. $this->getUrl(4) . ' a été supprimé.', + 'state' => true + ]); + } + } @@ -646,8 +669,6 @@ class plugin extends common { $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); $tempFolder = uniqid(); - $success = false; - $notification = ''; // Extraction dans un dossier temporaire mkdir (self::TEMP_DIR . $tempFolder, 0755); @@ -669,11 +690,14 @@ class plugin extends common { // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); $zip->close(); + + + // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', - 'state' => $success, - 'notification' => $notification + 'state' => true, + 'notification' => 'Import des données effectué' ]); } // Bouton d'importation des données d'un module spécifique diff --git a/core/module/plugin/view/index/index.js.php b/core/module/plugin/view/index/index.js.php index 4dd572cc..24542e5f 100644 --- a/core/module/plugin/view/index/index.js.php +++ b/core/module/plugin/view/index/index.js.php @@ -15,6 +15,16 @@ * Confirmation de suppression */ $(".moduleDelete").on("click", function() { + var _this = $(this); + return core.confirm("Êtes-vous sûr de vouloir désinstaller ce module ?", function() { + $(location).attr("href", _this.attr("href")); + }); +}); + +/** + * Confirmation de suppression + */ + $(".dataDelete").on("click", function() { var _this = $(this); return core.confirm("Êtes-vous sûr de vouloir supprimer ce module ?", function() { $(location).attr("href", _this.attr("href")); From 3c0e80699bd0feada98edea72d93f94853585a81 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 11:46:48 +0100 Subject: [PATCH 045/103] Supp module okay --- core/module/plugin/view/index/index.js.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/module/plugin/view/index/index.js.php b/core/module/plugin/view/index/index.js.php index 24542e5f..6a5a69ee 100644 --- a/core/module/plugin/view/index/index.js.php +++ b/core/module/plugin/view/index/index.js.php @@ -26,7 +26,7 @@ $(".moduleDelete").on("click", function() { */ $(".dataDelete").on("click", function() { var _this = $(this); - return core.confirm("Êtes-vous sûr de vouloir supprimer ce module ?", function() { + return core.confirm("Êtes-vous sûr de vouloir supprimer le module de cette page ?", function() { $(location).attr("href", _this.attr("href")); }); }); \ No newline at end of file From 5c9a779dff6c02e5d7cdc0323e52dca83911f960 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 12:16:01 +0100 Subject: [PATCH 046/103] =?UTF-8?q?Boutons=20de=20s=C3=A9lection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/plugin/view/index/index.css | 6 +- core/module/plugin/view/index/index.js.php | 20 ++++- core/module/plugin/view/index/index.php | 97 +++++++++++++--------- 3 files changed, 83 insertions(+), 40 deletions(-) diff --git a/core/module/plugin/view/index/index.css b/core/module/plugin/view/index/index.css index 52709ea6..fdb57b6f 100644 --- a/core/module/plugin/view/index/index.css +++ b/core/module/plugin/view/index/index.css @@ -15,4 +15,8 @@ /** NE PAS EFFACER * admin.css -*/ \ No newline at end of file +*/ + +.activeButton { + filter : brightness(150%); +} \ No newline at end of file diff --git a/core/module/plugin/view/index/index.js.php b/core/module/plugin/view/index/index.js.php index 6a5a69ee..060d7e18 100644 --- a/core/module/plugin/view/index/index.js.php +++ b/core/module/plugin/view/index/index.js.php @@ -29,4 +29,22 @@ $(".moduleDelete").on("click", function() { return core.confirm("Êtes-vous sûr de vouloir supprimer le module de cette page ?", function() { $(location).attr("href", _this.attr("href")); }); -}); \ No newline at end of file +}); + +// Sélecteur de fonctions + +$("#configManageModuleButton").on("click", function () { + console.log("clic"); + $("#manageDatas").hide(); + $("#manageModules").show(); + $("#configManageModuleButton").addClass("activeButton"); + $("#configManageDatasButton").removeClass("activeButton"); + setCookie("pluginLayout", "module"); +}); +$("#configManageDatasButton").on("click", function () { + $("#manageModules").hide(); + $("#manageDatas").show(); + $("#configManageModuleButton").removeClass("activeButton"); + $("#configManageDatasButton").addClass("activeButton"); + setCookie("pluginLayout", "data"); +}); diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 1b593a1b..16c83659 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -23,48 +23,69 @@ ]); ?>
    -
    -
    -
    -

    Sauvegarde des modules installés

    - -
    -
    +
    +
    +
    + 'Modules installés', + 'class' => 'activeButton' + ]); ?> +
    +
    + 'Données des modules' + ]); ?> +
    +
    +
    - - - - -
    -
    -
    -

    Désinstallation des modules orphelins

    - -
    -
    -
    - - -
    -
    -
    -

    Données des modules installés

    -
    -
    - helper::baseUrl() . 'plugin/dataImport', - 'value' => template::ico('upload'), - "help" => 'Importer des données de module dans une page libre' - ]); ?> -
    +
    + +
    +
    +
    +

    Sauvegarde des modules installés

    +
    -
    -
    - +
    +
    + + + + +
    +
    +
    +

    Désinstallation des modules orphelins

    + +
    +
    +
    + +
    +
    + +
    +
    +
    +

    Données des modules installés

    +
    +
    + helper::baseUrl() . 'plugin/dataImport', + 'value' => template::ico('upload'), + "help" => 'Importer des données de module dans une page libre' + ]); ?> +
    +
    +
    +
    + +
    -
    - \ No newline at end of file + +
    \ No newline at end of file From 957121d76ec1c3c2f545d39f4228d501487904af Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 4 Feb 2022 08:45:58 +0100 Subject: [PATCH 047/103] petites modifs ergonomie --- core/module/plugin/plugin.php | 6 ++--- core/module/plugin/view/index/index.php | 32 ++++++++++++++++++------- core/module/plugin/view/store/store.php | 9 +------ 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 5156254f..436d3e37 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -226,7 +226,7 @@ class plugin extends common { $state = $this->install(self::FILE_DIR.'source/'.$zipFilename, $checkValidMaj); } $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(), + 'redirect' => helper::baseUrl() . 'plugin', 'notification' => $state['notification'], 'state' => $state['success'] ]); @@ -310,7 +310,7 @@ class plugin extends common { // Module non installé $ico = template::ico('download'); $class = ''; - $help = 'Installer le module'; + $help = 'Télécharger le module'; // Le module est installé if (array_key_exists($key,$infoModules) === true) { $class = 'buttonGreen'; @@ -494,7 +494,7 @@ class plugin extends common { // Valeurs en sortie $this->addOutput([ - 'title' => 'Gestion des modules installés', + 'title' => 'Gestion des modules', 'view' => 'index' ]); } diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 16c83659..24ca3fe7 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -15,13 +15,6 @@ 'help' => 'Consulter l\'aide en ligne' ]); ?>
    -
    - helper::baseUrl() . 'plugin/store', - 'value' => template::ico('shopping-basket'), - "help" => 'Catalogue de modules en ligne' - ]); ?> -
    @@ -41,6 +34,27 @@
    +
    +
    +
    +

    Installation / mise à jour d'un module

    +
    +
    + helper::baseUrl() . 'plugin/store', + 'value' => template::ico('shopping-basket') . ' Catalogue en ligne' + ]); ?> +
    +
    + helper::baseUrl() . 'plugin/upload', + 'value' => template::ico('upload') . ' Depuis une archive ZIP' + ]); ?> +
    +
    +
    +
    +
    @@ -69,7 +83,7 @@
    -

    Données des modules installés

    +

    Modules configurés

    - +
    diff --git a/core/module/plugin/view/store/store.php b/core/module/plugin/view/store/store.php index 9aabc4a0..f06bf536 100644 --- a/core/module/plugin/view/store/store.php +++ b/core/module/plugin/view/store/store.php @@ -6,16 +6,9 @@ 'value' => template::ico('left') ]); ?>
    -
    - helper::baseUrl() . 'plugin/upload', - 'value' => template::ico('plus'), - "help" => 'Importer depuis une archive ZIP' - ]); ?> -
    - + \ No newline at end of file From 29fe8f84d8bcb25f55eee8cb5de021ee38340553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Mon, 17 Jan 2022 19:12:07 +0100 Subject: [PATCH 048/103] News v4.0 --- module/news/changes.md | 6 ++ module/news/news.php | 125 ++++++++++++++++------------- module/news/view/config/config.php | 85 ++------------------ module/news/view/layout/layout.css | 18 +++++ module/news/view/layout/layout.php | 93 +++++++++++++++++++++ 5 files changed, 191 insertions(+), 136 deletions(-) create mode 100644 module/news/changes.md create mode 100644 module/news/view/layout/layout.css create mode 100644 module/news/view/layout/layout.php diff --git a/module/news/changes.md b/module/news/changes.md new file mode 100644 index 00000000..ea0c25f1 --- /dev/null +++ b/module/news/changes.md @@ -0,0 +1,6 @@ +# Version 4 + - Config : le nombre d'objet est fixe, constante dans news.php + - Ecran layout réservé à la configuration et au thème + - Bug avec l'initialisation, fichier css déclaré mais absent + + A faire partie CSS à amléiorer au niveau des options \ No newline at end of file diff --git a/module/news/news.php b/module/news/news.php index c2dbdabd..1bb0ae6a 100644 --- a/module/news/news.php +++ b/module/news/news.php @@ -15,7 +15,7 @@ class news extends common { - const VERSION = '3.7'; + const VERSION = '4.0'; const REALNAME = 'News'; const DELETE = true; const UPDATE = '0.0'; @@ -23,7 +23,8 @@ class news extends common { public static $actions = [ 'add' => self::GROUP_MODERATOR, - 'config' => self::GROUP_MODERATOR, + 'config' => self::GROUP_MODERATOR, // Edition des news + 'layout' => self::GROUP_MODERATOR, // paramétrage des news 'delete' => self::GROUP_MODERATOR, 'edit' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, @@ -88,7 +89,8 @@ class news extends common { // Signature de l'article public static $articleSignature = ''; - + // Nombre d'articles dans la page de config: + public static $itemsperPage = 8; /** * Flux RSS @@ -189,10 +191,63 @@ class news extends common { // Mise à jour des données de module $this->update(); + // Ids des news par ordre de publication + $newsIds = array_keys(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC')); + // Pagination fixe + $pagination = helper::pagination($newsIds, $this->getUrl(),self::$itemsperPage ); + // Liste des pages + self::$pages = $pagination['pages']; + // News en fonction de la pagination + for($i = $pagination['first']; $i < $pagination['last']; $i++) { + // Met en forme le tableau + $dateOn = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true) + ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])) + : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))); + $dateOn .= ' à '; + $dateOn .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true) + ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])) + : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))); + if ($this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) { + $dateOff = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true) + ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) + : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))); + $dateOff .= ' à '; + $dateOff .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true) + ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) + : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))); + } else { + $dateOff = 'Permanent'; + } + self::$news[] = [ + $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'title']), + $dateOn, + $dateOff, + self::$states[$this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'state'])], + template::button('newsConfigEdit' . $newsIds[$i], [ + 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsIds[$i]. '/' . $_SESSION['csrf'], + 'value' => template::ico('pencil') + ]), + template::button('newsConfigDelete' . $newsIds[$i], [ + 'class' => 'newsConfigDelete buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $newsIds[$i] . '/' . $_SESSION['csrf'], + 'value' => template::ico('cancel') + ]) + ]; + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Configuration du module', + 'view' => 'config', + 'vendor' => [ + 'tinycolorpicker' + ] + ]); + } + + public function layout() { // Soumission du formulaire if($this->isPost()) { - // Générer la feuille de CSS $style = '.newsFrame {'; $style .= 'border:' . $this->getInput('newsThemeBorderStyle',helper::FILTER_STRING_SHORT) . ' ' . $this->getInput('newsThemeBorderColor') . ' ' . $this->getInput('newsThemeBorderWidth',helper::FILTER_STRING_SHORT) . ';'; @@ -217,69 +272,26 @@ class news extends common { ]]); $this->setData(['module', $this->getUrl(0), 'config',[ - 'feeds' => $this->getInput('newsConfigShowFeeds',helper::FILTER_BOOLEAN), - 'feedsLabel' => $this->getInput('newsConfigFeedslabel',helper::FILTER_STRING_SHORT), - 'itemsperPage' => $this->getInput('newsConfigItemsperPage', helper::FILTER_INT,true), - 'itemsperCol' => $this->getInput('newsConfigItemsperCol', helper::FILTER_INT,true), - 'height' => $this->getInput('newsConfigHeight', helper::FILTER_INT,true), + 'feeds' => $this->getInput('newsLayoutShowFeeds',helper::FILTER_BOOLEAN), + 'feedsLabel' => $this->getInput('newsLayoutFeedslabel',helper::FILTER_STRING_SHORT), + 'itemsperPage' => $this->getInput('newsLayoutItemsperPage', helper::FILTER_INT,true), + 'itemsperCol' => $this->getInput('newsLayoutItemsperCol', helper::FILTER_INT,true), + 'height' => $this->getInput('newsLayoutHeight', helper::FILTER_INT,true), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) ]]); // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/layout', 'notification' => 'Modifications enregistrées', 'state' => true ]); } else { - // Ids des news par ordre de publication - $newsIds = array_keys(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC')); - // Pagination - $pagination = helper::pagination($newsIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']) ); - // Liste des pages - self::$pages = $pagination['pages']; - // News en fonction de la pagination - for($i = $pagination['first']; $i < $pagination['last']; $i++) { - // Met en forme le tableau - $dateOn = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true) - ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])) - : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))); - $dateOn .= ' à '; - $dateOn .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])), 'UTF-8', true) - ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn'])) - : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOn']))); - if ($this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) { - $dateOff = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true) - ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) - : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))); - $dateOff .= ' à '; - $dateOff .= mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])), 'UTF-8', true) - ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff'])) - : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'publishedOff']))); - } else { - $dateOff = 'Permanent'; - } - self::$news[] = [ - $this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'title']), - $dateOn, - $dateOff, - self::$states[$this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'state'])], - template::button('newsConfigEdit' . $newsIds[$i], [ - 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsIds[$i]. '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') - ]), - template::button('newsConfigDelete' . $newsIds[$i], [ - 'class' => 'newsConfigDelete buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $newsIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') - ]) - ]; - } // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration du module', - 'view' => 'config', + 'title' => 'Mise en page', + 'view' => 'layout', 'vendor' => [ 'tinycolorpicker' ] @@ -435,8 +447,7 @@ class news extends common { $newsIds[] = $newsId; } } - // Pagination - //$pagination = helper::pagination($newsIds, $this->getUrl(),$this->getData(['config','itemsperPage'])); + // Pagination selon le layout $pagination = helper::pagination($newsIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0),'config', 'itemsperPage'])); // Nombre de colonnes self::$nbrCol = $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol']); diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 873c9a66..70b14434 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -16,87 +16,14 @@ ]); ?>
    - -
    -
    -
    -
    -
    -

    Paramètres du module

    -
    -
    - $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), - 'help' => 'Flux limité aux articles de la première page.' - ]); ?> -
    -
    - 'Etiquette RSS', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) - ]); ?> -
    -
    -
    -
    - 'Nombre de colonnes', - 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol']) - ]); ?> -
    -
    - 'Articles par page', - 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) - ]); ?> -
    -
    - 'Abrégé de l\'article', - 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'height']) - ]); ?> -
    -
    -
    -
    -
    -
    -
    -
    -

    Thème du module

    -
    -
    - 'Bordure', - 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderStyle']) - ]); ?> -
    -
    - 'Epaisseur', - 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderWidth']) - ]); ?> -
    -
    - 'colorPicker', - 'help' => 'Couleur visible en l\'absence d\'une image.
    Le curseur horizontal règle le niveau de transparence.', - 'label' => 'Couleur de la bordure', - 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'borderColor']) - ]); ?> -
    -
    - 'colorPicker', - 'help' => 'Couleur visible en l\'absence d\'une image.
    Le curseur horizontal règle le niveau de transparence.', - 'label' => 'Couleur du fond', - 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'backgroundColor']) - ]); ?> -
    -
    -
    + helper::baseUrl() . $this->getUrl(0) . '/layout', + 'ico' => 'puzzle', + 'value' => 'Mise en page' + ]); ?>
    + diff --git a/module/news/view/layout/layout.css b/module/news/view/layout/layout.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/module/news/view/layout/layout.css @@ -0,0 +1,18 @@ +/** + * 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-2022, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/module/news/view/layout/layout.php b/module/news/view/layout/layout.php new file mode 100644 index 00000000..06499a15 --- /dev/null +++ b/module/news/view/layout/layout.php @@ -0,0 +1,93 @@ + +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
    +
    + +
    +
    +
    +
    +
    +

    Paramètres du module

    +
    +
    + $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), + 'help' => 'Flux limité aux articles de la première page.' + ]); ?> +
    +
    + 'Etiquette RSS', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) + ]); ?> +
    +
    +
    +
    + 'Nombre de colonnes', + 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol']) + ]); ?> +
    +
    + 'Articles par page', + 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) + ]); ?> +
    +
    + 'Abrégé de l\'article', + 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'height']) + ]); ?> +
    +
    +
    +
    +
    +
    +
    +
    +

    Thème du module

    +
    +
    + 'Bordure', + 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderStyle']) + ]); ?> +
    +
    + 'Epaisseur', + 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderWidth']) + ]); ?> +
    +
    + 'colorPicker', + 'help' => 'Couleur visible en l\'absence d\'une image.
    Le curseur horizontal règle le niveau de transparence.', + 'label' => 'Couleur de la bordure', + 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'borderColor']) + ]); ?> +
    +
    + 'colorPicker', + 'help' => 'Couleur visible en l\'absence d\'une image.
    Le curseur horizontal règle le niveau de transparence.', + 'label' => 'Couleur du fond', + 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'backgroundColor']) + ]); ?> +
    +
    +
    +
    +
    + \ No newline at end of file From 195f6384697266a13c69d3f0623ceab9b7a853ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Mon, 17 Jan 2022 19:29:36 +0100 Subject: [PATCH 049/103] Gallery 3.4 --- module/gallery/changes.md | 2 ++ module/gallery/gallery.php | 2 +- module/gallery/view/config/config.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 module/gallery/changes.md diff --git a/module/gallery/changes.md b/module/gallery/changes.md new file mode 100644 index 00000000..5eaca775 --- /dev/null +++ b/module/gallery/changes.md @@ -0,0 +1,2 @@ +# version 3.4 + - Changement de nom du bouton Thème devient mise en page \ No newline at end of file diff --git a/module/gallery/gallery.php b/module/gallery/gallery.php index 37a8a0df..67483a83 100644 --- a/module/gallery/gallery.php +++ b/module/gallery/gallery.php @@ -17,7 +17,7 @@ class gallery extends common { - const VERSION = '3.3'; + const VERSION = '3.4'; const REALNAME = 'Galerie'; const DELETE = true; const UPDATE = '0.0'; diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index 91400a98..1901704b 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -11,7 +11,7 @@
    helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], - 'value' => template::ico('brush','right') . 'Thème' + 'value' => template::ico('brush','right') . 'Mise en page' ]); ?>
    From 615bf640a903566156459d7cc5c636276d5a8f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Mon, 17 Jan 2022 19:30:25 +0100 Subject: [PATCH 050/103] News 4.0 Icone bu bouton layout + version en bas du masque layout --- module/news/view/config/config.php | 2 +- module/news/view/layout/layout.php | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 70b14434..781ab96b 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -18,7 +18,7 @@
    helper::baseUrl() . $this->getUrl(0) . '/layout', - 'ico' => 'puzzle', + 'ico' => 'brush', 'value' => 'Mise en page' ]); ?>
    diff --git a/module/news/view/layout/layout.php b/module/news/view/layout/layout.php index 06499a15..44315e36 100644 --- a/module/news/view/layout/layout.php +++ b/module/news/view/layout/layout.php @@ -90,4 +90,7 @@
    - \ No newline at end of file + +
    Version n° + +
    \ No newline at end of file From 0e3c9e779bbb289f9368989f396aad42e9164340 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Mon, 17 Jan 2022 19:32:06 +0100 Subject: [PATCH 051/103] Blog 6.0 --- module/blog/blog.php | 172 ++++++++++++++++------------- module/blog/changes.md | 2 + module/blog/view/config/config.php | 34 +----- module/blog/view/layout/layout.css | 18 +++ module/blog/view/layout/layout.php | 47 ++++++++ 5 files changed, 165 insertions(+), 108 deletions(-) create mode 100644 module/blog/changes.md create mode 100644 module/blog/view/layout/layout.css create mode 100644 module/blog/view/layout/layout.php diff --git a/module/blog/blog.php b/module/blog/blog.php index 333a93dc..08222009 100644 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -15,7 +15,7 @@ class blog extends common { - const VERSION = '5.1'; + const VERSION = '6.0'; const REALNAME = 'Blog'; const DELETE = true; const UPDATE = '0.0'; @@ -32,6 +32,7 @@ class blog extends common { 'commentDelete' => self::GROUP_MODERATOR, 'commentDeleteAll' => self::GROUP_MODERATOR, 'config' => self::GROUP_MODERATOR, + 'layout' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, 'edit' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, @@ -100,6 +101,9 @@ class blog extends common { self::EDIT_OWNER => 'Propriétaire' ]; + // Nombre d'articles dans la page de config: + public static $itemsperPage = 8; + public static $users = []; @@ -398,103 +402,113 @@ class blog extends common { * Configuration */ public function config() { + + // Ids des articles par ordre de publication + $articleIds = array_keys(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC')); + // Gestion des droits d'accès + $filterData=[]; + foreach ($articleIds as $key => $value) { + if ( + ( // Propriétaire + $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_OWNER + AND ( $this->getData(['module', $this->getUrl(0), 'posts', $value,'userId']) === $this->getUser('id') + OR $this->getUser('group') === self::GROUP_ADMIN ) + ) + + OR ( + // Groupe + $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) !== self::EDIT_OWNER + AND $this->getUser('group') >= $this->getData(['module',$this->getUrl(0), 'posts', $value,'editConsent']) + ) + OR ( + // Tout le monde + $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_ALL + ) + ) { + $filterData[] = $value; + } + } + $articleIds = $filterData; + // Pagination + $pagination = helper::pagination($articleIds, $this->getUrl(),self::$itemsperPage); + // Liste des pages + self::$pages = $pagination['pages']; + // Articles en fonction de la pagination + for($i = $pagination['first']; $i < $pagination['last']; $i++) { + // Nombre de commentaires à approuver et approuvés + $approvals = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'comment' ]),'approval', 'SORT_DESC'); + if ( is_array($approvals) ) { + $a = array_values($approvals); + $toApprove = count(array_keys($a,false)); + $approved = count(array_keys($a,true)); + } else { + $toApprove = 0; + $approved = count($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i],'comment'])); + } + // Met en forme le tableau + $date = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true) + ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])) + : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))); + $heure = mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true) + ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])) + : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))); + self::$articles[] = [ + '' . + $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'title']) . + '', + $date .' à '. $heure, + self::$states[$this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'state'])], + // Bouton pour afficher les commentaires de l'article + template::button('blogConfigComment' . $articleIds[$i], [ + 'class' => ($toApprove || $approved ) > 0 ? '' : 'buttonGrey' , + 'href' => ($toApprove || $approved ) > 0 ? helper::baseUrl() . $this->getUrl(0) . '/comment/' . $articleIds[$i] : '', + 'value' => $toApprove > 0 ? $toApprove . '/' . $approved : $approved + ]), + template::button('blogConfigEdit' . $articleIds[$i], [ + 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $articleIds[$i] . '/' . $_SESSION['csrf'], + 'value' => template::ico('pencil') + ]), + template::button('blogConfigDelete' . $articleIds[$i], [ + 'class' => 'blogConfigDelete buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $articleIds[$i] . '/' . $_SESSION['csrf'], + 'value' => template::ico('cancel') + ]) + ]; + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Configuration du module', + 'view' => 'config' + ]); + } + + public function layout() { // Mise à jour des données de module $this->update(); // Soumission du formulaire if($this->isPost()) { $this->setData(['module', $this->getUrl(0), 'config',[ - 'feeds' => $this->getInput('blogConfigShowFeeds',helper::FILTER_BOOLEAN), - 'feedsLabel' => $this->getInput('blogConfigFeedslabel',helper::FILTER_STRING_SHORT), - 'itemsperPage' => $this->getInput('blogConfigItemsperPage', helper::FILTER_INT,true), + 'feeds' => $this->getInput('blogLayoutShowFeeds',helper::FILTER_BOOLEAN), + 'feedsLabel' => $this->getInput('blogLayoutFeedslabel',helper::FILTER_STRING_SHORT), + 'itemsperPage' => $this->getInput('blogLayoutItemsperPage', helper::FILTER_INT,true), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) ]]); // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/layout', 'notification' => 'Modifications enregistrées', 'state' => true ]); } else { - // Ids des articles par ordre de publication - $articleIds = array_keys(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts']), 'publishedOn', 'SORT_DESC')); - // Gestion des droits d'accès - $filterData=[]; - foreach ($articleIds as $key => $value) { - if ( - ( // Propriétaire - $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_OWNER - AND ( $this->getData(['module', $this->getUrl(0), 'posts', $value,'userId']) === $this->getUser('id') - OR $this->getUser('group') === self::GROUP_ADMIN ) - ) - - OR ( - // Groupe - $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) !== self::EDIT_OWNER - AND $this->getUser('group') >= $this->getData(['module',$this->getUrl(0), 'posts', $value,'editConsent']) - ) - OR ( - // Tout le monde - $this->getData(['module', $this->getUrl(0), 'posts', $value,'editConsent']) === self::EDIT_ALL - ) - ) { - $filterData[] = $value; - } - } - $articleIds = $filterData; - // Pagination - $pagination = helper::pagination($articleIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0),'config', 'itemsperPage'])); - // Liste des pages - self::$pages = $pagination['pages']; - // Articles en fonction de la pagination - for($i = $pagination['first']; $i < $pagination['last']; $i++) { - // Nombre de commentaires à approuver et approuvés - $approvals = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'comment' ]),'approval', 'SORT_DESC'); - if ( is_array($approvals) ) { - $a = array_values($approvals); - $toApprove = count(array_keys($a,false)); - $approved = count(array_keys($a,true)); - } else { - $toApprove = 0; - $approved = count($this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i],'comment'])); - } - // Met en forme le tableau - $date = mb_detect_encoding(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true) - ? strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])) - : utf8_encode(strftime('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))); - $heure = mb_detect_encoding(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])), 'UTF-8', true) - ? strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn'])) - : utf8_encode(strftime('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'publishedOn']))); - self::$articles[] = [ - '' . - $this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'title']) . - '', - $date .' à '. $heure, - self::$states[$this->getData(['module', $this->getUrl(0), 'posts', $articleIds[$i], 'state'])], - // Bouton pour afficher les commentaires de l'article - template::button('blogConfigComment' . $articleIds[$i], [ - 'class' => ($toApprove || $approved ) > 0 ? '' : 'buttonGrey' , - 'href' => ($toApprove || $approved ) > 0 ? helper::baseUrl() . $this->getUrl(0) . '/comment/' . $articleIds[$i] : '', - 'value' => $toApprove > 0 ? $toApprove . '/' . $approved : $approved - ]), - template::button('blogConfigEdit' . $articleIds[$i], [ - 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $articleIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') - ]), - template::button('blogConfigDelete' . $articleIds[$i], [ - 'class' => 'blogConfigDelete buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $articleIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') - ]) - ]; - } // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration du module', - 'view' => 'config' + 'title' => 'Mise en page', + 'view' => 'layout' ]); } } + /** * Suppression */ diff --git a/module/blog/changes.md b/module/blog/changes.md new file mode 100644 index 00000000..6a7d7be0 --- /dev/null +++ b/module/blog/changes.md @@ -0,0 +1,2 @@ +# version 6 + - mise à la norme avec le module news : le formulaire est sorti de l'écran principal \ No newline at end of file diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 736151c9..0430fdb2 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -16,35 +16,11 @@ ]); ?>
    - -
    -
    -
    -
    -
    -

    Paramètres du module

    -
    -
    - $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), - ]); ?> -
    -
    - 'Texte de l\'étiquette', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) - ]); ?> -
    -
    -
    -
    - 'Articles par page', - 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) - ]); ?> -
    -
    -
    + helper::baseUrl() . $this->getUrl(0) . '/layout', + 'ico' => 'brush', + 'value' => 'Mise en page' + ]); ?>
    diff --git a/module/blog/view/layout/layout.css b/module/blog/view/layout/layout.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/module/blog/view/layout/layout.css @@ -0,0 +1,18 @@ +/** + * 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-2022, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/module/blog/view/layout/layout.php b/module/blog/view/layout/layout.php new file mode 100644 index 00000000..f845302b --- /dev/null +++ b/module/blog/view/layout/layout.php @@ -0,0 +1,47 @@ + +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
    +
    + +
    +
    +
    +
    +
    +

    Paramètres du module

    +
    +
    + $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), + ]); ?> +
    +
    + 'Texte de l\'étiquette', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) + ]); ?> +
    +
    +
    +
    + 'Articles par page', + 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) + ]); ?> +
    +
    +
    +
    +
    + +
    Version n° + +
    + From 18a17e55767e6d74a32ab05e115567ffb5dd0690 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Tue, 18 Jan 2022 16:55:48 +0100 Subject: [PATCH 052/103] Form 3.0 WIP --- module/form/form.php | 113 +++++++++++++----- module/form/view/config/config.js.php | 93 +++------------ module/form/view/config/config.php | 164 ++++++-------------------- module/form/view/index/index.php | 2 + module/form/view/layout/layout.css | 18 +++ module/form/view/layout/layout.js.php | 72 +++++++++++ module/form/view/layout/layout.php | 144 ++++++++++++++++++++++ 7 files changed, 372 insertions(+), 234 deletions(-) create mode 100644 module/form/view/layout/layout.css create mode 100644 module/form/view/layout/layout.js.php create mode 100644 module/form/view/layout/layout.php diff --git a/module/form/form.php b/module/form/form.php index 627ad4da..af1b181f 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -16,7 +16,7 @@ class form extends common { - const VERSION = '2.11'; + const VERSION = '3.0'; const REALNAME = 'Formulaire'; const DELETE = true; const UPDATE = '0.0'; @@ -24,6 +24,7 @@ class form extends common { public static $actions = [ 'config' => self::GROUP_MODERATOR, + 'layout' => self::GROUP_MODERATOR, 'data' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, 'deleteall' => self::GROUP_MODERATOR, @@ -38,6 +39,9 @@ class form extends common { public static $pagination; + // Nombre d'articles dans la page de config: + public static $itemperPage = 20; + // Objets const TYPE_MAIL = 'mail'; @@ -75,38 +79,31 @@ class form extends common { '100' => '100%' ]; + public static $formOffset = [ + 'none' => 'Aucune', + '1' => 'Une colonne', + '2' => 'Deux colonnes', + '3' => 'Trois colonnes', + '4' => 'Quatre colonnes', + ]; + + public static $formWidth = [ + '6' => 'Six colonne', + '7' => 'Sept colonnes', + '8' => 'Huit colonnes', + '9' => 'Neuf colonnes', + '10' => 'Dix colonnes', + '11' => 'Onze colonnes', + '12' => 'Douze colonnes', + ]; + + /** * Configuration */ public function config() { - // Liste des utilisateurs - $userIdsFirstnames = helper::arrayCollumn($this->getData(['user']), 'firstname'); - ksort($userIdsFirstnames); - self::$listUsers [] = ''; - foreach($userIdsFirstnames as $userId => $userFirstname) { - self::$listUsers [] = $userId; - } // Soumission du formulaire if($this->isPost()) { - // Configuration - $this->setData([ - 'module', - $this->getUrl(0), - 'config', - [ - 'button' => $this->getInput('formConfigButton'), - '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' => $this->getInput('formConfigPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formConfigPageId', helper::FILTER_ID) : '', - 'subject' => $this->getInput('formConfigSubject'), - 'replyto' => $this->getInput('formConfigMailReplyTo', helper::FILTER_BOOLEAN), - 'signature' => $this->getInput('formConfigSignature'), - 'logoUrl' => $this->getInput('formConfigLogo'), - 'logoWidth' => $this->getInput('formConfigLogoWidth') - ] - ]); // Génération des données vides if ($this->getData(['module', $this->getUrl(0), 'data']) === null) { $this->setData(['module', $this->getUrl(0), 'data', []]); @@ -148,6 +145,66 @@ class form extends common { ]); } + + public function layout() { + // Liste des utilisateurs + $userIdsFirstnames = helper::arrayCollumn($this->getData(['user']), 'firstname'); + ksort($userIdsFirstnames); + self::$listUsers [] = ''; + foreach ($userIdsFirstnames as $userId => $userFirstname) { + self::$listUsers [] = $userId; + } + // Soumission du formulaire + if ($this->isPost()) { + // Configuration + $this->setData([ + 'module', + $this->getUrl(0), + 'config', + [ + 'button' => $this->getInput('formLayoutButton'), + 'captcha' => $this->getInput('formLayoutCaptcha', helper::FILTER_BOOLEAN), + 'group' => $this->getInput('formLayoutGroup', helper::FILTER_INT), + 'user' => self::$listUsers [$this->getInput('formLayoutUser', helper::FILTER_INT)], + 'mail' => $this->getInput('formLayoutMail') , + 'pageId' => $this->getInput('formLayoutPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formLayoutPageId', helper::FILTER_ID) : '', + 'subject' => $this->getInput('formLayoutSubject'), + 'replyto' => $this->getInput('formLayoutMailReplyTo', helper::FILTER_BOOLEAN), + 'signature' => $this->getInput('formLayoutSignature'), + 'logoUrl' => $this->getInput('formLayoutLogo'), + 'logoWidth' => $this->getInput('formLayoutLogoWidth') + ] + ]); + // Génération des données vides + if ($this->getData(['module', $this->getUrl(0), 'data']) === null) { + $this->setData(['module', $this->getUrl(0), 'data', []]); + } + // Valeurs en sortie + $this->addOutput([ + 'notification' => 'Modifications enregistrées', + 'redirect' => helper::baseUrl() . $this->getUrl(), + 'state' => true + ]); + } else { + // Liste des pages + foreach($this->getHierarchy(null, false) as $parentPageId => $childrenPageIds) { + self::$pages[$parentPageId] = $this->getData(['page', $parentPageId, 'title']); + foreach($childrenPageIds as $childKey) { + self::$pages[$childKey] = '    ' . $this->getData(['page', $childKey, 'title']); + } + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Paramètres', + 'vendor' => [ + 'html-sortable', + 'flatpickr' + ], + 'view' => 'layout' + ]); + } + } + /** * Données enregistrées */ @@ -155,7 +212,7 @@ class form extends common { $data = $this->getData(['module', $this->getUrl(0), 'data']); if($data) { // Pagination - $pagination = helper::pagination($data, $this->getUrl(),self::ITEMSPAGE); + $pagination = helper::pagination($data, $this->getUrl(), self::$itemsperPages); // Liste des pages self::$pages = $pagination['pages']; // Inverse l'ordre du tableau diff --git a/module/form/view/config/config.js.php b/module/form/view/config/config.js.php index 1522ee3d..2d64a2aa 100644 --- a/module/form/view/config/config.js.php +++ b/module/form/view/config/config.js.php @@ -54,6 +54,15 @@ function add(inputUid, input) { position(); } +/** + * Afficher/cacher les options supplémentaires + */ + $(document).on("click", ".formConfigMoreToggle", function() { + + $(this).parents(".formConfigInput").find(".formConfigMore").slideToggle(); + $(this).parents(".formConfigInput").find(".formConfigMoreLabel").slideToggle(); +}); + /** * Calcul des positions */ @@ -76,14 +85,6 @@ if(inputs) { }); } -/** - * Afficher/cacher les options supplémentaires - */ -$(document).on("click", ".formConfigMoreToggle", function() { - - $(this).parents(".formConfigInput").find(".formConfigMore").slideToggle(); - $(this).parents(".formConfigInput").find(".formConfigMoreLabel").slideToggle(); -}); /** * Crée un nouveau champ à partir des champs cachés @@ -96,6 +97,12 @@ $("#formConfigAdd").on("click", function() { /** * Actions sur les champs */ + +// Validation auto après ajout d'un champ +$("a#formConfigAdd.button").click(function () { + $("#formConfigForm").submit(); +}); + // Tri entre les champs sortable("#formConfigInputs", { forcePlaceholderSize: true, @@ -143,73 +150,3 @@ $("#formConfigInputs") }); // Simule un changement de type au chargement de la page $(".formConfigType").trigger("change"); - -/** - * Affiche/cache les options de la case à cocher du mail - */ -$("#formConfigMailOptionsToggle").on("change", function() { - if($(this).is(":checked")) { - $("#formConfigMailOptions").slideDown(); - } - else { - $("#formConfigMailOptions").slideUp(function() { - $("#formConfigGroup").val(""); - $("#formConfigSubject").val(""); - $("#formConfigMail").val(""); - $("#formConfigUser").val(""); - }); - } -}).trigger("change"); - -/** - * Affiche/cache les options de la case à cocher de la redirection - */ -$("#formConfigPageIdToggle").on("change", function() { - if($(this).is(":checked")) { - $("#formConfigPageIdWrapper").slideDown(); - } - else { - $("#formConfigPageIdWrapper").slideUp(function() { - $("#formConfigPageId").val(""); - }); - } -}).trigger("change"); - -/** -* Paramètres par défaut au chargement -*/ -$( document ).ready(function() { - - /** - * Masquer ou afficher la sélection du logo - */ - if ($("#formConfigSignature").val() !== "text") { - $("#formConfigLogoWrapper").addClass("disabled"); - $("#formConfigLogoWrapper").slideDown(); - $("#formConfigLogoWidthWrapper").addClass("disabled"); - $("#formConfigLogoWidthWrapper").slideDown(); - } else { - $("#formConfigLogoWrapper").removeClass("disabled"); - $("#formConfigLogoWrapper").slideUp(); - $("#formConfigLogoWidthWrapper").removeClass("disabled"); - $("#formConfigLogoWidthWrapper").slideUp(); - } -}); - -/** - * Masquer ou afficher la sélection du logo - */ -var formConfigSignatureDOM = $("#formConfigSignature"); -formConfigSignatureDOM.on("change", function() { - if ($(this).val() !== "text") { - $("#formConfigLogoWrapper").addClass("disabled"); - $("#formConfigLogoWrapper").slideDown(); - $("#formConfigLogoWidthWrapper").addClass("disabled"); - $("#formConfigLogoWidthWrapper").slideDown(); - } else { - $("#formConfigLogoWrapper").removeClass("disabled"); - $("#formConfigLogoWrapper").slideUp(); - $("#formConfigLogoWidthWrapper").removeClass("disabled"); - $("#formConfigLogoWidthWrapper").slideUp(); - } -}); diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 6631a20a..60cf1b6c 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -49,140 +49,48 @@
    -
    -
    - 'buttonGrey', - 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' - ]); ?> -
    -
    - helper::baseUrl() . $this->getUrl(0) . '/data', - 'value' => 'Gérer les données' - ]); ?> -
    -
    +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
    +
    + helper::baseUrl() . $this->getUrl(0) . '/data', + 'value' => 'Données' + ]); ?> +
    +
    + helper::baseUrl() . $this->getUrl(0) . '/layout', + 'value' => 'Paramètres', + 'ico' => 'cog-alt' + ]); ?> +
    +
    +
    +
    +

    Liste des champs

    +
    +
    +
    -
    -
    -

    Configuration

    - 'Laissez vide afin de conserver le texte par défaut.', - 'label' => 'Texte du bouton de soumission', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) - ]); ?> - (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || - !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.' - ]); ?> -
    -
    -
    - 'Laissez vide afin de conserver le texte par défaut.', - 'label' => 'Sujet du mail', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) - ]); ?> -
    -
    - -
    -
    - 'Aux groupes à partir de', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), - 'help' => 'Editeurs = éditeurs + administrateurs
    Membres = membres + éditeurs + administrateurs' - ]); ?> -
    -
    - 'A un membre', - 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) - ]); ?> -
    -
    - 'A une adresse email', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), - 'help' => 'Un email ou une liste de diffusion' - ]); ?> -
    -
    -
    -
    - (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.' - ]); ?> -
    -
    -
    -
    -
    - 'Sélectionner le type de signature', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) - ]); ?> -
    -
    - 'Sélectionnez le logo du site', - 'label' => 'Logo', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) - ]); ?> -
    -
    - 'Sélectionner la largeur du logo', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) - ]); ?> -
    -
    -
    -
    - (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) - ]); ?> -
    -
    - 'displayNone', - 'label' => 'Sélectionner une page du site :', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) - ]); ?> -
    -
    - $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) - ]); ?> -
    -
    -

    Liste des champs

    -
    - -
    -
    -
    -
    - template::ico('plus') - ]); ?> -
    -
    -
    +
    + template::ico('plus'), + 'class' => 'buttonGreen' + ]); ?>
    +
    +
    Version n° diff --git a/module/form/view/index/index.php b/module/form/view/index/index.php index 6eba5cc9..8d3b9a91 100644 --- a/module/form/view/index/index.php +++ b/module/form/view/index/index.php @@ -1,4 +1,5 @@ getData(['module', $this->getUrl(0), 'input'])): ?> +
    getData(['module', $this->getUrl(0), 'input']) as $index => $input): ?> @@ -61,6 +62,7 @@ ]); ?>
    +
    diff --git a/module/form/view/layout/layout.css b/module/form/view/layout/layout.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/module/form/view/layout/layout.css @@ -0,0 +1,18 @@ +/** + * 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-2022, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/module/form/view/layout/layout.js.php b/module/form/view/layout/layout.js.php new file mode 100644 index 00000000..8970a0fe --- /dev/null +++ b/module/form/view/layout/layout.js.php @@ -0,0 +1,72 @@ + + + +/* +* Affiche/cache les options de la case à cocher du mail +*/ +$("#formLayoutMailOptionsToggle").on("change", function() { + if($(this).is(":checked")) { + $("#formLayoutMailOptions").slideDown(); + } + else { + $("#formLayoutMailOptions").slideUp(function() { + $("#formLayoutGroup").val(""); + $("#formLayoutSubject").val(""); + $("#formLayoutMail").val(""); + $("#formLayoutUser").val(""); + }); + } +}).trigger("change"); + +/** +* Affiche/cache les options de la case à cocher de la redirection +*/ +$("#formLayoutPageIdToggle").on("change", function() { + if($(this).is(":checked")) { + $("#formLayoutPageIdWrapper").slideDown(); + } + else { + $("#formLayoutPageIdWrapper").slideUp(function() { + $("#formLayoutPageId").val(""); + }); + } +}).trigger("change"); + +/** +* Paramètres par défaut au chargement +*/ +$( document ).ready(function() { + + /** + * Masquer ou afficher la sélection du logo + */ + if ($("#formLayoutSignature").val() !== "text") { + $("#formLayoutLogoWrapper").addClass("disabled"); + $("#formLayoutLogoWrapper").slideDown(); + $("#formLayoutLogoWidthWrapper").addClass("disabled"); + $("#formLayoutLogoWidthWrapper").slideDown(); + } else { + $("#formLayoutLogoWrapper").removeClass("disabled"); + $("#formLayoutLogoWrapper").slideUp(); + $("#formLayoutLogoWidthWrapper").removeClass("disabled"); + $("#formLayoutLogoWidthWrapper").slideUp(); + } +}); + +/** +* Masquer ou afficher la sélection du logo +*/ +var formLayoutSignatureDOM = $("#formLayoutSignature"); +formLayoutSignatureDOM.on("change", function() { + if ($(this).val() !== "text") { + $("#formLayoutLogoWrapper").addClass("disabled"); + $("#formLayoutLogoWrapper").slideDown(); + $("#formLayoutLogoWidthWrapper").addClass("disabled"); + $("#formLayoutLogoWidthWrapper").slideDown(); + } else { + $("#formLayoutLogoWrapper").removeClass("disabled"); + $("#formLayoutLogoWrapper").slideUp(); + $("#formLayoutLogoWidthWrapper").removeClass("disabled"); + $("#formLayoutLogoWidthWrapper").slideUp(); + } +}); \ No newline at end of file diff --git a/module/form/view/layout/layout.php b/module/form/view/layout/layout.php new file mode 100644 index 00000000..83e80079 --- /dev/null +++ b/module/form/view/layout/layout.php @@ -0,0 +1,144 @@ + +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
    +
    + +
    +
    +
    +
    +
    +

    Validation du formulaire

    +
    +
    + $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) + ]); ?> +
    +
    + 'Laissez vide afin de conserver le texte par défaut.', + 'label' => 'Etiquette du bouton de soumission', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) + ]); ?> +
    +
    +
    +
    + (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) + ]); ?> +
    +
    + 'displayNone', + 'label' => 'Page du site :', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) + ]); ?> +
    +
    +
    +
    +
    +
    +
    +
    +

    Courriel

    + (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || + !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 saisissez un email. Votre serveur doit autoriser les envois de mail.' + ]); ?> +
    +
    +
    + 'Laissez vide afin de conserver le texte par défaut.', + 'label' => 'Sujet du mail', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) + ]); ?> +
    +
    + +
    +
    + 'Aux groupes à partir de', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), + 'help' => 'Editeurs = éditeurs + administrateurs
    Membres = membres + éditeurs + administrateurs' + ]); ?> +
    +
    + 'A un membre', + 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) + ]); ?> +
    +
    + 'A une adresse email', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), + 'help' => 'Un email ou une liste de diffusion' + ]); ?> +
    +
    +
    +
    + 'Sélectionner le type de signature', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) + ]); ?> +
    +
    + 'Sélectionnez le logo du site', + 'label' => 'Logo', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) + ]); ?> +
    +
    + 'Sélectionner la largeur du logo', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) + ]); ?> +
    +
    +
    +
    + (bool) $this->getData(['module', $this->getUrl(0), 'config', 'replyto']), + 'help' => 'Cette option permet de réponse directement à l\'expéditeur du message si celui-ci a indiqué un email valide.' + ]); ?> +
    +
    +
    +
    +
    +
    +
    +
    +
    +

    Gabarit

    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    \ No newline at end of file From 5be1f4641f2fa844cdaa4480199e0f9dcdd05fc5 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Wed, 19 Jan 2022 11:43:16 +0100 Subject: [PATCH 053/103] layout -> option --- module/form/form.php | 28 ++++---- module/form/view/config/config.php | 4 +- module/form/view/layout/layout.js.php | 72 ------------------- .../{layout/layout.css => option/option.css} | 0 module/form/view/option/option.js.php | 72 +++++++++++++++++++ .../{layout/layout.php => option/option.php} | 34 ++++----- 6 files changed, 105 insertions(+), 105 deletions(-) delete mode 100644 module/form/view/layout/layout.js.php rename module/form/view/{layout/layout.css => option/option.css} (100%) create mode 100644 module/form/view/option/option.js.php rename module/form/view/{layout/layout.php => option/option.php} (84%) diff --git a/module/form/form.php b/module/form/form.php index af1b181f..e677542b 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -24,7 +24,7 @@ class form extends common { public static $actions = [ 'config' => self::GROUP_MODERATOR, - 'layout' => self::GROUP_MODERATOR, + 'option' => self::GROUP_MODERATOR, 'data' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, 'deleteall' => self::GROUP_MODERATOR, @@ -146,7 +146,7 @@ class form extends common { } - public function layout() { + public function option() { // Liste des utilisateurs $userIdsFirstnames = helper::arrayCollumn($this->getData(['user']), 'firstname'); ksort($userIdsFirstnames); @@ -162,17 +162,17 @@ class form extends common { $this->getUrl(0), 'config', [ - 'button' => $this->getInput('formLayoutButton'), - 'captcha' => $this->getInput('formLayoutCaptcha', helper::FILTER_BOOLEAN), - 'group' => $this->getInput('formLayoutGroup', helper::FILTER_INT), - 'user' => self::$listUsers [$this->getInput('formLayoutUser', helper::FILTER_INT)], - 'mail' => $this->getInput('formLayoutMail') , - 'pageId' => $this->getInput('formLayoutPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formLayoutPageId', helper::FILTER_ID) : '', - 'subject' => $this->getInput('formLayoutSubject'), - 'replyto' => $this->getInput('formLayoutMailReplyTo', helper::FILTER_BOOLEAN), - 'signature' => $this->getInput('formLayoutSignature'), - 'logoUrl' => $this->getInput('formLayoutLogo'), - 'logoWidth' => $this->getInput('formLayoutLogoWidth') + 'button' => $this->getInput('formOptionButton'), + 'captcha' => $this->getInput('formOptionCaptcha', helper::FILTER_BOOLEAN), + 'group' => $this->getInput('formOptionGroup', helper::FILTER_INT), + 'user' => self::$listUsers [$this->getInput('formOptionUser', helper::FILTER_INT)], + 'mail' => $this->getInput('formOptionMail') , + 'pageId' => $this->getInput('formOptionPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formOptionPageId', helper::FILTER_ID) : '', + 'subject' => $this->getInput('formOptionSubject'), + 'replyto' => $this->getInput('formOptionMailReplyTo', helper::FILTER_BOOLEAN), + 'signature' => $this->getInput('formOptionSignature'), + 'logoUrl' => $this->getInput('formOptionLogo'), + 'logoWidth' => $this->getInput('formOptionLogoWidth') ] ]); // Génération des données vides @@ -200,7 +200,7 @@ class form extends common { 'html-sortable', 'flatpickr' ], - 'view' => 'layout' + 'view' => 'option' ]); } } diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 60cf1b6c..e992f834 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -66,8 +66,8 @@
    helper::baseUrl() . $this->getUrl(0) . '/layout', - 'value' => 'Paramètres', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/option', + 'value' => 'Options', 'ico' => 'cog-alt' ]); ?>
    diff --git a/module/form/view/layout/layout.js.php b/module/form/view/layout/layout.js.php deleted file mode 100644 index 8970a0fe..00000000 --- a/module/form/view/layout/layout.js.php +++ /dev/null @@ -1,72 +0,0 @@ - - - -/* -* Affiche/cache les options de la case à cocher du mail -*/ -$("#formLayoutMailOptionsToggle").on("change", function() { - if($(this).is(":checked")) { - $("#formLayoutMailOptions").slideDown(); - } - else { - $("#formLayoutMailOptions").slideUp(function() { - $("#formLayoutGroup").val(""); - $("#formLayoutSubject").val(""); - $("#formLayoutMail").val(""); - $("#formLayoutUser").val(""); - }); - } -}).trigger("change"); - -/** -* Affiche/cache les options de la case à cocher de la redirection -*/ -$("#formLayoutPageIdToggle").on("change", function() { - if($(this).is(":checked")) { - $("#formLayoutPageIdWrapper").slideDown(); - } - else { - $("#formLayoutPageIdWrapper").slideUp(function() { - $("#formLayoutPageId").val(""); - }); - } -}).trigger("change"); - -/** -* Paramètres par défaut au chargement -*/ -$( document ).ready(function() { - - /** - * Masquer ou afficher la sélection du logo - */ - if ($("#formLayoutSignature").val() !== "text") { - $("#formLayoutLogoWrapper").addClass("disabled"); - $("#formLayoutLogoWrapper").slideDown(); - $("#formLayoutLogoWidthWrapper").addClass("disabled"); - $("#formLayoutLogoWidthWrapper").slideDown(); - } else { - $("#formLayoutLogoWrapper").removeClass("disabled"); - $("#formLayoutLogoWrapper").slideUp(); - $("#formLayoutLogoWidthWrapper").removeClass("disabled"); - $("#formLayoutLogoWidthWrapper").slideUp(); - } -}); - -/** -* Masquer ou afficher la sélection du logo -*/ -var formLayoutSignatureDOM = $("#formLayoutSignature"); -formLayoutSignatureDOM.on("change", function() { - if ($(this).val() !== "text") { - $("#formLayoutLogoWrapper").addClass("disabled"); - $("#formLayoutLogoWrapper").slideDown(); - $("#formLayoutLogoWidthWrapper").addClass("disabled"); - $("#formLayoutLogoWidthWrapper").slideDown(); - } else { - $("#formLayoutLogoWrapper").removeClass("disabled"); - $("#formLayoutLogoWrapper").slideUp(); - $("#formLayoutLogoWidthWrapper").removeClass("disabled"); - $("#formLayoutLogoWidthWrapper").slideUp(); - } -}); \ No newline at end of file diff --git a/module/form/view/layout/layout.css b/module/form/view/option/option.css similarity index 100% rename from module/form/view/layout/layout.css rename to module/form/view/option/option.css diff --git a/module/form/view/option/option.js.php b/module/form/view/option/option.js.php new file mode 100644 index 00000000..2148e0c6 --- /dev/null +++ b/module/form/view/option/option.js.php @@ -0,0 +1,72 @@ + + + +/* +* Affiche/cache les options de la case à cocher du mail +*/ +$("#formOptionMailOptionsToggle").on("change", function() { + if($(this).is(":checked")) { + $("#formOptionMailOptions").slideDown(); + } + else { + $("#formOptionMailOptions").slideUp(function() { + $("#formOptionGroup").val(""); + $("#formOptionSubject").val(""); + $("#formOptionMail").val(""); + $("#formOptionUser").val(""); + }); + } +}).trigger("change"); + +/** +* Affiche/cache les options de la case à cocher de la redirection +*/ +$("#formOptionPageIdToggle").on("change", function() { + if($(this).is(":checked")) { + $("#formOptionPageIdWrapper").slideDown(); + } + else { + $("#formOptionPageIdWrapper").slideUp(function() { + $("#formOptionPageId").val(""); + }); + } +}).trigger("change"); + +/** +* Paramètres par défaut au chargement +*/ +$( document ).ready(function() { + + /** + * Masquer ou afficher la sélection du logo + */ + if ($("#formOptionSignature").val() !== "text") { + $("#formOptionLogoWrapper").addClass("disabled"); + $("#formOptionLogoWrapper").slideDown(); + $("#formOptionLogoWidthWrapper").addClass("disabled"); + $("#formOptionLogoWidthWrapper").slideDown(); + } else { + $("#formOptionLogoWrapper").removeClass("disabled"); + $("#formOptionLogoWrapper").slideUp(); + $("#formOptionLogoWidthWrapper").removeClass("disabled"); + $("#formOptionLogoWidthWrapper").slideUp(); + } +}); + +/** +* Masquer ou afficher la sélection du logo +*/ +var formOptionSignatureDOM = $("#formOptionSignature"); +formOptionSignatureDOM.on("change", function() { + if ($(this).val() !== "text") { + $("#formOptionLogoWrapper").addClass("disabled"); + $("#formOptionLogoWrapper").slideDown(); + $("#formOptionLogoWidthWrapper").addClass("disabled"); + $("#formOptionLogoWidthWrapper").slideDown(); + } else { + $("#formOptionLogoWrapper").removeClass("disabled"); + $("#formOptionLogoWrapper").slideUp(); + $("#formOptionLogoWidthWrapper").removeClass("disabled"); + $("#formOptionLogoWidthWrapper").slideUp(); + } +}); \ No newline at end of file diff --git a/module/form/view/layout/layout.php b/module/form/view/option/option.php similarity index 84% rename from module/form/view/layout/layout.php rename to module/form/view/option/option.php index 83e80079..b9aa005c 100644 --- a/module/form/view/layout/layout.php +++ b/module/form/view/option/option.php @@ -1,7 +1,7 @@ - +
    - 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'ico' => 'left', @@ -9,7 +9,7 @@ ]); ?>
    - +
    @@ -18,12 +18,12 @@

    Validation du formulaire

    - $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) ]); ?>
    - 'Laissez vide afin de conserver le texte par défaut.', 'label' => 'Etiquette du bouton de soumission', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) @@ -32,12 +32,12 @@
    - (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) ]); ?>
    - 'displayNone', 'label' => 'Page du site :', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) @@ -51,16 +51,16 @@

    Courriel

    - (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || !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 saisissez un email. Votre serveur doit autoriser les envois de mail.' ]); ?> -
    +
    - 'Laissez vide afin de conserver le texte par défaut.', 'label' => 'Sujet du mail', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) @@ -73,20 +73,20 @@ ?>
    - 'Aux groupes à partir de', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), 'help' => 'Editeurs = éditeurs + administrateurs
    Membres = membres + éditeurs + administrateurs' ]); ?>
    - 'A un membre', 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) ]); ?>
    - 'A une adresse email', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), 'help' => 'Un email ou une liste de diffusion' @@ -95,20 +95,20 @@
    - 'Sélectionner le type de signature', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) ]); ?>
    - 'Sélectionnez le logo du site', 'label' => 'Logo', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) ]); ?>
    - 'Sélectionner la largeur du logo', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) ]); ?> @@ -116,7 +116,7 @@
    - (bool) $this->getData(['module', $this->getUrl(0), 'config', 'replyto']), 'help' => 'Cette option permet de réponse directement à l\'expéditeur du message si celui-ci a indiqué un email valide.' ]); ?> From b03488c6891494c26ae153f5b7ff1a7672adbd79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Thu, 13 Jan 2022 18:11:29 +0100 Subject: [PATCH 054/103] relative_url --- core/vendor/tinymce/init.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/vendor/tinymce/init.js b/core/vendor/tinymce/init.js index 6daa4b89..b5d300d6 100755 --- a/core/vendor/tinymce/init.js +++ b/core/vendor/tinymce/init.js @@ -114,7 +114,7 @@ tinymce.init({ // Active l'onglet avancé lors de l'ajout d'une image image_advtab: true, // Urls absolues - relative_urls: false, + relative_urls: true, // Url de base document_base_url: baseUrl, // Gestionnaire de fichiers From 323147ac85c1bf3f8c7a14b94ef2c94a1e4ab0a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Thu, 13 Jan 2022 18:31:20 +0100 Subject: [PATCH 055/103] toutes url relatives --- core/core.php | 21 ++++++ core/include/update.inc.php | 48 +++++++++++++ core/module/config/config.php | 76 --------------------- core/module/config/view/restore/restore.php | 42 ------------ 4 files changed, 69 insertions(+), 118 deletions(-) diff --git a/core/core.php b/core/core.php index 8baa5512..7c79254e 100644 --- a/core/core.php +++ b/core/core.php @@ -1179,6 +1179,27 @@ class common { } + /** + * Fonction de parcours des données de module + * @param string $find donnée à rechercher + * @param string $replace donnée à remplacer + * @param array tableau à analyser + * @param int count nombres d'occurrences + * @return array avec les valeurs remplacées. + */ + private function recursive_array_replace ($find, $replace, $array, &$count) { + if (!is_array($array)) { + return str_replace($find, $replace, $array, $count); + } + + $newArray = []; + foreach ($array as $key => $value) { + $newArray[$key] = $this->recursive_array_replace($find, $replace, $value,$c); + $count += $c; + } + return $newArray; + } + /** * Génère une archive d'un dossier et des sous-dossiers * @param string fileName path et nom de l'archive diff --git a/core/include/update.inc.php b/core/include/update.inc.php index ebdaf896..344457a1 100644 --- a/core/include/update.inc.php +++ b/core/include/update.inc.php @@ -741,6 +741,54 @@ if ($this->getData(['core', 'dataVersion']) < 11202) { $this->setData(['core', 'dataVersion', 11202]); } +// Version 11.2.04 +if ($this->getData(['core', 'dataVersion']) < 11204) { + // Supprimer l'information de redirection + $old = str_replace('?','',$this->getData(['core', 'baseUrl'])); + $new = ''; + $c3 = 0; + $success = false ; + // Boucler sur les pages + foreach($this->getHierarchy(null,null,null) as $parentId => $childIds) { + $content = $this->getPage($parentId, self::$i18n); + $titre = $this->getData(['page', $parentId, 'title']); + $content = $titre . ' ' . $content ; + $replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ; + $replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ; + + if ($c1 > 0 || $c2 > 0) { + $success = true; + $this->setPage($parentId, $replace, self::$i18n); + $c3 += $c1 + $c2; + } + foreach($childIds as $childId) { + $content = $this->getPage($childId, self::$i18n); + $content = $titre . ' ' . $content ; + $replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ; + $replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ; + if ($c1 > 0 || $c2 > 0) { + $success = true; + $this->setPage($childId, $replace, self::$i18n); + $c3 += $c1 + $c2; + } + } + } + // Traiter les modules dont la redirection + $content = $this->getdata(['module']); + $replace = $this->recursive_array_replace('href="' . $old , 'href="'. $new, $content, $c1); + $replace = $this->recursive_array_replace('src="' . $old , 'src="'. $new, $replace, $c2); + if ($content !== $replace) { + $this->setdata(['module',$replace]); + $c3 += $c1 + $c2; + $success = true; + } + + // Effacer la baseUrl + $this->deleteData(['core', 'baseUrl']); + + // Mise à jour + $this->setData(['core', 'dataVersion', 11204]); +} // Version 11.3.00 if ($this->getData(['core', 'dataVersion']) < 11300) { diff --git a/core/module/config/config.php b/core/module/config/config.php index 1a3e66c2..fdabc78d 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -23,7 +23,6 @@ class config extends common { 'generateFiles' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, 'restore' => self::GROUP_ADMIN, - 'updateBaseUrl' => self::GROUP_ADMIN, 'script' => self::GROUP_ADMIN, 'logReset' => self::GROUP_ADMIN, 'logDownload'=> self::GROUP_ADMIN, @@ -652,60 +651,6 @@ class config extends common { ]); } - /** - * Met à jour les données de site avec l'adresse transmise - */ - public function updateBaseUrl () { - // Supprimer l'information de redirection - $old = str_replace('?','',$this->getData(['core', 'baseUrl'])); - $new = helper::baseUrl(false,false); - $c3 = 0; - $success = false ; - // Boucler sur les pages - foreach($this->getHierarchy(null,null,null) as $parentId => $childIds) { - $content = $this->getPage($parentId, self::$i18n); - $titre = $this->getData(['page', $parentId, 'title']); - $content = $titre . ' ' . $content ; - $replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ; - $replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ; - - if ($c1 > 0 || $c2 > 0) { - $success = true; - $this->setPage($parentId, $replace, self::$i18n); - $c3 += $c1 + $c2; - } - foreach($childIds as $childId) { - $content = $this->getPage($childId, self::$i18n); - $content = $titre . ' ' . $content ; - $replace = str_replace( 'href="' . $old , 'href="'. $new , stripslashes($content),$c1) ; - $replace = str_replace( 'src="' . $old , 'src="'. $new , stripslashes($replace),$c2) ; - if ($c1 > 0 || $c2 > 0) { - $success = true; - $this->setPage($childId, $replace, self::$i18n); - $c3 += $c1 + $c2; - } - } - } - // Traiter les modules dont la redirection - $content = $this->getdata(['module']); - $replace = $this->recursive_array_replace('href="' . $old , 'href="'. $new, $content, $c1); - $replace = $this->recursive_array_replace('src="' . $old , 'src="'. $new, $replace, $c2); - if ($content !== $replace) { - $this->setdata(['module',$replace]); - $c3 += $c1 + $c2; - $success = true; - } - // Mettre à jour la base URl - $this->setData(['core','baseUrl',helper::baseUrl(true,false)]); - // Valeurs en sortie - $this->addOutput([ - 'title' => 'Restaurer', - 'view' => 'restore', - 'notification' => $success ? $c3. ' conversion' . ($c3 > 1 ? 's' : '') . ' effectuée' . ($c3 > 1 ? 's' : '') : 'Aucune conversion', - 'state' => $success ? true : false - ]); - } - /** * Vider le fichier de log */ @@ -842,25 +787,4 @@ class config extends common { ]); } - - /** - * Fonction de parcours des données de module - * @param string $find donnée à rechercher - * @param string $replace donnée à remplacer - * @param array tableau à analyser - * @param int count nombres d'occurrences - * @return array avec les valeurs remplacées. - */ - private function recursive_array_replace ($find, $replace, $array, &$count) { - if (!is_array($array)) { - return str_replace($find, $replace, $array, $count); - } - - $newArray = []; - foreach ($array as $key => $value) { - $newArray[$key] = $this->recursive_array_replace($find, $replace, $value,$c); - $count += $c; - } - return $newArray; - } } diff --git a/core/module/config/view/restore/restore.php b/core/module/config/view/restore/restore.php index 22a63cc1..5e4ff26d 100644 --- a/core/module/config/view/restore/restore.php +++ b/core/module/config/view/restore/restore.php @@ -38,46 +38,4 @@
    -
    -
    -
    -

    Conversion après la restauration

    -
    -
    - getData(['core', 'baseUrl'])) ) { - $baseUrlValue = 'Pas de donnée dans la sauvegarde'; - $buttonClass = 'disabled'; - } elseif ($this->getData(['core', 'baseUrl']) === '') { - $baseUrlValue = '/'; - $buttonClass = helper::baseUrl(false,false) !== $this->getData(['core', 'baseUrl']) ? '' : 'disabled'; - } else { - $baseUrlValue = str_replace('?','',$this->getData(['core', 'baseUrl'])); - $buttonClass = helper::baseUrl(false,false) !== $baseUrlValue ? '' : 'disabled'; - } - echo template::text('configRestoreBaseURLToConvert', [ - 'label' => 'Dossier de l\'archive' , - 'value' => $baseUrlValue, - 'readonly' => true, - 'help' => 'Le dossier de base du site est stockée dans la sauvegarde.' - ]); ?> -
    -
    - 'Dossier du site actuel', - 'value' => helper::baseUrl(false,false), - 'readonly' => true - ]); ?> -
    -
    - helper::baseUrl() . 'config/updateBaseUrl', - 'class' => $buttonClass, - 'value' => 'convertir' - ]); ?> -
    -
    -
    -
    -
    From c201e70af5c9a8f1549534fc0d9aae8e41f5830f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Thu, 13 Jan 2022 19:08:07 +0100 Subject: [PATCH 056/103] =?UTF-8?q?config=20mise=20=C3=A0=20jour=20avec=20?= =?UTF-8?q?la=20nouvelle=20fonction?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/config/config.php | 62 +++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/core/module/config/config.php b/core/module/config/config.php index fdabc78d..f188125e 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -23,6 +23,7 @@ class config extends common { 'generateFiles' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, 'restore' => self::GROUP_ADMIN, + 'updateBaseUrl' => self::GROUP_ADMIN, 'script' => self::GROUP_ADMIN, 'logReset' => self::GROUP_ADMIN, 'logDownload'=> self::GROUP_ADMIN, @@ -382,6 +383,15 @@ class config extends common { $this->setData(['user',$users]); } } + // Conversion vers des Url relatives + if ($this->getData(['core', 'baseUrl'])) { + $url = str_replace('?','',$this->getData(['core', 'baseUrl'])); + // Suppresion de la base Url + $this->updateBaseUrl($url); + // Effacer la baseUrl + $this->deleteData(['core', 'baseUrl']); + } + // Message de notification $notification = $success === true ? 'Restaurer effectuée avec succès' : 'Erreur inconnue'; $redirect = $this->getInput('configRestoreImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/restore' : helper::baseUrl() . 'user/login/'; @@ -651,6 +661,58 @@ class config extends common { ]); } + /** + * Met à jour les données de site avec l'adresse transmise + */ + public function updateBaseUrl ($url) { + // Supprimer l'information de redirection + $c3 = 0; + $success = false ; + // Boucler sur les pages + foreach($this->getHierarchy(null,null,null) as $parentId => $childIds) { + $content = $this->getPage($parentId, self::$i18n); + $titre = $this->getData(['page', $parentId, 'title']); + $content = $titre . ' ' . $content ; + $replace = str_replace( 'href="' . $url , 'href="'. '' , stripslashes($content),$c1) ; + $replace = str_replace( 'src="' . $url , 'src="'. '' , stripslashes($replace),$c2) ; + + if ($c1 > 0 || $c2 > 0) { + $success = true; + $this->setPage($parentId, $replace, self::$i18n); + $c3 += $c1 + $c2; + } + foreach($childIds as $childId) { + $content = $this->getPage($childId, self::$i18n); + $content = $titre . ' ' . $content ; + $replace = str_replace( 'href="' . $url , 'href="'. '' , stripslashes($content),$c1) ; + $replace = str_replace( 'src="' . $url , 'src="'. '' , stripslashes($replace),$c2) ; + if ($c1 > 0 || $c2 > 0) { + $success = true; + $this->setPage($childId, $replace, self::$i18n); + $c3 += $c1 + $c2; + } + } + } + // Traiter les modules dont la redirection + $content = $this->getdata(['module']); + $replace = $this->recursive_array_replace('href="' . $url , 'href="'. '', $content, $c1); + $replace = $this->recursive_array_replace('src="' . $url , 'src="'. '', $replace, $c2); + if ($content !== $replace) { + $this->setdata(['module',$replace]); + $c3 += $c1 + $c2; + $success = true; + } + // Mettre à jour la base URl + $this->setData(['core','baseUrl',helper::baseUrl(true,false)]); + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Restaurer', + 'view' => 'restore', + 'notification' => $success ? $c3. ' conversion' . ($c3 > 1 ? 's' : '') . ' effectuée' . ($c3 > 1 ? 's' : '') : 'Aucune conversion', + 'state' => $success ? true : false + ]); + } + /** * Vider le fichier de log */ From c8cc8ea9fd304a76635981798030148ce8ab0f80 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 14 Jan 2022 09:18:09 +0100 Subject: [PATCH 057/103] =?UTF-8?q?init.js=20complet=20=20+=20changes=20+?= =?UTF-8?q?=20num=C3=A9ro=20de=20version=20update?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 4 ++-- core/include/update.inc.php | 6 +++--- core/vendor/tinymce/init.js | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 53a3a97a..0bcf03ae 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -27,9 +27,9 @@ - Thème ; pied de page ; option pied de page fixe inopérante. - Edition des pages orphelines : "Ne pas afficher" une page contenant des sous-pages provoquait un bug d'affichage dans le menu, la page était malgré tout affichée en fin de menu. Ce problème était causé par les pages enfants dont l'affichage n'était pas modifié. Le correctif cascade l'option "Ne pas afficher" aux sous-pages. La réciproque n'est pas appliquée, il faudra rendre visible les sous-pages d'une page parente qui devient à nouveau visible. - Modifications : - - Addons (gestion des modules), le bouton d'accès au store est déplacé à la page de gestion des modules. Quelques étiquettes de boutons sont modifiés. - - Thème ; pied de page ; options pied de page fixe et alignement avec le contenu déplacées dans les paramètres. + - **Chemin vers les données de site (images et liens internes)**. Désormais, les URL internes seront relatives, cela signifie qu'elles ne contiendront plus le domaine et le chemin d'accès au site. Cela permettra le déplacement d'un site d'un hébergement à un autre, d'un dossier d'hébergement à un autre, sans avoir à convertir les adresses internes. Les données d'un site mis à jour et importées d'une version antérieures sont automatiquement converties. En conséquence, le bloc de conversion de la fenêtre d'import est supprimé. - Mise à jour en ligne, contrôle de la clé MD5 de l'archive update.tar.gz. + - Thème ; pied de page ; options pied de page fixe et alignement avec le contenu déplacées dans les paramètres. ## Version 11.2.02 - Correction : diff --git a/core/include/update.inc.php b/core/include/update.inc.php index 344457a1..748032b8 100644 --- a/core/include/update.inc.php +++ b/core/include/update.inc.php @@ -741,8 +741,8 @@ if ($this->getData(['core', 'dataVersion']) < 11202) { $this->setData(['core', 'dataVersion', 11202]); } -// Version 11.2.04 -if ($this->getData(['core', 'dataVersion']) < 11204) { +// Version 11.2.03 +if ($this->getData(['core', 'dataVersion']) < 11203) { // Supprimer l'information de redirection $old = str_replace('?','',$this->getData(['core', 'baseUrl'])); $new = ''; @@ -787,7 +787,7 @@ if ($this->getData(['core', 'dataVersion']) < 11204) { $this->deleteData(['core', 'baseUrl']); // Mise à jour - $this->setData(['core', 'dataVersion', 11204]); + $this->setData(['core', 'dataVersion', 11203]); } // Version 11.3.00 if ($this->getData(['core', 'dataVersion']) < 11300) { diff --git a/core/vendor/tinymce/init.js b/core/vendor/tinymce/init.js index b5d300d6..b4d3bad3 100755 --- a/core/vendor/tinymce/init.js +++ b/core/vendor/tinymce/init.js @@ -294,7 +294,7 @@ tinymce.init({ // Active l'onglet avancé lors de l'ajout d'une image image_advtab: true, // Urls absolues - relative_urls: false, + relative_urls: true, // Url de base document_base_url: baseUrl, // Contenu du bouton formats From bd3e068095cc410f4d025cb2a8f41732547b3dd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Wed, 19 Jan 2022 19:14:14 +0100 Subject: [PATCH 058/103] update version de test --- core/core.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.php b/core/core.php index 7c79254e..dd29cb4c 100644 --- a/core/core.php +++ b/core/core.php @@ -46,7 +46,7 @@ class common { // Numéro de version const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/'; const ZWII_VERSION = '11.3.00'; - const ZWII_UPDATE_CHANNEL = "v11"; + const ZWII_UPDATE_CHANNEL = "test"; public static $actions = []; public static $coreModuleIds = [ From bf8b71e4bf7b4b058453e451b858fc8f1c7cb150 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 09:33:29 +0100 Subject: [PATCH 059/103] form option alignement + gabarit --- module/form/form.php | 45 +++++++---- module/form/view/index/index.php | 122 +++++++++++++++-------------- module/form/view/option/option.php | 18 ++++- 3 files changed, 109 insertions(+), 76 deletions(-) diff --git a/module/form/form.php b/module/form/form.php index e677542b..55730e8e 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -79,22 +79,26 @@ class form extends common { '100' => '100%' ]; - public static $formOffset = [ - 'none' => 'Aucune', - '1' => 'Une colonne', - '2' => 'Deux colonnes', - '3' => 'Trois colonnes', - '4' => 'Quatre colonnes', + public static $optionOffset = [ + 0 => 'Aucune', + 1 => 'Une colonne', + 2 => 'Deux colonnes' ]; - public static $formWidth = [ - '6' => 'Six colonne', - '7' => 'Sept colonnes', - '8' => 'Huit colonnes', - '9' => 'Neuf colonnes', - '10' => 'Dix colonnes', - '11' => 'Onze colonnes', - '12' => 'Douze colonnes', + public static $optionWidth = [ + 6 => 'Six colonnes', + 7 => 'Sept colonnes', + 8 => 'Huit colonnes', + 9 => 'Neuf colonnes', + 10 => 'Dix colonnes', + 11 => 'Onze colonnes', + 12 => 'Douze colonnes', + ]; + + public static $optionAlign = [ + '' => 'A gauche', + 'textAlignCenter' => 'Au centre', + 'textAlignRight' => 'A droite' ]; @@ -156,6 +160,12 @@ class form extends common { } // Soumission du formulaire if ($this->isPost()) { + // Débordement + $width = $this->getInput('formOptionWidth'); + if ($this->getInput('formOptionWidth',helper::FILTER_INT) + $this->getInput('formOptionOffset',helper::FILTER_INT) > 12 ) { + $width = (string) $this->getInput('formOptionWidth',helper::FILTER_INT) - $this->getInput('formOptionOffset',helper::FILTER_INT); + } + // Configuration $this->setData([ 'module', @@ -172,7 +182,10 @@ class form extends common { 'replyto' => $this->getInput('formOptionMailReplyTo', helper::FILTER_BOOLEAN), 'signature' => $this->getInput('formOptionSignature'), 'logoUrl' => $this->getInput('formOptionLogo'), - 'logoWidth' => $this->getInput('formOptionLogoWidth') + 'logoWidth' => $this->getInput('formOptionLogoWidth'), + 'offset' =>$this->getInput('formOptionOffset'), + 'width' =>$width, + 'align' =>$this->getInput('formOptionAlign'), ] ]); // Génération des données vides @@ -181,7 +194,7 @@ class form extends common { } // Valeurs en sortie $this->addOutput([ - 'notification' => 'Modifications enregistrées', + 'notification' => 'Modifications enregistrées' , 'redirect' => helper::baseUrl() . $this->getUrl(), 'state' => true ]); diff --git a/module/form/view/index/index.php b/module/form/view/index/index.php index 8d3b9a91..c2251225 100644 --- a/module/form/view/index/index.php +++ b/module/form/view/index/index.php @@ -1,69 +1,75 @@ getData(['module', $this->getUrl(0), 'input'])): ?> -
    - - getData(['module', $this->getUrl(0), 'input']) as $index => $input): ?> - - 'formInput_' . $index, - 'label' => $input['name'] - ]); ?> - - $key) { - $values[$value] = trim($value); - } - ?> - 'formInput_' . $index, - 'label' => $input['name'] - ]); ?> - - 'formInput_' . $index, - 'label' => $input['name'] - ]); ?> - - 'formInput_' . $index, - 'label' => $input['name'] - ]); ?> - - 'formInput_' . $index, - 'label' => $input['name'], - 'vendor' => 'flatpickr' - ]); ?> - - - -

    - -
    -

    +
    +
    + + getData(['module', $this->getUrl(0), 'input']) as $index => $input): ?> + + 'formInput_' . $index, + 'label' => $input['name'] + ]); ?> + + $key) { + $values[$value] = trim($value); + } + ?> + 'formInput_' . $index, + 'label' => $input['name'] + ]); ?> + + 'formInput_' . $index, + 'label' => $input['name'] + ]); ?> + + 'formInput_' . $index, + 'label' => $input['name'] + ]); ?> + + 'formInput_' . $index, + 'label' => $input['name'], + 'vendor' => 'flatpickr' + ]); ?> + + + +

    + +
    +

    + + + getData(['module', $this->getUrl(0), 'config', 'captcha'])): ?> +
    +
    + $this->getData(['config','connect', 'captchaStrong']), + 'type' => $this->getData(['config','connect', 'captchaType']) + ]); ?> +
    +
    - - getData(['module', $this->getUrl(0), 'config', 'captcha'])): ?>
    -
    - $this->getData(['config','connect', 'captchaStrong']), - 'type' => $this->getData(['config','connect', 'captchaType']) +
    + $this->getData(['module', $this->getUrl(0), 'config', 'button']) ? $this->getData(['module', $this->getUrl(0), 'config', 'button']) : 'Envoyer', + 'ico' => '' ]); ?>
    - -
    -
    - $this->getData(['module', $this->getUrl(0), 'config', 'button']) ? $this->getData(['module', $this->getUrl(0), 'config', 'button']) : 'Envoyer', - 'ico' => '' - ]); ?> -
    - +
    + \ No newline at end of file diff --git a/module/form/view/option/option.php b/module/form/view/option/option.php index b9aa005c..f8635892 100644 --- a/module/form/view/option/option.php +++ b/module/form/view/option/option.php @@ -132,10 +132,24 @@

    Gabarit

    - + 'Alignement du formulaire', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'align']) + ]); ?> +
    +
    +
    +
    + 'Décalage à gauche', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'offset']) + ]); ?>
    - + 'Largeur', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'width']) + ]); ?>
    From 7c687e75c282672de880493be8d7285339d6882c Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 09:34:04 +0100 Subject: [PATCH 060/103] forme v3 suite --- module/form/changes.md | 3 + module/form/view/option/option.php | 236 ++++++++++++++--------------- 2 files changed, 121 insertions(+), 118 deletions(-) create mode 100644 module/form/changes.md diff --git a/module/form/changes.md b/module/form/changes.md new file mode 100644 index 00000000..c8442301 --- /dev/null +++ b/module/form/changes.md @@ -0,0 +1,3 @@ +# Version 3 + - Déplacement des options de formulaires + - Gabarit du formulaire sur la page \ No newline at end of file diff --git a/module/form/view/option/option.php b/module/form/view/option/option.php index f8635892..47fb53e1 100644 --- a/module/form/view/option/option.php +++ b/module/form/view/option/option.php @@ -1,135 +1,56 @@ -
    -
    - 'buttonGrey', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' - ]); ?> -
    -
    - -
    -
    -
    -
    -
    -

    Validation du formulaire

    -
    -
    - $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) - ]); ?> -
    -
    - 'Laissez vide afin de conserver le texte par défaut.', - 'label' => 'Etiquette du bouton de soumission', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) - ]); ?> -
    -
    -
    -
    - (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) - ]); ?> -
    -
    - 'displayNone', - 'label' => 'Page du site :', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) - ]); ?> -
    -
    +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', + 'ico' => 'left', + 'value' => 'Retour' + ]); ?> +
    +
    +
    -
    -
    -
    -
    -

    Courriel

    - (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || - !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 saisissez un email. Votre serveur doit autoriser les envois de mail.' - ]); ?> -
    +
    +
    +
    +

    Validation du formulaire

    -
    - + $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) + ]); ?> +
    +
    + 'Laissez vide afin de conserver le texte par défaut.', - 'label' => 'Sujet du mail', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) - ]); ?> -
    -
    - -
    -
    - 'Aux groupes à partir de', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), - 'help' => 'Editeurs = éditeurs + administrateurs
    Membres = membres + éditeurs + administrateurs' - ]); ?> -
    -
    - 'A un membre', - 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) - ]); ?> -
    -
    - 'A une adresse email', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), - 'help' => 'Un email ou une liste de diffusion' - ]); ?> -
    -
    -
    -
    - 'Sélectionner le type de signature', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) - ]); ?> -
    -
    - 'Sélectionnez le logo du site', - 'label' => 'Logo', - 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) - ]); ?> -
    -
    - 'Sélectionner la largeur du logo', - 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) + 'label' => 'Etiquette du bouton de soumission', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'button']) ]); ?>
    - (bool) $this->getData(['module', $this->getUrl(0), 'config', 'replyto']), - 'help' => 'Cette option permet de réponse directement à l\'expéditeur du message si celui-ci a indiqué un email valide.' - ]); ?> + (bool) $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) + ]); ?> +
    +
    + 'displayNone', + 'label' => 'Page du site :', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'pageId']) + ]); ?>
    -
    -
    -
    -
    -

    Gabarit

    +
    +
    +
    +

    Gabarit

    - 'Largeur', 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'width']) ]); ?> @@ -155,4 +76,83 @@
    +
    +
    +
    +

    Courriel

    + (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || + !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 saisissez un email. Votre serveur doit autoriser les envois de mail.' + ]); ?> +
    +
    +
    + 'Laissez vide afin de conserver le texte par défaut.', + 'label' => 'Sujet du mail', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'subject']) + ]); ?> +
    +
    + +
    +
    + 'Aux groupes à partir de', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'group']), + 'help' => 'Editeurs = éditeurs + administrateurs
    Membres = membres + éditeurs + administrateurs' + ]); ?> +
    +
    + 'A un membre', + 'selected' => array_search($this->getData(['module', $this->getUrl(0), 'config', 'user']),$module::$listUsers) + ]); ?> +
    +
    + 'A une adresse email', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'mail']), + 'help' => 'Un email ou une liste de diffusion' + ]); ?> +
    +
    +
    +
    + 'Sélectionner le type de signature', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'signature']) + ]); ?> +
    +
    + 'Sélectionnez le logo du site', + 'label' => 'Logo', + 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) + ]); ?> +
    +
    + 'Sélectionner la largeur du logo', + 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'logoWidth']) + ]); ?> +
    +
    +
    +
    + (bool) $this->getData(['module', $this->getUrl(0), 'config', 'replyto']), + 'help' => 'Cette option permet de réponse directement à l\'expéditeur du message si celui-ci a indiqué un email valide.' + ]); ?> +
    +
    +
    +
    +
    +
    \ No newline at end of file From 524ea94bbcf7534dcbb0b018aea250fb8b3f96bf Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 09:53:40 +0100 Subject: [PATCH 061/103] layout -> option --- module/blog/blog.php | 14 +++++++------- module/blog/view/config/config.php | 14 +++++++------- .../view/{layout/layout.css => option/option.css} | 0 .../view/{layout/layout.php => option/option.php} | 12 ++++++------ 4 files changed, 20 insertions(+), 20 deletions(-) rename module/blog/view/{layout/layout.css => option/option.css} (100%) rename module/blog/view/{layout/layout.php => option/option.php} (76%) diff --git a/module/blog/blog.php b/module/blog/blog.php index 08222009..ff862cd2 100644 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -32,7 +32,7 @@ class blog extends common { 'commentDelete' => self::GROUP_MODERATOR, 'commentDeleteAll' => self::GROUP_MODERATOR, 'config' => self::GROUP_MODERATOR, - 'layout' => self::GROUP_MODERATOR, + 'option' => self::GROUP_MODERATOR, 'delete' => self::GROUP_MODERATOR, 'edit' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, @@ -482,20 +482,20 @@ class blog extends common { ]); } - public function layout() { + public function option() { // Mise à jour des données de module $this->update(); // Soumission du formulaire if($this->isPost()) { $this->setData(['module', $this->getUrl(0), 'config',[ - 'feeds' => $this->getInput('blogLayoutShowFeeds',helper::FILTER_BOOLEAN), - 'feedsLabel' => $this->getInput('blogLayoutFeedslabel',helper::FILTER_STRING_SHORT), - 'itemsperPage' => $this->getInput('blogLayoutItemsperPage', helper::FILTER_INT,true), + 'feeds' => $this->getInput('blogOptionShowFeeds',helper::FILTER_BOOLEAN), + 'feedsLabel' => $this->getInput('blogOptionFeedslabel',helper::FILTER_STRING_SHORT), + 'itemsperPage' => $this->getInput('blogOptionItemsperPage', helper::FILTER_INT,true), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) ]]); // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/layout', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/option', 'notification' => 'Modifications enregistrées', 'state' => true ]); @@ -503,7 +503,7 @@ class blog extends common { // Valeurs en sortie $this->addOutput([ 'title' => 'Mise en page', - 'view' => 'layout' + 'view' => 'option' ]); } } diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 0430fdb2..1be3aab5 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -8,18 +8,18 @@ 'value' => 'Retour' ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/add', 'ico' => 'plus', - 'value' => 'Article' + 'value' => '' ]); ?>
    -
    - helper::baseUrl() . $this->getUrl(0) . '/layout', - 'ico' => 'brush', - 'value' => 'Mise en page' +
    + helper::baseUrl() . $this->getUrl(0) . '/option', + 'ico' => 'cogs', + 'value' => '' ]); ?>
    diff --git a/module/blog/view/layout/layout.css b/module/blog/view/option/option.css similarity index 100% rename from module/blog/view/layout/layout.css rename to module/blog/view/option/option.css diff --git a/module/blog/view/layout/layout.php b/module/blog/view/option/option.php similarity index 76% rename from module/blog/view/layout/layout.php rename to module/blog/view/option/option.php index f845302b..f86d3cd8 100644 --- a/module/blog/view/layout/layout.php +++ b/module/blog/view/option/option.php @@ -1,7 +1,7 @@ - +
    - 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'ico' => 'left', @@ -9,7 +9,7 @@ ]); ?>
    - +
    @@ -18,12 +18,12 @@

    Paramètres du module

    - $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), ]); ?>
    - 'Texte de l\'étiquette', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) ]); ?> @@ -31,7 +31,7 @@
    - 'Articles par page', 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) ]); ?> From 0a8646ebd9a2e929a5e4df5aa991f9ff5b03b291 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 10:25:20 +0100 Subject: [PATCH 062/103] blog icones sans texte --- module/blog/view/config/config.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 1be3aab5..ab4c20d5 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -9,18 +9,19 @@ ]); ?>
    - helper::baseUrl() . $this->getUrl(0) . '/add', - 'ico' => 'plus', - 'value' => '' - ]); ?> -
    -
    helper::baseUrl() . $this->getUrl(0) . '/option', 'ico' => 'cogs', 'value' => '' ]); ?> + +
    +
    + helper::baseUrl() . $this->getUrl(0) . '/add', + 'ico' => 'plus', + 'value' => '' + ]); ?>
    From b9be27810ed09d729e9c8ec5d408ed57b1173efc Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 10:32:32 +0100 Subject: [PATCH 063/103] blog form et gallery icone dans value --- module/blog/view/config/config.php | 6 ++---- module/form/view/config/config.php | 9 ++++----- module/gallery/view/config/config.php | 4 ++-- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index ab4c20d5..e3e18509 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -11,16 +11,14 @@
    helper::baseUrl() . $this->getUrl(0) . '/option', - 'ico' => 'cogs', - 'value' => '' + 'value' => template::ico('cogs') ]); ?>
    helper::baseUrl() . $this->getUrl(0) . '/add', - 'ico' => 'plus', - 'value' => '' + 'value' => template::ico('plus') ]); ?>
    diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index e992f834..45784d4b 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -58,17 +58,16 @@ 'value' => 'Retour' ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/data', - 'value' => 'Données' + 'value' => template::ico('code') ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => 'Options', - 'ico' => 'cog-alt' + 'value' => template::ico('cogs') ]); ?>
    diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index 1901704b..4790c1dc 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -8,10 +8,10 @@ 'value' => 'Retour' ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], - 'value' => template::ico('brush','right') . 'Mise en page' + 'value' => template::ico('brush') ]); ?>
    From 69150cb4db35ad2da335fc3ca3cd4db3bd2c39de Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 10:37:00 +0100 Subject: [PATCH 064/103] news layout -> option --- module/news/news.php | 18 +++++++++--------- module/news/view/config/config.php | 12 +++++------- .../{layout/layout.css => option/option.css} | 0 .../{layout/layout.php => option/option.php} | 16 ++++++++-------- 4 files changed, 22 insertions(+), 24 deletions(-) rename module/news/view/{layout/layout.css => option/option.css} (100%) rename module/news/view/{layout/layout.php => option/option.php} (86%) diff --git a/module/news/news.php b/module/news/news.php index 1bb0ae6a..c47c8dca 100644 --- a/module/news/news.php +++ b/module/news/news.php @@ -24,7 +24,7 @@ class news extends common { public static $actions = [ 'add' => self::GROUP_MODERATOR, 'config' => self::GROUP_MODERATOR, // Edition des news - 'layout' => self::GROUP_MODERATOR, // paramétrage des news + 'option' => self::GROUP_MODERATOR, // paramétrage des news 'delete' => self::GROUP_MODERATOR, 'edit' => self::GROUP_MODERATOR, 'index' => self::GROUP_VISITOR, @@ -244,7 +244,7 @@ class news extends common { ]); } - public function layout() { + public function option() { // Soumission du formulaire if($this->isPost()) { @@ -272,18 +272,18 @@ class news extends common { ]]); $this->setData(['module', $this->getUrl(0), 'config',[ - 'feeds' => $this->getInput('newsLayoutShowFeeds',helper::FILTER_BOOLEAN), - 'feedsLabel' => $this->getInput('newsLayoutFeedslabel',helper::FILTER_STRING_SHORT), - 'itemsperPage' => $this->getInput('newsLayoutItemsperPage', helper::FILTER_INT,true), - 'itemsperCol' => $this->getInput('newsLayoutItemsperCol', helper::FILTER_INT,true), - 'height' => $this->getInput('newsLayoutHeight', helper::FILTER_INT,true), + 'feeds' => $this->getInput('newsOptionShowFeeds',helper::FILTER_BOOLEAN), + 'feedsLabel' => $this->getInput('newsOptionFeedslabel',helper::FILTER_STRING_SHORT), + 'itemsperPage' => $this->getInput('newsOptionItemsperPage', helper::FILTER_INT,true), + 'itemsperCol' => $this->getInput('newsOptionItemsperCol', helper::FILTER_INT,true), + 'height' => $this->getInput('newsOptionHeight', helper::FILTER_INT,true), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) ]]); // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/layout', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/option', 'notification' => 'Modifications enregistrées', 'state' => true ]); @@ -291,7 +291,7 @@ class news extends common { // Valeurs en sortie $this->addOutput([ 'title' => 'Mise en page', - 'view' => 'layout', + 'view' => 'option', 'vendor' => [ 'tinycolorpicker' ] diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 781ab96b..6cf7dbbd 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -8,18 +8,16 @@ 'value' => 'Retour' ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/add', - 'ico' => 'plus', - 'value' => 'News' + 'value' => template::ico('plus') ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/layout', - 'ico' => 'brush', - 'value' => 'Mise en page' + 'href' => helper::baseUrl() . $this->getUrl(0) . '/option', + 'value' => template::ico('brush') ]); ?>
    diff --git a/module/news/view/layout/layout.css b/module/news/view/option/option.css similarity index 100% rename from module/news/view/layout/layout.css rename to module/news/view/option/option.css diff --git a/module/news/view/layout/layout.php b/module/news/view/option/option.php similarity index 86% rename from module/news/view/layout/layout.php rename to module/news/view/option/option.php index 44315e36..00a3e417 100644 --- a/module/news/view/layout/layout.php +++ b/module/news/view/option/option.php @@ -1,7 +1,7 @@ - +
    - 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'ico' => 'left', @@ -9,7 +9,7 @@ ]); ?>
    - +
    @@ -18,13 +18,13 @@

    Paramètres du module

    - $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), 'help' => 'Flux limité aux articles de la première page.' ]); ?>
    - 'Etiquette RSS', 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) ]); ?> @@ -32,19 +32,19 @@
    - 'Nombre de colonnes', 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol']) ]); ?>
    - 'Articles par page', 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']) ]); ?>
    - 'Abrégé de l\'article', 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'height']) ]); ?> From f22298a113330e3ec5737211f8196c28f7b24897 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 10:50:40 +0100 Subject: [PATCH 065/103] Boutons courts dans les modules --- module/blog/blog.php | 2 +- module/blog/view/add/add.php | 9 ++++----- module/blog/view/config/config.php | 7 +++---- module/blog/view/option/option.php | 7 +++---- module/form/form.php | 2 +- module/form/view/config/config.php | 7 +++---- module/gallery/view/config/config.php | 7 +++---- module/gallery/view/edit/edit.php | 7 +++---- module/news/news.php | 2 +- module/news/view/add/add.php | 9 ++++----- module/news/view/config/config.php | 7 +++---- module/news/view/option/option.php | 7 +++---- module/redirection/view/config/config.php | 7 +++---- module/search/view/config/config.php | 7 +++---- 14 files changed, 38 insertions(+), 49 deletions(-) diff --git a/module/blog/blog.php b/module/blog/blog.php index ff862cd2..c2f98d2c 100644 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -502,7 +502,7 @@ class blog extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Mise en page', + 'title' => 'Options de configuration', 'view' => 'option' ]); } diff --git a/module/blog/view/add/add.php b/module/blog/view/add/add.php index 7f50b45e..22e51de4 100644 --- a/module/blog/view/add/add.php +++ b/module/blog/view/add/add.php @@ -1,17 +1,16 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    true, - 'value' => 'Enregistrer en brouillon' + 'value' => 'Brouillon' ]); ?> true diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index e3e18509..b08d8c7b 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), 'posts', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/option', 'value' => template::ico('cogs') diff --git a/module/blog/view/option/option.php b/module/blog/view/option/option.php index f86d3cd8..721eb6a7 100644 --- a/module/blog/view/option/option.php +++ b/module/blog/view/option/option.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    diff --git a/module/form/form.php b/module/form/form.php index 55730e8e..496272ba 100644 --- a/module/form/form.php +++ b/module/form/form.php @@ -208,7 +208,7 @@ class form extends common { } // Valeurs en sortie $this->addOutput([ - 'title' => 'Paramètres', + 'title' => 'Options de configuration', 'vendor' => [ 'html-sortable', 'flatpickr' diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 45784d4b..44e663b5 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -50,15 +50,14 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/data', 'value' => template::ico('code') diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index 4790c1dc..acf5c757 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], 'value' => template::ico('brush') diff --git a/module/gallery/view/edit/edit.php b/module/gallery/view/edit/edit.php index df001bf7..240c85fa 100644 --- a/module/gallery/view/edit/edit.php +++ b/module/gallery/view/edit/edit.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    diff --git a/module/news/news.php b/module/news/news.php index c47c8dca..69fc7c43 100644 --- a/module/news/news.php +++ b/module/news/news.php @@ -290,7 +290,7 @@ class news extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Mise en page', + 'title' => 'Options de configuration', 'view' => 'option', 'vendor' => [ 'tinycolorpicker' diff --git a/module/news/view/add/add.php b/module/news/view/add/add.php index b4427b96..59e3b9da 100644 --- a/module/news/view/add/add.php +++ b/module/news/view/add/add.php @@ -1,17 +1,16 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    true, - 'value' => 'Enregistrer en brouillon' + 'value' => 'Brouillon' ]); ?> true diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 6cf7dbbd..0a855f6e 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0),'posts', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/add', 'value' => template::ico('plus') diff --git a/module/news/view/option/option.php b/module/news/view/option/option.php index 00a3e417..463439ec 100644 --- a/module/news/view/option/option.php +++ b/module/news/view/option/option.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    diff --git a/module/redirection/view/config/config.php b/module/redirection/view/config/config.php index ff421b39..b786dbf1 100644 --- a/module/redirection/view/config/config.php +++ b/module/redirection/view/config/config.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    diff --git a/module/search/view/config/config.php b/module/search/view/config/config.php index 68b6ab8f..ac8bcfc5 100644 --- a/module/search/view/config/config.php +++ b/module/search/view/config/config.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    From fc89f26d19c778f4c0492c388ef9c6407cbf55c9 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 13:28:33 +0100 Subject: [PATCH 066/103] =?UTF-8?q?R=C3=A9duction=20des=20boutons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/addon/view/index/index.php | 14 ++++------ core/module/addon/view/store/store.php | 7 ++--- .../module/addon/view/upload/upload.help.html | 6 ---- core/module/addon/view/upload/upload.php | 18 +++++------- core/module/config/view/backup/backup.php | 7 ++--- core/module/config/view/index/index.php | 12 ++++---- core/module/page/view/edit/edit.php | 28 ++++++++----------- core/module/theme/view/admin/admin.php | 14 +++++----- core/module/theme/view/advanced/advanced.php | 10 +++---- core/module/theme/view/body/body.php | 12 ++++---- core/module/theme/view/footer/footer.php | 12 ++++---- core/module/theme/view/header/header.php | 12 ++++---- core/module/theme/view/manage/manage.php | 7 ++--- core/module/theme/view/menu/menu.php | 12 ++++---- core/module/theme/view/site/site.php | 12 ++++---- core/module/translate/view/index/index.php | 16 +++++------ core/module/user/view/add/add.php | 7 ++--- core/module/user/view/edit/edit.php | 12 ++++---- core/module/user/view/forgot/forgot.php | 5 ++-- core/module/user/view/import/import.php | 14 ++++------ core/module/user/view/index/index.php | 20 ++++++------- module/blog/view/edit/edit.php | 9 +++--- module/gallery/view/theme/theme.php | 7 ++--- module/news/view/edit/edit.php | 7 ++--- 24 files changed, 116 insertions(+), 164 deletions(-) delete mode 100644 core/module/addon/view/upload/upload.help.html diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index e1e9c61f..db1265dc 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -1,22 +1,20 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl(), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/les-modules', + 'href' => 'https://doc.zwiicms.fr/modules-utilisation-generique', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
    -
    +
    helper::baseUrl() . 'addon/store', 'value' => 'Catalogue en ligne' diff --git a/core/module/addon/view/store/store.php b/core/module/addon/view/store/store.php index e1324a6a..ba0e292c 100644 --- a/core/module/addon/view/store/store.php +++ b/core/module/addon/view/store/store.php @@ -1,10 +1,9 @@
    -
    +
    'buttonGrey', - 'href' => helper::baseUrl() . 'addon/upload', - 'ico' => 'left', - 'value' => 'Retour' + 'href' => helper::baseUrl() . 'addon', + 'value' => template::ico('left') ]); ?>
    diff --git a/core/module/addon/view/upload/upload.help.html b/core/module/addon/view/upload/upload.help.html deleted file mode 100644 index fbf87085..00000000 --- a/core/module/addon/view/upload/upload.help.html +++ /dev/null @@ -1,6 +0,0 @@ -

    INSTALLER OU METTRE A JOUR

    -

    Avant de choisir le fichier ZIP du module à installer vous devez le télécharger sur votre serveur en utilisant le 'Catalogue en ligne'.

    -

    D'autres modules sont également disponibles sur le forum de ZwiiCMS, -téléversez les sur votre serveur avec 'Gérer les fichiers'.

    -

    Lors d'une mise à jour Zwii contrôle la version du module à installer, pour réinstaller un module de même numéro de version vous devez cocher 'Mise à jour forcée'. - Il est déconseillé d'installer un module plus ancien.

    diff --git a/core/module/addon/view/upload/upload.php b/core/module/addon/view/upload/upload.php index 016418c6..6bdfb29d 100644 --- a/core/module/addon/view/upload/upload.php +++ b/core/module/addon/view/upload/upload.php @@ -1,30 +1,26 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'addon', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/installation-d-un-module', + 'target' => '_blank', 'class' => 'buttonHelp', - 'ico' => 'help', - 'value' => 'Aide' + 'value' => template::ico('help') ]); ?>
    -
    +
    'Valider', 'ico' => 'check' ]); ?>
    -
    - -
    -
    diff --git a/core/module/config/view/backup/backup.php b/core/module/config/view/backup/backup.php index 070ab2cd..25071a93 100644 --- a/core/module/config/view/backup/backup.php +++ b/core/module/config/view/backup/backup.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'Sauvegarder', 'uniqueSubmission' => true diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php index 3738b0e0..e9644297 100644 --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -1,23 +1,21 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl(false), - 'ico' => 'home', - 'value' => 'Accueil' + 'value' => template::ico('home') ]); ?>
    -
    +
    'buttonHelp', 'href' => 'https://doc.zwiicms.fr/configuration-du-site', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide' + 'value' => template::ico('help') ]); ?>
    -
    +
    diff --git a/core/module/page/view/edit/edit.php b/core/module/page/view/edit/edit.php index dc7625c6..6cf6be20 100644 --- a/core/module/page/view/edit/edit.php +++ b/core/module/page/view/edit/edit.php @@ -1,37 +1,33 @@
    -
    +
    getUrl(2); ?> getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code')$href = helper::baseUrl(); ?> 'buttonGrey', 'href' => $href, - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('home') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/edition-des-pages', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
    -
    - 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'], - 'value' => 'Supprimer', - 'ico' => 'cancel' + 'value' => template::ico('cancel') + ]); ?> +
    +
    + helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'], + 'value' => template::ico('clone') ]); ?>
    diff --git a/core/module/theme/view/admin/admin.php b/core/module/theme/view/admin/admin.php index 8b81ad02..510affdf 100644 --- a/core/module/theme/view/admin/admin.php +++ b/core/module/theme/view/admin/admin.php @@ -1,24 +1,24 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    + +
    'buttonRed', 'href' => helper::baseUrl() . 'theme/reset/admin' . '&csrf=' . $_SESSION['csrf'], - 'value' => 'Réinitialiser', - 'ico' => 'cancel' + 'value' => template::ico('cancel') ]); ?>
    diff --git a/core/module/theme/view/advanced/advanced.php b/core/module/theme/view/advanced/advanced.php index f1895306..3b507b25 100644 --- a/core/module/theme/view/advanced/advanced.php +++ b/core/module/theme/view/advanced/advanced.php @@ -1,19 +1,17 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    helper::baseUrl() . 'theme/reset/custom' . '&csrf=' . $_SESSION['csrf'], 'class' => 'buttonRed', - 'ico' => 'cancel', - 'value' => 'Réinitialiser' + 'value' => template::ico('cancel') ]); ?>
    diff --git a/core/module/theme/view/body/body.php b/core/module/theme/view/body/body.php index 6e1f536d..51243668 100644 --- a/core/module/theme/view/body/body.php +++ b/core/module/theme/view/body/body.php @@ -1,23 +1,21 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/arriere-plan', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
    -
    +
    diff --git a/core/module/theme/view/footer/footer.php b/core/module/theme/view/footer/footer.php index 9b78b052..9c47aa82 100644 --- a/core/module/theme/view/footer/footer.php +++ b/core/module/theme/view/footer/footer.php @@ -1,23 +1,21 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/pied-de-page', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
    -
    +
    diff --git a/core/module/theme/view/header/header.php b/core/module/theme/view/header/header.php index e503d88d..a9956412 100644 --- a/core/module/theme/view/header/header.php +++ b/core/module/theme/view/header/header.php @@ -1,23 +1,21 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/banniere', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
    -
    +
    diff --git a/core/module/theme/view/manage/manage.php b/core/module/theme/view/manage/manage.php index 42658cd9..90b994d3 100644 --- a/core/module/theme/view/manage/manage.php +++ b/core/module/theme/view/manage/manage.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'buttonRed', 'href' => helper::baseUrl() . 'theme/reset/manage' . '&csrf=' . $_SESSION['csrf'], diff --git a/core/module/theme/view/menu/menu.php b/core/module/theme/view/menu/menu.php index 11bde3da..9bcbb88a 100644 --- a/core/module/theme/view/menu/menu.php +++ b/core/module/theme/view/menu/menu.php @@ -1,23 +1,21 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/menu', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
    -
    +
    diff --git a/core/module/theme/view/site/site.php b/core/module/theme/view/site/site.php index 7414f397..7f4c4e67 100644 --- a/core/module/theme/view/site/site.php +++ b/core/module/theme/view/site/site.php @@ -1,23 +1,21 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'theme', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/site61863d315ffe0', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
    -
    +
    diff --git a/core/module/translate/view/index/index.php b/core/module/translate/view/index/index.php index 69821aaa..383b944a 100644 --- a/core/module/translate/view/index/index.php +++ b/core/module/translate/view/index/index.php @@ -1,27 +1,25 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl(), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/prise-en-charge-des-langues-etrangeres', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('cancel'), 'class' => 'buttonHelp' ]); ?>
    -
    +
    helper::baseUrl() . 'translate/copy', - 'value' => 'Utilitaire de copie', - 'ico' => 'cog-alt', + 'value' => 'Copie inter-langues', + 'ico' => 'cogs', 'disabled' => $module::$siteTranslate ]); ?>
    diff --git a/core/module/user/view/add/add.php b/core/module/user/view/add/add.php index d84c8ed1..bd806a49 100644 --- a/core/module/user/view/add/add.php +++ b/core/module/user/view/add/add.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'user', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    diff --git a/core/module/user/view/edit/edit.php b/core/module/user/view/edit/edit.php index aa739b33..30a91c97 100644 --- a/core/module/user/view/edit/edit.php +++ b/core/module/user/view/edit/edit.php @@ -1,23 +1,21 @@
    -
    - getUser('group') === self::GROUP_ADMIN): ?> +
    + getUser('group') === self::GROUP_ADMIN): ?> 'buttonGrey', 'href' => helper::baseUrl() . 'user', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?> 'buttonGrey', 'href' => helper::baseUrl(false), - 'ico' => 'home', - 'value' => 'Accueil' + 'value' => template::ico('home') ]); ?>
    -
    +
    diff --git a/core/module/user/view/forgot/forgot.php b/core/module/user/view/forgot/forgot.php index 29dc17e8..3e163deb 100644 --- a/core/module/user/view/forgot/forgot.php +++ b/core/module/user/view/forgot/forgot.php @@ -3,11 +3,10 @@ 'label' => 'Identifiant' ]); ?>
    -
    +
    helper::baseUrl() . 'user/login/' . $this->getUrl(2), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index 81e6a929..e879b7e1 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -1,23 +1,21 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'user', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/importation-d-une-liste-d-utilisateurs', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
    -
    +
    'Importer' ]); ?> @@ -28,7 +26,7 @@

    Importation de fichier plat CSV

    -
    +
    'Liste d\'utilisateurs :' ]); ?> diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index 98fc2388..1e0730ce 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -1,33 +1,29 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl(false), - 'ico' => 'home', - 'value' => 'Accueil' + 'value' => template::ico('home') ]); ?>
    -
    +
    'https://doc.zwiicms.fr/gestion-des-utilisateurs', 'target' => '_blank', - 'ico' => 'help', - 'value' => 'Aide', + 'value' => template::ico('help'), 'class' => 'buttonHelp' ]); ?>
    -
    +
    helper::baseUrl() . 'user/import', - 'ico' => 'plus', - 'value' => 'Importation' + 'value' => template::ico('download') ]); ?>
    -
    +
    helper::baseUrl() . 'user/add', - 'ico' => 'plus', - 'value' => 'Utilisateur' + 'value' => template::ico('plus') ]); ?>
    diff --git a/module/blog/view/edit/edit.php b/module/blog/view/edit/edit.php index 404467b8..b60da969 100644 --- a/module/blog/view/edit/edit.php +++ b/module/blog/view/edit/edit.php @@ -1,17 +1,16 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    true, - 'value' => 'Enregistrer en brouillon' + 'value' => 'Brouillon' ]); ?> true diff --git a/module/gallery/view/theme/theme.php b/module/gallery/view/theme/theme.php index 8da3639e..a585cc73 100644 --- a/module/gallery/view/theme/theme.php +++ b/module/gallery/view/theme/theme.php @@ -1,15 +1,14 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('cancel') ]); ?>
    -
    +
    diff --git a/module/news/view/edit/edit.php b/module/news/view/edit/edit.php index 927be92d..2cc71bc0 100644 --- a/module/news/view/edit/edit.php +++ b/module/news/view/edit/edit.php @@ -4,14 +4,13 @@ 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    true, - 'value' => 'Enregistrer en brouillon' + 'value' => 'Brouillon' ]); ?> true From 51e6fd6b98fdff58ab6be65259044f65438c8065 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 13:39:42 +0100 Subject: [PATCH 067/103] =?UTF-8?q?Template=20button,=20propri=C3=A9t?= =?UTF-8?q?=C3=A9=20help?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/class/template.class.php | 6 ++++-- core/module/page/view/edit/edit.php | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/core/class/template.class.php b/core/class/template.class.php index 836fd05a..243d3be1 100644 --- a/core/class/template.class.php +++ b/core/class/template.class.php @@ -19,15 +19,17 @@ class template { 'name' => $nameId, 'target' => '', 'uniqueSubmission' => false, - 'value' => 'Bouton' + 'value' => 'Bouton', + 'help' => '' ], $attributes); // Retourne le html return sprintf( - '%s', + '%s', helper::sprintAttributes($attributes, ['class', 'disabled', 'ico', 'value']), $attributes['disabled'] ? 'disabled' : '', $attributes['class'], $attributes['uniqueSubmission'] ? 'uniqueSubmission' : '', + $attributes['help'] ? ' title="' . $attributes['help'] . '" ': '', ($attributes['ico'] ? template::ico($attributes['ico'], 'right') : '') . $attributes['value'] ); } diff --git a/core/module/page/view/edit/edit.php b/core/module/page/view/edit/edit.php index 6cf6be20..72ccf753 100644 --- a/core/module/page/view/edit/edit.php +++ b/core/module/page/view/edit/edit.php @@ -21,7 +21,8 @@ 'buttonRed', 'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Effacer la page' ]); ?>
    From eaf9048479d2910baab7b2481d62050ec6d25910 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 20 Jan 2022 15:40:56 +0100 Subject: [PATCH 068/103] Aide des boutons --- core/module/addon/view/import/import.php | 7 +++---- core/module/addon/view/index/index.php | 13 ++++++++----- core/module/addon/view/upload/upload.php | 3 ++- core/module/config/view/index/index.php | 3 ++- core/module/page/view/edit/edit.php | 6 ++++-- core/module/theme/view/admin/admin.php | 3 ++- core/module/theme/view/advanced/advanced.php | 4 +++- core/module/theme/view/manage/manage.php | 6 +++--- core/module/translate/view/copy/copy.php | 11 ++++++----- core/module/translate/view/index/index.php | 13 +++++++------ core/module/user/view/import/import.help.html | 4 ---- core/module/user/view/import/import.php | 3 ++- core/module/user/view/index/index.php | 9 ++++++--- 13 files changed, 48 insertions(+), 37 deletions(-) delete mode 100644 core/module/user/view/import/import.help.html diff --git a/core/module/addon/view/import/import.php b/core/module/addon/view/import/import.php index 7cc41dac..8ccc44ce 100644 --- a/core/module/addon/view/import/import.php +++ b/core/module/addon/view/import/import.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'addon', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'Appliquer' ]); ?> diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index db1265dc..2b3a1767 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -11,19 +11,22 @@ 'href' => 'https://doc.zwiicms.fr/modules-utilisation-generique', 'target' => '_blank', 'value' => template::ico('help'), - 'class' => 'buttonHelp' + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
    -
    +
    helper::baseUrl() . 'addon/store', - 'value' => 'Catalogue en ligne' + 'value' => template::ico('plus') . template::ico('plus'), + "help" => 'Lister le catalogue en ligne' ]); ?>
    -
    +
    helper::baseUrl() . 'addon/upload', - 'value' => 'Installer' + 'value' => template::ico('plus'), + "help" => 'Ajouter à partir d\'une archive ZIP' ]); ?>
    diff --git a/core/module/addon/view/upload/upload.php b/core/module/addon/view/upload/upload.php index 6bdfb29d..57114be4 100644 --- a/core/module/addon/view/upload/upload.php +++ b/core/module/addon/view/upload/upload.php @@ -12,7 +12,8 @@ 'href' => 'https://doc.zwiicms.fr/installation-d-un-module', 'target' => '_blank', 'class' => 'buttonHelp', - 'value' => template::ico('help') + 'value' => template::ico('help'), + 'help' => 'Consulter l\'aide en ligne' ]); ?>
    diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php index e9644297..b7cb0008 100644 --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -12,7 +12,8 @@ 'class' => 'buttonHelp', 'href' => 'https://doc.zwiicms.fr/configuration-du-site', 'target' => '_blank', - 'value' => template::ico('help') + 'value' => template::ico('help'), + 'help' => 'Consulter l\'aide en ligne' ]); ?>
    diff --git a/core/module/page/view/edit/edit.php b/core/module/page/view/edit/edit.php index 72ccf753..5e8b3645 100644 --- a/core/module/page/view/edit/edit.php +++ b/core/module/page/view/edit/edit.php @@ -14,7 +14,8 @@ 'href' => 'https://doc.zwiicms.fr/edition-des-pages', 'target' => '_blank', 'value' => template::ico('help'), - 'class' => 'buttonHelp' + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
    @@ -28,7 +29,8 @@
    helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'], - 'value' => template::ico('clone') + 'value' => template::ico('clone'), + 'help' => 'Dupliquer la page' ]); ?>
    diff --git a/core/module/theme/view/admin/admin.php b/core/module/theme/view/admin/admin.php index 510affdf..ef3e4f9a 100644 --- a/core/module/theme/view/admin/admin.php +++ b/core/module/theme/view/admin/admin.php @@ -18,7 +18,8 @@ 'buttonRed', 'href' => helper::baseUrl() . 'theme/reset/admin' . '&csrf=' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Réinitialiser avec le thème par défaut' ]); ?>
    diff --git a/core/module/theme/view/advanced/advanced.php b/core/module/theme/view/advanced/advanced.php index 3b507b25..598b8507 100644 --- a/core/module/theme/view/advanced/advanced.php +++ b/core/module/theme/view/advanced/advanced.php @@ -11,7 +11,9 @@ helper::baseUrl() . 'theme/reset/custom' . '&csrf=' . $_SESSION['csrf'], 'class' => 'buttonRed', - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Réinitialiser la feuille de style' + ]); ?>
    diff --git a/core/module/theme/view/manage/manage.php b/core/module/theme/view/manage/manage.php index 90b994d3..c6c3ac22 100644 --- a/core/module/theme/view/manage/manage.php +++ b/core/module/theme/view/manage/manage.php @@ -7,12 +7,12 @@ 'value' => template::ico('left') ]); ?>
    -
    +
    'buttonRed', 'href' => helper::baseUrl() . 'theme/reset/manage' . '&csrf=' . $_SESSION['csrf'], - 'value' => 'Réinitialiser', - 'ico' => 'cancel' + 'value' => template::ico('cancel'), + 'help' => 'Réinitialiser avec le thème par défaut' ]); ?>
    diff --git a/core/module/translate/view/copy/copy.php b/core/module/translate/view/copy/copy.php index 4cb9e1fd..890128b8 100644 --- a/core/module/translate/view/copy/copy.php +++ b/core/module/translate/view/copy/copy.php @@ -1,15 +1,16 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . 'translate', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    - +
    + 'Copier' + ]); ?>
    diff --git a/core/module/translate/view/index/index.php b/core/module/translate/view/index/index.php index 383b944a..719a5bbd 100644 --- a/core/module/translate/view/index/index.php +++ b/core/module/translate/view/index/index.php @@ -11,16 +11,17 @@ 'https://doc.zwiicms.fr/prise-en-charge-des-langues-etrangeres', 'target' => '_blank', - 'value' => template::ico('cancel'), - 'class' => 'buttonHelp' + 'value' => template::ico('help'), + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
    -
    +
    helper::baseUrl() . 'translate/copy', - 'value' => 'Copie inter-langues', - 'ico' => 'cogs', - 'disabled' => $module::$siteTranslate + 'value' => template::ico('cogs'), + 'disabled' => $module::$siteTranslate, + 'help' => 'Utilitaire de copie de site inter-langues' ]); ?>
    diff --git a/core/module/user/view/import/import.help.html b/core/module/user/view/import/import.help.html deleted file mode 100644 index 0be5e2dd..00000000 --- a/core/module/user/view/import/import.help.html +++ /dev/null @@ -1,4 +0,0 @@ -

    IMPORT

    -

    Pour réaliser un fichier CSV d'utilisateurs les en-têtes obligatoires sont : id, nom, prenom, email et groupe ( 1 : membre - 2 : éditeur - 3 : administrateur )

    -

    Voir ce modèle à compléter avec un tableur.

    -

    Enregistrez au format CSV, séparateur ; ou , ou : puis téléversez votre fichier avec 'Gérer les fichiers'.

    diff --git a/core/module/user/view/import/import.php b/core/module/user/view/import/import.php index e879b7e1..e6d1ee43 100644 --- a/core/module/user/view/import/import.php +++ b/core/module/user/view/import/import.php @@ -12,7 +12,8 @@ 'href' => 'https://doc.zwiicms.fr/importation-d-une-liste-d-utilisateurs', 'target' => '_blank', 'value' => template::ico('help'), - 'class' => 'buttonHelp' + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
    diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index 1e0730ce..aa82d8fb 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -11,19 +11,22 @@ 'href' => 'https://doc.zwiicms.fr/gestion-des-utilisateurs', 'target' => '_blank', 'value' => template::ico('help'), - 'class' => 'buttonHelp' + 'class' => 'buttonHelp', + 'help' => 'Consulter l\'aide en ligne' ]); ?>
    helper::baseUrl() . 'user/import', - 'value' => template::ico('download') + 'value' => template::ico('plus') . template::ico('plus'), + 'help' => 'Importer des utilisateurs en masse' ]); ?>
    helper::baseUrl() . 'user/add', - 'value' => template::ico('plus') + 'value' => template::ico('plus'), + 'help' => 'Ajouter un utilisateur' ]); ?>
    From 7dda7063d276a724f071d3bed044dc6ed8918288 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Thu, 20 Jan 2022 17:11:12 +0100 Subject: [PATCH 069/103] version --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f2902060..40cd4269 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# ZwiiCMS 11.3.0 +# ZwiiCMS 11.3.00 Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation. From ebe76fad2a7b5a97198870dafd1e6dc89a9775df Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 21 Jan 2022 10:58:13 +0100 Subject: [PATCH 070/103] =?UTF-8?q?Aide=20sur=20les=20boutons=20d'ic=C3=B4?= =?UTF-8?q?nes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/addon/addon.php | 15 ++-- core/module/addon/view/store/store.php | 2 +- core/module/translate/view/index/index.php | 2 +- core/module/user/user.php | 6 +- core/vendor/tippy/init.js | 81 ++++++++++++---------- module/blog/blog.php | 9 ++- module/blog/view/config/config.php | 6 +- module/form/view/config/config.php | 6 +- module/form/view/data/data.php | 17 +++-- module/form/view/option/option.php | 7 +- module/gallery/gallery.php | 6 +- module/gallery/view/config/config.php | 3 +- module/gallery/view/gallery/gallery.php | 5 +- module/gallery/view/theme/theme.php | 2 +- module/news/view/config/config.php | 14 ++-- 15 files changed, 105 insertions(+), 76 deletions(-) diff --git a/core/module/addon/addon.php b/core/module/addon/addon.php index 3c528df4..1e9b0f6e 100644 --- a/core/module/addon/addon.php +++ b/core/module/addon/addon.php @@ -302,15 +302,18 @@ class addon extends common { // Module non installé $ico = template::ico('download'); $class = ''; + $help = 'Installer le module'; // Le module est installé if (array_key_exists($key,$infoModules) === true) { $class = 'buttonGreen'; $ico = template::ico('update'); + $help = 'Mettre à jour ce module'; } // Le module est installé et utilisé if (in_array($key,$inPages) === true) { $class = 'buttonRed'; $ico = template::ico('update'); + $help = 'Mettre à jour le module'; } self::$storeList [] = [ $store[$key]['category'], @@ -323,7 +326,8 @@ class addon extends common { template::button('moduleExport' . $key, [ 'class' => $class, 'href' => helper::baseUrl(). $this->getUrl(0) . '/uploadItem/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => $ico + 'value' => $ico, + 'help' => $help ]) ]; } @@ -380,19 +384,22 @@ class addon extends common { ? template::button('moduleDelete' . $key, [ 'class' => 'moduleDelete buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Supprimer le module '. $key ]) : '', implode(', ',array_keys($inPages,$key)) !== '' ? template::button('moduleExport' . $key, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('download') + 'value' => template::ico('download'), + 'help' => 'Exporter les données du module avec sa page' ]) : '', implode(', ',array_keys($inPages,$key)) === '' ? template::button('moduleExport' . $key, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('upload') + 'value' => template::ico('upload'), + 'help' => 'Importer les données du module avec sa page' ]) : '' ]; diff --git a/core/module/addon/view/store/store.php b/core/module/addon/view/store/store.php index ba0e292c..8646d8cf 100644 --- a/core/module/addon/view/store/store.php +++ b/core/module/addon/view/store/store.php @@ -8,7 +8,7 @@
    - Mettre à jour']); ?> + \ No newline at end of file diff --git a/core/module/translate/view/index/index.php b/core/module/translate/view/index/index.php index 719a5bbd..777a920d 100644 --- a/core/module/translate/view/index/index.php +++ b/core/module/translate/view/index/index.php @@ -21,7 +21,7 @@ 'href' => helper::baseUrl() . 'translate/copy', 'value' => template::ico('cogs'), 'disabled' => $module::$siteTranslate, - 'help' => 'Utilitaire de copie de site inter-langues' + 'help' => 'Copie de sites inter-langues' ]); ?>
    diff --git a/core/module/user/user.php b/core/module/user/user.php index 82a22882..dab81c76 100644 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -346,12 +346,14 @@ class user extends common { self::$groups[$this->getData(['user', $userId, 'group'])], template::button('userEdit' . $userId, [ 'href' => helper::baseUrl() . 'user/edit/' . $userId . '/back/'. $_SESSION['csrf'], - 'value' => template::ico('pencil') + 'value' => template::ico('pencil'), + 'help' => 'Editer ' . $userId ]), template::button('userDelete' . $userId, [ 'class' => 'userDelete buttonRed', 'href' => helper::baseUrl() . 'user/delete/' . $userId. '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Supprimer ' . $userId ]) ]; } diff --git a/core/vendor/tippy/init.js b/core/vendor/tippy/init.js index 976da1e6..210a5f14 100755 --- a/core/vendor/tippy/init.js +++ b/core/vendor/tippy/init.js @@ -1,38 +1,49 @@ /** * Initialisation de Tippy */ -$(document).ready(function() { - // Tooltip des aides - tippy(".helpButton", { - arrow: true, - arrowType: "round", - placement: "top" - }); - // Tooltip des attributs title - tippy("[data-tippy-content]", { - arrow: true, - placement: "top" - }); - // Pour les images map, pas de flèche, bulle haut suivant le curseur - - tippy('img[title], a[title], area[title]', { - - content(reference) { - const title = reference.getAttribute('title') - reference.removeAttribute('title') - return title - }, - - placement: "top", - followCursor: true, - animation: "fade", - animateFill: true - }); - // Pour les images map, pas de flèche, bulle haut suivant le curseur - tippy("#image-map", { - placement: "top", - followCursor: true, - animation: "fade", - animateFill: true - }); -}); +$(document).ready(function () { + + // Tooltip des attributs title + tippy("[data-tippy-content]", { + arrow: true, + placement: "top" + }); + + // Pour les images map, pas de flèche, bulle haut suivant le curseur + tippy('img[title], a[title]:not(.button), area[title]', { + + content(reference) { + const title = reference.getAttribute('title') + reference.removeAttribute('title') + return title + }, + + placement: "top", + followCursor: true, + animation: "fade", + animateFill: true + }); + + // Tooltip des aides + tippy('a.button[title]', { + content(reference) { + const title = reference.getAttribute('title') + reference.removeAttribute('title') + return title + }, + delay: [1000,250], + placement: "bottom", + followCursor: false, + arrow: true, + animateFill: true, + arrowType: "round", + }); + + // Pour les images map, pas de flèche, bulle haut suivant le curseur + tippy("#image-map", { + placement: "top", + followCursor: true, + animation: "fade", + animateFill: true + }); +}); \ No newline at end of file diff --git a/module/blog/blog.php b/module/blog/blog.php index c2f98d2c..b25c4b0f 100644 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -462,16 +462,19 @@ class blog extends common { template::button('blogConfigComment' . $articleIds[$i], [ 'class' => ($toApprove || $approved ) > 0 ? '' : 'buttonGrey' , 'href' => ($toApprove || $approved ) > 0 ? helper::baseUrl() . $this->getUrl(0) . '/comment/' . $articleIds[$i] : '', - 'value' => $toApprove > 0 ? $toApprove . '/' . $approved : $approved + 'value' => $toApprove > 0 ? $toApprove . '/' . $approved : $approved, + 'help' => ($toApprove || $approved ) > 0 ? 'Editer / Approuver les commentaires' : '' ]), template::button('blogConfigEdit' . $articleIds[$i], [ 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $articleIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') + 'value' => template::ico('pencil'), + 'help' => 'Editer l\'article' ]), template::button('blogConfigDelete' . $articleIds[$i], [ 'class' => 'blogConfigDelete buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $articleIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Effacer l\'article' ]) ]; } diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index b08d8c7b..0a34ab28 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -10,14 +10,16 @@
    helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs') + 'value' => template::ico('cogs'), + 'help' => 'Options de configuration' ]); ?>
    helper::baseUrl() . $this->getUrl(0) . '/add', - 'value' => template::ico('plus') + 'value' => template::ico('plus'), + 'help' => 'Rédiger un article' ]); ?>
    diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 44e663b5..4da4e856 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -60,13 +60,15 @@
    helper::baseUrl() . $this->getUrl(0) . '/data', - 'value' => template::ico('code') + 'value' => template::ico('code'), + 'help' => 'Voir et exporter les données du formulaire' ]); ?>
    helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs') + 'value' => template::ico('cogs'), + 'help' => 'Options de configuration' ]); ?>
    diff --git a/module/form/view/data/data.php b/module/form/view/data/data.php index d0a22868..147548a7 100644 --- a/module/form/view/data/data.php +++ b/module/form/view/data/data.php @@ -1,25 +1,24 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    'formDataDeleteAll buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/deleteall' . '/' . $_SESSION['csrf'], - 'ico' => 'cancel', - 'value' => 'Tout effacer' + 'value' => template::ico('cancel'), + 'help' => 'Effacer toutes les données' ]); ?>
    -
    +
    helper::baseUrl() . $this->getUrl(0) . '/export2csv' . '/' . $_SESSION['csrf'], - 'ico' => 'download', - 'value' => 'Export CSV' + 'value' => template::ico('download'), + 'help' => 'Exporter toutes les données' ]); ?>
    diff --git a/module/form/view/option/option.php b/module/form/view/option/option.php index 47fb53e1..fe479465 100644 --- a/module/form/view/option/option.php +++ b/module/form/view/option/option.php @@ -1,14 +1,13 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    -
    +
    diff --git a/module/gallery/gallery.php b/module/gallery/gallery.php index 67483a83..e2d99e61 100644 --- a/module/gallery/gallery.php +++ b/module/gallery/gallery.php @@ -346,12 +346,14 @@ class gallery extends common { $gallery['config']['directory'], template::button('galleryConfigEdit' . $galleryId , [ 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $galleryId . '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') + 'value' => template::ico('pencil'), + 'help' => 'Configuration de la galerie ' ]), template::button('galleryConfigDelete' . $galleryId, [ 'class' => 'galleryConfigDelete buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $galleryId . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Supprimer cette galerie' ]) ]; // Tableau des id des galleries pour le drag and drop diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index acf5c757..526cdaab 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -10,7 +10,8 @@
    helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], - 'value' => template::ico('brush') + 'value' => template::ico('brush'), + 'help' => 'Thème de cette galerie' ]); ?>
    diff --git a/module/gallery/view/gallery/gallery.php b/module/gallery/view/gallery/gallery.php index 9e617583..235aac0d 100644 --- a/module/gallery/view/gallery/gallery.php +++ b/module/gallery/view/gallery/gallery.php @@ -1,10 +1,9 @@
    -
    +
    'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0), - 'ico' => 'left', - 'value' => 'Retour' + 'value' => template::ico('left') ]); ?>
    diff --git a/module/gallery/view/theme/theme.php b/module/gallery/view/theme/theme.php index a585cc73..a66c589d 100644 --- a/module/gallery/view/theme/theme.php +++ b/module/gallery/view/theme/theme.php @@ -5,7 +5,7 @@ 'buttonGrey', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config', - 'value' => template::ico('cancel') + 'value' => template::ico('left') ]); ?>
    diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 0a855f6e..5341b1c8 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -8,15 +8,17 @@ ]); ?>
    - helper::baseUrl() . $this->getUrl(0) . '/add', - 'value' => template::ico('plus') + helper::baseUrl() . $this->getUrl(0) . '/option', + 'value' => template::ico('cogs'), + 'help' => 'Options de configuration' ]); ?>
    - helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('brush') + helper::baseUrl() . $this->getUrl(0) . '/add', + 'value' => template::ico('plus'), + 'help' => 'Rédiger une news' ]); ?>
    From ec8ead747a7792a1e5d06bb66230a8e65d8d35a1 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 21 Jan 2022 13:50:21 +0100 Subject: [PATCH 071/103] =?UTF-8?q?supprime=20le=20syst=C3=A8me=20d'aide?= =?UTF-8?q?=20interne?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.js.php | 20 -------------------- core/layout/common.css | 16 ---------------- core/module/addon/view/index/index.php | 4 ---- 3 files changed, 40 deletions(-) diff --git a/core/core.js.php b/core/core.js.php index afceb326..e97e0bf7 100644 --- a/core/core.js.php +++ b/core/core.js.php @@ -490,26 +490,6 @@ $(document).ready(function(){ }; }); - /** - * Active le système d'aide interne - * - */ - - $(".buttonHelp").click(function() { - $(".helpDisplayContent").slideToggle(); - /** - if( $(".buttonHelp").css('opacity') > '0.75'){ - $(".buttonHelp").css('opacity','0.5'); - } - else{ - $(".buttonHelp").css('opacity','1'); - } - */ - }); - - $(".helpDisplayContent").click(function() { - $(".helpDisplayContent").slideToggle(); - }); /** * Remove ID Facebook from URL diff --git a/core/layout/common.css b/core/layout/common.css index d21cb214..0cd8c3ed 100755 --- a/core/layout/common.css +++ b/core/layout/common.css @@ -1743,22 +1743,6 @@ th.col12 { width: 60%; } -/* Système d'aide */ - -.helpDisplayContent { - display: none; - width: 100%; - padding: 10px 10px; - -webkit-box-shadow: 5px 5px 11px 0px #222222; - box-shadow: 5px 5px 11px 0px #222222; - border-radius: 5px; - z-index: 30; -} - -.helpDisplayContent, .helpDisplayButton { - cursor: pointer; -} - /* Bannière masquable en petit écran*/ @media screen and (max-width: 768px) { .bannerDisplay{ diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index 2b3a1767..254d9834 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -30,10 +30,6 @@ ]); ?>
    - -
    - -
    From bfbcb95510bb6d0bb0c4e4df0e3dcc3562c93053 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 21 Jan 2022 14:31:36 +0100 Subject: [PATCH 072/103] =?UTF-8?q?Nouveau=20jeu=20d'ic=C3=B4nes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/addon/view/index/index.php | 2 +- core/module/config/view/setup/setup.php | 2 +- core/module/theme/view/index/index.php | 4 ++-- core/module/translate/view/index/index.php | 2 +- core/module/user/view/index/index.php | 2 +- core/vendor/zwiico/css/zwiico-codes.css | 3 +++ core/vendor/zwiico/css/zwiico-embedded.css | 18 ++++++++++++++++++ core/vendor/zwiico/css/zwiico-ie7-codes.css | 3 +++ core/vendor/zwiico/css/zwiico-ie7.css | 3 +++ core/vendor/zwiico/css/zwiico.css | 16 ++++++++++++++++ module/blog/view/config/config.php | 2 +- module/form/view/config/config.php | 2 +- module/gallery/view/config/config.php | 4 ++-- module/news/news.php | 6 ++++-- module/news/view/config/config.php | 2 +- 15 files changed, 58 insertions(+), 13 deletions(-) diff --git a/core/module/addon/view/index/index.php b/core/module/addon/view/index/index.php index 254d9834..f5ee7fc6 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/addon/view/index/index.php @@ -18,7 +18,7 @@
    helper::baseUrl() . 'addon/store', - 'value' => template::ico('plus') . template::ico('plus'), + 'value' => template::ico('shopping-basket'), "help" => 'Lister le catalogue en ligne' ]); ?>
    diff --git a/core/module/config/view/setup/setup.php b/core/module/config/view/setup/setup.php index 97c603c0..90f5b36a 100644 --- a/core/module/config/view/setup/setup.php +++ b/core/module/config/view/setup/setup.php @@ -137,7 +137,7 @@ helper::baseUrl() . 'config/copyBackups', 'value' => 'Copie sauvegardes auto', - 'ico' => 'download-cloud' + 'ico' => 'docs' ]); ?>
    diff --git a/core/module/theme/view/index/index.php b/core/module/theme/view/index/index.php index 85f0a16f..d2b5ec4e 100644 --- a/core/module/theme/view/index/index.php +++ b/core/module/theme/view/index/index.php @@ -32,7 +32,7 @@
    'cogs', + 'ico' => 'sliders', 'href' => helper::baseUrl() . $this->getUrl(0) . '/manage', 'value' => 'Gestion' ]); ?> @@ -77,7 +77,7 @@
    'cogs', + 'ico' => 'sliders', 'href' => helper::baseUrl() . $this->getUrl(0) . '/manage', 'value' => 'Gestion' ]); ?> diff --git a/core/module/translate/view/index/index.php b/core/module/translate/view/index/index.php index 777a920d..fabc4e6a 100644 --- a/core/module/translate/view/index/index.php +++ b/core/module/translate/view/index/index.php @@ -19,7 +19,7 @@
    helper::baseUrl() . 'translate/copy', - 'value' => template::ico('cogs'), + 'value' => template::ico('docs'), 'disabled' => $module::$siteTranslate, 'help' => 'Copie de sites inter-langues' ]); ?> diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index aa82d8fb..0e626198 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -18,7 +18,7 @@
    helper::baseUrl() . 'user/import', - 'value' => template::ico('plus') . template::ico('plus'), + 'value' => template::ico('table') , 'help' => 'Importer des utilisateurs en masse' ]); ?>
    diff --git a/core/vendor/zwiico/css/zwiico-codes.css b/core/vendor/zwiico/css/zwiico-codes.css index 90f637d8..0f363830 100755 --- a/core/vendor/zwiico/css/zwiico-codes.css +++ b/core/vendor/zwiico/css/zwiico-codes.css @@ -55,8 +55,11 @@ .zwiico-calendar-empty:before { content: '\f133'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ +<<<<<<< HEAD .zwiico-box:before { content: '\f187'; } /* '' */ .zwiico-file-archive:before { content: '\f1c6'; } /* '' */ +======= +>>>>>>> Nouveau jeu d'icônes .zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */ diff --git a/core/vendor/zwiico/css/zwiico-embedded.css b/core/vendor/zwiico/css/zwiico-embedded.css index f09c2359..e0782796 100755 --- a/core/vendor/zwiico/css/zwiico-embedded.css +++ b/core/vendor/zwiico/css/zwiico-embedded.css @@ -1,15 +1,26 @@ @font-face { font-family: 'zwiico'; +<<<<<<< HEAD src: url('../font/zwiico.eot?81579449'); src: url('../font/zwiico.eot?81579449#iefix') format('embedded-opentype'), url('../font/zwiico.svg?81579449#zwiico') format('svg'); +======= + src: url('../font/zwiico.eot?96425754'); + src: url('../font/zwiico.eot?96425754#iefix') format('embedded-opentype'), + url('../font/zwiico.svg?96425754#zwiico') format('svg'); +>>>>>>> Nouveau jeu d'icônes font-weight: normal; font-style: normal; } @font-face { font-family: 'zwiico'; +<<<<<<< HEAD src: url('data:application/octet-stream;base64,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') format('woff'), url('data:application/octet-stream;base64,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') format('truetype'); +======= + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); +>>>>>>> Nouveau jeu d'icônes } /* 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 +28,11 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'zwiico'; +<<<<<<< HEAD src: url('../font/zwiico.svg?81579449#zwiico') format('svg'); +======= + src: url('../font/zwiico.svg?96425754#zwiico') format('svg'); +>>>>>>> Nouveau jeu d'icônes } } */ @@ -113,8 +128,11 @@ .zwiico-calendar-empty:before { content: '\f133'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ +<<<<<<< HEAD .zwiico-box:before { content: '\f187'; } /* '' */ .zwiico-file-archive:before { content: '\f1c6'; } /* '' */ +======= +>>>>>>> Nouveau jeu d'icônes .zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */ diff --git a/core/vendor/zwiico/css/zwiico-ie7-codes.css b/core/vendor/zwiico/css/zwiico-ie7-codes.css index f4b1860e..5fea69d5 100755 --- a/core/vendor/zwiico/css/zwiico-ie7-codes.css +++ b/core/vendor/zwiico/css/zwiico-ie7-codes.css @@ -55,8 +55,11 @@ .zwiico-calendar-empty { *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 = ' '); } +<<<<<<< HEAD .zwiico-box { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +======= +>>>>>>> Nouveau jeu d'icônes .zwiico-sliders { *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 = ' '); } diff --git a/core/vendor/zwiico/css/zwiico-ie7.css b/core/vendor/zwiico/css/zwiico-ie7.css index 9116cba6..ddd44dba 100755 --- a/core/vendor/zwiico/css/zwiico-ie7.css +++ b/core/vendor/zwiico/css/zwiico-ie7.css @@ -66,8 +66,11 @@ .zwiico-calendar-empty { *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 = ' '); } +<<<<<<< HEAD .zwiico-box { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +======= +>>>>>>> Nouveau jeu d'icônes .zwiico-sliders { *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 = ' '); } diff --git a/core/vendor/zwiico/css/zwiico.css b/core/vendor/zwiico/css/zwiico.css index 4e79bfea..963cb7d1 100755 --- a/core/vendor/zwiico/css/zwiico.css +++ b/core/vendor/zwiico/css/zwiico.css @@ -1,11 +1,20 @@ @font-face { font-family: 'zwiico'; +<<<<<<< HEAD src: url('../font/zwiico.eot?39677933'); src: url('../font/zwiico.eot?39677933#iefix') format('embedded-opentype'), url('../font/zwiico.woff2?39677933') format('woff2'), url('../font/zwiico.woff?39677933') format('woff'), url('../font/zwiico.ttf?39677933') format('truetype'), url('../font/zwiico.svg?39677933#zwiico') format('svg'); +======= + src: url('../font/zwiico.eot?37992248'); + src: url('../font/zwiico.eot?37992248#iefix') format('embedded-opentype'), + url('../font/zwiico.woff2?37992248') format('woff2'), + url('../font/zwiico.woff?37992248') format('woff'), + url('../font/zwiico.ttf?37992248') format('truetype'), + url('../font/zwiico.svg?37992248#zwiico') format('svg'); +>>>>>>> Nouveau jeu d'icônes font-weight: normal; font-style: normal; } @@ -15,7 +24,11 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'zwiico'; +<<<<<<< HEAD src: url('../font/zwiico.svg?39677933#zwiico') format('svg'); +======= + src: url('../font/zwiico.svg?37992248#zwiico') format('svg'); +>>>>>>> Nouveau jeu d'icônes } } */ @@ -110,8 +123,11 @@ .zwiico-calendar-empty:before { content: '\f133'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ +<<<<<<< HEAD .zwiico-box:before { content: '\f187'; } /* '' */ .zwiico-file-archive:before { content: '\f1c6'; } /* '' */ +======= +>>>>>>> Nouveau jeu d'icônes .zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */ diff --git a/module/blog/view/config/config.php b/module/blog/view/config/config.php index 0a34ab28..df44db80 100644 --- a/module/blog/view/config/config.php +++ b/module/blog/view/config/config.php @@ -10,7 +10,7 @@
    helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs'), + 'value' => template::ico('sliders'), 'help' => 'Options de configuration' ]); ?> diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 4da4e856..49050a8d 100644 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -67,7 +67,7 @@
    helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs'), + 'value' => template::ico('sliders'), 'help' => 'Options de configuration' ]); ?>
    diff --git a/module/gallery/view/config/config.php b/module/gallery/view/config/config.php index 526cdaab..5f1fc67f 100644 --- a/module/gallery/view/config/config.php +++ b/module/gallery/view/config/config.php @@ -10,8 +10,8 @@
    helper::baseUrl() . $this->getUrl(0) . '/theme/' . $_SESSION['csrf'], - 'value' => template::ico('brush'), - 'help' => 'Thème de cette galerie' + 'value' => template::ico('sliders'), + 'help' => 'Options de configuration' ]); ?>
    diff --git a/module/news/news.php b/module/news/news.php index 69fc7c43..0f7a2aac 100644 --- a/module/news/news.php +++ b/module/news/news.php @@ -225,12 +225,14 @@ class news extends common { self::$states[$this->getData(['module', $this->getUrl(0),'posts', $newsIds[$i], 'state'])], template::button('newsConfigEdit' . $newsIds[$i], [ 'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsIds[$i]. '/' . $_SESSION['csrf'], - 'value' => template::ico('pencil') + 'value' => template::ico('pencil'), + 'help' => 'Editer cette nouvelle' ]), template::button('newsConfigDelete' . $newsIds[$i], [ 'class' => 'newsConfigDelete buttonRed', 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $newsIds[$i] . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel') + 'value' => template::ico('cancel'), + 'help' => 'Effacer cette nouvelle' ]) ]; } diff --git a/module/news/view/config/config.php b/module/news/view/config/config.php index 5341b1c8..5527854a 100644 --- a/module/news/view/config/config.php +++ b/module/news/view/config/config.php @@ -10,7 +10,7 @@
    helper::baseUrl() . $this->getUrl(0) . '/option', - 'value' => template::ico('cogs'), + 'value' => template::ico('sliders'), 'help' => 'Options de configuration' ]); ?>
    From 244257601092b85f53400b349562cb11c44ab194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Fri, 21 Jan 2022 19:11:51 +0100 Subject: [PATCH 073/103] effacement du dossier des sauvegarde auto --- core/module/config/config.php | 45 +++++++++--- core/module/config/view/index/index.js.php | 84 ++++++++++++---------- core/module/config/view/setup/setup.php | 24 +++++-- core/module/user/view/index/index.php | 2 +- 4 files changed, 101 insertions(+), 54 deletions(-) diff --git a/core/module/config/config.php b/core/module/config/config.php index f188125e..dbba1e29 100644 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -19,6 +19,7 @@ class config extends common { public static $actions = [ 'backup' => self::GROUP_ADMIN, 'copyBackups'=> self::GROUP_ADMIN, + 'delBackups'=> self::GROUP_ADMIN, 'configMetaImage' => self::GROUP_ADMIN, 'generateFiles' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN, @@ -593,7 +594,7 @@ class config extends common { $this->generateFiles(); // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Modifications enregistrées ' , 'state' => true @@ -625,7 +626,7 @@ class config extends common { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index' ]); } @@ -725,7 +726,7 @@ class config extends common { file_put_contents(self::DATA_DIR . 'journal.log',$d); // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Journal réinitialisé avec succès', 'state' => true @@ -733,7 +734,7 @@ class config extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Aucun journal à effacer', 'state' => false @@ -761,7 +762,7 @@ class config extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Aucun fichier journal à télécharger', 'state' => false @@ -798,7 +799,7 @@ class config extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Aucune liste noire à télécharger', 'state' => false @@ -815,7 +816,7 @@ class config extends common { $this->setData(['blacklist',[]]); // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Liste noire réinitialisée avec succès', 'state' => true @@ -823,7 +824,7 @@ class config extends common { } else { // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Pas de liste à effacer', 'state' => false @@ -842,11 +843,37 @@ class config extends common { $this->copyDir(self::BACKUP_DIR, self::FILE_DIR . 'source/backup' ); // Valeurs en sortie $this->addOutput([ - 'title' => 'Configuration', + 'title' => 'Configuration du site', 'view' => 'index', 'notification' => 'Copie terminée', 'state' => true ]); } + /** + * Vider le dosser des sauvegardes automatisées + */ + public function delBackups() { + $path = realpath(self::BACKUP_DIR); + $success = $fail = 0; + foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename) + { + if (strpos($filename,'.zip')) { + + $r = unlink($filename); + $success = $r === true ? $succes + 1 : $success; + $fail = $r === false ? $fail + 1 : $fail; + } + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Configuration du site', + 'view' => 'index', + 'notification' => 'Suppression terminée :
    ' . $success . ' fichiers effacé(s)
    ' . $fail . ' échec(s)', + 'state' => true + ]); + } + + + } diff --git a/core/module/config/view/index/index.js.php b/core/module/config/view/index/index.js.php index ee94b0e5..b50acb6d 100644 --- a/core/module/config/view/index/index.js.php +++ b/core/module/config/view/index/index.js.php @@ -10,7 +10,17 @@ * @link http://zwiicms.fr/ */ -$( document).ready(function() { +$(document).ready(function () { + + /** + * Confirmation de suppression + */ + $("#configBackupDelButton").on("click", function () { + var _this = $(this); + return core.confirm("Êtes-vous sûr de vouloir supprimer les sauvegardes automatisées ?", function () { + $(location).attr("href", _this.attr("href")); + }); + }); // Positionnement inital des options //----------------------------------------------------------------------------------------------------- @@ -45,36 +55,36 @@ $( document).ready(function() { $("#connectCaptchaStrongWrapper").addClass("disabled"); $("#connectCaptchaStrongWrapper").slideDown(); $("#connectCaptchaTypeWrapper").addClass("disabled"); - $("#connectCaptchaTypeWrapper").slideDown(); + $("#connectCaptchaTypeWrapper").slideDown(); } else { $("#connectCaptchaStrongWrapper").removeClass("disabled"); $("#connectCaptchaStrongWrapper").slideUp(); $("#connectCaptchaTypeWrapper").removeClass("disabled"); $("#connectCaptchaTypeWrapper").slideUp(); - $( "#connectCaptchaStrong" ).prop( "checked", false ); + $("#connectCaptchaStrong").prop("checked", false); } var configLayout = getCookie("configLayout"); if (configLayout == null) { configLayout = "setup"; - setCookie("configLayout","setup"); + setCookie("configLayout", "setup"); } $("#localeContainer").hide(); $("#socialContainer").hide(); $("#connectContainer").hide(); $("#networkContainer").hide(); $("#setupContainer").hide(); - $("#" + configLayout + "Container" ).show(); + $("#" + configLayout + "Container").show(); $("#config" + capitalizeFirstLetter(configLayout) + "Button").addClass("activeButton"); // Gestion des événements //--------------------------------------------------------------------------------------------------------------------- - /** + /** * Afficher et masquer options smtp */ - $("input[name=smtpEnable]").on("change", function() { + $("input[name=smtpEnable]").on("change", function () { if ($("input[name=smtpEnable]").is(':checked')) { $("#smtpParam").addClass("disabled"); $("#smtpParam").slideDown(); @@ -88,7 +98,7 @@ $( document).ready(function() { * Afficher et masquer options Auth */ - $("select[name=smtpAuth]").on("change", function() { + $("select[name=smtpAuth]").on("change", function () { if ($("select[name=smtpAuth]").val() == true) { $("#smtpAuthParam").addClass("disabled"); $("#smtpAuthParam").slideDown(); @@ -102,7 +112,7 @@ $( document).ready(function() { * Options de blocage de connexions * Contrôle la cohérence des sélections et interdit une seule valeur Aucune */ - $("select[name=connectAttempt]").on("change", function() { + $("select[name=connectAttempt]").on("change", function () { if ($("select[name=connectAttempt]").val() === "999") { $("select[name=connectTimeout]").val(0); } else { @@ -111,7 +121,7 @@ $( document).ready(function() { } } }); - $("select[name=connectTimeout]").on("change", function() { + $("select[name=connectTimeout]").on("change", function () { if ($("select[name=connectTimeout]").val() === "0") { $("select[name=connectAttempt]").val(999); } else { @@ -124,20 +134,20 @@ $( document).ready(function() { /** * Captcha strong si captcha sélectionné */ - $("input[name=connectCaptcha]").on("change", function() { - + $("input[name=connectCaptcha]").on("change", function () { + if ($("input[name=connectCaptcha]").is(':checked')) { $("#connectCaptchaStrongWrapper").addClass("disabled"); $("#connectCaptchaStrongWrapper").slideDown(); $("#connectCaptchaTypeWrapper").addClass("disabled"); - $("#connectCaptchaTypeWrapper").slideDown(); - + $("#connectCaptchaTypeWrapper").slideDown(); + } else { $("#connectCaptchaStrongWrapper").removeClass("disabled"); $("#connectCaptchaStrongWrapper").slideUp(); $("#connectCaptchaTypeWrapper").removeClass("disabled"); $("#connectCaptchaTypeWrapper").slideUp(); - $( "#connectCaptchaStrong" ).prop( "checked", false ); + $("#connectCaptchaStrong").prop("checked", false); } }); @@ -145,7 +155,7 @@ $( document).ready(function() { /** * Sélection de la page de configuration à afficher */ - $("#configSetupButton").on("click", function() { + $("#configSetupButton").on("click", function () { $("#localeContainer").hide(); $("#socialContainer").hide(); $("#connectContainer").hide(); @@ -156,9 +166,9 @@ $( document).ready(function() { $("#configSocialButton").removeClass("activeButton"); $("#configConnectButton").removeClass("activeButton"); $("#configNetworkButton").removeClass("activeButton"); - setCookie("configLayout","setup"); + setCookie("configLayout", "setup"); }); - $("#configLocaleButton").on("click", function() { + $("#configLocaleButton").on("click", function () { $("#setupContainer").hide(); $("#socialContainer").hide(); $("#connectContainer").hide(); @@ -169,9 +179,9 @@ $( document).ready(function() { $("#configSocialButton").removeClass("activeButton"); $("#configConnectButton").removeClass("activeButton"); $("#configNetworkButton").removeClass("activeButton"); - setCookie("configLayout","locale"); + setCookie("configLayout", "locale"); }); - $("#configSocialButton").on("click", function() { + $("#configSocialButton").on("click", function () { $("#connectContainer").hide(); $("#setupContainer").hide(); $("#localeContainer").hide(); @@ -182,9 +192,9 @@ $( document).ready(function() { $("#configSocialButton").addClass("activeButton"); $("#configConnectButton").removeClass("activeButton"); $("#configNetworkButton").removeClass("activeButton"); - setCookie("configLayout","social"); + setCookie("configLayout", "social"); }); - $("#configConnectButton").on("click", function() { + $("#configConnectButton").on("click", function () { $("#setupContainer").hide(); $("#localeContainer").hide(); $("#socialContainer").hide(); @@ -195,9 +205,9 @@ $( document).ready(function() { $("#configSocialButton").removeClass("activeButton"); $("#configConnectButton").addClass("activeButton"); $("#configNetworkButton").removeClass("activeButton"); - setCookie("configLayout","connect"); + setCookie("configLayout", "connect"); }); - $("#configNetworkButton").on("click", function() { + $("#configNetworkButton").on("click", function () { $("#setupContainer").hide(); $("#localeContainer").hide(); $("#socialContainer").hide(); @@ -208,49 +218,49 @@ $( document).ready(function() { $("#configSocialButton").removeClass("activeButton"); $("#configConnectButton").removeClass("activeButton"); $("#configNetworkButton").addClass("activeButton"); - setCookie("configLayout","network"); + setCookie("configLayout", "network"); }); - + /** * Aspect de la souris - */ - $("#socialMetaImage, #socialSiteMap, #configBackupCopyButton").click(function(event) { + */ + $("#socialMetaImage, #socialSiteMap, #configBackupCopyButton").click(function (event) { $('body, .button').css('cursor', 'wait'); }); // Mise en évidence des erreurs de saisie dans les boutons de sélection var containers = ["setup", "locale", "social", "connect", "network"]; - $.each( containers, function( index, value ){ + $.each(containers, function (index, value) { var a = $("div#" + value + "Container").find("input.notice").not(".displayNone"); if (a.length > 0) { - $("#config" + capitalizeFirstLetter(value) + "Button").addClass("buttonNotice"); + $("#config" + capitalizeFirstLetter(value) + "Button").addClass("buttonNotice"); } else { - $("#config" + capitalizeFirstLetter(value) + "Button").removeClass("buttonNotice"); + $("#config" + capitalizeFirstLetter(value) + "Button").removeClass("buttonNotice"); } }); }); -function setCookie(name,value,days) { +function setCookie(name, value, days) { var expires = ""; if (days) { var date = new Date(); - date.setTime(date.getTime() + (days*24*60*60*1000)); + date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000)); expires = "; expires=" + date.toUTCString(); } - document.cookie = name + "=" + (value || "") + expires + "; path=/; samesite=lax"; + document.cookie = name + "=" + (value || "") + expires + "; path=/; samesite=lax"; } function getCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); - for(var i=0;i < ca.length;i++) { + for (var i = 0; i < ca.length; i++) { var c = ca[i]; - while (c.charAt(0)==' ') c = c.substring(1,c.length); - if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length); + while (c.charAt(0) == ' ') c = c.substring(1, c.length); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); } return null; } diff --git a/core/module/config/view/setup/setup.php b/core/module/config/view/setup/setup.php index 90f5b36a..20e7e1ff 100644 --- a/core/module/config/view/setup/setup.php +++ b/core/module/config/view/setup/setup.php @@ -118,28 +118,38 @@ ]); ?>
    -
    -
    +
    +
    helper::baseUrl() . 'config/backup', - 'value' => 'Sauvegarder', + 'value' => 'Sauvegarder les données du site', 'ico' => 'download-cloud' ]); ?>
    -
    +
    helper::baseUrl() . 'config/restore', - 'value' => 'Restaurer', + 'value' => 'Restaurer les données du site', 'ico' => 'upload-cloud' ]); ?>
    -
    +
    +
    +
    helper::baseUrl() . 'config/copyBackups', - 'value' => 'Copie sauvegardes auto', + 'value' => 'Copier sauvegardes auto', 'ico' => 'docs' ]); ?>
    +
    + helper::baseUrl() . 'config/delBackups', + 'value' => 'Vider dossier sauvegardes auto', + 'ico' => 'cancel', + 'class' => 'buttonRed' + ]); ?> +
    diff --git a/core/module/user/view/index/index.php b/core/module/user/view/index/index.php index 0e626198..1a89a67e 100644 --- a/core/module/user/view/index/index.php +++ b/core/module/user/view/index/index.php @@ -18,7 +18,7 @@
    helper::baseUrl() . 'user/import', - 'value' => template::ico('table') , + 'value' => template::ico('upload') , 'help' => 'Importer des utilisateurs en masse' ]); ?>
    From f9810ade1d8e48efe0161691c5fde75d9c104bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Fri, 21 Jan 2022 19:12:24 +0100 Subject: [PATCH 074/103] url store --- core/module/addon/addon.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/module/addon/addon.php b/core/module/addon/addon.php index 1e9b0f6e..3379395f 100644 --- a/core/module/addon/addon.php +++ b/core/module/addon/addon.php @@ -30,7 +30,7 @@ class addon extends common { ]; // URL des modules - const BASEURL_STORE = 'https://store.zwiicms.fr/'; + const BASEURL_STORE = 'https://www.zwiicms.fr/'; const MODULE_STORE = '?modules/'; // Gestion des modules From 9663e67bc37c8c26ccb8af736fa1e20a1afd1c97 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Wed, 26 Jan 2022 10:22:41 +0100 Subject: [PATCH 075/103] bug autoupdate --- core/class/helper.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/helper.class.php b/core/class/helper.class.php index 99f33ee2..6940bd1c 100644 --- a/core/class/helper.class.php +++ b/core/class/helper.class.php @@ -281,7 +281,7 @@ class helper { if($version = helper::getOnlineVersion()) { //return (trim($version) !== common::ZWII_VERSION); - return ((version_compare(common::ZWII_VERSION,$version,'<')) === -1); + return ((version_compare(common::ZWII_VERSION,$version)) === -1); } else { return false; From 7e2df69c9513c8a377e390ce58ec5a16b98d7701 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Wed, 26 Jan 2022 11:40:48 +0100 Subject: [PATCH 076/103] nom addon -> plugin +export wip --- core/module/addon/view/import/import.php | 30 --- .../{addon/addon.php => plugin/plugin.php} | 241 +++++++++++------- .../view/dataExport/dataExport.css} | 0 .../plugin/view/dataExport/dataExport.php | 30 +++ .../view/dataImport/dataImport.css} | 0 .../plugin/view/dataImport/dataImport.php | 35 +++ .../store.css => plugin/view/index/index.css} | 0 .../view/index/index.help.html | 0 .../{addon => plugin}/view/index/index.js.php | 0 .../{addon => plugin}/view/index/index.php | 6 +- .../{addon => plugin}/view/item/item.css | 0 .../{addon => plugin}/view/item/item.php | 0 .../view/store/store.css} | 0 .../{addon => plugin}/view/store/store.php | 2 +- core/module/plugin/view/upload/upload.css | 18 ++ .../{addon => plugin}/view/upload/upload.php | 4 +- 16 files changed, 231 insertions(+), 135 deletions(-) delete mode 100644 core/module/addon/view/import/import.php rename core/module/{addon/addon.php => plugin/plugin.php} (73%) rename core/module/{addon/view/import/import.css => plugin/view/dataExport/dataExport.css} (100%) create mode 100644 core/module/plugin/view/dataExport/dataExport.php rename core/module/{addon/view/index/index.css => plugin/view/dataImport/dataImport.css} (100%) create mode 100644 core/module/plugin/view/dataImport/dataImport.php rename core/module/{addon/view/store/store.css => plugin/view/index/index.css} (100%) rename core/module/{addon => plugin}/view/index/index.help.html (100%) rename core/module/{addon => plugin}/view/index/index.js.php (100%) rename core/module/{addon => plugin}/view/index/index.php (88%) rename core/module/{addon => plugin}/view/item/item.css (100%) rename core/module/{addon => plugin}/view/item/item.php (100%) rename core/module/{addon/view/upload/upload.css => plugin/view/store/store.css} (100%) rename core/module/{addon => plugin}/view/store/store.php (87%) create mode 100644 core/module/plugin/view/upload/upload.css rename core/module/{addon => plugin}/view/upload/upload.php (93%) diff --git a/core/module/addon/view/import/import.php b/core/module/addon/view/import/import.php deleted file mode 100644 index 8ccc44ce..00000000 --- a/core/module/addon/view/import/import.php +++ /dev/null @@ -1,30 +0,0 @@ - -
    -
    - 'buttonGrey', - 'href' => helper::baseUrl() . 'addon', - 'value' => template::ico('left') - ]); ?> -
    -
    - 'Appliquer' - ]); ?> -
    -
    -
    -
    -
    -

    Installer des données de module

    -
    -
    - 'Archive ZIP :', - 'type' => 2 - ]); ?> -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/core/module/addon/addon.php b/core/module/plugin/plugin.php similarity index 73% rename from core/module/addon/addon.php rename to core/module/plugin/plugin.php index 3379395f..ebf47770 100644 --- a/core/module/addon/addon.php +++ b/core/module/plugin/plugin.php @@ -16,21 +16,21 @@ * @link http://zwiicms.fr/ */ -class addon extends common { +class plugin extends common { public static $actions = [ 'index' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN, - 'export' => self::GROUP_ADMIN, - 'import' => self::GROUP_ADMIN, + 'dataExport' => self::GROUP_ADMIN, + 'dataImport' => self::GROUP_ADMIN, // les données d'un module 'store' => self::GROUP_ADMIN, - 'item' => self::GROUP_ADMIN, - 'upload' => self::GROUP_ADMIN, - 'uploadItem'=> self::GROUP_ADMIN + 'item' => self::GROUP_ADMIN, // détail d'un objet + 'upload' => self::GROUP_ADMIN, // Téléverser catalogue + 'uploadItem'=> self::GROUP_ADMIN // Téléverser par archive ]; // URL des modules - const BASEURL_STORE = 'https://www.zwiicms.fr/'; + const BASEURL_STORE = 'https://store.zwiicms.fr/'; const MODULE_STORE = '?modules/'; // Gestion des modules @@ -43,6 +43,9 @@ class addon extends common { public static $storeList = []; public static $storeItem = []; + // Liste de pages + public static $pagesList = []; + /* * Effacement d'un module installé et non utilisé @@ -53,7 +56,7 @@ class addon extends common { if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); @@ -81,7 +84,7 @@ class addon extends common { } // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'notification' => $notification, 'state' => $success ]); @@ -271,7 +274,7 @@ class addon extends common { *} */ $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon/store', + 'redirect' => helper::baseUrl() . 'plugin/store', 'notification' => $moduleFile . ' téléchargé dans le dossier modules du gestionnaire de fichiers', 'state' => true ]); @@ -390,16 +393,16 @@ class addon extends common { : '', implode(', ',array_keys($inPages,$key)) !== '' ? template::button('moduleExport' . $key, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), - 'help' => 'Exporter les données du module avec sa page' + 'help' => 'Exporter les données du module' ]) : '', implode(', ',array_keys($inPages,$key)) === '' ? template::button('moduleExport' . $key, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload'), - 'help' => 'Importer les données du module avec sa page' + 'help' => 'Importer les données du module' ]) : '' ]; @@ -415,95 +418,114 @@ class addon extends common { /* * Export des données d'un module externes ou interne à module.json */ - public function export(){ + public function dataExport(){ // Jeton incorrect if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); } else { - // Lire les données du module - $infoModules = helper::getModules(); - // Créer un dossier par défaut - $tmpFolder = self::TEMP_DIR . uniqid(); - //$tmpFolder = self::TEMP_DIR . 'test'; - if (!is_dir($tmpFolder)) { - mkdir($tmpFolder, 0755); - } - // Clés moduleIds dans les pages - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - // Parcourir les pages utilisant le module - foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) { - // Export des pages hébergeant le module - $pageParam[$pageId] = $this->getData(['page',$pageId]); - // Export du contenu de la page - //$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content'])); - $pageContent[$pageId] = $this->getPage($pageId, self::$i18n); - // Export de fr/module.json - $moduleId = 'fr/module.json'; - $moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']); - // Création de l'arborescence des langues - // Pas de nom dossier de langue - dossier par défaut - $t = explode ('/',$moduleId); - if ( is_array($t)) { - $lang = 'fr'; - } else { - $lang = $t[0]; + // Soumission du formulaire + if($this->isPost()) { + // Lire les données du module + $infoModules = helper::getModules(); + // Créer un dossier par défaut + $tmpFolder = self::TEMP_DIR . uniqid(); + //$tmpFolder = self::TEMP_DIR . 'test'; + if (!is_dir($tmpFolder)) { + mkdir($tmpFolder, 0755); } - // Créer le dossier temporaire si inexistant sinon le nettoie et le créer - if (!is_dir($tmpFolder . '/' . $lang)) { - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } else { - $this->removeDir($tmpFolder . '/' . $lang); - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } - // Créer le dossier temporaire des données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory']) { - if (!is_dir($tmpFolder . '/' . $moduleDir)) { - mkdir ($tmpFolder . '/' . $moduleDir, 0755, true) ; + $page = $this->getInput('pluginExportSelectPage'); + + // Clés moduleIds dans les pages + $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + // Parcourir les pages utilisant le module + foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) { + // Export des pages hébergeant le module + $pageParam[$pageId] = $this->getData(['page',$pageId]); + // Export du contenu de la page + //$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content'])); + $pageContent[$pageId] = $this->getPage($pageId, self::$i18n); + // Export de fr/module.json + $moduleId = 'fr/module.json'; + $moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']); + // Création de l'arborescence des langues + // Pas de nom dossier de langue - dossier par défaut + $t = explode ('/',$moduleId); + if ( is_array($t)) { + $lang = 'fr'; + } else { + $lang = $t[0]; + } + // Créer le dossier temporaire si inexistant sinon le nettoie et le créer + if (!is_dir($tmpFolder . '/' . $lang)) { + mkdir ($tmpFolder . '/' . $lang, 0755, true); + } else { + $this->removeDir($tmpFolder . '/' . $lang); + mkdir ($tmpFolder . '/' . $lang, 0755, true); + } + // Créer le dossier temporaire des données du module + if ($infoModules[$this->getUrl(2)]['dataDirectory']) { + if (!is_dir($tmpFolder . '/' . $moduleDir)) { + mkdir ($tmpFolder . '/' . $moduleDir, 0755, true) ; + } + } + // Sauvegarde si données non vides + $tmpData [$pageId] = $this->getData(['module',$pageId ]); + if ($tmpData [$pageId] !== null) { + file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); + } + // Export des données localisées dans le dossier de données du module + if ($infoModules[$this->getUrl(2)]['dataDirectory'] && + is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) { + $this->copyDir ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir); } } - // Sauvegarde si données non vides - $tmpData [$pageId] = $this->getData(['module',$pageId ]); - if ($tmpData [$pageId] !== null) { - file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); + // Enregistrement des pages dans le dossier de langue identique à module + if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) { + file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageParam)); + mkdir ($tmpFolder . '/' . $lang . '/content', 0755); + file_put_contents($tmpFolder . '/' . $lang . '/content/' . $this->getData(['page', $pageId, 'content']), $pageContent); } - // Export des données localisées dans le dossier de données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory'] && - is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) { - $this->copyDir ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir); + // création du zip + $fileName = $this->getUrl(2) . '.zip'; + $this->makeZip ($fileName, $tmpFolder, []); + if (file_exists($fileName)) { + ob_start(); + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . $fileName . '"'); + header('Content-Length: ' . filesize($fileName)); + ob_clean(); + ob_end_flush(); + readfile( $fileName); + unlink($fileName); + $this->removeDir($tmpFolder); + exit(); + } else { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'notification' => 'Quelque chose s\'est mal passé', + 'state' => false + ]); } - } - // Enregistrement des pages dans le dossier de langue identique à module - if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) { - file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageParam)); - mkdir ($tmpFolder . '/' . $lang . '/content', 0755); - file_put_contents($tmpFolder . '/' . $lang . '/content/' . $this->getData(['page', $pageId, 'content']), $pageContent); - } - // création du zip - $fileName = $this->getUrl(2) . '.zip'; - $this->makeZip ($fileName, $tmpFolder, []); - if (file_exists($fileName)) { - ob_start(); - header('Content-Type: application/octet-stream'); - header('Content-Disposition: attachment; filename="' . $fileName . '"'); - header('Content-Length: ' . filesize($fileName)); - ob_clean(); - ob_end_flush(); - readfile( $fileName); - unlink($fileName); - $this->removeDir($tmpFolder); - exit(); } else { + + // Liste des pages contenant le module + $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + foreach( $inPages as $key=>$value){ + if ($value === $this->getUrl(2)) { + self::$pagesList[] = $key; + } + } // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', - 'notification' => 'Quelque chose s\'est mal passé', - 'state' => false + 'title' => 'Export des données de module', + 'view' => 'dataExport' ]); } } @@ -512,12 +534,12 @@ class addon extends common { /* * Importer des données d'un module externes ou interne à module.json */ - public function import(){ + public function dataImport(){ // Jeton incorrect if ($this->getUrl(3) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); @@ -526,18 +548,32 @@ class addon extends common { // Soumission du formulaire if($this->isPost()) { // Récupérer le fichier et le décompacter - $zipFilename = $this->getInput('addonImportFile', helper::FILTER_STRING_SHORT, true); + $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); + $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); $tempFolder = uniqid(); mkdir (self::TEMP_DIR . $tempFolder, 0755); $zip = new ZipArchive(); if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { $zip->extractTo(self::TEMP_DIR . $tempFolder ); } + + // copie du contenu de la page + $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); + // Supprimer les fichiers importés + unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); + // Import des fichiers placés ailleurs que dans les dossiers localisés. + $this->copyDir (self::TEMP_DIR . $tempFolder, self::DATA_DIR ); + + // Import des données localisées page.json et module.json // Pour chaque dossier localisé - $dataTarget = array(); - $dataSource = array(); + // $dataTarget = array(); + // $dataSource = array(); + + + // Liste des pages de même nom dans l'archive et le site + /* $list = ''; foreach (self::$i18nList as $key=>$value) { // Les Pages et les modules @@ -561,20 +597,16 @@ class addon extends common { if( $list === ''){ file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); } - // copie du contenu de la page - $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); - // Supprimer les fichiers importés - unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); } } } + */ - // Import des fichiers placés ailleurs que dans les dossiers localisés. - $this->copyDir (self::TEMP_DIR . $tempFolder,self::DATA_DIR ); // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); $zip->close(); + /* if( $list !== '' ){ $success = false; strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; @@ -582,18 +614,29 @@ class addon extends common { else{ $success = true; $notification = 'Import réussi'; - } + }*/ // Valeurs en sortie $this->addOutput([ - 'redirect' => helper::baseUrl() . 'addon', + 'redirect' => helper::baseUrl() . 'plugin', 'state' => $success, 'notification' => $notification ]); } + + // Liste des pages ne contenant pas de module + self::$pagesList = $this->getData(['page']); + foreach(self::$pagesList as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true || + $this->getData(['page',$page,'moduleId']) !== '') { + unset(self::$pagesList[$page]); + } + } + // Valeurs en sortie $this->addOutput([ 'title' => 'Importer des données de module', - 'view' => 'import' + 'view' => 'dataImport' ]); } } diff --git a/core/module/addon/view/import/import.css b/core/module/plugin/view/dataExport/dataExport.css similarity index 100% rename from core/module/addon/view/import/import.css rename to core/module/plugin/view/dataExport/dataExport.css diff --git a/core/module/plugin/view/dataExport/dataExport.php b/core/module/plugin/view/dataExport/dataExport.php new file mode 100644 index 00000000..e9d1ee50 --- /dev/null +++ b/core/module/plugin/view/dataExport/dataExport.php @@ -0,0 +1,30 @@ + +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl() . 'plugin', + 'value' => template::ico('left') + ]); ?> +
    +
    + 'Appliquer' + ]); ?> +
    +
    +
    +
    +
    +

    Installer des données de module

    +
    +
    + 'Export depuis la page ' . template::flag('site', '20px'), + 'help' => 'Pour exporter les données de module d\'une autre langue traduite, sélectionnez-la puis revenez sur cet écran' + ]); ?> +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/core/module/addon/view/index/index.css b/core/module/plugin/view/dataImport/dataImport.css similarity index 100% rename from core/module/addon/view/index/index.css rename to core/module/plugin/view/dataImport/dataImport.css diff --git a/core/module/plugin/view/dataImport/dataImport.php b/core/module/plugin/view/dataImport/dataImport.php new file mode 100644 index 00000000..ea365be6 --- /dev/null +++ b/core/module/plugin/view/dataImport/dataImport.php @@ -0,0 +1,35 @@ + +
    +
    + 'buttonGrey', + 'href' => helper::baseUrl() . 'plugin', + 'value' => template::ico('left') + ]); ?> +
    +
    + 'Appliquer' + ]); ?> +
    +
    +
    +
    +
    +

    Installer des données de module

    +
    +
    + 'Archive ZIP :', + 'type' => 2 + ]); ?> +
    +
    + 'Importer le module dans la page ' . template::flag('site', '20px') + ]); ?> +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/core/module/addon/view/store/store.css b/core/module/plugin/view/index/index.css similarity index 100% rename from core/module/addon/view/store/store.css rename to core/module/plugin/view/index/index.css diff --git a/core/module/addon/view/index/index.help.html b/core/module/plugin/view/index/index.help.html similarity index 100% rename from core/module/addon/view/index/index.help.html rename to core/module/plugin/view/index/index.help.html diff --git a/core/module/addon/view/index/index.js.php b/core/module/plugin/view/index/index.js.php similarity index 100% rename from core/module/addon/view/index/index.js.php rename to core/module/plugin/view/index/index.js.php diff --git a/core/module/addon/view/index/index.php b/core/module/plugin/view/index/index.php similarity index 88% rename from core/module/addon/view/index/index.php rename to core/module/plugin/view/index/index.php index f5ee7fc6..e95c77ce 100644 --- a/core/module/addon/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -17,21 +17,21 @@
    helper::baseUrl() . 'addon/store', + 'href' => helper::baseUrl() . 'plugin/store', 'value' => template::ico('shopping-basket'), "help" => 'Lister le catalogue en ligne' ]); ?>
    helper::baseUrl() . 'addon/upload', + 'href' => helper::baseUrl() . 'plugin/upload', 'value' => template::ico('plus'), "help" => 'Ajouter à partir d\'une archive ZIP' ]); ?>
    - + diff --git a/core/module/addon/view/item/item.css b/core/module/plugin/view/item/item.css similarity index 100% rename from core/module/addon/view/item/item.css rename to core/module/plugin/view/item/item.css diff --git a/core/module/addon/view/item/item.php b/core/module/plugin/view/item/item.php similarity index 100% rename from core/module/addon/view/item/item.php rename to core/module/plugin/view/item/item.php diff --git a/core/module/addon/view/upload/upload.css b/core/module/plugin/view/store/store.css similarity index 100% rename from core/module/addon/view/upload/upload.css rename to core/module/plugin/view/store/store.css diff --git a/core/module/addon/view/store/store.php b/core/module/plugin/view/store/store.php similarity index 87% rename from core/module/addon/view/store/store.php rename to core/module/plugin/view/store/store.php index 8646d8cf..154bc4c7 100644 --- a/core/module/addon/view/store/store.php +++ b/core/module/plugin/view/store/store.php @@ -2,7 +2,7 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'addon', + 'href' => helper::baseUrl() . 'plugin', 'value' => template::ico('left') ]); ?>
    diff --git a/core/module/plugin/view/upload/upload.css b/core/module/plugin/view/upload/upload.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/core/module/plugin/view/upload/upload.css @@ -0,0 +1,18 @@ +/** + * 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-2022, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/core/module/addon/view/upload/upload.php b/core/module/plugin/view/upload/upload.php similarity index 93% rename from core/module/addon/view/upload/upload.php rename to core/module/plugin/view/upload/upload.php index 57114be4..c4104450 100644 --- a/core/module/addon/view/upload/upload.php +++ b/core/module/plugin/view/upload/upload.php @@ -3,12 +3,12 @@
    'buttonGrey', - 'href' => helper::baseUrl() . 'addon', + 'href' => helper::baseUrl() . 'plugin', 'value' => template::ico('left') ]); ?>
    - 'https://doc.zwiicms.fr/installation-d-un-module', 'target' => '_blank', 'class' => 'buttonHelp', From 7db85004a0fc615adb403b290cd509e15e97ffe6 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Wed, 26 Jan 2022 11:41:36 +0100 Subject: [PATCH 077/103] addon -> plugin --- core/core.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/core.php b/core/core.php index dd29cb4c..be85158e 100644 --- a/core/core.php +++ b/core/core.php @@ -58,7 +58,7 @@ class common { 'theme', 'user', 'translate', - 'addon' + 'plugin' ]; public static $accessList = [ 'user', @@ -2069,7 +2069,7 @@ class common { } if($this->getUser('group') >= self::GROUP_ADMIN) { $rightItems .= '
  • ' . template::ico('brush') . '
  • '; - $rightItems .= '
  • ' . template::ico('puzzle') . '
  • '; + $rightItems .= '
  • ' . template::ico('puzzle') . '
  • '; if ($this->getData(['config', 'i18n', 'enable']) === true) { $rightItems .= '
  • ' . template::ico('flag') . '
  • '; } From 5ad0bed23051724816293653c7f320e24d585c67 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 27 Jan 2022 10:21:54 +0100 Subject: [PATCH 078/103] =?UTF-8?q?m=C3=A9thode=20non=20priv=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.php b/core/core.php index be85158e..c6822982 100644 --- a/core/core.php +++ b/core/core.php @@ -1187,7 +1187,7 @@ class common { * @param int count nombres d'occurrences * @return array avec les valeurs remplacées. */ - private function recursive_array_replace ($find, $replace, $array, &$count) { + public function recursive_array_replace ($find, $replace, $array, &$count) { if (!is_array($array)) { return str_replace($find, $replace, $array, $count); } From 3cc035d37ccd152f2ddcb0cb06d71729aa1cfe2f Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 28 Jan 2022 14:28:37 +0100 Subject: [PATCH 079/103] Gestion des modules Ok avec langues --- core/module/plugin/plugin.php | 249 +++++++++--------- .../plugin/view/dataExport/dataExport.css | 18 -- .../plugin/view/dataExport/dataExport.php | 30 --- core/module/plugin/view/index/index.php | 9 +- truc | 1 + 5 files changed, 130 insertions(+), 177 deletions(-) delete mode 100644 core/module/plugin/view/dataExport/dataExport.css delete mode 100644 core/module/plugin/view/dataExport/dataExport.php create mode 100644 truc diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index ebf47770..12ec3994 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -9,9 +9,9 @@ * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2022, Frédéric Tempez - * @author Sylvain Lelièvre * @copyright Copyright (C) 2020-2021, Sylvain Lelièvre + * @copyright Copyright (C) 2018-2022, Frédéric Tempez + * @author Sylvain Lelièvre * @license GNU General Public License, version 3 * @link http://zwiicms.fr/ */ @@ -21,7 +21,7 @@ class plugin extends common { public static $actions = [ 'index' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN, - 'dataExport' => self::GROUP_ADMIN, + 'dataExport' => self::GROUP_ADMIN, // Fonction muette d'exportation 'dataImport' => self::GROUP_ADMIN, // les données d'un module 'store' => self::GROUP_ADMIN, 'item' => self::GROUP_ADMIN, // détail d'un objet @@ -35,6 +35,7 @@ class plugin extends common { // Gestion des modules public static $modInstal = []; + public static $modOrphans = []; // pour tests public static $valeur = []; @@ -82,6 +83,7 @@ class plugin extends common { $success = false; $notification = 'La suppression a échouée'; } + // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', @@ -298,7 +300,7 @@ class plugin extends common { // Clés moduleIds dans les pages $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); foreach( $inPages as $key=>$value){ - $inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value; + $pagesInfos[ $this->getData(['page', $key, 'title' ]) ] = $value; } // Parcourir les données des modules foreach ($store as $key=>$value) { @@ -325,7 +327,7 @@ class plugin extends common { mb_detect_encoding(strftime('%d %B %Y', $store[$key]['versionDate']), 'UTF-8', true) ? strftime('%d %B %Y', $store[$key]['versionDate']) : utf8_encode(strftime('%d %B %Y', $store[$key]['versionDate'])), - implode(', ', array_keys($inPagesTitle,$key)), + implode(', ', array_keys($pagesInfos,$key)), template::button('moduleExport' . $key, [ 'class' => $class, 'href' => helper::baseUrl(). $this->getUrl(0) . '/uploadItem/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre @@ -368,131 +370,137 @@ class plugin extends common { // $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory'] $infoModules = helper::getModules(); - // Clés moduleIds dans les pages - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - foreach( $inPages as $key=>$value){ - $inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value; + // Tableau des langues installées + foreach (self::$i18nList as $key => $value) { + if ($this->getData(['config','i18n', $key]) === 'site' || + $key === 'fr') { + $i18nSites[$key] = $value; + } + } + + // Langue actuelle + $savei18n = self::$i18n; + // Parcourir les langues du site traduit + foreach ($i18nSites as $keyI18n=>$vaueI18n) { + self::$i18n = $keyI18n; + // Clés moduleIds dans les pages de la langue sélectionnée + $pagesModules = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + // Générer ls liste des pages avec module pour la sauvegarde ou le backup + foreach( $pagesModules as $key=>$value ) { + if (!empty($value)) { + $pagesInfos [self::$i18n] [$key] ['pageId'] = $key ; + $pagesInfos [self::$i18n] [$key] ['title'] = $this->getData(['page', $key, 'title' ]) ; + $pagesInfos [self::$i18n] [$key] ['moduleId'] = $value; + } + } } - // Parcourir les données des modules + // Restaurer la langue actuelle + self::$i18n = $savei18n; + + //var_dump($pagesModules); + //var_dump($pagesInfos); + + // Générer la liste des modules orphelins foreach ($infoModules as $key=>$value) { - // Construire le tableau de sortie - self::$modInstal[] = [ - $key, - $infoModules[$key]['realName'], - $infoModules[$key]['version'], - implode(', ', array_keys($inPagesTitle,$key)), - //|| ('delete',$infoModules[$key]) && $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' - $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === '' - ? template::button('moduleDelete' . $key, [ - 'class' => 'moduleDelete buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $key . '/' . $_SESSION['csrf'], - 'value' => template::ico('cancel'), - 'help' => 'Supprimer le module '. $key - ]) - : '', - implode(', ',array_keys($inPages,$key)) !== '' - ? template::button('moduleExport' . $key, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('download'), - 'help' => 'Exporter les données du module' - ]) - : '', - implode(', ',array_keys($inPages,$key)) === '' - ? template::button('moduleExport' . $key, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('upload'), - 'help' => 'Importer les données du module' - ]) - : '' - ]; + if (!array_search($key, $pagesModules) ) { + $orphans[] = $key; + } + } + // Mise ene forme du tableau des modules orphelins + if (isset($orphans)) { + foreach ($orphans as $key) { + // Construire le tableau de sortie + self::$modOrphans [] = [ + $infoModules [$key] ['realName'], + $key, + $infoModules [$key] ['version'], + '', + '', + '', + '', + $infoModules[$key] ['delete'] === true + ? template::button('moduleDelete' . $key, [ + 'class' => 'moduleDelete buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' .$key . '/' . $_SESSION['csrf'], + 'value' => template::ico('cancel'), + 'help' => 'Supprimer le module' + ]) + : '', + + ]; + } + } + + // Parcourir les langues du site traduit + foreach ($pagesInfos as $keyI18n=>$valueI18n) { + // Modules affectés à des pages + + foreach ($valueI18n as $keyPage=>$value) { + + // Construire le tableau de sortie + self::$modInstal[] = [ + $infoModules[$pagesInfos[$keyI18n][$keyPage]['moduleId']] ['realName'], + $pagesInfos[$keyI18n][$keyPage]['moduleId'], + $infoModules[$pagesInfos [$keyI18n][$keyPage]['moduleId']] ['version'], + template::flag($keyI18n, '20px'), + $pagesInfos [$keyI18n][$keyPage]['title'] . ' (' .$keyPage . ')', + template::button('moduleExport' . $keyPage, [ + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('download'), + 'help' => 'Exporter les données du module' + ]), + template::button('moduleImport' . $keyPage, [ + 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('upload'), + 'help' => 'Importer les données du module' + ]) + ]; + } } // Valeurs en sortie $this->addOutput([ - 'title' => 'Gestion des modules', + 'title' => 'Gestion des modules installés', 'view' => 'index' ]); } + /* - * Export des données d'un module externes ou interne à module.json + * Export des données d'un module */ - public function dataExport(){ + public function dataExport() { // Jeton incorrect - if ($this->getUrl(3) !== $_SESSION['csrf']) { + if ($this->getUrl(4) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', 'state' => false, 'notification' => 'Action non autorisée' ]); - } - else { - // Soumission du formulaire - if($this->isPost()) { - // Lire les données du module - $infoModules = helper::getModules(); - // Créer un dossier par défaut - $tmpFolder = self::TEMP_DIR . uniqid(); - //$tmpFolder = self::TEMP_DIR . 'test'; - if (!is_dir($tmpFolder)) { - mkdir($tmpFolder, 0755); - } - $page = $this->getInput('pluginExportSelectPage'); + } else { - // Clés moduleIds dans les pages - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - // Parcourir les pages utilisant le module - foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) { - // Export des pages hébergeant le module - $pageParam[$pageId] = $this->getData(['page',$pageId]); - // Export du contenu de la page - //$pageContent[$pageId] = file_get_contents(self::DATA_DIR . self::$i18n . '/content/' . $this->getData(['page', $pageId, 'content'])); - $pageContent[$pageId] = $this->getPage($pageId, self::$i18n); - // Export de fr/module.json - $moduleId = 'fr/module.json'; - $moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']); - // Création de l'arborescence des langues - // Pas de nom dossier de langue - dossier par défaut - $t = explode ('/',$moduleId); - if ( is_array($t)) { - $lang = 'fr'; - } else { - $lang = $t[0]; - } - // Créer le dossier temporaire si inexistant sinon le nettoie et le créer - if (!is_dir($tmpFolder . '/' . $lang)) { - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } else { - $this->removeDir($tmpFolder . '/' . $lang); - mkdir ($tmpFolder . '/' . $lang, 0755, true); - } - // Créer le dossier temporaire des données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory']) { - if (!is_dir($tmpFolder . '/' . $moduleDir)) { - mkdir ($tmpFolder . '/' . $moduleDir, 0755, true) ; - } - } - // Sauvegarde si données non vides - $tmpData [$pageId] = $this->getData(['module',$pageId ]); - if ($tmpData [$pageId] !== null) { - file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData)); - } - // Export des données localisées dans le dossier de données du module - if ($infoModules[$this->getUrl(2)]['dataDirectory'] && - is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) { - $this->copyDir ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir); - } - } - // Enregistrement des pages dans le dossier de langue identique à module - if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) { - file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageParam)); - mkdir ($tmpFolder . '/' . $lang . '/content', 0755); - file_put_contents($tmpFolder . '/' . $lang . '/content/' . $this->getData(['page', $pageId, 'content']), $pageContent); - } - // création du zip - $fileName = $this->getUrl(2) . '.zip'; + // Créer un dossier par défaut + $tmpFolder = self::TEMP_DIR . uniqid(); + if (!is_dir($tmpFolder)) { + mkdir($tmpFolder, 0755); + } + + // Copie des infos sur le module + $moduleData = $this->getData(['module', $this->getUrl(3) ]); + $success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData)); + + // Le dossier du module s'il existe + if (is_dir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3) ) ) { + // Copier le dossier des données + $success = $this->copyDir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3), $tmpFolder . '/' . self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3)); + } + + // création du zip + if ($success) + { + $fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '.zip'; $this->makeZip ($fileName, $tmpFolder, []); if (file_exists($fileName)) { ob_start(); @@ -505,29 +513,15 @@ class plugin extends common { unlink($fileName); $this->removeDir($tmpFolder); exit(); - } else { - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl() . 'plugin', - 'notification' => 'Quelque chose s\'est mal passé', - 'state' => false - ]); } } else { - - // Liste des pages contenant le module - $inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); - foreach( $inPages as $key=>$value){ - if ($value === $this->getUrl(2)) { - self::$pagesList[] = $key; - } - } // Valeurs en sortie $this->addOutput([ - 'title' => 'Export des données de module', - 'view' => 'dataExport' + 'redirect' => helper::baseUrl() . 'plugin', + 'notification' => 'Quelque chose s\'est mal passé', + 'state' => false ]); - } + } } } @@ -641,4 +635,5 @@ class plugin extends common { } } + } diff --git a/core/module/plugin/view/dataExport/dataExport.css b/core/module/plugin/view/dataExport/dataExport.css deleted file mode 100644 index 52709ea6..00000000 --- a/core/module/plugin/view/dataExport/dataExport.css +++ /dev/null @@ -1,18 +0,0 @@ -/** - * 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-2022, Frédéric Tempez - * @license GNU General Public License, version 3 - * @link http://zwiicms.fr/ - */ - - -/** NE PAS EFFACER -* admin.css -*/ \ No newline at end of file diff --git a/core/module/plugin/view/dataExport/dataExport.php b/core/module/plugin/view/dataExport/dataExport.php deleted file mode 100644 index e9d1ee50..00000000 --- a/core/module/plugin/view/dataExport/dataExport.php +++ /dev/null @@ -1,30 +0,0 @@ - -
    -
    - 'buttonGrey', - 'href' => helper::baseUrl() . 'plugin', - 'value' => template::ico('left') - ]); ?> -
    -
    - 'Appliquer' - ]); ?> -
    -
    -
    -
    -
    -

    Installer des données de module

    -
    -
    - 'Export depuis la page ' . template::flag('site', '20px'), - 'help' => 'Pour exporter les données de module d\'une autre langue traduite, sélectionnez-la puis revenez sur cet écran' - ]); ?> -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index e95c77ce..6b2e7744 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -29,9 +29,14 @@ "help" => 'Ajouter à partir d\'une archive ZIP' ]); ?>
    -
    +
    > +

    Modules non utilisés :

    + + - +

    Modules utilisés :

    + diff --git a/truc b/truc new file mode 100644 index 00000000..ed62dafb --- /dev/null +++ b/truc @@ -0,0 +1 @@ +{"config":{"previewLength":"100","resultHideContent":"","placeHolder":"Un ou plusieurs mots-cl\u00e9s s\u00e9par\u00e9s par un espace ou par +","submitText":"Rechercher","versionData":"2.2"},"theme":{"keywordColor":"rgba(229, 229, 1, 1)","style":"site\/data\/search\/recherche\/theme.css"}} \ No newline at end of file From b2d9f48faa6d5fd988701f06e66c040b39d6a821 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 28 Jan 2022 15:13:04 +0100 Subject: [PATCH 080/103] =?UTF-8?q?R=C3=A9sourdre=20la=20lecture=20des=20m?= =?UTF-8?q?odules=20et=20des=20pages=20dans=20chaque=20langue=20traduite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.php | 5 ++++- core/module/plugin/plugin.php | 31 +++++++++++++++++++------------ 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/core/core.php b/core/core.php index c6822982..074592c0 100644 --- a/core/core.php +++ b/core/core.php @@ -538,6 +538,8 @@ class common { } + + /** * Effacer les données de la page * @param string pageId @@ -547,7 +549,8 @@ class common { return unlink(self::DATA_DIR . $lang . '/content/' . $this->getData(['page', $page, 'content'])); - } + } + /** * Sauvegarde des données diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 12ec3994..3fed22d9 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -366,9 +366,7 @@ class plugin extends common { */ public function index() { - // Lister les modules - // $infoModules[nom_module]['realName'], ['version'], ['update'], ['delete'], ['dataDirectory'] - $infoModules = helper::getModules(); + // Tableau des langues installées foreach (self::$i18nList as $key => $value) { @@ -377,9 +375,10 @@ class plugin extends common { $i18nSites[$key] = $value; } } + // Lister les modules + $infoModules = helper::getModules(); - // Langue actuelle - $savei18n = self::$i18n; + // Parcourir les langues du site traduit foreach ($i18nSites as $keyI18n=>$vaueI18n) { self::$i18n = $keyI18n; @@ -395,8 +394,7 @@ class plugin extends common { } } - // Restaurer la langue actuelle - self::$i18n = $savei18n; + //var_dump($pagesModules); //var_dump($pagesInfos); @@ -472,7 +470,7 @@ class plugin extends common { */ public function dataExport() { // Jeton incorrect - if ($this->getUrl(4) !== $_SESSION['csrf']) { + if ($this->getUrl(5) !== $_SESSION['csrf']) { // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', @@ -487,20 +485,28 @@ class plugin extends common { mkdir($tmpFolder, 0755); } + // Sauvegarder la langue active + $saveI18n = self::$i18n; + + self::$i18n = $this->getUrl(2); + // Copie des infos sur le module - $moduleData = $this->getData(['module', $this->getUrl(3) ]); + $moduleData = $this->getData(['module', $this->getUrl(4) ]); $success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData)); // Le dossier du module s'il existe - if (is_dir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3) ) ) { + if (is_dir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4) ) ) { // Copier le dossier des données - $success = $this->copyDir(self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3), $tmpFolder . '/' . self::DATA_DIR . $this->getUrl(2) . '/' . $this->getUrl(3)); + $success = $this->copyDir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4), $tmpFolder . '/' . self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4)); } + // Restaurer la langue active + //self::$i18n = $saveI18n; + // création du zip if ($success) { - $fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '.zip'; + $fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '-' . $this->getUrl(4) . '.zip'; $this->makeZip ($fileName, $tmpFolder, []); if (file_exists($fileName)) { ob_start(); @@ -636,4 +642,5 @@ class plugin extends common { } + } From d38a913beef5a2aa7123aaa034956a0832288144 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Sat, 29 Jan 2022 19:22:09 +0100 Subject: [PATCH 081/103] moduels orphelins ok --- core/module/plugin/plugin.php | 50 +++++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 3fed22d9..58a78270 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -368,44 +368,54 @@ class plugin extends common { - // Tableau des langues installées + // Tableau des langues rédigées foreach (self::$i18nList as $key => $value) { if ($this->getData(['config','i18n', $key]) === 'site' || $key === 'fr') { $i18nSites[$key] = $value; } } - // Lister les modules + + // Lister les modules installés $infoModules = helper::getModules(); - // Parcourir les langues du site traduit - foreach ($i18nSites as $keyI18n=>$vaueI18n) { - self::$i18n = $keyI18n; - // Clés moduleIds dans les pages de la langue sélectionnée - $pagesModules = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC'); + // Parcourir les langues du site traduit et recherche les modules affectés à des pages + foreach ($i18nSites as $keyi18n=>$vauei18n) { + + // Clés moduleIds dans les pages de la langue + $pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/' . 'page.json'), true); + + // Extraire les clés des modules + $pagesModules [$keyi18n] = array_filter(helper::arrayCollumn($pages['page'],'moduleId', 'SORT_DESC'), 'strlen'); + // Générer ls liste des pages avec module pour la sauvegarde ou le backup - foreach( $pagesModules as $key=>$value ) { + foreach( $pagesModules [$keyi18n] as $key=>$value ) { if (!empty($value)) { - $pagesInfos [self::$i18n] [$key] ['pageId'] = $key ; - $pagesInfos [self::$i18n] [$key] ['title'] = $this->getData(['page', $key, 'title' ]) ; - $pagesInfos [self::$i18n] [$key] ['moduleId'] = $value; + $pagesInfos [$keyi18n] [$key] ['pageId'] = $key ; + $pagesInfos [$keyi18n] [$key] ['title'] = $this->getData(['page', $key, 'title' ]) ; + $pagesInfos [$keyi18n] [$key] ['moduleId'] = $value; } } } - - //var_dump($pagesModules); - //var_dump($pagesInfos); - - // Générer la liste des modules orphelins - foreach ($infoModules as $key=>$value) { - if (!array_search($key, $pagesModules) ) { - $orphans[] = $key; + // Recherche des modules orphelins dans toutes les langues + $orphans = array_flip(array_keys ($infoModules)); + foreach ($i18nSites as $keyi18n=>$valuei18n) { + // Générer la liste des modules orphelins + foreach ($infoModules as $key=>$value) { + //echo $key . '

    '; + //echo array_search($key, $pagesModules[$keyi18n]); + if (array_search($key, $pagesModules[$keyi18n]) ) { + unset($orphans [$key]); + } + } } - // Mise ene forme du tableau des modules orphelins + $orphans = array_flip($orphans); + + // Mise en forme du tableau des modules orphelins if (isset($orphans)) { foreach ($orphans as $key) { // Construire le tableau de sortie From 0e8c03e79bff7e8392e12ce171eddda85d410e18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Sat, 29 Jan 2022 19:26:58 +0100 Subject: [PATCH 082/103] Commentaires et nettoyage --- core/module/plugin/plugin.php | 22 +++++++++---------- core/module/plugin/view/index/index.help.html | 8 ------- core/module/plugin/view/index/index.php | 2 +- 3 files changed, 11 insertions(+), 21 deletions(-) delete mode 100644 core/module/plugin/view/index/index.help.html diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 58a78270..bd25d95c 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -440,26 +440,24 @@ class plugin extends common { } } - // Parcourir les langues du site traduit - foreach ($pagesInfos as $keyI18n=>$valueI18n) { - // Modules affectés à des pages - + // Mise en forme du tableau des modules employés dans les pages + // Avec les commandes de sauvegarde et de restauration + foreach ($pagesInfos as $keyi18n=>$valueI18n) { foreach ($valueI18n as $keyPage=>$value) { - // Construire le tableau de sortie self::$modInstal[] = [ - $infoModules[$pagesInfos[$keyI18n][$keyPage]['moduleId']] ['realName'], - $pagesInfos[$keyI18n][$keyPage]['moduleId'], - $infoModules[$pagesInfos [$keyI18n][$keyPage]['moduleId']] ['version'], - template::flag($keyI18n, '20px'), - $pagesInfos [$keyI18n][$keyPage]['title'] . ' (' .$keyPage . ')', + $infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']] ['realName'], + $pagesInfos[$keyi18n][$keyPage]['moduleId'], + $infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'], + template::flag($keyi18n, '20px'), + $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', template::button('moduleExport' . $keyPage, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' ]), template::button('moduleImport' . $keyPage, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $keyI18n . '/' . $pagesInfos[$keyI18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataImport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload'), 'help' => 'Importer les données du module' ]) diff --git a/core/module/plugin/view/index/index.help.html b/core/module/plugin/view/index/index.help.html deleted file mode 100644 index 8af49c96..00000000 --- a/core/module/plugin/view/index/index.help.html +++ /dev/null @@ -1,8 +0,0 @@ -

    MODULES INSTALLES

    -Les modules installés sont listés dans le tableau avec leur nom usuel (alias) et leur numéro de version. -Si le module est utilisé le nom de la page ou des pages apparaît, dans le cas contraire une icône permet de le supprimer. -

    EXPORTER IMPORTER

    -

    Exporter produit une archive au nom du module contenant les pages concernées ainsi que les données et ressources utilisées par le module dans ces pages.

    -

    Vous pouvez vous en servir comme d'une sauvegarde partielle ou pour transférer les pages et les données du module vers un autre site.

    -

    Une fois le module installé l'import permet de restaurer les pages et les données sauvegardées. Vous devrez avoir au préalable transféré le fichier zip d'un export sur votre serveur par 'Gérer les fichiers'. -Si une page de même nom existe sur votre site vous serez invité à modifier son nom.

    diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 6b2e7744..0db22a00 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -31,7 +31,7 @@
    > -

    Modules non utilisés :

    +

    Modules installés non utilisés par une page :

    From ae09556e8de129d2fe37bc67be398b3ad6a22bd8 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 31 Jan 2022 14:24:45 +0100 Subject: [PATCH 083/103] Sauvegarde des modules --- core/core.php | 2 +- core/module/plugin/plugin.php | 116 ++++++++++++++++++++---- core/module/plugin/view/index/index.php | 20 ++-- 3 files changed, 110 insertions(+), 28 deletions(-) diff --git a/core/core.php b/core/core.php index 074592c0..8534de8e 100644 --- a/core/core.php +++ b/core/core.php @@ -1209,7 +1209,7 @@ class common { * @param string folder path à zipper * @param array filter dossiers à exclure */ - public function makeZip ($fileName, $folder, $filter ) { + public function makeZip ($fileName, $folder, $filter = [] ) { $zip = new ZipArchive(); $zip->open($fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE); //$directory = 'site/'; diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index bd25d95c..f7841e1c 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -21,6 +21,7 @@ class plugin extends common { public static $actions = [ 'index' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN, + 'save' => self::GROUP_ADMIN, // Sauvegarde le module dans un fichier ZIP ou dans le gestionnaire 'dataExport' => self::GROUP_ADMIN, // Fonction muette d'exportation 'dataImport' => self::GROUP_ADMIN, // les données d'un module 'store' => self::GROUP_ADMIN, @@ -34,8 +35,9 @@ class plugin extends common { const MODULE_STORE = '?modules/'; // Gestion des modules - public static $modInstal = []; - public static $modOrphans = []; + public static $modulesData = []; + public static $modulesOrphan = []; + public static $modulesInstalled = []; // pour tests public static $valeur = []; @@ -236,7 +238,7 @@ class plugin extends common { } /*** - * Installation d'un module par le catalogue + * Installation d'un module depuis le catalogue */ public function uploadItem() { // Jeton incorrect @@ -366,8 +368,6 @@ class plugin extends common { */ public function index() { - - // Tableau des langues rédigées foreach (self::$i18nList as $key => $value) { if ($this->getData(['config','i18n', $key]) === 'site' || @@ -375,13 +375,11 @@ class plugin extends common { $i18nSites[$key] = $value; } } - // Lister les modules installés $infoModules = helper::getModules(); - // Parcourir les langues du site traduit et recherche les modules affectés à des pages - foreach ($i18nSites as $keyi18n=>$vauei18n) { + foreach ($i18nSites as $keyi18n=>$valuei18n) { // Clés moduleIds dans les pages de la langue $pages = json_decode(file_get_contents(self::DATA_DIR . $keyi18n . '/' . 'page.json'), true); @@ -401,12 +399,11 @@ class plugin extends common { // Recherche des modules orphelins dans toutes les langues - $orphans = array_flip(array_keys ($infoModules)); + $orphans = $installed = array_flip(array_keys ($infoModules)); foreach ($i18nSites as $keyi18n=>$valuei18n) { // Générer la liste des modules orphelins foreach ($infoModules as $key=>$value) { - //echo $key . '

    '; - //echo array_search($key, $pagesModules[$keyi18n]); + // Supprimer les éléments affectés if (array_search($key, $pagesModules[$keyi18n]) ) { unset($orphans [$key]); } @@ -419,14 +416,11 @@ class plugin extends common { if (isset($orphans)) { foreach ($orphans as $key) { // Construire le tableau de sortie - self::$modOrphans [] = [ + self::$modulesOrphan [] = [ $infoModules [$key] ['realName'], $key, $infoModules [$key] ['version'], '', - '', - '', - '', $infoModules[$key] ['delete'] === true ? template::button('moduleDelete' . $key, [ 'class' => 'moduleDelete buttonRed', @@ -440,17 +434,43 @@ class plugin extends common { } } + // Modules installés non orphelins + // Mise en forme du tableau des modules utilisés + if (isset($installed)) { + foreach (array_flip($installed) as $key) { + // Construire le tableau de sortie + self::$modulesInstalled [] = [ + $infoModules [$key] ['realName'], + $key, + $infoModules [$key] ['version'], + '', + template::button('moduleSave' . $key, [ + 'href' => helper::baseUrl() . $this->getUrl(0) . '/save/filemanager/' .$key . '/' . $_SESSION['csrf'], + 'value' => template::ico('download-cloud'), + 'help' => 'Sauvegarder le module dans le gestionnaire de fichiers' + ]), + template::button('moduleDownload' . $key, [ + 'href' => helper::baseUrl() . $this->getUrl(0) . '/save/download/' .$key . '/' . $_SESSION['csrf'], + 'value' => template::ico('download'), + 'help' => 'Sauvegarder et télécharger le module' + ]) + + ]; + } + } + + // Mise en forme du tableau des modules employés dans les pages // Avec les commandes de sauvegarde et de restauration foreach ($pagesInfos as $keyi18n=>$valueI18n) { foreach ($valueI18n as $keyPage=>$value) { // Construire le tableau de sortie - self::$modInstal[] = [ + self::$modulesData[] = [ $infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']] ['realName'], $pagesInfos[$keyi18n][$keyPage]['moduleId'], $infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'], template::flag($keyi18n, '20px'), - $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', + '' . $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', template::button('moduleExport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), @@ -473,6 +493,64 @@ class plugin extends common { } + /** + * Sauvergarde un module sans les données + */ + + public function save() { + // Jeton incorrect + if ($this->getUrl(4) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } else { + + // Créer un dossier temporaire + $tmpFolder = self::TEMP_DIR . uniqid(); + if (!is_dir($tmpFolder)) { + mkdir($tmpFolder, 0755); + } + + //Nom de l'archive + $fileName = $this->getUrl(3) . '.zip'; + $this->makeZip ($tmpFolder . '/' . $fileName, 'module/' . $this->getUrl(3)); + + switch ($this->getUrl(2)) { + case 'filemanager': + if (!file_exists(self::FILE_DIR . 'source/modules')) { + mkdir(self::FILE_DIR . 'source/modules'); + } + $success = copy($tmpFolder . '/' . $fileName , self::FILE_DIR . 'source/modules/' . $this->getUrl(3) . '.zip' ); + // Nettoyage + unlink($tmpFolder . '/' . $fileName); + $this->removeDir($tmpFolder); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'notification' => $success ? $this->getUrl(3) . '.zip copié dans le dossier Module du gestionnaire de fichier' : 'Erreur de copie', + 'state' => $success + ]); + break; + case 'download': + default: + header('Content-Type: application/octet-stream'); + header('Content-Disposition: attachment; filename="' . $fileName . '"'); + header('Content-Length: ' . filesize($tmpFolder . '/' . $fileName)); + ob_clean(); + ob_end_flush(); + readfile( $tmpFolder . '/' .$fileName); + unlink($tmpFolder . '/' . $fileName); + $this->removeDir($tmpFolder); + exit(); + break; + } + + } + } + /* * Export des données d'un module */ @@ -487,7 +565,7 @@ class plugin extends common { ]); } else { - // Créer un dossier par défaut + // Créer un dossier temporaire $tmpFolder = self::TEMP_DIR . uniqid(); if (!is_dir($tmpFolder)) { mkdir($tmpFolder, 0755); @@ -515,7 +593,7 @@ class plugin extends common { if ($success) { $fileName = $this->getUrl(2) . '-' . $this->getUrl(3) . '-' . $this->getUrl(4) . '.zip'; - $this->makeZip ($fileName, $tmpFolder, []); + $this->makeZip ($fileName, $tmpFolder); if (file_exists($fileName)) { ob_start(); header('Content-Type: application/octet-stream'); diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 0db22a00..9026697a 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -8,7 +8,7 @@

    'https://doc.zwiicms.fr/modules-utilisation-generique', + 'href' => 'https://doc.zwiicms.fr/gestion-des-modules', 'target' => '_blank', 'value' => template::ico('help'), 'class' => 'buttonHelp', @@ -29,14 +29,18 @@ "help" => 'Ajouter à partir d\'une archive ZIP' ]); ?>
    -
    > -

    Modules installés non utilisés par une page :

    - +
    + +

    Suppression des modules orphelins

    + - -

    Modules utilisés :

    - + +

    Sauvegarde des modules

    + + + +

    Sauvegarde des données des modules installés

    + From a566883b0640a6cb39ef1e7cf0f856cc80d24426 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Tue, 1 Feb 2022 16:56:02 +0100 Subject: [PATCH 084/103] importData WIP --- core/module/plugin/plugin.php | 211 ++++++++++++------------ core/module/plugin/view/index/index.php | 28 ++-- core/module/plugin/view/store/store.php | 7 + truc | 1 - 4 files changed, 129 insertions(+), 118 deletions(-) delete mode 100644 truc diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index f7841e1c..21b70c20 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -475,12 +475,14 @@ class plugin extends common { 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' - ]), + ]) + /* template::button('moduleImport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataImport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload'), 'help' => 'Importer les données du module' ]) + */ ]; } } @@ -524,9 +526,7 @@ class plugin extends common { mkdir(self::FILE_DIR . 'source/modules'); } $success = copy($tmpFolder . '/' . $fileName , self::FILE_DIR . 'source/modules/' . $this->getUrl(3) . '.zip' ); - // Nettoyage - unlink($tmpFolder . '/' . $fileName); - $this->removeDir($tmpFolder); + // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', @@ -542,12 +542,12 @@ class plugin extends common { ob_clean(); ob_end_flush(); readfile( $tmpFolder . '/' .$fileName); - unlink($tmpFolder . '/' . $fileName); - $this->removeDir($tmpFolder); exit(); break; } - + // Nettoyage + unlink($tmpFolder . '/' . $fileName); + $this->removeDir($tmpFolder); } } @@ -570,24 +570,26 @@ class plugin extends common { if (!is_dir($tmpFolder)) { mkdir($tmpFolder, 0755); } - - // Sauvegarder la langue active - $saveI18n = self::$i18n; - - self::$i18n = $this->getUrl(2); + // Copie des infos sur le module - $moduleData = $this->getData(['module', $this->getUrl(4) ]); + $modulesData = json_decode(file_get_contents(self::DATA_DIR . $this->getUrl(2) . '/module.json' ), true); + $moduleData [$this->getUrl(4)] = $modulesData['module'] [$this->getUrl(4)]; $success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData)); // Le dossier du module s'il existe if (is_dir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4) ) ) { // Copier le dossier des données - $success = $this->copyDir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4), $tmpFolder . '/' . self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4)); - } + $success .= $this->copyDir(self::DATA_DIR . $this->getUrl(3) . '/' . $this->getUrl(4), $tmpFolder); + } + + // Descripteur de l'archive + $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode([ + 'langue' => $this->getUrl(2), + 'page' => $this->getUrl(3), + 'module' => $this->getUrl(4) + ])); - // Restaurer la langue active - //self::$i18n = $saveI18n; // création du zip if ($success) @@ -621,110 +623,109 @@ class plugin extends common { * Importer des données d'un module externes ou interne à module.json */ public function dataImport(){ - // Jeton incorrect - if ($this->getUrl(3) !== $_SESSION['csrf']) { - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl() . 'plugin', - 'state' => false, - 'notification' => 'Action non autorisée' - ]); - } - else { - // Soumission du formulaire - if($this->isPost()) { - // Récupérer le fichier et le décompacter - $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); - $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); - $tempFolder = uniqid(); - mkdir (self::TEMP_DIR . $tempFolder, 0755); - $zip = new ZipArchive(); - if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { - $zip->extractTo(self::TEMP_DIR . $tempFolder ); - } - // copie du contenu de la page - $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); - // Supprimer les fichiers importés - unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); - // Import des fichiers placés ailleurs que dans les dossiers localisés. - $this->copyDir (self::TEMP_DIR . $tempFolder, self::DATA_DIR ); - + // Soumission du formulaire + if($this->isPost()) { + // Jeton incorrect + if ($this->getUrl(3) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } + // Récupérer le fichier et le décompacter + $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); + $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); + $tempFolder = uniqid(); + mkdir (self::TEMP_DIR . $tempFolder, 0755); + $zip = new ZipArchive(); + if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { + $zip->extractTo(self::TEMP_DIR . $tempFolder ); + } - // Import des données localisées page.json et module.json - // Pour chaque dossier localisé - // $dataTarget = array(); - // $dataSource = array(); - + // copie du contenu de la page + $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); + // Supprimer les fichiers importés + unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); + // Import des fichiers placés ailleurs que dans les dossiers localisés. + $this->copyDir (self::TEMP_DIR . $tempFolder, self::DATA_DIR ); + - - // Liste des pages de même nom dans l'archive et le site - /* - $list = ''; - foreach (self::$i18nList as $key=>$value) { - // Les Pages et les modules - foreach (['page','module'] as $fileTarget){ - if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) { - // Le dossier de langue existe - // faire la fusion - $dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true); - // Des pages de même nom que celles de l'archive existent - if( $fileTarget === 'page' ){ - foreach( $dataSource as $keydataSource=>$valuedataSource ){ - foreach( $this->getData(['page']) as $keypage=>$valuepage ){ - if( $keydataSource === $keypage){ - $list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']); - } + // Import des données localisées page.json et module.json + // Pour chaque dossier localisé + // $dataTarget = array(); + // $dataSource = array(); + + + + // Liste des pages de même nom dans l'archive et le site + /* + $list = ''; + foreach (self::$i18nList as $key=>$value) { + // Les Pages et les modules + foreach (['page','module'] as $fileTarget){ + if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) { + // Le dossier de langue existe + // faire la fusion + $dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true); + // Des pages de même nom que celles de l'archive existent + if( $fileTarget === 'page' ){ + foreach( $dataSource as $keydataSource=>$valuedataSource ){ + foreach( $this->getData(['page']) as $keypage=>$valuepage ){ + if( $keydataSource === $keypage){ + $list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']); } } } - $dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true); - $data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource); - if( $list === ''){ - file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); - } + } + $dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true); + $data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource); + if( $list === ''){ + file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); } } } - */ - - - // Supprimer le dossier temporaire - $this->removeDir(self::TEMP_DIR . $tempFolder); - $zip->close(); - /* - if( $list !== '' ){ - $success = false; - strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; - } - else{ - $success = true; - $notification = 'Import réussi'; - }*/ - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl() . 'plugin', - 'state' => $success, - 'notification' => $notification - ]); } + */ - // Liste des pages ne contenant pas de module - self::$pagesList = $this->getData(['page']); - foreach(self::$pagesList as $page => $pageId) { - if ($this->getData(['page',$page,'block']) === 'bar' || - $this->getData(['page',$page,'disable']) === true || - $this->getData(['page',$page,'moduleId']) !== '') { - unset(self::$pagesList[$page]); - } + + // Supprimer le dossier temporaire + $this->removeDir(self::TEMP_DIR . $tempFolder); + $zip->close(); + /* + if( $list !== '' ){ + $success = false; + strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; } - + else{ + $success = true; + $notification = 'Import réussi'; + }*/ // Valeurs en sortie $this->addOutput([ - 'title' => 'Importer des données de module', - 'view' => 'dataImport' + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => $success, + 'notification' => $notification ]); } + + // Liste des pages ne contenant pas de module + self::$pagesList = $this->getData(['page']); + foreach(self::$pagesList as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true || + $this->getData(['page',$page,'moduleId']) !== '') { + unset(self::$pagesList[$page]); + } + } + + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Importer des données de module', + 'view' => 'dataImport' + ]); } diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 9026697a..1453ba39 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -15,20 +15,13 @@ 'help' => 'Consulter l\'aide en ligne' ]); ?>
    -
    +
    helper::baseUrl() . 'plugin/store', 'value' => template::ico('shopping-basket'), - "help" => 'Lister le catalogue en ligne' + "help" => 'Catalogue de modules en ligne' ]); ?> -
    -
    - helper::baseUrl() . 'plugin/upload', - 'value' => template::ico('plus'), - "help" => 'Ajouter à partir d\'une archive ZIP' - ]); ?> -
    +

    Suppression des modules orphelins

    @@ -39,8 +32,19 @@ -

    Sauvegarde des données des modules installés

    - +
    +
    +

    Sauvegarde des données des modules installés

    +
    +
    + helper::baseUrl() . 'dataImport', + 'value' => template::ico('upload'), + "help" => 'Importer des données de module' + ]); ?> +
    +
    + diff --git a/core/module/plugin/view/store/store.php b/core/module/plugin/view/store/store.php index 154bc4c7..9aabc4a0 100644 --- a/core/module/plugin/view/store/store.php +++ b/core/module/plugin/view/store/store.php @@ -6,6 +6,13 @@ 'value' => template::ico('left') ]); ?>
    +
    + helper::baseUrl() . 'plugin/upload', + 'value' => template::ico('plus'), + "help" => 'Importer depuis une archive ZIP' + ]); ?> +
    diff --git a/truc b/truc deleted file mode 100644 index ed62dafb..00000000 --- a/truc +++ /dev/null @@ -1 +0,0 @@ -{"config":{"previewLength":"100","resultHideContent":"","placeHolder":"Un ou plusieurs mots-cl\u00e9s s\u00e9par\u00e9s par un espace ou par +","submitText":"Rechercher","versionData":"2.2"},"theme":{"keywordColor":"rgba(229, 229, 1, 1)","style":"site\/data\/search\/recherche\/theme.css"}} \ No newline at end of file From cb3a3d82c57251fdc5a4ac88807516e461904a52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Wed, 2 Feb 2022 17:04:44 +0100 Subject: [PATCH 085/103] oredre des tableaux --- core/module/plugin/plugin.php | 4 +- core/module/plugin/view/index/index.php | 63 ++++++++++++++++--------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 21b70c20..266039d5 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -475,14 +475,12 @@ class plugin extends common { 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' - ]) - /* + ]), template::button('moduleImport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataImport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('upload'), 'help' => 'Importer les données du module' ]) - */ ]; } } diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 1453ba39..d8c015dd 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -16,35 +16,54 @@ ]); ?>
    - helper::baseUrl() . 'plugin/store', 'value' => template::ico('shopping-basket'), "help" => 'Catalogue de modules en ligne' ]); ?> -
    +
    - -

    Suppression des modules orphelins

    - - -

    Sauvegarde des modules

    - +
    +
    +
    +

    Sauvegarde des modules installés

    + +
    +
    +
    + + -
    -
    -

    Sauvegarde des données des modules installés

    +
    +
    +
    +

    Données des modules installés

    +
    +
    + helper::baseUrl() . 'dataImport', + 'value' => template::ico('upload'), + "help" => 'Importer des données de module dans une page libre' + ]); ?> +
    +
    +
    +
    + +
    +
    -
    - helper::baseUrl() . 'dataImport', - 'value' => template::ico('upload'), - "help" => 'Importer des données de module' - ]); ?> -
    - - - - + + +
    +
    +
    +

    Désinstallation des modules orphelins

    + +
    +
    +
    + \ No newline at end of file From 2d07aa2c4d466b451066a0122ffa0855a521b132 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Wed, 2 Feb 2022 17:59:07 +0100 Subject: [PATCH 086/103] dataImport WIP --- core/module/plugin/plugin.php | 99 +++++++++---------------- core/module/plugin/view/index/index.php | 2 +- 2 files changed, 37 insertions(+), 64 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 266039d5..f08ca7e3 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -572,7 +572,7 @@ class plugin extends common { // Copie des infos sur le module $modulesData = json_decode(file_get_contents(self::DATA_DIR . $this->getUrl(2) . '/module.json' ), true); - $moduleData [$this->getUrl(4)] = $modulesData['module'] [$this->getUrl(4)]; + $moduleData = $modulesData['module'] [$this->getUrl(4)]; $success = file_put_contents ($tmpFolder . '/module.json', json_encode($moduleData)); // Le dossier du module s'il existe @@ -584,8 +584,8 @@ class plugin extends common { // Descripteur de l'archive $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode([ 'langue' => $this->getUrl(2), - 'page' => $this->getUrl(3), - 'module' => $this->getUrl(4) + 'moduleid' => $this->getUrl(3), + 'pageId' => $this->getUrl(4) ])); @@ -622,85 +622,36 @@ class plugin extends common { */ public function dataImport(){ - // Soumission du formulaire + // Soumission du formulaire d'importation du module dans une page libre if($this->isPost()) { - // Jeton incorrect - if ($this->getUrl(3) !== $_SESSION['csrf']) { - // Valeurs en sortie - $this->addOutput([ - 'redirect' => helper::baseUrl() . 'plugin', - 'state' => false, - 'notification' => 'Action non autorisée' - ]); - } // Récupérer le fichier et le décompacter $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); $tempFolder = uniqid(); + $success = false; + $notification = ''; + + // Extraction dans un dossier temporaire mkdir (self::TEMP_DIR . $tempFolder, 0755); $zip = new ZipArchive(); if ($zip->open(self::FILE_DIR . 'source/' . $zipFilename) === TRUE) { $zip->extractTo(self::TEMP_DIR . $tempFolder ); } - - // copie du contenu de la page - $this->copyDir (self::TEMP_DIR . $tempFolder . '/' .$key . '/content', self::DATA_DIR . '/' .$key . '/content'); - // Supprimer les fichiers importés - unlink (self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'); - // Import des fichiers placés ailleurs que dans les dossiers localisés. - $this->copyDir (self::TEMP_DIR . $tempFolder, self::DATA_DIR ); - - // Import des données localisées page.json et module.json - // Pour chaque dossier localisé - // $dataTarget = array(); - // $dataSource = array(); + // Lire le descripteur + $descripteur = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/descripteur.json'), true); + // Intégration des données du module importé + $moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/module.json'), true ); - // Liste des pages de même nom dans l'archive et le site - /* - $list = ''; - foreach (self::$i18nList as $key=>$value) { - // Les Pages et les modules - foreach (['page','module'] as $fileTarget){ - if (file_exists(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json')) { - // Le dossier de langue existe - // faire la fusion - $dataSource = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/' .$key . '/' . $fileTarget . '.json'), true); - // Des pages de même nom que celles de l'archive existent - if( $fileTarget === 'page' ){ - foreach( $dataSource as $keydataSource=>$valuedataSource ){ - foreach( $this->getData(['page']) as $keypage=>$valuepage ){ - if( $keydataSource === $keypage){ - $list === '' ? $list .= ' '.$this->getData(['page', $keypage, 'title']) : $list .= ', '.$this->getData(['page', $keypage, 'title']); - } - } - } - } - $dataTarget = json_decode(file_get_contents(self::DATA_DIR . $key . '/' . $fileTarget . '.json'), true); - $data [$fileTarget] = array_merge($dataTarget[$fileTarget], $dataSource); - if( $list === ''){ - file_put_contents(self::DATA_DIR . '/' .$key . '/' . $fileTarget . '.json', json_encode( $data ,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|LOCK_EX) ); - } - } - } - } - */ + + // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); $zip->close(); - /* - if( $list !== '' ){ - $success = false; - strpos( $list, ',') === false ? $notification = 'Import impossible la page suivante doit être renommée :'.$list : $notification = 'Import impossible les pages suivantes doivent être renommées :'.$list; - } - else{ - $success = true; - $notification = 'Import réussi'; - }*/ // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', @@ -708,6 +659,28 @@ class plugin extends common { 'notification' => $notification ]); } + // Bouton d'importation des données d'un module spécifique + if (count(explode('/',$this->getUrl())) === 6) { + // Jeton incorrect + if ($this->getUrl(3) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } + + // Traitement + + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => true, + 'notification' => 'Okay' + ]); + } + // Liste des pages ne contenant pas de module self::$pagesList = $this->getData(['page']); diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index d8c015dd..b39a782f 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -43,7 +43,7 @@
    helper::baseUrl() . 'dataImport', + 'href' => helper::baseUrl() . 'plugin/dataImport', 'value' => template::ico('upload'), "help" => 'Importer des données de module dans une page libre' ]); ?> From 04b602b118331aa0802c09fbd1401bdd8ad95c8f Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 08:55:14 +0100 Subject: [PATCH 087/103] descripteur d'export --- core/module/plugin/plugin.php | 31 ++++++++++++++++--------- core/module/plugin/view/index/index.php | 2 +- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index f08ca7e3..35cf0852 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -24,6 +24,7 @@ class plugin extends common { 'save' => self::GROUP_ADMIN, // Sauvegarde le module dans un fichier ZIP ou dans le gestionnaire 'dataExport' => self::GROUP_ADMIN, // Fonction muette d'exportation 'dataImport' => self::GROUP_ADMIN, // les données d'un module + 'dataDelete' => self::GROUP_ADMIN, 'store' => self::GROUP_ADMIN, 'item' => self::GROUP_ADMIN, // détail d'un objet 'upload' => self::GROUP_ADMIN, // Téléverser catalogue @@ -475,12 +476,14 @@ class plugin extends common { 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' - ]), - template::button('moduleImport' . $keyPage, [ - 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataImport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre - 'value' => template::ico('upload'), - 'help' => 'Importer les données du module' + ]), + template::button('moduleDelete' . $keyPage, [ + 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataDelete/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre + 'value' => template::ico('cancel'), + 'class' => 'buttonRed', + 'help' => 'Détacher le module de la page', ]) + ]; } } @@ -494,7 +497,7 @@ class plugin extends common { /** - * Sauvergarde un module sans les données + * Sauvegarde un module sans les données */ public function save() { @@ -549,6 +552,15 @@ class plugin extends common { } } + + /* + * Détacher un module d'une page + */ + public function dataDelete() { + + } + + /* * Export des données d'un module */ @@ -582,11 +594,8 @@ class plugin extends common { } // Descripteur de l'archive - $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode([ - 'langue' => $this->getUrl(2), - 'moduleid' => $this->getUrl(3), - 'pageId' => $this->getUrl(4) - ])); + $infoModule = helper::getModules(); + $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode( $infoModule [$this->getUrl(3)] )); // création du zip diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index b39a782f..4c30c408 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -66,4 +66,4 @@
    - \ No newline at end of file + From 0af01481c4dd73e6a1bf1aea1c7704b51b040aae Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 09:47:52 +0100 Subject: [PATCH 088/103] =?UTF-8?q?Modules=20dans=20la=20langue=20s=C3=A9l?= =?UTF-8?q?ectionn=C3=A9e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/plugin/plugin.php | 30 ++++++++++++++++--------- core/module/plugin/view/index/index.php | 27 +++++++++++----------- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 35cf0852..020d6a3e 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -463,14 +463,17 @@ class plugin extends common { // Mise en forme du tableau des modules employés dans les pages // Avec les commandes de sauvegarde et de restauration - foreach ($pagesInfos as $keyi18n=>$valueI18n) { + //foreach ($pagesInfos as $keyi18n=>$valueI18n) { + + $keyi18n = self::$i18n; + $valueI18n = $pagesInfos[self::$i18n]; foreach ($valueI18n as $keyPage=>$value) { // Construire le tableau de sortie self::$modulesData[] = [ $infoModules[$pagesInfos[$keyi18n][$keyPage]['moduleId']] ['realName'], $pagesInfos[$keyi18n][$keyPage]['moduleId'], $infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'], - template::flag($keyi18n, '20px'), + //template::flag($keyi18n, '20px'), '' . $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', template::button('moduleExport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre @@ -486,7 +489,8 @@ class plugin extends common { ]; } - } + + //} // Valeurs en sortie $this->addOutput([ @@ -554,7 +558,7 @@ class plugin extends common { /* - * Détacher un module d'une page + * Détacher un module d'une page en supprimant les données du module */ public function dataDelete() { @@ -563,6 +567,11 @@ class plugin extends common { /* * Export des données d'un module + * Structure de l'adresse reçue + * 2 : i18n id + * 3 : moduleId + * 4 : pageId + * 5 : CSRF */ public function dataExport() { // Jeton incorrect @@ -595,7 +604,7 @@ class plugin extends common { // Descripteur de l'archive $infoModule = helper::getModules(); - $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode( $infoModule [$this->getUrl(3)] )); + $success .= file_put_contents ($tmpFolder . '/descripteur.json', json_encode( [$this->getUrl(3) => $infoModule [$this->getUrl(3)]] )); // création du zip @@ -650,13 +659,12 @@ class plugin extends common { // Lire le descripteur $descripteur = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/descripteur.json'), true); - // Intégration des données du module importé + // Lecture des données du module $moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/module.json'), true ); - - - - - + // Chargement des données du module importé + $this->setData(['module', array_first_key($descripteur), $moduleData ]); + // Intégration des données du module importé dans la page + $this->setData(['page', 'moduleId', array_first_key($descripteur) ]); // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 4c30c408..1b593a1b 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -28,13 +28,23 @@

    Sauvegarde des modules installés

    - +
    + +
    +
    +
    +

    Désinstallation des modules orphelins

    + +
    +
    +
    +
    @@ -51,19 +61,10 @@
    - +
    - - -
    -
    -
    -

    Désinstallation des modules orphelins

    - -
    -
    -
    - +
    + \ No newline at end of file From 9d729ee710bbcb31b645d43be3a5dd0b4c3f8505 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 10:41:59 +0100 Subject: [PATCH 089/103] Filtre des pages de l'import --- core/module/plugin/plugin.php | 17 +++++++++++------ .../plugin/view/dataImport/dataImport.php | 2 +- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 020d6a3e..d0612cdf 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -662,9 +662,9 @@ class plugin extends common { // Lecture des données du module $moduleData = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/module.json'), true ); // Chargement des données du module importé - $this->setData(['module', array_first_key($descripteur), $moduleData ]); + $this->setData(['module', $targetPage, $moduleData ]); // Intégration des données du module importé dans la page - $this->setData(['page', 'moduleId', array_first_key($descripteur) ]); + $this->setData(['page', $targetPage ,'moduleId', array_key_first($descripteur) ]); // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); @@ -699,15 +699,20 @@ class plugin extends common { } - // Liste des pages ne contenant pas de module - self::$pagesList = $this->getData(['page']); + /** + * Liste des pages sans module + * et ne sont pas des barres latérales + */ + self::$pagesList = $this->getHierarchy(null, null, null); foreach(self::$pagesList as $page => $pageId) { if ($this->getData(['page',$page,'block']) === 'bar' || - $this->getData(['page',$page,'disable']) === true || - $this->getData(['page',$page,'moduleId']) !== '') { + //$this->getData(['page',$page,'disable']) === true || + $this->getData(['page',$page,'moduleId']) !== '' + ) { unset(self::$pagesList[$page]); } } + self::$pagesList = array_keys(self::$pagesList); // Valeurs en sortie $this->addOutput([ diff --git a/core/module/plugin/view/dataImport/dataImport.php b/core/module/plugin/view/dataImport/dataImport.php index ea365be6..43b00552 100644 --- a/core/module/plugin/view/dataImport/dataImport.php +++ b/core/module/plugin/view/dataImport/dataImport.php @@ -25,7 +25,7 @@ ]); ?>
    - 'Importer le module dans la page ' . template::flag('site', '20px') ]); ?>
    From 7df429d5e217ec02244a0653e27143efb0c6fb4e Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 10:58:16 +0100 Subject: [PATCH 090/103] Delete Module WIP --- core/module/plugin/plugin.php | 38 ++++++++++++++++++---- core/module/plugin/view/index/index.js.php | 10 ++++++ 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index d0612cdf..5156254f 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -475,15 +475,15 @@ class plugin extends common { $infoModules[$pagesInfos [$keyi18n][$keyPage]['moduleId']] ['version'], //template::flag($keyi18n, '20px'), '' . $pagesInfos [$keyi18n][$keyPage]['title'] . ' (' .$keyPage . ')', - template::button('moduleExport' . $keyPage, [ + template::button('dataExport' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataExport/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('download'), 'help' => 'Exporter les données du module' ]), - template::button('moduleDelete' . $keyPage, [ + template::button('dataDelete' . $keyPage, [ 'href' => helper::baseUrl(). $this->getUrl(0) . '/dataDelete/' . $keyi18n . '/' . $pagesInfos[$keyi18n][$keyPage]['moduleId'] . '/' . $keyPage . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre 'value' => template::ico('cancel'), - 'class' => 'buttonRed', + 'class' => 'buttonRed dataDelete', 'help' => 'Détacher le module de la page', ]) @@ -559,8 +559,31 @@ class plugin extends common { /* * Détacher un module d'une page en supprimant les données du module + * 2 : i18n id + * 3 : moduleId + * 4 : pageId + * 5 : CSRF */ public function dataDelete() { + // Jeton incorrect + if ($this->getUrl(5) !== $_SESSION['csrf']) { + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'state' => false, + 'notification' => 'Action non autorisée' + ]); + } else { + $this->setData(['page', $this->getUrl(4), 'moduleId', '']); + $this->deleteData(['module', $this->getUrl(4)]); + // Valeurs en sortie + $this->addOutput([ + 'redirect' => helper::baseUrl() . 'plugin', + 'notification' => 'Le module ' . $this->getUrl(3) . ' de la page '. $this->getUrl(4) . ' a été supprimé.', + 'state' => true + ]); + } + } @@ -646,8 +669,6 @@ class plugin extends common { $zipFilename = $this->getInput('pluginImportFile', helper::FILTER_STRING_SHORT, true); $targetPage = $this->getInput('pluginImportPage', helper::FILTER_STRING_SHORT, true); $tempFolder = uniqid(); - $success = false; - $notification = ''; // Extraction dans un dossier temporaire mkdir (self::TEMP_DIR . $tempFolder, 0755); @@ -669,11 +690,14 @@ class plugin extends common { // Supprimer le dossier temporaire $this->removeDir(self::TEMP_DIR . $tempFolder); $zip->close(); + + + // Valeurs en sortie $this->addOutput([ 'redirect' => helper::baseUrl() . 'plugin', - 'state' => $success, - 'notification' => $notification + 'state' => true, + 'notification' => 'Import des données effectué' ]); } // Bouton d'importation des données d'un module spécifique diff --git a/core/module/plugin/view/index/index.js.php b/core/module/plugin/view/index/index.js.php index 4dd572cc..24542e5f 100644 --- a/core/module/plugin/view/index/index.js.php +++ b/core/module/plugin/view/index/index.js.php @@ -15,6 +15,16 @@ * Confirmation de suppression */ $(".moduleDelete").on("click", function() { + var _this = $(this); + return core.confirm("Êtes-vous sûr de vouloir désinstaller ce module ?", function() { + $(location).attr("href", _this.attr("href")); + }); +}); + +/** + * Confirmation de suppression + */ + $(".dataDelete").on("click", function() { var _this = $(this); return core.confirm("Êtes-vous sûr de vouloir supprimer ce module ?", function() { $(location).attr("href", _this.attr("href")); From 33b4fa91397306a0afed37e4a778141ef31211b5 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 11:46:48 +0100 Subject: [PATCH 091/103] Supp module okay --- core/module/plugin/view/index/index.js.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/module/plugin/view/index/index.js.php b/core/module/plugin/view/index/index.js.php index 24542e5f..6a5a69ee 100644 --- a/core/module/plugin/view/index/index.js.php +++ b/core/module/plugin/view/index/index.js.php @@ -26,7 +26,7 @@ $(".moduleDelete").on("click", function() { */ $(".dataDelete").on("click", function() { var _this = $(this); - return core.confirm("Êtes-vous sûr de vouloir supprimer ce module ?", function() { + return core.confirm("Êtes-vous sûr de vouloir supprimer le module de cette page ?", function() { $(location).attr("href", _this.attr("href")); }); }); \ No newline at end of file From 25aea3bfca757f358999a3103ef6727d4f51fa5f Mon Sep 17 00:00:00 2001 From: fredtempez Date: Thu, 3 Feb 2022 12:16:01 +0100 Subject: [PATCH 092/103] =?UTF-8?q?Boutons=20de=20s=C3=A9lection?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/plugin/view/index/index.css | 6 +- core/module/plugin/view/index/index.js.php | 20 ++++- core/module/plugin/view/index/index.php | 97 +++++++++++++--------- 3 files changed, 83 insertions(+), 40 deletions(-) diff --git a/core/module/plugin/view/index/index.css b/core/module/plugin/view/index/index.css index 52709ea6..fdb57b6f 100644 --- a/core/module/plugin/view/index/index.css +++ b/core/module/plugin/view/index/index.css @@ -15,4 +15,8 @@ /** NE PAS EFFACER * admin.css -*/ \ No newline at end of file +*/ + +.activeButton { + filter : brightness(150%); +} \ No newline at end of file diff --git a/core/module/plugin/view/index/index.js.php b/core/module/plugin/view/index/index.js.php index 6a5a69ee..060d7e18 100644 --- a/core/module/plugin/view/index/index.js.php +++ b/core/module/plugin/view/index/index.js.php @@ -29,4 +29,22 @@ $(".moduleDelete").on("click", function() { return core.confirm("Êtes-vous sûr de vouloir supprimer le module de cette page ?", function() { $(location).attr("href", _this.attr("href")); }); -}); \ No newline at end of file +}); + +// Sélecteur de fonctions + +$("#configManageModuleButton").on("click", function () { + console.log("clic"); + $("#manageDatas").hide(); + $("#manageModules").show(); + $("#configManageModuleButton").addClass("activeButton"); + $("#configManageDatasButton").removeClass("activeButton"); + setCookie("pluginLayout", "module"); +}); +$("#configManageDatasButton").on("click", function () { + $("#manageModules").hide(); + $("#manageDatas").show(); + $("#configManageModuleButton").removeClass("activeButton"); + $("#configManageDatasButton").addClass("activeButton"); + setCookie("pluginLayout", "data"); +}); diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 1b593a1b..16c83659 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -23,48 +23,69 @@ ]); ?>
    -
    -
    -
    -

    Sauvegarde des modules installés

    - -
    -
    +
    +
    +
    + 'Modules installés', + 'class' => 'activeButton' + ]); ?> +
    +
    + 'Données des modules' + ]); ?> +
    +
    +
    - - - - -
    -
    -
    -

    Désinstallation des modules orphelins

    - -
    -
    -
    - - -
    -
    -
    -

    Données des modules installés

    -
    -
    - helper::baseUrl() . 'plugin/dataImport', - 'value' => template::ico('upload'), - "help" => 'Importer des données de module dans une page libre' - ]); ?> -
    +
    + +
    +
    +
    +

    Sauvegarde des modules installés

    +
    -
    -
    - +
    +
    + + + + +
    +
    +
    +

    Désinstallation des modules orphelins

    + +
    +
    +
    + +
    +
    + +
    +
    +
    +

    Données des modules installés

    +
    +
    + helper::baseUrl() . 'plugin/dataImport', + 'value' => template::ico('upload'), + "help" => 'Importer des données de module dans une page libre' + ]); ?> +
    +
    +
    +
    + +
    -
    - \ No newline at end of file + +
    \ No newline at end of file From 04d953747aa4ca0fcfba99f9ef117df6e696717c Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 4 Feb 2022 08:45:58 +0100 Subject: [PATCH 093/103] petites modifs ergonomie --- core/module/plugin/plugin.php | 6 ++--- core/module/plugin/view/index/index.php | 32 ++++++++++++++++++------- core/module/plugin/view/store/store.php | 9 +------ 3 files changed, 27 insertions(+), 20 deletions(-) diff --git a/core/module/plugin/plugin.php b/core/module/plugin/plugin.php index 5156254f..436d3e37 100644 --- a/core/module/plugin/plugin.php +++ b/core/module/plugin/plugin.php @@ -226,7 +226,7 @@ class plugin extends common { $state = $this->install(self::FILE_DIR.'source/'.$zipFilename, $checkValidMaj); } $this->addOutput([ - 'redirect' => helper::baseUrl() . $this->getUrl(), + 'redirect' => helper::baseUrl() . 'plugin', 'notification' => $state['notification'], 'state' => $state['success'] ]); @@ -310,7 +310,7 @@ class plugin extends common { // Module non installé $ico = template::ico('download'); $class = ''; - $help = 'Installer le module'; + $help = 'Télécharger le module'; // Le module est installé if (array_key_exists($key,$infoModules) === true) { $class = 'buttonGreen'; @@ -494,7 +494,7 @@ class plugin extends common { // Valeurs en sortie $this->addOutput([ - 'title' => 'Gestion des modules installés', + 'title' => 'Gestion des modules', 'view' => 'index' ]); } diff --git a/core/module/plugin/view/index/index.php b/core/module/plugin/view/index/index.php index 16c83659..24ca3fe7 100644 --- a/core/module/plugin/view/index/index.php +++ b/core/module/plugin/view/index/index.php @@ -15,13 +15,6 @@ 'help' => 'Consulter l\'aide en ligne' ]); ?>
    -
    - helper::baseUrl() . 'plugin/store', - 'value' => template::ico('shopping-basket'), - "help" => 'Catalogue de modules en ligne' - ]); ?> -
    @@ -41,6 +34,27 @@
    +
    +
    +
    +

    Installation / mise à jour d'un module

    +
    +
    + helper::baseUrl() . 'plugin/store', + 'value' => template::ico('shopping-basket') . ' Catalogue en ligne' + ]); ?> +
    +
    + helper::baseUrl() . 'plugin/upload', + 'value' => template::ico('upload') . ' Depuis une archive ZIP' + ]); ?> +
    +
    +
    +
    +
    @@ -69,7 +83,7 @@
    -

    Données des modules installés

    +

    Modules configurés

    - +
    diff --git a/core/module/plugin/view/store/store.php b/core/module/plugin/view/store/store.php index 9aabc4a0..f06bf536 100644 --- a/core/module/plugin/view/store/store.php +++ b/core/module/plugin/view/store/store.php @@ -6,16 +6,9 @@ 'value' => template::ico('left') ]); ?>
    -
    - helper::baseUrl() . 'plugin/upload', - 'value' => template::ico('plus'), - "help" => 'Importer depuis une archive ZIP' - ]); ?> -
    - + \ No newline at end of file From e01a1a62e163da049d34828c3b36e14da86975c9 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 7 Feb 2022 14:03:22 +0100 Subject: [PATCH 094/103] update --- core/include/update.inc.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/include/update.inc.php b/core/include/update.inc.php index 08d6e7c6..748032b8 100644 --- a/core/include/update.inc.php +++ b/core/include/update.inc.php @@ -788,7 +788,6 @@ if ($this->getData(['core', 'dataVersion']) < 11203) { // Mise à jour $this->setData(['core', 'dataVersion', 11203]); -<<<<<<< HEAD } // Version 11.3.00 if ($this->getData(['core', 'dataVersion']) < 11300) { @@ -839,6 +838,4 @@ if ($this->getData(['core', 'dataVersion']) < 11300) { // Mise à jour $this->setData(['core', 'dataVersion', 11300]); -======= ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af } \ No newline at end of file From 4d222d8e8ed3e193a12e456c7a81e223d897574e Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 7 Feb 2022 14:05:10 +0100 Subject: [PATCH 095/103] =?UTF-8?q?Jeu=20d'ic=C3=B4nes=20en=20conflit=20de?= =?UTF-8?q?=20merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/vendor/zwiico/css/zwiico-codes.css | 6 ---- core/vendor/zwiico/css/zwiico-embedded.css | 36 --------------------- core/vendor/zwiico/css/zwiico-ie7-codes.css | 6 ---- core/vendor/zwiico/css/zwiico-ie7.css | 6 ---- core/vendor/zwiico/css/zwiico.css | 29 ----------------- core/vendor/zwiico/font/zwiico.svg | 3 -- 6 files changed, 86 deletions(-) diff --git a/core/vendor/zwiico/css/zwiico-codes.css b/core/vendor/zwiico/css/zwiico-codes.css index 38f85159..90f637d8 100755 --- a/core/vendor/zwiico/css/zwiico-codes.css +++ b/core/vendor/zwiico/css/zwiico-codes.css @@ -55,14 +55,8 @@ .zwiico-calendar-empty:before { content: '\f133'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ -<<<<<<< HEAD -<<<<<<< HEAD .zwiico-box:before { content: '\f187'; } /* '' */ .zwiico-file-archive:before { content: '\f1c6'; } /* '' */ -======= ->>>>>>> Nouveau jeu d'icônes -======= ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af .zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */ diff --git a/core/vendor/zwiico/css/zwiico-embedded.css b/core/vendor/zwiico/css/zwiico-embedded.css index 8b5cc187..f09c2359 100755 --- a/core/vendor/zwiico/css/zwiico-embedded.css +++ b/core/vendor/zwiico/css/zwiico-embedded.css @@ -1,37 +1,15 @@ @font-face { font-family: 'zwiico'; -<<<<<<< HEAD -<<<<<<< HEAD src: url('../font/zwiico.eot?81579449'); src: url('../font/zwiico.eot?81579449#iefix') format('embedded-opentype'), url('../font/zwiico.svg?81579449#zwiico') format('svg'); -======= - src: url('../font/zwiico.eot?96425754'); - src: url('../font/zwiico.eot?96425754#iefix') format('embedded-opentype'), - url('../font/zwiico.svg?96425754#zwiico') format('svg'); ->>>>>>> Nouveau jeu d'icônes -======= - src: url('../font/zwiico.eot?96425754'); - src: url('../font/zwiico.eot?96425754#iefix') format('embedded-opentype'), - url('../font/zwiico.svg?96425754#zwiico') format('svg'); ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af font-weight: normal; font-style: normal; } @font-face { font-family: 'zwiico'; -<<<<<<< HEAD -<<<<<<< HEAD src: url('data:application/octet-stream;base64,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') format('woff'), url('data:application/octet-stream;base64,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') format('truetype'); -======= - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); ->>>>>>> Nouveau jeu d'icônes -======= - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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') format('truetype'); ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af } /* 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 */ @@ -39,15 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'zwiico'; -<<<<<<< HEAD -<<<<<<< HEAD src: url('../font/zwiico.svg?81579449#zwiico') format('svg'); -======= - src: url('../font/zwiico.svg?96425754#zwiico') format('svg'); ->>>>>>> Nouveau jeu d'icônes -======= - src: url('../font/zwiico.svg?96425754#zwiico') format('svg'); ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af } } */ @@ -143,14 +113,8 @@ .zwiico-calendar-empty:before { content: '\f133'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ -<<<<<<< HEAD -<<<<<<< HEAD .zwiico-box:before { content: '\f187'; } /* '' */ .zwiico-file-archive:before { content: '\f1c6'; } /* '' */ -======= ->>>>>>> Nouveau jeu d'icônes -======= ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af .zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */ diff --git a/core/vendor/zwiico/css/zwiico-ie7-codes.css b/core/vendor/zwiico/css/zwiico-ie7-codes.css index 9a360584..f4b1860e 100755 --- a/core/vendor/zwiico/css/zwiico-ie7-codes.css +++ b/core/vendor/zwiico/css/zwiico-ie7-codes.css @@ -55,14 +55,8 @@ .zwiico-calendar-empty { *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 = ' '); } -<<<<<<< HEAD -<<<<<<< HEAD .zwiico-box { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -======= ->>>>>>> Nouveau jeu d'icônes -======= ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af .zwiico-sliders { *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 = ' '); } diff --git a/core/vendor/zwiico/css/zwiico-ie7.css b/core/vendor/zwiico/css/zwiico-ie7.css index 7d716d15..9116cba6 100755 --- a/core/vendor/zwiico/css/zwiico-ie7.css +++ b/core/vendor/zwiico/css/zwiico-ie7.css @@ -66,14 +66,8 @@ .zwiico-calendar-empty { *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 = ' '); } -<<<<<<< HEAD -<<<<<<< HEAD .zwiico-box { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .zwiico-file-archive { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } -======= ->>>>>>> Nouveau jeu d'icônes -======= ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af .zwiico-sliders { *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 = ' '); } diff --git a/core/vendor/zwiico/css/zwiico.css b/core/vendor/zwiico/css/zwiico.css index 86a8ac24..4e79bfea 100755 --- a/core/vendor/zwiico/css/zwiico.css +++ b/core/vendor/zwiico/css/zwiico.css @@ -1,26 +1,11 @@ @font-face { font-family: 'zwiico'; -<<<<<<< HEAD -<<<<<<< HEAD src: url('../font/zwiico.eot?39677933'); src: url('../font/zwiico.eot?39677933#iefix') format('embedded-opentype'), url('../font/zwiico.woff2?39677933') format('woff2'), url('../font/zwiico.woff?39677933') format('woff'), url('../font/zwiico.ttf?39677933') format('truetype'), url('../font/zwiico.svg?39677933#zwiico') format('svg'); -======= -======= ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af - src: url('../font/zwiico.eot?37992248'); - src: url('../font/zwiico.eot?37992248#iefix') format('embedded-opentype'), - url('../font/zwiico.woff2?37992248') format('woff2'), - url('../font/zwiico.woff?37992248') format('woff'), - url('../font/zwiico.ttf?37992248') format('truetype'), - url('../font/zwiico.svg?37992248#zwiico') format('svg'); -<<<<<<< HEAD ->>>>>>> Nouveau jeu d'icônes -======= ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af font-weight: normal; font-style: normal; } @@ -30,15 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'zwiico'; -<<<<<<< HEAD -<<<<<<< HEAD src: url('../font/zwiico.svg?39677933#zwiico') format('svg'); -======= - src: url('../font/zwiico.svg?37992248#zwiico') format('svg'); ->>>>>>> Nouveau jeu d'icônes -======= - src: url('../font/zwiico.svg?37992248#zwiico') format('svg'); ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af } } */ @@ -133,14 +110,8 @@ .zwiico-calendar-empty:before { content: '\f133'; } /* '' */ .zwiico-youtube:before { content: '\f167'; } /* '' */ .zwiico-instagram:before { content: '\f16d'; } /* '' */ -<<<<<<< HEAD -<<<<<<< HEAD .zwiico-box:before { content: '\f187'; } /* '' */ .zwiico-file-archive:before { content: '\f1c6'; } /* '' */ -======= ->>>>>>> Nouveau jeu d'icônes -======= ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af .zwiico-sliders:before { content: '\f1de'; } /* '' */ .zwiico-brush:before { content: '\f1fc'; } /* '' */ .zwiico-pinterest:before { content: '\f231'; } /* '' */ diff --git a/core/vendor/zwiico/font/zwiico.svg b/core/vendor/zwiico/font/zwiico.svg index 4eb59ff7..28537fc6 100755 --- a/core/vendor/zwiico/font/zwiico.svg +++ b/core/vendor/zwiico/font/zwiico.svg @@ -118,13 +118,10 @@ -<<<<<<< HEAD -======= ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af From 44e7c653e6f4eddd49c89ccb6644db51bc7d92f1 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 7 Feb 2022 14:58:53 +0100 Subject: [PATCH 096/103] =?UTF-8?q?nettoyage=20de=20code=20comment=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/theme/theme.php | 30 +----------------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/core/module/theme/theme.php b/core/module/theme/theme.php index cd1be767..3c45345d 100644 --- a/core/module/theme/theme.php +++ b/core/module/theme/theme.php @@ -412,34 +412,6 @@ class theme extends common { $featureContent = $this->getInput('themeHeaderText', null); $featureContent = str_replace(helper::baseUrl(false,false), './', $featureContent); - // Encodage des images en base64 - // Identifier les images - /* - preg_match_all('/]+>/i',$featureContent, $results); - foreach($results[0] as $value) { - // Lire le contenu XML - $sx = simplexml_load_string($value); - // Elément à remplacer - $src = 'src="' . $sx[0]['src'] . '"'; - // Elément encodé en base64 - $base64 = 'src="data:image/'. pathinfo($sx[0]['src'],PATHINFO_EXTENSION) . ';base64,'. base64_encode(file_get_contents($sx[0]['src'])).'"'; - // Effectuer le remplacement dans la chaine - $featureContent = str_replace($src, $base64, $featureContent); - } - - // Encodage des videos en base64 - preg_match_all('/]+>/i',$featureContent, $results); - foreach($results[0] as $value) { - // Lire le contenu XML - $sx = simplexml_load_string($value); - // Elément à remplacer - $src = 'src="' . $sx[0]['src'] . '"'; - // Elément encodé en base64 - $base64 = 'src="data:source/'. pathinfo($sx[0]['src'],PATHINFO_EXTENSION) . ';base64,'. base64_encode(file_get_contents($sx[0]['src'])).'"'; - // Effectuer le remplacement dans la chaine - $featureContent = str_replace($src, $base64, $featureContent); - }*/ - /** * Stocker les images incluses dans la bannière perso dans un tableau */ @@ -447,7 +419,7 @@ class theme extends common { foreach($results[0] as $value) { // Lire le contenu XML $sx = simplexml_load_string($value); - // Elément à remplacer + // Élément à remplacer $files [] = str_replace('./site/file/source/','',(string) $sx[0]['src']); } From db9123362e2b85752cce5052a579692b6081b099 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 7 Feb 2022 15:10:19 +0100 Subject: [PATCH 097/103] changes --- CHANGES.md | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index c163cc9d..3eabbaa2 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,24 +1,24 @@ # Changelog -<<<<<<< HEAD + +## Version 12.3.00 +- Modifications : + - Module addon refondu et renommé plugin. + - Réorganisation massive des modules afin d'éviter de faire cohabiter des formulaires avec des champs d'information. + - Désormais, les URL internes seront relatives, cela signifie qu'elles ne contiendront plus le domaine et le chemin d'accès au site. Cela permettra le déplacement d'un site d'un hébergement à un autre, d'un dossier d'hébergement à un autre, sans avoir à convertir les adresses internes. Les données d'un site mis à jour et importées d'une version antérieures sont automatiquement converties. En conséquence, le bloc de conversion de la fenêtre d'import est supprimé. + ## Version 11.3.00 -- Correction : +Corrections : - Thème / site : problème d'aperçu du body ; police du thème admin non chargées. - Bugs avec les aperçus des sélecteurs de fontes. -- Modification : +Modifications : - Police de caractères : - - Changement de fournisseur, CdnFont remplace Google Font. + - Changement de fournisseur, CdnFont remplace Google Font. - Les polices pourront désormais être téléchargées à partir du site et non du CDN. + - Installation de police personnalisées. - Thème / Bannière : ergonomie de l'information sur l'image sélectionnée. - -======= -## Version 11.3 -### Modifications - - Désormais, les URL internes seront relatives, cela signifie qu'elles ne contiendront plus le domaine et le chemin d'accès au site. Cela permettra le déplacement d'un site d'un hébergement à un autre, d'un dossier d'hébergement à un autre, sans avoir à convertir les adresses internes. Les données d'un site mis à jour et importées d'une version antérieures sont automatiquement converties. En conséquence, le bloc de conversion de la fenêtre d'import est supprimé. - - Réorganisation massive des modules afin d'éviter de faire cohabiter des formulaires avec des champs d'information. ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af ## Version 11.2.05 - Corrections : - Configuration / localisation : Les champs de cookies ne devraient pas être obligatoires lorsque la case à cocher de consentement des cookies n'est pas sélectionnée. @@ -35,7 +35,6 @@ - Thème ; pied de page ; option pied de page fixe inopérante. - Edition des pages orphelines : "Ne pas afficher" une page contenant des sous-pages provoquait un bug d'affichage dans le menu, la page était malgré tout affichée en fin de menu. Ce problème était causé par les pages enfants dont l'affichage n'était pas modifié. Le correctif cascade l'option "Ne pas afficher" aux sous-pages. La réciproque n'est pas appliquée, il faudra rendre visible les sous-pages d'une page parente qui devient à nouveau visible. - Modifications : - - **Chemin vers les données de site (images et liens internes)**. Désormais, les URL internes seront relatives, cela signifie qu'elles ne contiendront plus le domaine et le chemin d'accès au site. Cela permettra le déplacement d'un site d'un hébergement à un autre, d'un dossier d'hébergement à un autre, sans avoir à convertir les adresses internes. Les données d'un site mis à jour et importées d'une version antérieures sont automatiquement converties. En conséquence, le bloc de conversion de la fenêtre d'import est supprimé. - Mise à jour en ligne, contrôle de la clé MD5 de l'archive update.tar.gz. - Thème ; pied de page ; options pied de page fixe et alignement avec le contenu déplacées dans les paramètres. From 0a498fedb640f2027d44b828a3267ce9d9345145 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 7 Feb 2022 15:10:31 +0100 Subject: [PATCH 098/103] =?UTF-8?q?Pr=C3=A9paration=20gestion=20des=20font?= =?UTF-8?q?es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/theme/view/fonts/fonts.css | 18 ++++++++++++++++++ core/module/theme/view/fonts/fonts.php | 0 2 files changed, 18 insertions(+) create mode 100644 core/module/theme/view/fonts/fonts.css create mode 100644 core/module/theme/view/fonts/fonts.php diff --git a/core/module/theme/view/fonts/fonts.css b/core/module/theme/view/fonts/fonts.css new file mode 100644 index 00000000..52709ea6 --- /dev/null +++ b/core/module/theme/view/fonts/fonts.css @@ -0,0 +1,18 @@ +/** + * 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-2022, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.fr/ + */ + + +/** NE PAS EFFACER +* admin.css +*/ \ No newline at end of file diff --git a/core/module/theme/view/fonts/fonts.php b/core/module/theme/view/fonts/fonts.php new file mode 100644 index 00000000..e69de29b From a4ad7645ea8c84e289bc50912bfa34141b2223a9 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 7 Feb 2022 15:14:02 +0100 Subject: [PATCH 099/103] =?UTF-8?q?Num=C3=A9rotation=20v12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 3 +-- README.md | 6 +----- core/core.php | 2 +- core/include/update.inc.php | 10 +++++++++- core/module/install/ressource/defaultdata.php | 2 +- 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3eabbaa2..dfcd1c60 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,13 +1,12 @@ # Changelog -## Version 12.3.00 +## Version 12.0.00 - Modifications : - Module addon refondu et renommé plugin. - Réorganisation massive des modules afin d'éviter de faire cohabiter des formulaires avec des champs d'information. - Désormais, les URL internes seront relatives, cela signifie qu'elles ne contiendront plus le domaine et le chemin d'accès au site. Cela permettra le déplacement d'un site d'un hébergement à un autre, d'un dossier d'hébergement à un autre, sans avoir à convertir les adresses internes. Les données d'un site mis à jour et importées d'une version antérieures sont automatiquement converties. En conséquence, le bloc de conversion de la fenêtre d'import est supprimé. - ## Version 11.3.00 Corrections : - Thème / site : problème d'aperçu du body ; police du thème admin non chargées. diff --git a/README.md b/README.md index fe146d44..dc500c58 100755 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ -<<<<<<< HEAD -# ZwiiCMS 11.3.00 -======= -# ZwiiCMS 11.3 ->>>>>>> 957121d76ec1c3c2f545d39f4228d501487904af +# ZwiiCMS 12.0.00 Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation. diff --git a/core/core.php b/core/core.php index 8534de8e..ac415e3b 100644 --- a/core/core.php +++ b/core/core.php @@ -45,7 +45,7 @@ class common { // Numéro de version const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/update/raw/branch/master/'; - const ZWII_VERSION = '11.3.00'; + const ZWII_VERSION = '12.0.00'; const ZWII_UPDATE_CHANNEL = "test"; public static $actions = []; diff --git a/core/include/update.inc.php b/core/include/update.inc.php index 748032b8..88bfb40b 100644 --- a/core/include/update.inc.php +++ b/core/include/update.inc.php @@ -789,6 +789,7 @@ if ($this->getData(['core', 'dataVersion']) < 11203) { // Mise à jour $this->setData(['core', 'dataVersion', 11203]); } + // Version 11.3.00 if ($this->getData(['core', 'dataVersion']) < 11300) { @@ -838,4 +839,11 @@ if ($this->getData(['core', 'dataVersion']) < 11300) { // Mise à jour $this->setData(['core', 'dataVersion', 11300]); -} \ No newline at end of file +} + +// Version 12.0.00 +if ($this->getData(['core', 'dataVersion']) < 11200) { + + // Mise à jour + $this->setData(['core', 'dataVersion', 11200]); +} diff --git a/core/module/install/ressource/defaultdata.php b/core/module/install/ressource/defaultdata.php index f6238171..3f61aa13 100644 --- a/core/module/install/ressource/defaultdata.php +++ b/core/module/install/ressource/defaultdata.php @@ -56,7 +56,7 @@ class init extends common { ] ], 'core' => [ - 'dataVersion' => 11300, + 'dataVersion' => 12000, 'lastBackup' => 0, 'lastClearTmp' => 0, 'lastAutoUpdate' => 0, From 452d245e00232625cccdf81b2803526e5490e92d Mon Sep 17 00:00:00 2001 From: fredtempez Date: Mon, 7 Feb 2022 15:17:21 +0100 Subject: [PATCH 100/103] Effacer le dossier addon --- core/include/update.inc.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/include/update.inc.php b/core/include/update.inc.php index 88bfb40b..1f768b26 100644 --- a/core/include/update.inc.php +++ b/core/include/update.inc.php @@ -842,8 +842,11 @@ if ($this->getData(['core', 'dataVersion']) < 11300) { } // Version 12.0.00 -if ($this->getData(['core', 'dataVersion']) < 11200) { +if ($this->getData(['core', 'dataVersion']) < 12000) { + + // Effacer le dossier + $this->removeDir('core/module/addon'); // Mise à jour - $this->setData(['core', 'dataVersion', 11200]); + $this->setData(['core', 'dataVersion', 12000]); } From 8ea56f8ae98ac65ef78f16fb51271712152c8f2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Tempez?= Date: Mon, 7 Feb 2022 19:10:16 +0100 Subject: [PATCH 101/103] test fonts --- core/module/theme/theme.php | 27 ++++++++++++++++++++------ core/module/theme/view/fonts/fonts.php | 11 +++++++++++ 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/core/module/theme/theme.php b/core/module/theme/theme.php index 3c45345d..4a74ca50 100644 --- a/core/module/theme/theme.php +++ b/core/module/theme/theme.php @@ -29,7 +29,8 @@ class theme extends common { 'manage' => self::GROUP_ADMIN, 'export' => self::GROUP_ADMIN, 'import' => self::GROUP_ADMIN, - 'save' => self::GROUP_ADMIN + 'save' => self::GROUP_ADMIN, + 'fonts' => self::GROUP_ADMIN ]; public static $aligns = [ 'left' => 'À gauche', @@ -412,11 +413,11 @@ class theme extends common { $featureContent = $this->getInput('themeHeaderText', null); $featureContent = str_replace(helper::baseUrl(false,false), './', $featureContent); - /** + /** * Stocker les images incluses dans la bannière perso dans un tableau */ - preg_match_all('/]+>/i',$featureContent, $results); - foreach($results[0] as $value) { + preg_match_all('/]+>/i',$featureContent, $results); + foreach($results[0] as $value) { // Lire le contenu XML $sx = simplexml_load_string($value); // Élément à remplacer @@ -538,6 +539,20 @@ class theme extends common { ]); } + /** + * Options des fontes + */ + public function fonts() { + // Soumission du formulaire + if($this->isPost()) { + } + // Valeurs en sortie + $this->addOutput([ + 'title' => 'Gestion des fontes', + 'view' => 'fonts' + ]); + } + /** * Réinitialisation de la personnalisation avancée */ @@ -795,10 +810,10 @@ class theme extends common { // Traite les images du header perso if (!empty($this->getData(['theme','header','featureFiles'])) ) { foreach($this->getData(['theme','header','featureFiles']) as $value) { - $zip->addFile(self::FILE_DIR . 'source/' . $value, + $zip->addFile(self::FILE_DIR . 'source/' . $value, self::FILE_DIR . 'source/' . $value ); } - } + } break; } $ret = $zip->close(); diff --git a/core/module/theme/view/fonts/fonts.php b/core/module/theme/view/fonts/fonts.php index e69de29b..b7d4590b 100644 --- a/core/module/theme/view/fonts/fonts.php +++ b/core/module/theme/view/fonts/fonts.php @@ -0,0 +1,11 @@ +loadHTMLFile($filefont, LIBXML_NOERROR); +$elements = $doc->getElementsByTagName('i'); +var_dump ($elements); +foreach($elements as $element) { + if ($element->$textContent === 'http://fonts.cdnfonts.com/css/sketched') { + var_dump( $element['textContent'] ); + } +} \ No newline at end of file From f8f315617d637f623a2f298e7e0816ee2988b780 Mon Sep 17 00:00:00 2001 From: fredtempez Date: Tue, 8 Feb 2022 12:28:22 +0100 Subject: [PATCH 102/103] menu de fonts en cours --- core/module/theme/view/index/index.css | 3 ++- core/module/theme/view/index/index.php | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/core/module/theme/view/index/index.css b/core/module/theme/view/index/index.css index 0f66fdf7..9d32a5a3 100755 --- a/core/module/theme/view/index/index.css +++ b/core/module/theme/view/index/index.css @@ -40,7 +40,8 @@ nav li ul { #themeBack, #themeManage, #themeAdmin, -#themeAdvanced { +#themeAdvanced, +#themeFonts { position: relative; z-index: 11; } diff --git a/core/module/theme/view/index/index.php b/core/module/theme/view/index/index.php index d2b5ec4e..ef6b40d7 100644 --- a/core/module/theme/view/index/index.php +++ b/core/module/theme/view/index/index.php @@ -53,6 +53,15 @@ ]); ?>
    +
    +
    + 'code', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/fonts', + 'value' => 'Fontes' + ]); ?> +
    +
    @@ -98,4 +107,13 @@ ]); ?>
    +
    +
    + 'code', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/fonts', + 'value' => 'Fontes' + ]); ?> +
    +
    From 6e07c7ff4e6323d2f4f0d25348649da248ecc7cb Mon Sep 17 00:00:00 2001 From: fredtempez Date: Fri, 11 Feb 2022 15:22:37 +0100 Subject: [PATCH 103/103] bouton fonte en trop --- core/module/theme/view/index/index.php | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/core/module/theme/view/index/index.php b/core/module/theme/view/index/index.php index 33132b28..97d1f706 100644 --- a/core/module/theme/view/index/index.php +++ b/core/module/theme/view/index/index.php @@ -60,15 +60,6 @@ ]); ?>
    -
    -
    - 'code', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/fonts', - 'value' => 'Fontes' - ]); ?> -
    -
    @@ -120,13 +111,4 @@ ]); ?>
    -
    -
    - 'code', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/fonts', - 'value' => 'Fontes' - ]); ?> -
    -