Compare commits

...

1027 Commits

Author SHA1 Message Date
fredtempez 51607bfbb7 supprimer un dump 2020-12-18 16:10:48 +01:00
fredtempez c319240444 Bug commentaires du blog 2020-12-18 15:05:36 +01:00
fredtempez 185a3993db bug search 2020-12-14 12:34:02 +01:00
fredtempez aa318357fa typo 2020-12-13 17:44:10 +01:00
fredtempez 0aad617a33 RGPD + bug search 2020-12-12 18:40:08 +01:00
fredtempez 4406458c11 changes 2020-12-06 11:32:17 +01:00
fredtempez f47fd18a12 version 2020-12-04 17:21:58 +01:00
fredtempez b01ea7aa42 Images de blogs smartphone 2020-12-04 17:06:42 +01:00
fredtempez 0de6e5a1cb changes + init.js 2020-12-04 13:02:02 +01:00
fredtempez 3a6739fa4f class captcha en double 2020-12-01 21:07:07 +01:00
fredtempez a5fd6a99e0 bug module form v2.5 2020-12-01 21:05:22 +01:00
fredtempez 1a881e2023 page désactivée -> erreur 404 2020-12-01 20:47:05 +01:00
fredtempez 1e76d58f7e Bug page privée et désactivée + bug module de recherche groupes pages enfants 2020-12-01 18:29:58 +01:00
Fred Tempez b38628d726 version 2020-11-24 14:26:11 +01:00
Fred Tempez 642a1afea8 changes 2020-11-24 14:21:11 +01:00
Fred Tempez 5c50a87ff9 Theme reset normal 2020-11-22 18:59:03 +01:00
Fred Tempez 62a4debf62 Réinitialisation du mdp 2020-11-22 18:56:14 +01:00
Fred Tempez 0a2e3cb28d bords des icones RSS tranparentes 2020-11-22 18:01:41 +01:00
Fred Tempez 2c5986c127 Persistence ouverture des blocs dans la config 2020-11-21 15:16:51 +01:00
Fred Tempez c89eb7b505 version defaultdata 2020-11-21 15:14:49 +01:00
Fred Tempez fb0a9d74fc changes 2020-11-21 12:50:15 +01:00
Fred Tempez b0491002e8 update 2020-11-21 12:39:02 +01:00
Fred Tempez 226b4e03df bug 10307 effacer updateAvailable 2020-11-21 12:35:26 +01:00
Fred Tempez 96139d31fd bug setData données false non nulle 2020-11-21 10:07:48 +01:00
Fred Tempez 6de44652fa Nettoyage theme admin + bug backup 2020-11-21 04:36:14 +01:00
Fred Tempez e414988bee Durcir update blog et news 2020-11-19 08:53:52 +01:00
Fred Tempez 3136da34ca Bug installation 2020-11-18 22:38:43 +01:00
Fred Tempez 5e4f5ddf91 Init 2020-11-18 22:22:45 +01:00
Fred Tempez 2ef87c0c1a init 2020-11-18 22:16:52 +01:00
ZwiiCMS-team c368746eae
Update install.php 2020-11-18 19:27:12 +01:00
Fred Tempez 2e90cb5952 sitemap 2020-11-18 18:49:15 +01:00
Fred Tempez 4c6762e55f Merge branch 'master' of https://github.com/ZwiiCMS-team/ZwiiCMS 2020-11-18 18:43:07 +01:00
Fred Tempez 496cbb2054 Merge branch '10307' 2020-11-18 18:43:00 +01:00
Fred Tempez ff4a9c45ea Changes 10306 2020-11-18 18:42:04 +01:00
Fred Tempez 20ed2464d4 fix sitemap 2020-11-18 18:40:18 +01:00
Fred Tempez 671eb4001c Merge branch 'master' of https://github.com/ZwiiCMS-team/ZwiiCMS 2020-11-18 18:31:51 +01:00
Fred Tempez 3b128b7b9b Changes 10306 2020-11-18 18:31:36 +01:00
Fred Tempez 3b2c78e178 Merge branch '10307' 2020-11-18 18:30:13 +01:00
Fred Tempez c7c3b4e97e changes 2020-11-18 18:18:16 +01:00
Fred Tempez 92d55df344 version 2020-11-18 18:06:43 +01:00
Fred Tempez 2b207f0499 10.3.07 petits correctifs 2020-11-18 17:55:21 +01:00
Fred Tempez 5962ef846e Changes 10306 2020-11-18 12:38:10 +01:00
Fred Tempez 04602aacea Version 2020-11-18 12:16:28 +01:00
Fred Tempez 3ba789dde2 Sécurisation d'écriture 2020-11-17 15:00:10 +01:00
Fred Tempez f987aecbff modif options d'activation 2020-11-17 10:31:08 +01:00
Fred Tempez 8023df17e6 Numéros de version 2020-11-17 10:16:50 +01:00
Fred Tempez 354d9c5627 commentaires 2020-11-17 09:48:21 +01:00
Fred Tempez a8e74d471f fix module blog + news complet 2020-11-17 09:47:45 +01:00
Fred Tempez 82e1493ede Nouvelle structure données blog 2020-11-17 08:52:32 +01:00
Fred Tempez 21580cf4fa Protection des données de config 2020-11-16 18:39:32 +01:00
Fred Tempez 9158a48d39 suppression de classe générale 2020-11-16 18:19:39 +01:00
Fred Tempez 24f463b77e URL dans les pages 2020-11-16 14:55:46 +01:00
Fred Tempez d4d336d730 Versions 2020-11-16 14:34:44 +01:00
Fred Tempez 1c61bf5e88 Installation de la classe FeedWriter 2020-11-16 14:33:59 +01:00
Fred Tempez f3d1c930d7 Premier commit 2020-11-15 18:39:03 +01:00
Fred Tempez cafb3cd1ee bug édition de page bouton option du module désactivé 2020-11-09 17:21:35 +01:00
Fred Tempez 256c9c62b2 core version 2020-11-05 07:49:16 +01:00
Fred Tempez 64b1ceeccb version 2020-11-05 07:38:02 +01:00
Fred Tempez 27df460d0c 10305 problème avec l'import d'une theme admin 2020-11-05 07:34:12 +01:00
Fred Tempez ff951024ea mage light haute 150 px pour installation 2020-11-04 14:35:58 +01:00
Fred Tempez 2ad472e548 changes + version 2020-11-04 14:20:26 +01:00
Fred Tempez 32b7ca8c00 changes 2020-11-04 14:15:11 +01:00
Fred Tempez e8326e848e changes 2020-11-04 14:14:23 +01:00
Fred Tempez 6d3cec1b65 changes 2020-11-04 14:06:31 +01:00
Fred Tempez 67843f4f0f Nettoyage css 2020-11-04 13:35:07 +01:00
Fred Tempez d06aa23eba générateur aléatoire 2020-11-04 13:26:25 +01:00
Fred Tempez 8105d466c9 redirection maintenance 2020-11-04 13:22:07 +01:00
Fred Tempez 47eef28318 inversion icones + et - config 2020-11-04 09:50:20 +01:00
Fred Tempez 3a5702e36b recharger le thème 2020-11-04 09:17:29 +01:00
Fred Tempez f2e6af6dea Light div site marge haute 2020-11-04 09:15:08 +01:00
Fred Tempez f667587274 Icones dans la gestion du theme 2020-11-03 17:27:32 +01:00
Fred Tempez 493b8ff6b2 Contraste theme black 2020-11-03 17:09:53 +01:00
Fred Tempez e7424dc9dd check la validité d'une thème importé 2020-11-03 15:34:57 +01:00
Fred Tempez 96b0a1a9b9 erreur de commentaire 2020-11-03 15:34:42 +01:00
Fred Tempez 52be6d2997 Bug theme menu 2020-11-03 12:02:59 +01:00
Fred Tempez 459f55081c warning primo installation 2020-11-03 07:48:56 +01:00
Fred Tempez ca411cf9a1 bug classe active dans menu latéral 2020-11-02 12:11:59 +01:00
Fred Tempez 72d3bb772f Couleur du sous-menu 2020-11-01 20:19:02 +01:00
Fred Tempez 9a2274a716 heure blog 2020-11-01 19:06:33 +01:00
Fred Tempez ba7a0633b0 colorvariants option rgb supprime la transparence 2020-11-01 19:00:24 +01:00
Fred Tempez 62da5cc5b5 double arrière-plan dans le menu 2020-11-01 14:15:13 +01:00
Fred Tempez f863b69a4d Localisation avec test de l'encodage 2020-11-01 13:38:25 +01:00
Fred 7783eb69ab
taille de la loupe 2020-11-01 09:12:28 +01:00
Fred Tempez 6180b903c9 Alignement du menu centré 2020-11-01 08:51:23 +01:00
Fred Tempez ca8b3e8d7b Localation pour Free 2020-11-01 08:27:32 +01:00
Fred Tempez a7058e4c49 localisation pour Free + position du démarrage de session 2020-11-01 08:16:30 +01:00
Fred Tempez 53c82522aa Localisation FR 2020-11-01 07:56:04 +01:00
Fred Tempez 813dc501a3 changes 2020-10-31 18:35:49 +01:00
Fred Tempez b8e0d53288 alignement du menu 2020-10-31 18:34:55 +01:00
fredtempez 81a6496ee6 changes 2020-10-28 19:28:21 +01:00
fredtempez d0e1f5abe1 tinymce 4.9.11 2020-10-28 19:24:00 +01:00
fredtempez b8772c0ac6 changes 2020-10-28 19:02:19 +01:00
fredtempez 41c44b4557 thème admin css 2020-10-28 07:53:51 +01:00
fredtempez dd65cdb3c2 Présentation améliorée du mail 2020-10-25 22:55:21 +01:00
fredtempez ec59a0c77c 2 bugs de thème : import admin et nettoyage tmp 2020-10-25 22:49:28 +01:00
Fred Tempez 8a66c3d1ae Merge branch '10304' of https://github.com/fredtempez/ZwiiCMS into 10304 2020-10-24 17:02:12 +02:00
Fred Tempez bcbcb79a12 bug affichage menu petits écrans + barre admin 2020-10-24 17:01:40 +02:00
Fred Tempez a892fd9855 bug affichage menu petit écrans + barre admin 2020-10-24 16:59:19 +02:00
Fred Tempez 645cb7fef5 minor fix 2020-10-22 19:16:53 +02:00
Prof Langues 227b3943a3 Petites corrections 2020-10-22 08:47:02 +02:00
Fred Tempez c0494b6ae6 Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-10-21 17:06:41 +02:00
Fred Tempez dbf12fc999 changes 2020-10-21 17:06:23 +02:00
Fred Tempez 868271617a Commentaires 2020-10-21 17:04:07 +02:00
Fred Tempez 7b5f1aab4e changes 2020-10-20 18:45:15 +02:00
Fred Tempez c83e8e3149 Commentaires 2020-10-20 18:32:25 +02:00
Prof Langues a37c02f8ac compatibilité 750px 2020-10-20 09:25:56 +02:00
Fred 6df7256a98
Update index.php 2020-10-19 20:48:18 +02:00
Fred fd02c81190
Update index.php 2020-10-19 20:46:12 +02:00
Fred Tempez f5bda47965 fix captcha simple 2020-10-19 18:49:33 +02:00
Fred Tempez 85c8e923d2 Merge branch '10303' of https://github.com/fredtempez/ZwiiCMS into 10303 2020-10-19 18:19:55 +02:00
Fred Tempez c5a4e16726 captcha faible 2020-10-19 18:19:50 +02:00
Prof Langues 0517dc4df4 changes 2020-10-15 10:18:26 +02:00
Fred Tempez b2ed7b4866 version 2020-10-14 11:33:56 +02:00
Fred Tempez ac773706a2 Merge branch '10303' of https://github.com/fredtempez/ZwiiCMS into 10303 2020-10-14 09:42:20 +02:00
Fred Tempez 7644da6401 barre de membre alignée à droite. 2020-10-14 09:42:14 +02:00
Prof Langues 4786942409 Revert "menuRight"
This reverts commit aa7a0926c4.
2020-10-13 15:13:55 +02:00
Prof Langues 3ebd99c284 Revert "modif css menuRight"
This reverts commit 8821da73a0.
2020-10-13 15:13:19 +02:00
Prof Langues 8821da73a0 modif css menuRight 2020-10-13 15:07:41 +02:00
Prof Langues aa7a0926c4 menuRight 2020-10-13 11:04:30 +02:00
Prof Langues d0827ca3e7 format date 2020-10-12 17:32:27 +02:00
Prof Langues 31961f112d syntaxe getUser 2020-10-12 16:59:44 +02:00
Prof Langues 50d12a210a position option captcha - icône login 2020-10-12 16:19:32 +02:00
Fred Tempez 0dc4df3b98 TLD com en fr 2020-10-12 09:49:17 +02:00
Fred Tempez 26841c795c captcha 10 ou 20 2020-10-11 19:29:33 +02:00
Fred Tempez f0fe2c0177 Revert "instructions en double"
This reverts commit c83e0e6b4f.
2020-10-11 05:06:08 +02:00
Fred Tempez 589fe9f8cb changes 2020-10-11 04:31:30 +02:00
Fred Tempez 4104fdf736 revert to core origin 2020-10-11 04:29:57 +02:00
Fred Tempez f2fc03ce91 modif routeur test en cours 2020-10-11 04:15:38 +02:00
Fred Tempez 2f3db2d426 inversions 2020-10-11 03:49:39 +02:00
Fred Tempez c83e0e6b4f instructions en double 2020-10-11 03:48:03 +02:00
Fred Tempez 920f012007 bug routeur 2020-10-11 03:34:13 +02:00
Fred Tempez 107c41f409 10303 routage 2020-10-10 20:22:14 +02:00
Fred Tempez 339241383f changes 2020-10-10 19:36:09 +02:00
Fred Tempez 2e929d142b espaces en trop + supprimer = 2020-10-09 08:44:05 +02:00
Fred Tempez 00a3243d87 gitignore 2020-10-08 20:47:57 +02:00
Prof Langues b4e7a0f5f4 erreur login captcha erroné 2020-10-08 15:16:01 +02:00
Fred Tempez ef6928547b Bug connexion dans captcha 2020-10-06 18:28:21 +02:00
Fred Tempez db6e2c3a97 tag article 2020-10-05 09:49:06 +02:00
Fred Tempez a5327a959c bouton gris 2020-10-04 17:12:33 +02:00
Fred Tempez c0564f705c captcha présentation sur une seule ligne 2020-10-04 16:49:28 +02:00
Fred Tempez 33aed39f83 Diverses corrections 2020-10-04 12:16:37 +02:00
Fred Tempez 1901e06957 Changes 2020-10-04 11:58:24 +02:00
Fred Tempez 1308ab8a5f Erreur de variable 2020-10-03 14:15:03 +02:00
Fred Tempez eec9b80e81 htaccess compatibilité Free 2020-10-02 19:12:47 +02:00
Fred Tempez b1c4ce34a4 Chemin d'accès aux images de captcha 2020-10-02 17:36:28 +02:00
Fred Tempez b45bb37c4f Permission de l'accès aux images temporaires et chemin complet 2020-10-02 17:26:10 +02:00
Fred Tempez af3d4dfa41 Dates UTF8 2020-10-02 17:07:14 +02:00
Fred Tempez c88da6198b github icone 2020-10-02 16:56:44 +02:00
Fred Tempez 06d71f44f6 NUméro de version systeme 2020-10-02 16:49:21 +02:00
Fred Tempez 5fb003bae6 Masquer les images et leur dossier 2020-10-01 20:20:16 +02:00
Prof Langues 9d444be061 contraste amélioré 2020-10-01 15:50:33 +02:00
Prof Langues 175dd51a18 transfert du résultat dans un champ cahcé et hashé 2020-10-01 15:50:19 +02:00
Fred Tempez 0216e0c1e1 CSS + présentation du login 2020-09-30 17:37:26 +02:00
Fred Tempez 2278f837cb tailel des images CSS + centrage + largeur de saisie ++ 2020-09-30 17:21:19 +02:00
Fred Tempez bf13ccb675 Taille deux images 2020-09-30 17:18:16 +02:00
Fred Tempez 9eed5ad28f installation captcha + version 2020-09-30 09:16:40 +02:00
Fred Tempez 4aaa6cbc58 Jeux d'images captcha 2020-09-30 08:57:56 +02:00
Fred Tempez 26f88cbb26 init 2020-09-29 19:03:35 +02:00
Fred 1b117eb8c0
Update README.md 2020-09-27 21:28:49 +02:00
Fred Tempez c39e1640e2 libellé de bulle 2020-09-27 19:36:53 +02:00
Fred Tempez 435c1fa05f libellé de bulle 2020-09-27 19:28:32 +02:00
Fred Tempez 4c93a1aa6d changes 2020-09-27 18:04:13 +02:00
Fred Tempez ae46017b20 changes 2020-09-27 18:03:08 +02:00
Fred Tempez dc426c25e3 permissions 2020-09-27 17:55:45 +02:00
Fred Tempez 2c1be3c3e2 réarranger theme 2020-09-27 12:41:13 +02:00
Fred Tempez 96f1a83850 Bloc configuration modifé 2020-09-27 12:32:34 +02:00
Fred Tempez 332bb6f1f9 séparateurs visuels 2020-09-27 09:21:00 +02:00
Fred Tempez eace81330f numérotation de version galerie et ordre config 2020-09-27 09:18:44 +02:00
Fred Tempez 89ab970806 vérification de l'archive de thème importée 2020-09-26 18:27:46 +02:00
Fred Tempez 65a064ef92 menu position fixe mauvaise position après déco auto 2020-09-26 17:33:05 +02:00
Fred Tempez a18df7cdf4 delete class reload 2020-09-26 17:23:03 +02:00
Fred Tempez f0aff19b80 position fixe de la barre de membre simple 2020-09-26 17:13:59 +02:00
Fred Tempez 41ceb694d8 position fixe pour la barre de membre simple 2020-09-26 16:59:30 +02:00
Fred Tempez c3ab04ee79 fix connect link 2020-09-26 10:02:03 +02:00
Fred Tempez 3c7c7c628f init 10.3.01 2020-09-25 20:02:01 +02:00
Fred Tempez 13627f5e59 Fix pb position gallery 2020-09-25 19:34:51 +02:00
Fred Tempez 4b9f0b1ef7 changes 2020-09-25 16:42:17 +02:00
Fred Tempez be7ea6c4fb Modif valeur par defaut pageid recherche et mentions vides 2020-09-25 16:38:40 +02:00
Fred Tempez de7caa49c1 pb de menu fixe après auto logout 2020-09-25 16:19:07 +02:00
Fred Tempez 2e644e7cd4 numéro de version des modules 2020-09-25 16:04:44 +02:00
Fred Tempez 80e5088b68 config filtrage des page et libellés 2020-09-25 11:50:14 +02:00
Fred Tempez 7229473a22 bug menu fixe 2020-09-25 11:49:11 +02:00
Fred 2404142d9c
Update CHANGES.md 2020-09-24 22:30:38 +02:00
Fred Tempez 0a877b0d24 update 2020-09-24 17:47:35 +02:00
Fred Tempez b9f49174da update 2020-09-24 17:29:59 +02:00
Fred Tempez beb85b9e9a Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-09-24 17:28:52 +02:00
Prof Langues b6a448ca9b validation masque de saisie user 2020-09-24 11:34:26 +02:00
Prof Langues 7011373627 Revert "bug f5 après masque de saisie incomplet"
Fix bug rafraichissement écran après notice
2020-09-24 10:23:57 +02:00
Fred b308b50476
Add files via upload 2020-09-23 06:56:10 +02:00
Fred 582ebe2650
Delete mini_nebula.jpg 2020-09-23 06:55:45 +02:00
Fred c2a3cd09b5
Delete mini_earth.jpg 2020-09-23 06:55:38 +02:00
Fred 27e282245c
Delete mini_cosmos.jpg 2020-09-23 06:55:32 +02:00
Fred 42fd1dd842
Add files via upload 2020-09-23 06:54:55 +02:00
Fred d1bde29a81
Delete mini_earth.jpg 2020-09-23 06:53:18 +02:00
Fred 6d8288ac9f
Delete mini_nebula.jpg 2020-09-23 06:53:10 +02:00
Fred 2aa777fac2
Delete mini_cosmos.jpg 2020-09-23 06:53:04 +02:00
Fred Tempez 027e75dd7e bug edit galeri nom vide 2020-09-22 19:20:35 +02:00
Fred b8d464fea4
Add files via upload 2020-09-22 19:01:17 +02:00
Fred 44d7b54e5d
Add files via upload 2020-09-22 19:00:41 +02:00
Fred Tempez bf17ed81c0 bug new galerie 2020-09-22 18:58:21 +02:00
Fred Tempez b9b514263a Merge branch 'beta' of https://github.com/fredtempez/ZwiiCMS into beta 2020-09-22 18:54:18 +02:00
Fred Tempez 7e8dbc3f0e bug f5 après masque de saisie incomplet 2020-09-22 18:54:14 +02:00
Fred 75c796c5c2
Update common.css 2020-09-22 08:05:01 +02:00
Fred aabe72594b
Correction de syntaxe 2020-09-22 08:04:32 +02:00
Fred 59eab29353
Correction de syntaxe 2020-09-22 08:03:55 +02:00
Fred Tempez 8398aae329 taille et effet 2020-09-20 18:57:34 +02:00
Fred Tempez 12c935656b effet hover 2020-09-20 18:29:44 +02:00
Fred Tempez b746700d0c Duplication du module de page 2020-09-20 17:53:50 +02:00
Fred Tempez fef55731be texte aide survol 2020-09-20 17:39:42 +02:00
Fred Tempez c058d25d39 Changes 2020-09-20 16:07:26 +02:00
Fred Tempez 7edb7b4f0a Page duplication 2020-09-20 16:06:58 +02:00
Fred Tempez 2ddf76ef24 Icones + et - rondes et orange 2020-09-19 18:14:06 +02:00
Fred Tempez 3ac6bb75ea Update favicon switcher 2020-09-19 17:35:02 +02:00
Fred Tempez d402ad9516 ne garder que page et module 2020-09-19 16:56:58 +02:00
Fred Tempez e05f0d1bef RW mise en page des modules + améliorations 2020-09-19 16:49:58 +02:00
Fred Tempez 8d00613ce9 virgule 2020-09-19 15:00:33 +02:00
Fred Tempez 96b06cc19b Theme header bug présentation 2020-09-18 20:51:40 +02:00
Fred Tempez 9c6c0d664b header débordement inputfile 2020-09-18 16:00:25 +02:00
Fred Tempez 030b42ab09 jsonDb comment param inutiles 2020-09-18 04:31:58 +02:00
Fred Tempez c0aaa15ad5 jsonDb supprimer init modèle données 2020-09-18 04:10:13 +02:00
Fred Tempez 0c08e387b7 jsonDb supprimer le template 2020-09-18 03:57:02 +02:00
Fred Tempez 318a2d7e1c Classe jsonDB gestion d'erreur + traduction commentaires russes 2020-09-18 03:55:22 +02:00
Fred Tempez 80c80aca3c Lien rechercher supp dans footer defaut site 2020-09-17 20:36:56 +02:00
Fred Tempez f6d0635f1e Droits htaccess 2020-09-17 18:01:36 +02:00
Fred Tempez 901c21f894 install : bulle aide supprimée 2020-09-17 07:08:22 +02:00
Fred Tempez 1395ed4a0a Installation : option de site par défaut 2020-09-16 15:09:26 +02:00
Fred Tempez 9d9c6780df Traitement des modification et des suppression des pages spéciales 2020-09-16 15:04:14 +02:00
Fred Tempez dfe31a2400 Traitement des modification et des suppression des pages spéciales 2020-09-16 14:59:21 +02:00
Fred Tempez 8885ddb362 Exemple de site bulle 2020-09-15 20:41:08 +02:00
Fred Tempez b177a9eca1 Recherche titre des ressources 2020-09-15 20:35:32 +02:00
Fred Tempez b3a467e274 Merge branch 'maintenance' of https://github.com/fredtempez/ZwiiCMS into maintenance 2020-09-14 21:21:33 +02:00
Fred Tempez 659bc7f922 bulle aide + filtre orphelines 2020-09-14 21:20:37 +02:00
Fred Tempez 084b5c73c5 pb du lien de login dans la page 2020-09-14 21:20:37 +02:00
Fred Tempez 4bca8f92f4 Bouton dans la page 2020-09-14 21:20:37 +02:00
Fred Tempez f8e11f4016 bouton dans code de page 2020-09-14 21:20:37 +02:00
Fred Tempez f26ca90a91 fic url bouton + libellé et options de page par défaut 2020-09-14 21:20:37 +02:00
Fred Tempez ad275ec629 initialisation 2020-09-14 21:20:37 +02:00
Fred Tempez d6eaa7cd50 bulle aide + filtre orphelines 2020-09-14 21:15:55 +02:00
Fred Tempez 2f40fd565a pb du lien de login dans la page 2020-09-13 18:11:03 +02:00
Fred Tempez a42798f47c Bouton dans la page 2020-09-12 20:00:09 +02:00
Fred Tempez d7b9817ae0 bouton dans code de page 2020-09-12 19:49:32 +02:00
Fred Tempez 9b6ece352b fic url bouton + libellé et options de page par défaut 2020-09-12 19:37:42 +02:00
Fred Tempez 44d5866d3d initialisation 2020-09-12 09:52:30 +02:00
Fred Tempez a1c2a86d5a 10.3.00 bug test variable 2020-09-12 09:05:57 +02:00
Fred Tempez 9c5642b9b0 Installation + création user 2020-09-09 17:21:02 +02:00
Fred Tempez f84613561e Valider nouveau user 2020-09-09 17:01:31 +02:00
Fred Tempez 61984d5c78 Revert "10.3.00 module installation corrections"
This reverts commit 711e5fef44.
2020-09-09 16:47:53 +02:00
Fred Tempez 711e5fef44 10.3.00 module installation corrections 2020-09-09 14:23:05 +02:00
Fred Tempez 19af48b777 Existence des pages 404 et 403 2020-09-08 22:26:33 +02:00
Fred Tempez f89e2d3142 Bug masque installation validé vide 2020-09-08 21:28:53 +02:00
Fred Tempez b36a0f069f Bug masque installation validé vide 2020-09-08 21:25:42 +02:00
Fred Tempez 0d5ed4bf8d Merge branch 'master' into beta 2020-09-08 21:11:29 +02:00
Fred Tempez 63d3931549 10.2.09 securisation setData 2020-09-08 14:14:59 +02:00
fredtempez e576a62b2d aside dans les barres latérales 2020-09-02 09:03:01 +02:00
fredtempez b4b33ec600 hauteur captcha 2020-09-01 21:42:46 +02:00
fredtempez 2d4a4b323c backup animation avec contenu du gestionnaire de fichiers 2020-09-01 21:35:25 +02:00
fredtempez 70a496a749 modif url vers zwiicms.fr + écriture update 2020-09-01 20:48:40 +02:00
fredtempez 7cf99fb99e lorem multiples 2020-08-26 20:01:36 +02:00
fredtempez 05beea4ab1 Tinymce espace insécable 2020-08-26 19:58:38 +02:00
fredtempez 36a2c0fcde Rechercher de phrase exacte entre guillemets 2020-08-26 19:54:17 +02:00
fredtempez 590daa8b89 mauvaise mise en évidence des espaces + réécriture de la fonction 2020-08-25 23:16:47 +02:00
fredtempez 77df0f9de8 mots clés apporchants par défaut 2020-08-25 21:01:10 +02:00
fredtempez 66ef114f56 Merge branch 'master' into beta 2020-08-25 20:45:11 +02:00
fredtempez 5ece1ed117 Permission 644 2020-08-25 20:43:17 +02:00
fredtempez f7b1e76387 mots clés approchants + mot clé suivi d'un caractère de ponctuation. 2020-08-24 20:04:28 +02:00
Fred Tempez a6a46fea76 Alignement des select 2020-08-22 18:26:08 +02:00
fredtempez a5441402c0 Merge branch 'beta' of https://github.com/fredtempez/ZwiiCMS into beta 2020-08-22 12:15:39 +02:00
fredtempez a3261a6a4b Merge branch 'master' into beta 2020-08-22 11:13:29 +02:00
fredtempez 34f0f8ff0d 10.2.08 bug pageId 2020-08-22 10:48:03 +02:00
Fred Tempez 4e88ec43ad 10.2.07 Numérotation de la version 2020-08-21 18:35:07 +02:00
Fred Tempez 8f696cc1cb Merge branch 'master' into beta 2020-08-21 18:02:50 +02:00
Fred Tempez 707397f3ec 10.2.07 bug flatpickr dans le module formulaire 2020-08-21 18:01:55 +02:00
Fred Tempez 04978ab13a debug off 2020-08-21 14:55:40 +02:00
Fred Tempez 04d585b277 libellé 2020-08-21 09:50:06 +02:00
Fred Tempez 1325b09fe9 défaut d'initialisation + libellés 2020-08-21 09:45:59 +02:00
fredtempez 86b552ec93 changes 2020-08-20 19:33:03 +02:00
fredtempez 14aaa9af23 espace supprimé 2020-08-20 19:31:19 +02:00
fredtempez b050238af7 Erreur d'initialisation 2020-08-20 19:31:11 +02:00
Fred Tempez 016790052c Dimension de l'aperçu 2020-08-20 16:11:11 +02:00
Fred Tempez 7986fc27d7 Icônes d'aide 2020-08-20 15:56:48 +02:00
Fred Tempez f26924461c avertissement dans thèmes galerie et recherche 2020-08-20 13:43:40 +02:00
Fred Tempez f7b411a09f Modif galerie : mise à jour et nettoyage du json 2020-08-20 13:21:28 +02:00
Fred Tempez b3a094c4ee Libellés 2020-08-20 12:14:36 +02:00
Fred Tempez f25b27eae0 Search gestion du thème modifié 2020-08-19 21:08:21 +02:00
Fred Tempez d2b6c54418 Gallery stockage unique des paramètres de theme 2020-08-19 21:08:00 +02:00
Fred Tempez 3feab64a17 Stockage des paramètres générique au module 2020-08-19 20:34:40 +02:00
Fred Tempez 711b3ffab9 echo supprimé + couleur par défaut keyword 2020-08-19 19:05:00 +02:00
Fred Tempez 1c065ba546 Recherche d'une suite de mots-clés. 2020-08-19 19:02:37 +02:00
Fred Tempez 04c5fe5193 Module search choix couleur des mots-clés 2020-08-19 18:46:00 +02:00
Fred Tempez 6f3e81f7ce Gallery : modif theme notification + espace en trop 2020-08-19 18:44:40 +02:00
Fred Tempez 64641b2417 présentation bloc h4 encore 2020-08-19 18:16:49 +02:00
Fred Tempez 18c5ca26a7 présentation div h4 2020-08-19 18:15:23 +02:00
Fred Tempez 540ec4a796 Champ vide 2020-08-19 17:46:39 +02:00
Fred Tempez 29a4193450 Petites corrections 2020-08-19 16:40:23 +02:00
Fred Tempez 1f4ba11970 occurence pluriel sur une ligne 2020-08-19 15:31:03 +02:00
Fred Tempez 3731ef209a pluriel occurence 2020-08-19 15:27:23 +02:00
Fred Tempez 6a075b9880 Moteur de recherche - résultats condensés 2020-08-19 15:18:57 +02:00
Fred Tempez 6647cf8bea oups 2020-08-19 14:06:34 +02:00
Fred Tempez 8bc087bc89 améliorer css + pb double affichage + découpage aperçu 2020-08-18 19:07:28 +02:00
Fred Tempez dd39587938 tri par pertinence + css 2020-08-17 16:51:18 +02:00
Fred Tempez 4c43750e3a bug recherche vide 2020-08-17 15:36:31 +02:00
Fred Tempez bd12f3d5d9 Modifications de libellés 2020-08-17 15:34:18 +02:00
Fred Tempez c541c2e742 Masquer le nombre d'occurences 2020-08-17 11:09:32 +02:00
Fred Tempez a17a7e0807 multi mise en évidence 2020-08-17 11:05:44 +02:00
Fred Tempez 0f851a7304 Présentation de l'aperçu 2020-08-17 10:53:32 +02:00
Fred Tempez 58b923fc18 aperçu sur deux lignes 2020-08-17 10:51:45 +02:00
Fred Tempez 0e93feb076 changes 2020-08-17 10:44:31 +02:00
Fred Tempez 784a4935fd Regex de nettoyage + mise en évidence 2020-08-17 10:39:44 +02:00
Fred Tempez 6976594a14 Nouveau moteur de recherche basé sur des regex - reste à faire recherche par chaine 2020-08-16 21:02:26 +02:00
Fred Tempez 9b847547f3 Textes par défaut dans la config 2020-08-16 16:24:09 +02:00
Fred Tempez e076950f0e Personnalisation module de recherche 2020-08-16 15:59:37 +02:00
Fred Tempez fe273b8019 Bug titre de la configuration du module masqué si titre de la page masqué 2020-08-16 15:52:05 +02:00
Fred Tempez 7cc5a928d0 Merge branch 'beta' of https://github.com/fredtempez/ZwiiCMS into beta 2020-08-16 11:03:20 +02:00
Fred Tempez 5ff6a7d65b Droits 2020-08-16 11:01:39 +02:00
Fred 9960979944
Delete mini_home_blue.png 2020-08-16 11:00:40 +02:00
Fred 6c870d23d2
Delete mini_home_black.png 2020-08-16 11:00:32 +02:00
Fred 1695e48db1
Add files via upload 2020-08-16 11:00:04 +02:00
Fred eea886c1c8
Add files via upload 2020-08-16 10:58:31 +02:00
Fred 2c61f2a0b7
Add files via upload 2020-08-16 10:57:52 +02:00
Fred Tempez 1aa57f0f35 copyright 2020-08-16 10:55:52 +02:00
Fred Tempez 368f98e959 Liste des versions des modules dans config 2020-08-16 10:55:44 +02:00
Fred Tempez 67707f36ed Page de configuration du mode de recherche 2020-08-16 10:43:09 +02:00
Fred Tempez 59e42e81d8 Rechercher : loupe dans le menu 2020-08-16 10:34:09 +02:00
Fred Tempez 635e561765 autres modifs 2020-08-15 10:11:04 +02:00
Fred Tempez b96a089678 Libellés modifiés 2020-08-15 10:03:36 +02:00
Fred Tempez febbdf3923 Modif des bulles 2020-08-15 09:48:13 +02:00
Fred Tempez cdb0dbc3b4 Nom du module en FR 2020-08-15 09:48:05 +02:00
Fred Tempez 7e3dc1d1c0 nom du module + variables static 2020-08-15 09:35:43 +02:00
Fred Tempez f8e1f98002 Changes 2020-08-14 18:10:17 +02:00
Fred Tempez 8ba60263f7 page de recherche par défaut 2020-08-14 17:56:17 +02:00
Fred Tempez 18ab09cd3c déplacer le stockage de la nouvelle version du core 2020-08-14 17:56:03 +02:00
Fred Tempez 6227b843fb droits modifiés 2020-08-14 17:33:01 +02:00
Fred Tempez 3e65b0bc6a masque 2020-08-14 17:32:48 +02:00
Fred Tempez 997ef55efb Masque 2020-08-14 17:32:35 +02:00
Fred Tempez 3675aa196e gestion erreur 2020-08-14 17:32:21 +02:00
Fred Tempez a4505c2d88 inscription module 2020-08-14 17:32:11 +02:00
Fred Tempez 88cc62e15d Supprimer le module interne 2020-08-14 16:26:48 +02:00
Fred Tempez 26d28be381 Modif config 2020-08-14 16:25:57 +02:00
Fred Tempez f3013b0764 Merge branch 'beta' into module_rechercher 2020-08-14 16:10:02 +02:00
Fred Tempez 5801b09583 nom du module 2020-08-14 16:09:46 +02:00
Fred Tempez 5bd3c0a9fe 'occurence' 2020-08-14 16:00:42 +02:00
Fred Tempez d374749ebc supprimer écriture dans json 2020-08-14 15:35:52 +02:00
Fred Tempez 40fc832c7c init 2020-08-14 15:24:14 +02:00
Fred Tempez 2c803996f6 Changes 2020-08-14 07:16:09 +02:00
Fred Tempez 0aa0652de1 Données par défaut actualisées 2020-08-14 07:14:11 +02:00
Fred Tempez 3a05406525 Erreur de champ 2020-08-13 14:16:06 +02:00
Fred Tempez 1a6ce51080 page 403 2020-08-13 14:11:33 +02:00
Fred Tempez a7376f7f17 Choix aucune page personnalisée version 10.3 2020-08-13 09:47:58 +02:00
Fred Tempez baffde2f07 erreur de slash 2020-08-12 18:26:04 +02:00
Fred Tempez 03620979b6 Commit inital 2020-08-12 18:19:54 +02:00
Fred Tempez b3cdc71b8d Paramètrage du champ INPUT 2020-08-12 17:39:43 +02:00
Fred Tempez b89314610b Nom de classe 2020-08-12 16:35:13 +02:00
Fred Tempez 0b400cdb35 Débordement dans inputfile 2020-08-12 09:21:40 +02:00
Fred Tempez cddf3ab4a5 Fichier vide pour écrasement du fichier dans les installations existantes 2020-08-12 09:18:30 +02:00
Fred Tempez fd633ccfd2 nettoyage d'espaces 2020-08-11 18:10:53 +02:00
Fred Tempez 87b19c913a largeur div captcha col5 2020-08-11 18:06:52 +02:00
Fred Tempez f062d209c8 thème du bouton installation 2020-08-11 18:06:35 +02:00
Fred Tempez 6ec6e74c0b alignement sur image captcha 2020-08-11 16:28:10 +02:00
Fred Tempez f97b2a7ed3 formulation 2020-08-11 16:09:11 +02:00
Fred Tempez 53bb2efeff captcha lettres 2020-08-11 16:03:48 +02:00
Fred Tempez 8ee8229e3f Bug bouton bouton éditer avec cookie persistant 2020-08-11 08:25:41 +02:00
Fred Tempez ac15324da5 changes 2020-08-10 19:39:39 +02:00
Fred Tempez e94cb81b24 Captcha en lettres + correction du nom : capcha en captcha 2020-08-10 19:07:17 +02:00
Fred Tempez bf1819fc74 Ajustements 2020-08-10 13:30:48 +02:00
Fred Tempez 9c46c227d0 remember me true value 2020-08-10 09:16:28 +02:00
Fred Tempez 5a8420bd3d remember me ok 2020-08-10 09:10:20 +02:00
Fred Tempez 83b5234efb move loader png 2020-08-10 09:10:02 +02:00
Fred Tempez d31cedb23e Menu : classe active 2020-08-09 19:16:39 +02:00
Fred Tempez a670fa4e5d Backup name = base Url 2020-08-09 18:59:43 +02:00
Fred Tempez 74787dffbc Message d'attente 2020-08-09 18:32:16 +02:00
Fred Tempez 7c956dd919 Soumission unique 2020-08-09 18:11:49 +02:00
Fred Tempez 9ab2e0eefd Numéro de version 2020-08-09 18:10:36 +02:00
Fred Tempez 38e05f0115 reverse samesite=strict 2020-08-09 17:58:13 +02:00
Fred Tempez 5a9e7405e0 Cookie authentification : samesite = strict | remember me ok 2020-08-09 16:35:03 +02:00
Fred Tempez c933abefc2 optimisation d'écriture 2020-08-09 15:53:30 +02:00
Fred Tempez 8b4775967d Image du loader 2020-08-09 15:53:20 +02:00
Fred Tempez 065c8832cb Changes 2020-08-09 12:14:03 +02:00
Fred Tempez 30542b157b Changes 2020-08-09 12:13:15 +02:00
Fred Tempez d95142c3f1 Merge branch 'loading_animation' into beta 2020-08-09 12:06:52 +02:00
Fred Tempez c38c8b8694 Gestion d'erreur 2020-08-09 12:00:29 +02:00
Fred Tempez 603f28189e Améliorations : spinner + masque 2020-08-09 11:47:46 +02:00
Fred Tempez 13a143815d Merge branch 'beta' of https://github.com/fredtempez/ZwiiCMS into beta 2020-08-09 10:54:03 +02:00
Fred Tempez c03a22436e Merge bug_page_id 2020-08-09 10:53:58 +02:00
Fred Tempez 80f091b59f Merge bug_page_id 2020-08-09 10:50:45 +02:00
Fred Tempez 8581911e61 Correctif : edit page, changement id si le nom de la page a changé 2020-08-08 19:41:12 +02:00
Fred Tempez 4400b6de8b Notification ok + libellés 2020-08-08 18:36:11 +02:00
Fred Tempez 5a0998e139 Virer une console 2020-08-08 17:15:19 +02:00
Fred Tempez 14e0499bc8 Virer les icones de bouton + petites modifs 2020-08-08 17:14:52 +02:00
Fred Tempez 54b5efd1d8 init + améliorer la notification finale. 2020-08-08 17:06:06 +02:00
Fred Tempez b54f2ed9bc 10.2.06 changes 2020-08-08 14:33:34 +02:00
Fred Tempez 7863b098ad 10206 Numéro de version 2020-08-08 14:32:01 +02:00
Fred Tempez 2c6e4ff6d8 change 2020-08-08 10:33:54 +02:00
Fred Tempez dfcc6e640d Warning map theme file tinymce 2020-08-08 10:25:08 +02:00
Fred Tempez 69ad317888 Warning samesite 2020-08-08 10:17:16 +02:00
fredtempez 2b59a39c7a 10.2.05 Merge branch 'dev' 2020-07-30 07:57:32 +02:00
fredtempez 35a7f614e9 10.2.05 bug champ date sous chrome et safari 2020-07-25 14:23:04 +02:00
Fred Tempez fac102b038 Merge branch 'dev' 2020-07-17 21:16:03 +02:00
Fred Tempez 5bfa992290 10.2.04 login unknown notification 2020-07-17 17:19:27 +02:00
Fred Tempez 6529b611a4 Update flatPickr 4.6.3 2020-07-16 19:21:53 +02:00
Fred Tempez 1bd0d7b964 Update flatPickr 4.6.3 2020-07-16 19:19:58 +02:00
Fred Tempez 490e91e391 change 2020-07-16 11:02:26 +02:00
Fred Tempez cc45d3d009 10.2.04 standard button hover color 2020-07-16 11:01:57 +02:00
Fred Tempez 6d05cc6f48 102.04 theme admin font not body 2020-07-15 22:56:51 +02:00
Fred Tempez 452f60dc9b 10.2.04 bend icons at the right of blocks 2020-07-15 22:56:03 +02:00
Fred Tempez 8ba7682a6c Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-07-15 18:27:29 +02:00
Fred Tempez 6883e3fe64 version 2020-07-15 18:22:16 +02:00
Fred Tempez 280b21c6f8 Libellées 2020-07-14 11:36:24 +02:00
Fred Tempez 8726c17034 Libellé config 2020-07-14 10:09:43 +02:00
Fred Tempez cf99a0f7aa classe helper fonction isHttps 2020-07-13 10:26:16 +02:00
Fred Tempez 6d5caf8623 Changes 2020-07-12 17:57:20 +02:00
Fred Tempez 20732d5f8a Sécurisation des cookies 2020-07-12 17:50:09 +02:00
Fred Tempez a3ef3e9cb2 Changes 2020-07-11 18:44:09 +02:00
Fred Tempez 7d67818b52 No hover effect on class inputFile 2020-07-11 18:38:26 +02:00
Fred Tempez c16746c9b1 Header color with a link + mail new user content 2020-07-11 17:18:18 +02:00
Fred Tempez 9780470f62 Header color with a link + mail new user content 2020-07-11 17:01:08 +02:00
Fred Tempez d46b5e43dd Revert "hauteur viewport et footer"
This reverts commit 4188264298.
2020-07-10 18:09:54 +02:00
Fred Tempez 4188264298 hauteur viewport et footer 2020-07-10 17:24:21 +02:00
Fred Tempez 14331ebd5e changes 2020-07-09 19:47:31 +02:00
Fred Tempez 46762d13b2 Edit user empêcher le pré-remplisage auto de l'ancien mot de passe 2020-07-09 19:43:55 +02:00
Fred Tempez e3e59db275 Structure de l'édition de page 2020-07-08 21:15:38 +02:00
Fred Tempez 8bb1d9954c WIIP - Libellés 2020-07-08 21:07:30 +02:00
Fred Tempez 2a59d74b33 changes 2020-07-08 18:55:41 +02:00
Fred a0bb56e388
Update README.md 2020-07-08 08:26:15 +02:00
Fred Tempez 24e7c84824 10.2.03 id dupliqués dans le menu 2020-07-08 08:24:50 +02:00
Fred Tempez c63a870843 10.2.02 Changes 2020-07-06 21:33:50 +02:00
Fred Tempez c010f4f518 Bug favicon select 2020-07-06 19:50:53 +02:00
Fred 2762c7df82 Merge branch 'master' into dev 2020-07-02 19:45:14 +02:00
Fred eca6b4fb87 Revert "Permissions"
This reverts commit a9be62287a.
2020-07-02 19:43:31 +02:00
Fred c6aee2862f Merge branch 'master' into dev 2020-06-30 22:53:00 +02:00
Fred cc61fce0eb Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-06-30 22:04:44 +02:00
Fred d82fadfe03 10.2.01 2020-06-30 22:03:29 +02:00
Fred 8fc49e3218
Update README.md 2020-06-30 21:53:30 +02:00
Fred cc4c73355e
Update README.md 2020-06-30 21:51:36 +02:00
Fred 8cace16d0d 10.2.01 No install window on fresh install 2020-06-30 21:50:40 +02:00
Fred a9be62287a Permissions 2020-06-30 20:13:51 +02:00
Fred c39654d99f Fix bug Safari RFM 2020-06-30 00:14:10 +02:00
Fred 3e115982f8 gitignore 2020-06-29 21:52:33 +02:00
Fred 29fbe0a001 10.2.01 fix select menu icon error 2020-06-29 21:48:06 +02:00
Fred 617364f578 10.2.01 fix select menu icon error 2020-06-29 21:26:20 +02:00
Fred 16894d1d90 10.2.01 fix imagetag 2020-06-29 20:55:22 +02:00
Fred Tempez 9579315407 10.2 Optimisation script protection login + journalisation IP 2020-06-27 16:21:22 +02:00
Fred Tempez ff4d03c18a changes 2020-06-27 13:50:41 +02:00
Fred Tempez 9354863b1e Erreur de nom de variables de barre de membre simple dans update 2020-06-26 21:23:22 +02:00
Fred Tempez 0ed4582cf0 Gestion d'un compte non enregistré 2020-06-26 21:02:41 +02:00
Fred Tempez eeeb5c3db8 10.2.01 gestion des échecs de connexion 2020-06-26 10:01:14 +02:00
Fred Tempez 51827c015b Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-06-25 12:09:00 +02:00
Fred Tempez 9d312c5582 Update non effacé après mise à jour 10.1 vers 10.2 cause option de sécurité 2020-06-25 12:08:57 +02:00
Fred cf8796f45a
Update README.md 2020-06-25 11:03:39 +02:00
Fred Tempez 8756ff4bd5 10.2 2020-06-23 20:10:10 +02:00
Fred Tempez 624dae23c1 10.2.dev40 theme menu active textcolor non définie 2020-06-23 18:37:04 +02:00
Fred Tempez ed8f77755e Bug déconnexion après modification compte 2020-06-19 11:09:24 +02:00
Fred Tempez 9d1618d2ea Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-06-18 13:28:41 +02:00
Fred Tempez 172d2f763b 10.2.dev39 barre de membre simple dans footer 2020-06-18 13:21:47 +02:00
Fred Tempez f4e890f8e7 10.2.dev39 barre de membre simple dans footer 2020-06-18 13:16:34 +02:00
Fred Tempez 663842d8d0 Supp redondance génération theme.css 2020-06-17 20:45:49 +02:00
Fred Tempez efbc893d53 10.2.dev38 barre de membres simples dans le menu + bug bouton retour édition compte 2020-06-17 19:07:51 +02:00
Fred Tempez 048e59e497 10.2.dev36 css pour le thème sombre 2020-06-17 18:45:02 +02:00
Fred Tempez 7c6befaa20 10.2.dev35 selecteur de pages en mode sombre 2020-06-16 18:44:26 +02:00
Fred Tempez 7df3330bb5 Changes 2020-06-16 12:45:15 +02:00
Fred Tempez 4975fa74c4 Gallery 2.26 largeur proportionnelle 2020-06-16 12:43:54 +02:00
Fred Tempez 83d614c4e2 10.2.dev34 option de préservation htaccess de la racine 2020-06-14 10:36:36 +02:00
Fred Tempez 0f42f03d4e position -> location 2020-06-12 18:22:34 +02:00
Fred Tempez fc5b7172eb Edit page blocs fermés 2020-06-12 18:20:32 +02:00
Fred Tempez 363057d568 Tinymce supprimer codesample 2020-06-12 17:32:32 +02:00
Fred Tempez 9227fe5e3c Supprimer les espaces 2020-06-12 17:15:55 +02:00
Fred Tempez 4ed4a4e0d9 10.2.dev33 persistances des positions de blocs durant la durée de la session. 2020-06-11 11:25:53 +02:00
Fred Tempez fd333a1090 update Changes 2020-06-10 19:38:49 +02:00
Fred Tempez 9c66bfcf9b Blog 2.2 options à la création 2020-06-10 16:38:53 +02:00
Fred Tempez db9bebe596 Blog 2.3 options à la création 2020-06-10 16:32:33 +02:00
Fred Tempez 30f72054ec Activation paste TinyMCE 2020-06-10 12:21:42 +02:00
Fred Tempez d7d000ff1d Couleurs par défaut du thème 2020-06-07 19:15:21 +02:00
Fred Tempez 842da132e0 Options de page dépliables 2020-06-07 18:55:38 +02:00
Fred Tempez 638f2a99d8 Interdire le clic sur le fond de boite 2020-06-07 18:55:24 +02:00
Fred Tempez ba991a79b3 Supprimer les id inutiles 2020-06-07 18:08:10 +02:00
Fred Tempez 3b5a424c34 TinyMCS couleur bordure de contour 2020-06-07 17:04:02 +02:00
Fred Tempez 2e0d9dd20c 102.dev31 présentation configuration 2020-06-07 12:28:43 +02:00
Fred Tempez e1a09676b4 10.2.dev31 config : blocs dépliants code optimisé. 2020-06-07 09:25:54 +02:00
Fred Tempez 0ac70c9f51 10.2.dev30 formulaire ouvert mauvais message 2020-06-06 11:55:56 +02:00
Fred Tempez 6b2c44c3fc 10.2.dev28 config blocs pliables - optimisation JS à réaliser. 2020-06-05 07:23:36 +02:00
Fred Tempez c963a61389 10.2 commentaire + fonction private 2020-06-04 18:34:39 +02:00
Fred Tempez b30f70a4c8 10.2.dev27 check login fail values 2020-06-04 13:57:50 +02:00
Fred Tempez a700dcb1aa changes 2020-06-03 18:19:50 +02:00
Fred Tempez 2d93f5c5f5 10.2.dev26 + merge 10104 + correctif auth 2020-06-03 16:44:46 +02:00
Fred Tempez 75ac83331c 10.2 Erreur création thème pas défaut couleur du texte 2020-06-03 10:17:37 +02:00
Fred Tempez e19e6548ee 10.2.dev25 en-têtes des logs + permissions des nouveaux fichiers 2020-06-03 10:13:15 +02:00
Fred Tempez 5151f64beb 10.2.dev25 en-têtes des logs + permissions des nouveaux fichiers 2020-06-03 10:06:11 +02:00
Fred Tempez 508cd838df 10.2 Nettoyage d'espaces 2020-06-03 09:07:00 +02:00
Fred Tempez f6474295d4 Fomr 2.3 bug répondre à 2020-06-03 08:54:48 +02:00
Fred Tempez 4641fcf3d1 10.2 Suppression d'espaces en fin de ligne 2020-06-02 18:51:50 +02:00
Fred Tempez 63452426be 10.2 Suppression d'espaces en fin de ligne 2020-06-02 18:49:24 +02:00
Fred Tempez 3e3d3492d2 update jquery 2020-06-02 17:12:23 +02:00
Fred Tempez 5f3572c1a6 update jquery 2020-06-02 17:12:05 +02:00
Fred Tempez 0389499595 avertissement github 2020-06-02 17:09:39 +02:00
Fred Tempez 749d5ebe55 10.2.dev24 modification liste noire 2020-06-02 16:58:08 +02:00
Fred Tempez 165eeaecb5 Theme header text defaultcolor 2020-06-02 16:12:35 +02:00
Fred Tempez caf767aaaa Erreur de création du theme.css 2020-06-02 14:29:10 +02:00
Fred Tempez 7273c41e30 10.2.dev23 update RFM + changes 2020-06-02 14:13:24 +02:00
Fred Tempez 4843b93366 10.2.dev22 erreur defaultdata css 2020-06-02 12:10:06 +02:00
Fred Tempez a400b65654 10.2dev21 petites corrections 2020-06-02 12:03:45 +02:00
Fred Tempez 29e460ffad 10.2.dev21 supprimer stockage IP 2020-06-02 11:49:19 +02:00
Fred Tempez 3734697e90 changes 2020-06-01 15:51:19 +02:00
Fred Tempez 6d94f626fd Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-06-01 10:22:33 +02:00
Fred Tempez d99bcbe9b2 10.2 Mise à jour 2020-06-01 10:22:29 +02:00
Fred Tempez 06c32689ef 10.2 Mise à jour 2020-06-01 10:20:25 +02:00
Fred Tempez b0966d036e 10.2.dev20 Liste noire 2020-06-01 09:35:42 +02:00
Fred Tempez 9d71c34f3a 10.2.dev20 Liste noire 2020-06-01 09:35:03 +02:00
Fred Tempez 600426da61 10.2.dev20 Liste noire 2020-06-01 09:34:13 +02:00
Fred Tempez 80cb7a114d 10.2 RAZ auto update en début de script en cas d'échec 2020-06-01 08:19:34 +02:00
Fred Tempez f50e2ab8c2 10.2.dev19 verrou connexion sans userId valide 2020-05-31 19:08:19 +02:00
Fred Tempez d74a6e620c 10.2.dev18 connexion login d'un compte tentatives avec un login inexistant 2020-05-31 16:46:13 +02:00
Fred Tempez a948f590fa 10.2.dev18 présenation config 2020-05-31 16:45:33 +02:00
Fred Tempez 1037717809 Suppression plugin fullpage tinymce 2020-05-30 18:26:05 +02:00
Fred Tempez 36360e19a3 10.2.dev17 blog ombre shadow et date couleur du texte 2020-05-30 17:55:06 +02:00
Fred Tempez 53a0289b9b logn brute force options par défaut 2020-05-30 12:17:54 +02:00
Fred Tempez dd1d3f793f 10.2.dev16 journalisation + blocage brute force login 2020-05-30 12:04:45 +02:00
Fred Tempez 9ce6c8bd9d gitignore 2020-05-30 08:02:25 +02:00
Fred Tempez 9c7d9443ce thumb vignettes 640 2020-05-30 07:57:57 +02:00
Fred Tempez d1272cb3c6 10.2.dev14 logique des options de sécurité de connexion 2020-05-29 17:53:30 +02:00
Fred Tempez b7a90902ab 10.2.dev13 adapatation index et site du thème aux écrans 750px 2020-05-29 17:32:57 +02:00
Fred Tempez 4c29d94246 Sécurité connexion options par défaut 2020-05-29 08:24:32 +02:00
Fred Tempez 0d68f00710 10.2.dev12 sécurité de la conenxion au compte 2020-05-28 19:03:31 +02:00
Fred Tempez 9c94e84d82 10.2.dev11 config warning pwd smtp 2020-05-28 15:23:46 +02:00
Fred Tempez 397fbe8c26 10.2.dev11 bloquer l'accès au compte trop de mauvaises connexions 2020-05-28 15:19:32 +02:00
Fred Tempez 943a4dddf8 10.2.dev10 timer sur le controle d'accès 2020-05-28 09:28:10 +02:00
Fred Tempez 1cc2f5e225 Merge 10.1.02 2020-05-28 07:19:06 +02:00
Fred Tempez 1515579141 10.2.dev9 blog shadow dargrey 2020-05-27 08:56:20 +02:00
Fred Tempez 1c96e44623 10.2.dev9 h4 search 2020-05-27 08:44:14 +02:00
Fred Tempez 69b00a4250 10.2dev9 theme admin 2020-05-27 08:42:32 +02:00
Fred Tempez 3b8879dac9 10.2.dev8 police du texte 2020-05-26 09:25:08 +02:00
Fred Tempez 2a769406ff 10.2.dev7 encore le thme admin : bouton couleur du texte auto 2020-05-26 09:10:56 +02:00
Fred Tempez 3266154989 10.2.dev6 theme admin couleurs par défaut 2020-05-26 08:36:58 +02:00
Fred Tempez f9d05aa803 10.2.dev6 accès concurrents login et logout 2020-05-26 08:32:51 +02:00
Fred Tempez 40c35a0de7 10.2.dev5 theme admin + présentation 2020-05-26 00:03:58 +02:00
Fred Tempez 43b7864b70 10.2.dev5 correction d'une régression 2020-05-26 00:03:34 +02:00
Fred Tempez f92cad8f71 10.2.dev5 theme admin + supp fonction inutilisé 2020-05-26 00:03:10 +02:00
Fred Tempez b886cc21cb 10.2 stratégie création screenshot 2020-05-25 21:03:34 +02:00
Fred Tempez 5b927d2a8e Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-05-25 20:50:35 +02:00
Fred Tempez c324081076 Change 10.1.001 2020-05-25 20:50:30 +02:00
Fred Tempez 76793e7282 >Change 10.1.001 2020-05-25 19:41:04 +02:00
Fred Tempez cae10ab155 10.2 bagnière de connexion thème du site 2020-05-25 15:47:50 +02:00
Fred Tempez e0d94517e0 10.2 theme admin au login + version + changes 2020-05-25 14:49:28 +02:00
Fred Tempez d75ec190b5 10.2 API imagetag 2020-05-25 11:58:54 +02:00
Fred Tempez 098eca657f 10.2 read.me 2020-05-24 20:22:10 +02:00
Fred Tempez a358d8d4da 10.2 numéro de la version 2020-05-24 20:21:00 +02:00
Fred Tempez 77c930d737 10.2 accès concurrents WIP 2020-05-24 19:59:21 +02:00
Fred Tempez c5f3c0ac4b Merge branch 'master' into accès_concurrents_2 2020-05-24 18:00:22 +02:00
Fred Tempez 5c42dece4f Supprimer un faux bouton 2020-05-24 18:00:06 +02:00
Fred Tempez 3a85ec44eb dev2 nonbreaking 2020-05-24 16:27:40 +02:00
Fred Tempez 7e0574f277 Revert "dev2 déplacer le chemin de fer"
This reverts commit 81f55490d3.
2020-05-24 16:03:33 +02:00
Fred Tempez 81f55490d3 dev2 déplacer le chemin de fer 2020-05-24 15:55:40 +02:00
Fred Tempez 5f1e9a4412 TinyMCE plugin inutiles 2020-05-24 15:41:26 +02:00
Fred Tempez c485dcab7a TinyMCE plugin inutiles 2020-05-24 10:19:17 +02:00
Fred Tempez 8e7db68253 Nettoyage site/file 2020-05-24 10:06:38 +02:00
Fred Tempez 95665f8bb8 Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-05-23 19:02:16 +02:00
Fred Tempez 8535381f36 10.1.001.dev1 thème admin mode sombre 2020-05-23 19:02:10 +02:00
Fred Tempez 497d5286cc 10.1.001.dev1 thème admin 2020-05-23 18:59:53 +02:00
Fred Tempez 2209b65940 10.1.001.dev Theme admin - test darkmode 2020-05-22 17:57:03 +02:00
Fred Tempez bbc2303fbd 10.1 changes 2020-05-22 16:20:19 +02:00
Fred Tempez 50b4efd6bd 10.1 warning création dossier existant 2020-05-22 16:13:38 +02:00
Fred Tempez 24f8267ac8 10.1 Compatibilite baseUrl IIS + Majuscules 2020-05-22 16:06:34 +02:00
Fred Tempez ca963adbbd 10.1 Bug imagetag + majuscules 2020-05-21 12:01:46 +02:00
Fred Tempez 2553a659c5 10.1 Changes 2020-05-21 09:58:08 +02:00
Fred Tempez 5e5dce0b29 10.1 Changes 2020-05-21 09:55:49 +02:00
Fred Tempez 25b6007300 10.1 id de la page lien du menu 2020-05-21 09:28:09 +02:00
Fred Tempez d9359a60e2 10.1 aperçu thème du site 2020-05-21 08:01:28 +02:00
Fred Tempez 902d70a663 10.1 toutjours afficher backtotop dans body 2020-05-21 08:00:52 +02:00
Fred Tempez 1475ff30fa 10.1 Sauvegarde du theme ou de l'admin 2020-05-18 18:26:21 +02:00
Fred Tempez 5647416cbc 10.1 Erreur de sitemap blog vide 2020-05-18 17:48:08 +02:00
Fred Tempez a25523b638 10.1 correction données par défaut 2020-05-18 11:05:33 +02:00
Fred Tempez 3960e68365 10.1 Thème 2020-05-18 10:50:43 +02:00
Fred Tempez 1a1071992e 10.1 permissions 2020-05-18 08:16:49 +02:00
Fred Tempez 7fabae02e9 10.1 enregistrement de la sauvegarde auto 2020-05-17 15:26:14 +02:00
Fred Tempez 93ca724f08 [10.1.000] Change et version 2020-05-17 07:58:28 +02:00
Fred Tempez b0c05a5200 093 libellé 2020-05-17 07:43:21 +02:00
Fred Tempez 514e0e83b6 Merge branch 'master' of https://github.com/fredtempez/ZwiiCMS 2020-05-17 07:41:49 +02:00
Fred Tempez ab6cba3574 093 Thème admin 2020-05-17 07:41:44 +02:00
Fred Tempez 4b38d4c3d6 093 Thème admin 2020-05-17 07:40:09 +02:00
Fred Tempez e1f4a6dc8c 093 Personnalisation administration : reste à faire la couleur des blocs et l'aperçu. 2020-05-16 22:15:16 +02:00
Fred Tempez 85423bbf2c 093 sécurise la mise à jour de la couverture de la galerie 2020-05-16 21:39:29 +02:00
Fred Tempez 54ef6d95dd 093 Mise en cache des pages 2020-05-16 21:24:20 +02:00
Fred Tempez 2fca58ab52 093 supprimer is_readable 2020-05-16 13:52:52 +02:00
Fred Tempez b436b16608 0193 bug codage mdp smtp 2020-05-16 08:46:56 +02:00
Fred Tempez a2195dc572 093 helper pour Free 2020-05-15 18:52:54 +02:00
Fred Tempez 1934ef4ef0 093 protection image tag google api 2020-05-15 18:42:35 +02:00
Fred Tempez 5e77c51f51 093 thème menu couleur de la page sélectionnée 2020-05-15 18:31:01 +02:00
Fred Tempez 8cf09137fb 093 admin.css et admin.json couleurs du thème admin 2020-05-15 17:36:55 +02:00
Fred Tempez 4c1d91195b 093 effacer un var_dump 2020-05-15 17:35:20 +02:00
Fred Tempez 60148ffc4e Correction d'une horreur 2020-05-15 16:07:01 +02:00
Fred Tempez faeb330579 093 déplacer admin.css dans data + dépalcement d'un fichier de ressources 2020-05-14 19:22:09 +02:00
Fred Tempez bd854b20c3 093 actualisation htaccess de secours 2020-05-14 18:59:49 +02:00
Fred Tempez 31e9853ca7 093 masque un warning pour FREE !!! 2020-05-14 18:43:35 +02:00
Fred Tempez cbc5cd2c4f 093 TinyMCE 4.9.10 + permissions 2020-05-14 11:19:03 +02:00
Fred Tempez 3d1914e847 092 compléter la suppression fullpage 2020-05-14 07:25:36 +02:00
Fred Tempez ea4aca1bee 092 ajouter des ico dans config 2020-05-13 18:05:46 +02:00
Fred Tempez 5a354b4f06 092 ajouter des ico dans config 2020-05-13 18:00:11 +02:00
Fred Tempez 3fd624844e 092 chipotages 2020-05-13 17:52:05 +02:00
Fred Tempez 1eda5a7055 092 changes 2020-05-13 15:02:28 +02:00
Fred Tempez ef1cdbdfc7 092 Thème administration 2020-05-13 14:36:05 +02:00
Fred Tempez de61445249 092 compatibilité Free 2020-05-13 13:59:29 +02:00
Fred Tempez bb6d41b106 092 désactiver le bouton autoupdate si indispo 2020-05-12 18:27:28 +02:00
Fred Tempez fab314a7ee 0932 scrip vide 2020-05-12 16:40:33 +02:00
Fred Tempez b77bdbd08a 092 Edition des scripts dans une fenêtre dédiée 2020-05-12 16:28:10 +02:00
Fred Tempez 67d2155569 Merge branch 'SMTP' 2020-05-12 09:19:30 +02:00
Fred Tempez 0d41800c0f 092 Suppression fullpage + changes 2020-05-12 09:19:28 +02:00
Fred Tempez 0ade031772 092 Changes 2020-05-11 18:25:46 +02:00
Fred Tempez d25ebe52be 092 Suppression fullPage 2020-05-11 17:46:25 +02:00
Fred Tempez 8d814afa73 Cryptage mot de passe SMTP + masquage de champs 2020-05-11 17:02:32 +02:00
Fred Tempez 73cd16b953 Amélioreation form + param smtp false 2020-05-11 12:15:51 +02:00
Fred Tempez 5542ba5193 init smtp server 2020-05-10 18:06:57 +02:00
Fred 46a5a6b128
Merge pull request #7 from finkiki/master
typo
2020-05-10 14:24:00 +02:00
Fred Tempez 70ebd16e65 092 numéro de versoin 2020-05-10 14:22:34 +02:00
Fred Tempez 29f7304aea 092 extension manquante 2020-05-10 14:22:22 +02:00
Fred Tempez 322b202d22 092 Libellé erroné 2020-05-10 14:22:02 +02:00
Popol e2731575ba
Update custom.css 2020-05-10 01:48:31 +02:00
fredtempez 5616b19bef 090 changes 2020-05-09 16:37:11 +02:00
fredtempez 3d941f2c90 090 changes 2020-05-09 16:33:00 +02:00
Fred Tempez 65c1220d75 090 source commentée 2020-05-09 12:52:29 +02:00
Fred Tempez 883120455b 091 restauration convetion url pour les modules 2020-05-09 12:06:22 +02:00
Fred Tempez e893a9ff3c 091 restauration convetion url pour les modules 2020-05-09 12:05:56 +02:00
Fred Tempez a7fc3e23e0 091 restauration convetion url pour les modules 2020-05-09 09:23:29 +02:00
Fred Tempez c584612549 090 Option de marge en haut du site non fluide et correction theme dans core.php 2020-05-08 21:14:29 +02:00
Fred Tempez 1573fa7695 089 fullPage options 2020-05-08 19:50:13 +02:00
Fred Tempez 7c5aacd4be Typo 2020-05-08 16:22:29 +02:00
Fred Tempez d43a0a97d1 089 inclus le script fullpage pour le nouveau site et deux templates tinymce + aide dans le module de redirection 2020-05-08 10:00:05 +02:00
Fred Tempez 7b741f0f74 088 libellés et aide 2020-05-07 16:51:24 +02:00
Fred Tempez f0a2d7767a 087 import user de v9 2020-05-07 16:22:44 +02:00
Fred Tempez f7799861e6 087 information sur les conversions. 2020-05-07 15:59:23 +02:00
Fred Tempez 67bdd386e2 087 conversion URL ok 2020-05-07 15:07:26 +02:00
Fred Tempez 4bab683c2b 087 config backup de la v10 WIP 2020-05-07 08:45:46 +02:00
Fred Tempez 5e748eb3f2 087 config backup de la v10 WIP 2020-05-07 08:36:24 +02:00
Fred Tempez 1312de02d8 086 Nom du fichier de backup 2020-05-06 16:15:08 +02:00
Fred Tempez a06e71f6dc 085 backup CSS manquant 2020-05-06 15:54:16 +02:00
Fred Tempez a3a059167c 085 Suppression css fenêtre update 2020-05-06 07:43:44 +02:00
Fred Tempez 52e1efdddf 085 présentation news + changes 2020-05-06 07:19:51 +02:00
Fred Tempez 9dac796d91 Update PHPMailer 2020-05-05 17:43:35 +02:00
Fred Tempez 92e7b57e6b Aperçu fond d'écran dans thème site 2020-05-05 17:22:04 +02:00
Fred Tempez 72a44219e2 Nom en clair d'un module 2020-05-03 11:16:41 +02:00
Fred Tempez ad9b9c0b19 Nom en clair d'un module 2020-05-03 11:14:20 +02:00
Fred Tempez 934e5bc6f9 Position des images dans updates : correction 2020-05-02 21:47:01 +02:00
Fred Tempez 4e7d005924 Position des images dans updates : correction 2020-05-02 21:46:17 +02:00
Fred Tempez d3e3769b62 080 Protection des données de module 2020-05-02 17:48:44 +02:00
Fred Tempez 8c12494412 Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-05-02 11:18:24 +02:00
Fred Tempez 2db3fd21f0 079 Confirmer supp module 2020-05-02 10:30:55 +02:00
Fred Tempez dfc72060fd 079 Confirmer supp module 2020-05-02 10:18:07 +02:00
Fred Tempez ed807249fe 2.25 édition dela galerie change sa position 2020-05-01 13:43:27 +02:00
Fred Tempez f101b0612a layout light css optimisé 2020-05-01 09:39:13 +02:00
Fred Tempez da8fadecc3 2.24 bug : position manuelles perdues si la galerie change de nom. position devient positions dans json 2020-04-30 18:45:42 +02:00
Fred Tempez a559558f9d Libellé aide tri manuel 2020-04-29 16:34:27 +02:00
Fred Tempez 467f03f0ad 077 Magic_quotes dépréciée 2020-04-29 13:38:01 +02:00
Fred Tempez be614eae29 076 correction de headers 2020-04-29 02:57:57 +02:00
Fred Tempez 906ed547a6 gallery 2.23 le tri des images ne nécessite plus une validation 2020-04-28 19:29:24 +02:00
Fred Tempez fe0e40cb99 075 optimisation méta d'un article de blog 2020-04-28 15:09:39 +02:00
Fred Tempez 3c45d77023 075 optimisation méta d'un article de blog 2020-04-28 15:06:49 +02:00
Fred Tempez e1e625b361 Message relatif aux updates supprimé 2020-04-28 13:52:14 +02:00
Fred Tempez 6a8bed0240 Compléter avec urlGetContents 2020-04-28 10:34:11 +02:00
Fred Tempez 345e0c69f9 Gallery trop longue 2020-04-28 08:25:10 +02:00
Fred Tempez 77d5a024b4 Merge branch 'master' into dev10 2020-04-27 18:57:48 +02:00
Fred Tempez 0afb4363ca Correctifs affichage d'un article 2020-04-27 12:14:42 +02:00
Fred Tempez 3c37807ee5 Merge branch 'master 9.2.28' into dev10 2020-04-27 09:14:34 +02:00
Fred Tempez d343cfde44 071 correction accent dans id 2020-04-26 19:06:10 +02:00
Fred Tempez 6a6233e362 Libellé 2020-04-26 09:54:31 +02:00
Fred Tempez da7aea6838 Bug tri gallery 2020-04-24 12:37:01 +02:00
Fred Tempez f7a05e4bf6 070 raz config si indispo 2020-04-24 10:16:43 +02:00
Fred Tempez fd951381f8 070 mise à jour : libellés 2020-04-24 10:11:25 +02:00
Fred Tempez f1645e0ab8 Mise à jour forçée bloquée si pas de mise à jour détectée. 2020-04-24 10:00:16 +02:00
Fred Tempez 36b0b5bc9e 070 Structure 2020-04-24 09:48:42 +02:00
Fred Tempez 80a3abef2c 070 Gestion d'erreur mise à jour auto 2020-04-24 09:43:13 +02:00
Fred Tempez d20b406cfb 070 Gestion d'erreur mise à jour auto 2020-04-24 09:42:16 +02:00
Fred Tempez 010c2e98df 070 Gestion d'erreur mise à jour auto 2020-04-24 09:28:44 +02:00
Fred Tempez 647e0a8b5b Blog 2.0 personnalisation image de couverture EN COURS 2020-04-23 19:55:47 +02:00
Fred Tempez 73800eabaa Revert "Hauteur minimale en vh"
This reverts commit 791d7c08f8.
2020-04-23 17:06:13 +02:00
Fred Tempez 791d7c08f8 Hauteur minimale en vh 2020-04-23 15:02:18 +02:00
Fred Tempez 7f41418bed 0.169 Amélioration de la mise à jour auto + change 2020-04-23 14:42:24 +02:00
Fred Tempez 3794fe96a1 [0.69] Mise à jour en ligne 2020-04-23 10:17:40 +02:00
Fred Tempez 2fb054cc57 Supprime les emojis de l'id de la page 2020-04-23 07:49:55 +02:00
Fred Tempez efed2febae Valeurs par défaut de la galerie 2020-04-22 18:28:49 +02:00
Fred Tempez 205f054f0b PB arrondi angles 2020-04-20 18:21:26 +02:00
Fred Tempez d3c3ce32bc Droit dossiers récursifs 2020-04-20 10:19:43 +02:00
Fred Tempez b9e5c6fb3a Couleur des ombres + valeurs par défaut plus faibles 2020-04-19 19:43:37 +02:00
Fred Tempez 6b62351cd7 Libellé radius 2020-04-19 19:43:13 +02:00
Fred Tempez 1b2fd01535 Effacer le cache au changement de données du thème. 2020-04-19 19:24:23 +02:00
Fred Tempez 9b4688c1e7 Revert "Revert "Mise à jour TinyMCE""
This reverts commit e8ad6f019d.
2020-04-19 17:24:31 +02:00
Fred Tempez 3c7e965d1f Image du fond dans l'éditeur TinyMCE 2020-04-19 17:24:03 +02:00
Fred Tempez 463f6b0180 module rechercher présentation 2020-04-19 17:07:26 +02:00
Fred Tempez e8ad6f019d Revert "Mise à jour TinyMCE"
This reverts commit c19b1daa63.
2020-04-19 16:57:54 +02:00
Fred Tempez b80eab0939 2.19 ajustement de valeurs 2020-04-19 14:58:38 +02:00
Fred Tempez 498fd7f4d6 2.19 confirmation enregistrement 2020-04-19 13:07:01 +02:00
Fred Tempez 844acd8c8a 2.18 Ajout d'effets + masque du thème 2020-04-18 19:18:34 +02:00
Fred Tempez 79318d0408 2.17 icone + private sort 2020-04-18 16:56:12 +02:00
Fred Tempez 7fd1259a79 2.17 Thème de la galerie 2020-04-18 16:33:48 +02:00
Fred Tempez c19b1daa63 Mise à jour TinyMCE 2020-04-17 20:04:00 +02:00
Fred Tempez b7e8434556 Gallery : vignette d'album en plein écran 2020-04-17 19:32:51 +02:00
Fred Tempez 3310b88aca Gallery : css par défaut 2020-04-17 19:07:06 +02:00
Fred Tempez f061d0edc9 Droits modifiés 2020-04-17 19:05:46 +02:00
Fred Tempez 77f28be18b Galerie 2.16 : règlage du thème WIP 2020-04-17 19:02:04 +02:00
Fred Tempez 52ad23b4f9 Libellé : A accent 2020-04-17 17:39:16 +02:00
Fred Tempez f9617a45ee Warning count galerie inexistante 2020-04-17 14:16:53 +02:00
Fred Tempez 69e5d127cd Merge branch 'responsive_gallery' into dev10 2020-04-16 22:36:08 +02:00
Fred Tempez 48d3edac4f 2.14 Option d'ouverture automatique des images 2020-04-16 22:34:59 +02:00
fredtempez 349e859c08 Erreur de sortie de boucle 2020-04-16 19:27:52 +02:00
Fred Tempez 6393425895 2.11 gérer le déplacement ou la suppression de l'image de couverture. 2020-04-16 14:56:30 +02:00
Fred Tempez 229ef395db 2.11 gestion des images supprimées ou ajoutées au dossier 2020-04-16 14:15:49 +02:00
Fred Tempez e02c2fd52f 0.10 correction getpathname -> getpath 2020-04-16 11:50:01 +02:00
Fred Tempez 3b501ce9cf [10.0.066] makeThumb filtre extension plutôt que type mime 2020-04-15 20:00:30 +02:00
Fred Tempez 905825b47a strtolower manquant 2020-04-15 19:59:28 +02:00
Fred Tempez 17471ed4e0 Libellés vignette 640 etc.. 2020-04-15 17:26:26 +02:00
Fred Tempez 768cb64c30 Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-04-15 10:28:58 +02:00
Fred Tempez 579a47435b bannière par défaut 2020-04-15 10:28:53 +02:00
Fred 9c283ce0c3
Delete sitemap.xml.gz 2020-04-15 10:13:46 +02:00
Fred b03dcaa5ac
Delete sitemap.xml 2020-04-15 10:13:39 +02:00
Fred 4900188ab9
Delete robots.txt 2020-04-15 10:13:30 +02:00
Fred Tempez d06794d5dc Gallery 0.8 : tri manuel sans déplacement effectué 2020-04-14 23:18:58 +02:00
Fred Tempez 46708cbca1 gallery 0.6 Tri manuel sans déplacement -> passe en tri alpha 2020-04-14 14:13:12 +02:00
Fred Tempez 2568479ad8 Ne pas découper les noms de fichiers dans les id 2020-04-14 13:59:51 +02:00
Fred Tempez aee4952dfd Ne pas découper les noms de fichiers avec des _ 2020-04-14 13:44:06 +02:00
Fred Tempez 9d4784db42 Miniature de couverture définie par défaut 2020-04-14 13:36:03 +02:00
Fred Tempez 2e6ce91b9b Default data footer 2020-04-13 19:05:36 +02:00
Fred Tempez bca9cbfe02 Numérotation dév de la galerie 2.5 -> 2.05 2020-04-13 18:58:40 +02:00
Fred Tempez ae682377d3 Création de la miniature RFM si absente (upload FTP) pour l'édition de la galerie 2020-04-13 18:58:09 +02:00
Fred Tempez ed83251e9a makeThumb, dossiers récursifs 2020-04-13 18:53:06 +02:00
Fred Tempez 3356a5bd76 [10.0.064] Mise à jour simplelightbox 2020-04-13 18:30:30 +02:00
Fred Tempez ea2085d584 [2.4] Constantes de tri - pas de tri dans la création de galerie dans la config 2020-04-13 18:13:01 +02:00
Fred Tempez bc0185729c gitignore 2020-04-13 15:01:20 +02:00
Fred Tempez 30e0b0c425 Data par défaut 2020-04-13 15:00:57 +02:00
Fred Tempez 8d79dc3491 [2.4] incohérence nom fichier et nom de la couverture 2020-04-13 15:00:38 +02:00
Fred Tempez 9b141bda45 [10.0.063] suppresion option ouverture d'une page dans lity cause pb de thème. 2020-04-13 09:46:19 +02:00
Fred Tempez 345dc0e169 [10.0.063] suppresion option ouverture d'une page dans lity cause pb de thème. 2020-04-13 09:40:23 +02:00
Fred Tempez a2c7e3e270 062 Mise à jour galerie 2020-04-12 19:32:39 +02:00
Fred Tempez 7ea47bd69c Edition de la galerie lien sur les mini vignettes en grande taille 2020-04-12 19:31:43 +02:00
Fred Tempez 8afb95689c Pb ordre et tri 2020-04-12 19:21:39 +02:00
Fred Tempez 0e182ce5ab Désactiver les icônes de tri dans l'édition des images de la galerie 2020-04-12 18:49:42 +02:00
Fred Tempez 2d010b36f2 Tri des galeries modifié après édition d'une galerie 2020-04-12 10:09:38 +02:00
Fred Tempez 564089b598 [10.0.061] Thème site : Valider -> bouton 2020-04-11 20:06:11 +02:00
Fred Tempez ab619ab0be gallery 2.3 désactivation du drag and drop incomplet si pas de tri manuel 2020-04-11 20:03:59 +02:00
Fred Tempez 54a888f25e Gallery 2.3 message d'erreur si pas d'image 2020-04-11 20:03:29 +02:00
Fred Tempez b79138e15e Gallery 2.3 bug image de couverture création d'une galerie de zéro 2020-04-11 20:03:06 +02:00
Fred Tempez e5e0f2c471 [10.0.060] Optimisation du code de création des images mini 2020-04-11 15:16:50 +02:00
Fred Tempez a3d0f7ac71 [10.0.060] Optimisation du code de création des images mini 2020-04-11 15:08:56 +02:00
Fred Tempez 6eb697e427 Gallery : upload par ftp, dossier miniature non créé. 2020-04-11 14:33:10 +02:00
Fred Tempez 72d5f46353 Image par défaut de la gallery 2020-04-10 16:10:44 +02:00
Fred Tempez 77230ab03f Gallery renommée -> erreur 2020-04-10 15:57:51 +02:00
Fred Tempez 7ddc7bc90a galeries par défaut 2020-04-10 15:36:14 +02:00
Fred Tempez 0b4ce70555 Réorganisation écran gestion des images 2020-04-09 23:12:15 +02:00
Fred Tempez fc3b40eab4 Supprimer le formulaire inutile 2020-04-09 22:56:12 +02:00
Fred Tempez 7ae925e3dc v2.2 2020-04-09 22:53:51 +02:00
Fred Tempez c2f68a4716 Supprimer le bouton trier 2020-04-09 22:53:24 +02:00
Fred Tempez 514c1d31b7 Tri des galeries : activation du bouton pb sur Chrome 2020-04-09 21:53:02 +02:00
Fred Tempez 2ba13c89b8 Update v9 2020-04-09 10:03:20 +02:00
Fred 987d03845d
Delete nebula.jpg 2020-04-09 09:30:45 +02:00
Fred 2ea7a4ad77
Delete earth.jpg 2020-04-09 09:30:40 +02:00
Fred c64ccde509
Delete cosmos.jpg 2020-04-09 09:30:34 +02:00
Fred e20c5487ce
Add files via upload 2020-04-09 09:29:48 +02:00
Fred 73ecc66869
Create t 2020-04-09 09:29:02 +02:00
Fred 51582b90ca
Delete space 2020-04-09 09:28:35 +02:00
Fred 2b3c36e4d2
Create space 2020-04-09 09:28:24 +02:00
Fred Tempez 3174d01518 annulation ancres 2020-04-09 08:47:51 +02:00
Fred Tempez b44ef817e8 Rafraichissement forcé 2020-04-08 22:22:40 +02:00
Fred Tempez 193843ae14 Cosmétique 2020-04-08 21:10:13 +02:00
Fred Tempez 179f27270c Tri des images WIP 2020-04-08 17:46:29 +02:00
Fred Tempez 638606c87a Tri des images WIP 2020-04-07 19:08:24 +02:00
Fred 1106c74c9f
Delete t 2020-04-07 17:47:01 +02:00
Fred 9ba587177e
Add files via upload 2020-04-07 17:46:23 +02:00
Fred dc8216217d
Create t 2020-04-07 17:44:21 +02:00
Fred Tempez 75afa19e1b Images par défaut avec les droits 2020-04-07 17:40:53 +02:00
Fred Tempez 84c3cb72c0 059 filtrage des users en cours d'inscriptions dans module systeme user 2020-04-07 17:22:49 +02:00
Fred Tempez 179c1b5ca0 059 User edit Autorisations est masqué quand inutile 2020-04-07 17:15:13 +02:00
Fred Tempez 4e27765e12 Liste des modules de page Aucun toujours en tête 2020-04-07 10:41:41 +02:00
Fred Tempez 04c8f207b1 Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-04-07 10:17:48 +02:00
Fred Tempez 630a63185a [10.0.058] Miniature du blog 2020-04-07 10:17:42 +02:00
Fred dadac0a5ee
Delete mini_nebula.jpg 2020-04-07 09:30:22 +02:00
Fred fb1dc88fec
Delete mini_earth.jpg 2020-04-07 09:30:17 +02:00
Fred b176e47df1
Delete mini_cosmos.jpg 2020-04-07 09:30:11 +02:00
Fred Tempez 3226e9f37f [10.0.058] Création des mini_ à la volée 2020-04-07 09:22:38 +02:00
Fred Tempez 1e87818a41 [10.0.057] Mise à jour récursive des miniatures. Taille width 320 2020-04-06 17:06:22 +02:00
Fred Tempez f5aeb60236 [10.0.057] Mise à jour récursive des miniatures. Taille width 320 2020-04-06 17:02:46 +02:00
Fred Tempez 12dc91c986 Changes 2020-04-06 14:43:56 +02:00
Fred Tempez 335dc84064 Mini_ thumb 480 plutôt que 640 + auto - crop 2020-04-06 14:32:57 +02:00
Fred Tempez b7022af095 [10.0.056] Erreur click galerie à trier + aperçu cliquable 2020-04-06 14:30:26 +02:00
Fred Tempez c0c3d22d77 [10.0.056] Erreur click galerie à trier 2020-04-06 14:17:25 +02:00
Fred Tempez 44f861290c [10.0.055] version 2020-04-06 10:30:07 +02:00
Fred Tempez d825de7b6c [10.0.055] Aperçu dans gallery 2020-04-06 10:14:52 +02:00
Fred Tempez 96a8e2993f [10.0.054] conversion des miniatures 2020-04-06 10:05:27 +02:00
Fred Tempez 543c4911da [10.0.053] Création des miniatures pour les galeries existantes WIP 2020-04-06 09:41:02 +02:00
Fred Tempez bf9ba87c37 [10.0.052] RFM éditeur image actif + mise à jour config 2020-04-06 07:14:52 +02:00
Fred Tempez f1e5ae5367 Edition des images d'une galerie, aperçu 2020-04-05 19:00:02 +02:00
Fred Tempez 4111ae6270 Gallery , mettre à jour la couverture import v9 2020-04-05 18:59:17 +02:00
Fred Tempez 77d4fcbdd8 couverture gallery v9 à v10 fix 2020-04-05 18:22:48 +02:00
Fred Tempez ca2b7dda60 Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-04-05 18:05:28 +02:00
Fred Tempez d235f78689 homePicture et miniatures dans la galerie WIP 2020-04-05 18:02:34 +02:00
Fred 3681670b36
Add files via upload 2020-04-05 17:35:50 +02:00
Fred Tempez 232e0312fc Données par défaut galerie v10 2020-04-05 17:23:53 +02:00
Fred Tempez 328fdeef71 Mise à jour image de couverture v9 2020-04-05 17:23:21 +02:00
Fred Tempez eda235904e [10.0.051] Bouton module pour les sous-pages 2020-04-05 16:40:35 +02:00
Fred Tempez 92a0e76625 [10.0.051] activer correctement les miniatures de la galerie L:640 2020-04-05 10:34:51 +02:00
Fred Tempez 213c922664 [10.0.050] Nom des modules en français 2020-04-04 19:15:32 +02:00
Fred Tempez 3b1bf1c777 Merge branch 'dev10_gallery_stock_v2' into dev10 2020-04-04 16:22:07 +02:00
Fred Tempez 6330400c63 Libellés + optimisation 2020-04-04 16:13:03 +02:00
Fred Tempez e11fc3d101 parametre template::table et édition de galerie 2020-04-04 15:58:09 +02:00
Fred Tempez ab8f5b5dca parametre template::table et édition de galerie 2020-04-04 15:56:46 +02:00
Fred Tempez 8b864fe9f9 parametre template::table et édition de galerie 2020-04-04 15:54:19 +02:00
Fred Tempez 869bff6a36 Order -> position 2020-04-04 10:27:14 +02:00
fredtempez b27d3dfaae Texte fenêtre de déconnexion 2020-04-04 00:23:20 +02:00
fredtempez 17985b3514 fix showstyle redondant 2020-04-03 23:53:40 +02:00
fredtempez 27136da82b css manquant 2020-04-03 23:50:35 +02:00
fredtempez c246020a79 [10.0.049] mise à jour gallery v2 dans v10 et non v9227 2020-04-03 18:58:30 +02:00
fredtempez 067b4c56f9 Default data 2020-04-03 18:54:43 +02:00
fredtempez c66f28027b erreur installation default 2020-04-03 18:50:44 +02:00
Fred Tempez 5b440c8700 [10.0.048] bouton moduile dans barre admin 2020-04-03 15:22:44 +02:00
Fred Tempez 1d94e5015f JS vide 2020-04-02 22:57:47 +02:00
Fred Tempez 2053074e0b Adaptation v10 2020-04-02 22:32:46 +02:00
Fred Tempez 779a864761 Merge branch 'gallery_stock_v2' into dev10_gallery_stock_v2 2020-04-02 22:11:37 +02:00
Fred Tempez bb80657c93 Merge branch 'master' into gallery_stock_v2 2020-04-02 21:44:07 +02:00
Fred Tempez 44736d8979 Merge branch 'master' into dev10 2020-04-02 21:41:18 +02:00
Fred Tempez f3926d2832 Merge branch 'master' into gallery_stock_v2 2020-04-02 21:38:56 +02:00
Fred Tempez cc29d14c07 Merge branch 'master' into dev10 2020-04-02 19:09:39 +02:00
Fred Tempez c460cb0bed merge master 2020-04-02 19:05:10 +02:00
Fred Tempez dba71ce796 Merge branch 'master' into gallery_stock_v2 2020-04-02 19:03:59 +02:00
Fred Tempez 5cfea185de Tris dans l'index manquant 2020-04-01 16:40:37 +02:00
Fred Tempez d3b07ddb88 Largeur tableau 2020-04-01 13:47:37 +02:00
Fred Tempez 2c0f96ee05 Gallery 2.0 : formulaire non séparé 2020-04-01 13:43:15 +02:00
Fred Tempez 4b7626ea91 Merge branch 'master' into dev10 2020-03-31 12:49:03 +02:00
Fred Tempez 06c42aa8d6 Merge branch 'master' into gallery_stock_v2 2020-03-31 12:47:23 +02:00
Fred Tempez 1af1553fc6 gitignore 2020-03-31 12:42:36 +02:00
Fred Tempez 2f94b27fc8 Merge branch 'master' into dev10 2020-03-31 10:11:02 +02:00
Fred Tempez 55a2dc887f Merge branch 'master' into gallery_stock_v2 2020-03-30 18:10:45 +02:00
Fred Tempez 1ec6fa2d96 Merge branch 'master' into dev10 2020-03-28 18:15:01 +01:00
Fred Tempez c2d3fccff4 Merge branch 'master' into gallery_stock_v2 2020-03-28 18:14:33 +01:00
Fred Tempez f768d40fd6 Merge branch 'master' into dev10 2020-03-28 17:57:06 +01:00
Fred Tempez a7c4f5cbf3 Merge branch 'master' into gallery_stock_v2 2020-03-28 17:56:13 +01:00
Fred Tempez 538fd38bbb Merge branch 'master' into dev10 2020-03-28 17:37:36 +01:00
Fred Tempez 6c4433b6a1 Merge branch 'master' into gallery_stock_v2 2020-03-28 17:35:25 +01:00
Fred Tempez b1ac2afb2e Merge branch 'master' into gallery_stock_v2 2020-03-28 10:20:29 +01:00
Fred Tempez 79940a7393 Initialisation des champs galerie version inférieure 2020-03-28 10:16:59 +01:00
Fred Tempez c9ba833698 Merge branch 'master' into gallery_stock_v2 2020-03-27 19:09:57 +01:00
Fred Tempez 5d8ad82ad6 Vérification erreur de saisie nom gallerie WIP 2020-03-27 18:58:47 +01:00
Fred Tempez 9d059aa01b Merge branch 'master' into gallery_stock_v2 2020-03-27 15:10:55 +01:00
Fred Tempez e3da2f3dba Gallery v2 init 2020-03-27 15:06:35 +01:00
Fred Tempez 5329511c70 Merge branch 'master' into dev10 2020-03-24 18:25:37 +01:00
Fred Tempez ea7b997551 Merge branch 'master' into dev10 2020-03-24 17:53:52 +01:00
Fred Tempez 932b78650a manque récupération données ajax 2020-03-24 17:48:54 +01:00
Fred Tempez 9ad9672a12 Merge branch 'master' into dev10 2020-03-23 18:05:45 +01:00
Fred Tempez f42f0745ea gallery master 2020-03-23 17:53:43 +01:00
Fred Tempez 89c5b3e535 Merge branch 'master' into dev10 2020-03-23 16:27:36 +01:00
Fred Tempez 6cad85c285 Version 2020-03-23 16:27:32 +01:00
Fred Tempez ee010b9dae Merge branch 'master' into dev10 2020-03-23 10:45:37 +01:00
Fred Tempez c80d42a571 Merge branch 'master' into dev10 2020-03-23 10:39:06 +01:00
Fred Tempez 2fdb566fe1 Merge branch 'master' into dev10 2020-03-22 16:45:43 +01:00
Fred Tempez 6353f3a330 Merge branch 'master' into dev10 2020-03-22 16:09:27 +01:00
Fred Tempez bc1fa8c53f [9.2.26] hover sur les boutons page admin 2020-03-22 16:06:43 +01:00
Fred Tempez 03d7a2db8e Merge branch 'master' into dev10 2020-03-22 15:44:53 +01:00
Fred Tempez 78a602b208 Merge branch 'master' into dev10 2020-03-22 15:34:38 +01:00
Fred Tempez d25a42f07d Merge branch 'master' into dev10 2020-03-21 18:30:26 +01:00
Fred Tempez 797e670c44 Merge branch 'master' into dev10 2020-03-21 18:18:01 +01:00
Fred Tempez 7e6cffd19a Merge branch 'master' into dev10 2020-03-21 18:09:59 +01:00
Fred Tempez 111263ba91 Merge branch 'master' into dev10 2020-03-20 09:12:42 +01:00
Fred Tempez 72c4681512 Merge branch 'master' into dev10 2020-03-19 12:18:57 +01:00
Fred Tempez f0b82ce262 Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-03-19 11:14:54 +01:00
Fred Tempez 9e618dc123 Installation par défaut 2020-03-19 11:13:39 +01:00
Fred Tempez 031df8993d Installation par défaut 2020-03-19 11:12:59 +01:00
Fred Tempez f8a3a365b6 Merge branch 'master' into dev10 2020-03-16 18:55:58 +01:00
Fred Tempez 375a98e957 Merge branch 'master' into dev10 2020-03-16 16:24:49 +01:00
Fred Tempez 0ed05e545f Merge branch 'master' into dev10 2020-03-16 15:29:13 +01:00
Fred Tempez dc55de352b Merge branch 'master' into dev10 2020-03-16 10:40:40 +01:00
Fred Tempez d8eb134eba Merge branch 'master' into dev10 2020-03-16 10:21:27 +01:00
Fred Tempez b015d2894f Double déclaration news css 2020-03-15 17:53:56 +01:00
Fred Tempez b443b22456 Merge branch 'master' into dev10 2020-03-15 17:48:06 +01:00
Fred Tempez 7b654184c1 Merge branch 'master' into dev10 2020-03-15 17:33:13 +01:00
Fred Tempez 0caaa2c10e Merge branch 'master' into dev10 2020-03-15 17:11:07 +01:00
Fred Tempez 257f836d4f Merge branch 'master' into dev10 2020-03-15 17:06:24 +01:00
fredtempez d7ea320daa merge master 2020-03-15 08:49:22 +01:00
Fred Tempez 321115bdc1 Merge branch 'master' into dev10 2020-03-14 10:32:40 +01:00
Fred Tempez 91f998a602 Merge branch 'master' into dev10 2020-03-14 10:14:25 +01:00
fredtempez 6894c73f21 merge master 2020-03-12 19:28:10 +01:00
Fred Tempez 2bf6880060 Css module de news 2020-03-12 14:54:53 +01:00
Fred Tempez 41c0e7e77e [10.0.043] version 2020-03-12 11:08:43 +01:00
Fred Tempez 589fe23b5c [10.0.043] SLB gallery 2020-03-12 11:06:41 +01:00
fredtempez 88b2948057 10.0.042 2020-03-12 10:15:26 +01:00
Fred Tempez e5a128bdb5 Merge branch 'master' into dev10 2020-03-12 09:35:37 +01:00
Fred Tempez 516946a608 Merge branch 'master' into dev10 2020-03-12 09:14:06 +01:00
Fred Tempez 559157ecc6 Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-03-12 08:52:13 +01:00
Fred Tempez d870722c3a Merge branch 'master' into dev10 2020-03-12 08:51:23 +01:00
fredtempez a1b19d0032 merge master 2020-03-11 21:44:37 +01:00
fredtempez d48c6f776c Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-03-11 19:00:25 +01:00
fredtempez 2229a11db7 [10.0.142] Tinymce insertion de code + coloration 2020-03-11 19:00:13 +01:00
fredtempez a15f1ce1c8 [10.0.042] fix 2020-03-11 18:59:35 +01:00
Fred Tempez 74cb38d69c Merge branch 'master' into dev10 2020-03-10 09:59:44 +01:00
Fred Tempez 02f319eeda Merge branch 'master' into dev10 2020-03-09 17:07:14 +01:00
Fred Tempez 91ddf5a0f3 Merge branch 'master' into dev10 2020-03-06 21:32:36 +01:00
Fred Tempez daefeaf3a9 changes 2020-03-06 21:31:58 +01:00
Fred Tempez 1392b371f6 Merge branch 'master' into dev10 2020-03-06 21:31:17 +01:00
Fred Tempez 0f683c6061 Merge branch 'master' into dev10 2020-03-06 21:21:05 +01:00
Fred Tempez ba05ecd74a 10.0.041.rc 2020-03-06 21:20:54 +01:00
Fred Tempez 8797c166c6 Erreur defaultdata 2020-03-05 11:47:26 +01:00
Fred Tempez 4c399ecfe8 Merge branch 'master' into dev10 2020-03-05 11:46:56 +01:00
Fred Tempez 64f581ab7d Merge branch 'master' into dev10 2020-03-03 08:50:36 +01:00
Fred Tempez 66e46bec66 Erreur de nom de variable 2020-03-02 13:32:14 +01:00
Fred Tempez 1d93f10602 appels à Savedata() supprimés 2020-03-02 13:14:19 +01:00
Fred Tempez f6b607248c Merge branch 'master' into dev10 2020-03-02 13:11:16 +01:00
Fred Tempez f770c0d9e2 Merge branch 'master' into dev10 2020-03-02 11:52:52 +01:00
Fred Tempez 2e57893e08 Merge master 2020-03-02 11:38:50 +01:00
Fred Tempez c1f6f60c06 Merge branch 'master' into dev10 2020-03-02 10:35:48 +01:00
fredtempez f9e616aec1 Merge master 2020-03-01 19:01:15 +01:00
Fred Tempez 1ba2d9dec6 Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-03-01 18:57:48 +01:00
Fred Tempez c27d02d3c9 Icone dark 2020-03-01 18:57:40 +01:00
Fred 2769cc848d
Delete faviconDark.ico 2020-03-01 18:55:31 +01:00
fredtempez cd11cf45f5 Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-03-01 18:11:23 +01:00
fredtempez 0d836021a5 [10.0.040.dev] favicone 2020-03-01 18:11:04 +01:00
Fred c9ce1678d0
Add files via upload 2020-03-01 18:08:27 +01:00
fredtempez 36afbfcdc0 Modification config 2020-03-01 17:36:54 +01:00
fredtempez bdcc2dceb6 Modification config 2020-03-01 17:31:15 +01:00
fredtempez f79cd70b4a Libellés modifiées dans config 2020-03-01 17:18:59 +01:00
fredtempez 8c7efe9aa8 Merge master 9.2.23 2020-03-01 16:49:07 +01:00
fredtempez e602d4df4c Merge master 9.2.23 2020-03-01 16:45:41 +01:00
fredtempez 29ef1d5e68 Merge master 9.2.23 2020-03-01 16:43:09 +01:00
fredtempez 575e5f03a1 Merge master 9.2.23 2020-03-01 16:39:57 +01:00
Fred Tempez 953f9f06de fix reply to email 2020-02-28 14:58:50 +01:00
Fred Tempez a49b3d0ef1 Merge branch 'master' into dev10 2020-02-28 14:27:56 +01:00
fredtempez d550401eba merge master 9.2.23 2020-02-27 16:03:26 +01:00
fredtempez 77851208d9 Merge master 9.2.23 2020-02-27 15:54:57 +01:00
fredtempez be0e7cd729 Merge branch 'master' into dev10 2020-02-23 17:51:34 +01:00
fredtempez 70714be2ff [10.0.037.dev] canal de mise à jour 2020-02-23 17:44:44 +01:00
fredtempez 6df8a83677 Merge branch 'master' into dev10 2020-02-23 17:35:07 +01:00
Fred Tempez c0a6832074 Merge branch 'master' into dev10 2020-02-20 20:54:09 +01:00
Fred Tempez 5827e7a916 Merge branch 'master' into dev10 2020-02-20 14:30:44 +01:00
Fred Tempez 09f355f57e Merge branch 'master' into dev10 2020-02-20 11:30:48 +01:00
Fred Tempez 8bc15e54f3 [10.0.036.dev] fix aperçu des polices 2020-02-18 15:28:33 +01:00
Fred Tempez 0d15efd316 Merge branch 'master' into dev10 2020-02-18 15:22:48 +01:00
Fred Tempez 26063d9b4b [10.0.036.dev] version aperçu police dans select 2020-02-18 15:11:10 +01:00
Fred Tempez 7b67951714 [10.0.036.dev] Aperçu des polices dans les sélecteurs 2020-02-18 15:07:57 +01:00
Fred Tempez 61e22d4831 [10.0.035.dev] Auto update ; génère un backup de data 2020-02-18 11:18:27 +01:00
Fred Tempez 9b9353adbb [10.0.034.dev] annulation dernier commit 2020-02-18 11:05:42 +01:00
Fred Tempez 6be6a39a1a [10.0.034.dev] canal de mise à jour WIP 2020-02-17 18:20:44 +01:00
Fred Tempez eff8baf506 [10.0.033.dev] compatbilité v9 saveData dummy 2020-02-17 18:10:04 +01:00
fredtempez 87e9cdf546 Merge master 9.2.21 2020-02-14 10:49:24 +01:00
Fred Tempez c556552bf0 Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-02-13 11:12:20 +01:00
Fred Tempez d02fd09b6c Merge master 2020-02-13 11:11:35 +01:00
Fred Tempez 91007c9515 Merge branch 'master' into dev10 2020-02-13 11:10:18 +01:00
fredtempez 92542e8085 merge master 2020-02-11 20:12:51 +01:00
Fred Tempez 8f8221c9e0 merge master 9.2.20 2020-02-11 11:08:04 +01:00
Fred Tempez 1a5428c671 Merge branch 'master' into dev10 2020-02-11 11:07:08 +01:00
Fred Tempez 84c35abdbe [10.0.030.dev] restore backup ajustements 2020-02-10 17:04:25 +01:00
Fred Tempez 90946cf9f1 [10.0.030.dev] correction CSS + modification config / restore and backup 2020-02-10 16:36:57 +01:00
Fred Tempez 72c2ac151c Merge branch 'master' into dev10 2020-02-10 13:33:14 +01:00
Prof Langues 1032877b50 [10.0.029.dev] suppression de warning lors d el'installation - faviconDark 2020-02-07 09:11:22 +01:00
Fred Tempez e5a0fa0066 [10.0.028.dev] vocabulaire 2020-02-06 21:11:31 +01:00
Fred Tempez d42cc357fd [10.0.028.dev] Backup revu et corrigé, reste option dossier data inclus ou pas 2020-02-06 21:04:56 +01:00
Fred Tempez ca1e2ba5cb [10.0.027.dev] erreur de validation backup restaure 2020-02-06 19:18:01 +01:00
Fred Tempez 4e5f2e015c [10.0.026] Correction dasn config 2020-02-05 18:12:45 +01:00
Fred Tempez 966c2e5172 Merge branch 'master' into dev10 2020-02-05 17:58:03 +01:00
Fred Tempez 3b3c6b5cdd Merge branch 'master' into dev10 2020-02-05 17:16:18 +01:00
Fred Tempez a3735b6223 Merge branch 'master' into dev10 2020-02-05 17:14:05 +01:00
Fred Tempez 464460c8cf Merge branch 'master' into dev10 2020-02-05 16:53:04 +01:00
Fred Tempez 505db421ba Merge branch 'master' into dev10 2020-02-05 15:33:55 +01:00
Fred Tempez 89ba90e741 Merge branch 'master' into dev10 2020-02-04 16:53:17 +01:00
Fred Tempez 6c283cebad Merge branch 'master' into dev10 2020-02-04 13:23:24 +01:00
Fred Tempez d5f15d97a9 Merge branch 'master' into dev10 2020-02-04 10:22:42 +01:00
Fred Tempez 2be54777ff Merge master 2020-02-03 13:03:40 +01:00
Fred Tempez 5938c769db Merge branch 'master' into dev10 2020-02-02 19:18:40 +01:00
Fred Tempez fde0a2d0a1 Merge branch 'master' into dev10 2020-02-02 19:15:35 +01:00
fredtempez 5c24951ac5 Merge branch 'master' into dev10 2020-02-02 12:10:51 +01:00
fredtempez c645dbe79c Merge branch 'master' into dev10 2020-02-02 12:03:26 +01:00
fredtempez 88e3ccbd4c Merge branch 'master' into dev10 2020-02-02 11:44:04 +01:00
fredtempez 17051b35d1 Merge master 2020-02-01 20:52:49 +01:00
Prof Langues c6a9fa9f28 Merge branch 'master' into dev10 2020-01-31 11:27:44 +01:00
Fred Tempez 64fd367086 Dates de version 2020-01-21 08:53:30 +01:00
Fred Tempez 8e691e1231 [10.0.025.dev] petites corrections 2020-01-21 08:52:42 +01:00
Fred Tempez 5c752c993e [10.0.025.dev] Erreurs de déclaration 2020-01-21 08:42:21 +01:00
fredtempez 810772d623 Merge branch 'master' into dev10 2020-01-08 18:00:19 +01:00
fredtempez 5cd2d71ea3 [10.0.024.dev] lazy loading 2020-01-07 10:15:16 +01:00
fredtempez a06218bdaf Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2020-01-02 19:35:19 +01:00
fredtempez e679ebf1a3 [10.0.023.dev] Favicon switcher 2020-01-02 19:30:23 +01:00
Fred 260b9e13f0
Add files via upload 2020-01-02 18:18:06 +01:00
fredtempez 50aeb22034 merge master 2020-01-01 18:29:09 +01:00
fredtempez 06fbc269d2 [10.0.022] chargement paresseux des images 2020-01-01 18:23:23 +01:00
fredtempez 912d0e9bef [10.0.021.dev] Supprimer des commentaires 2019-12-25 11:17:22 +01:00
fredtempez 7183d0158f [10.0.021.dev] Conversion baseURL ok 2019-12-25 11:09:08 +01:00
fredtempez f19094ba48 TEST convert URL 2019-12-23 20:58:30 +01:00
fredtempez 5b19187df4 changes 2019-12-23 20:51:02 +01:00
Fred 679ba8b517
[10.0.020] Test 2019-12-23 10:49:57 +01:00
fredtempez 7eb5f82c67 [10.0.020.dev] function update url WIP 2019-12-22 19:10:16 +01:00
fredtempez a66f710c75 Validation 2019-12-22 18:51:47 +01:00
fredtempez d808c316d1 empty line 2019-12-22 18:51:06 +01:00
fredtempez 04b1d8ebcc Merge master 9.2.16 2019-12-22 18:33:58 +01:00
Fred Tempez 6a55c99291 [10.0.019.dev] présentation écran backup restore 2019-12-17 16:19:00 +01:00
Fred Tempez 0eacd56612 [10.0.018.dev] préserver comptes import 2019-12-17 16:04:40 +01:00
Fred Tempez f70d77a25e [10.0.017.dev] importation revue 2019-12-17 10:34:34 +01:00
Fred Tempez 591f74543a Supprimer recursiveDirectoryIterator de config.php 2019-12-17 09:39:12 +01:00
Fred Tempez 0c23b2024c [10.0.016.dev] optimisation fonction de conversion baseUrl 2019-12-17 09:23:38 +01:00
Fred Tempez 0a42877ecf merge master changes 2019-12-17 08:14:51 +01:00
Fred Tempez 89c4c7b3aa Nettoyage notranslate 2019-12-16 17:26:53 +01:00
Fred Tempez fe5302be14 Fonction backup modifiée 2019-12-16 17:14:20 +01:00
Fred Tempez e87172682c (10.0.015.dev] 2019-12-16 14:09:46 +01:00
Fred Tempez 6144253853 [10.0.014.dev] backup nouvelle fonction 2019-12-16 13:16:13 +01:00
Fred Tempez 5419b3fa51 indentation 2019-12-16 12:23:25 +01:00
fredtempez c307b5ad93 [10.0.013.dev] Déplacement jsondb 2019-12-15 11:30:04 +01:00
fredtempez 4b1a477320 [10.0.113.dev] sécurité dossier data + classes déplacées 2019-12-15 11:14:37 +01:00
fredtempez 6bb842c6a5 [10.0.013.dev] Classes externalisées 2019-12-15 10:47:18 +01:00
fredtempez 0ec33ae02c [10.0.012.dev] favicon et bannière livrés dans linstallation par défaut 2019-12-14 15:04:22 +01:00
fredtempez ad4397351c Merge branch 'dev10' of https://github.com/fredtempez/ZwiiCMS into dev10 2019-12-14 13:28:08 +01:00
fredtempez 37e2526dd7 [10.0.009.dev] Homepage non sauvegardée 2019-12-14 13:26:19 +01:00
fredtempez d98e0c67da [10.0.008.dev] fix couleur fond menu + banniere pans install 2019-12-14 13:24:13 +01:00
fredtempez 59c79f71cd [10.0.011.dev] supprimer update v8 2019-12-11 22:53:11 +01:00
fredtempez 623355c555 Libellés 2019-12-11 22:46:07 +01:00
fredtempez ab26ff2cec (10.0.010.dev] version 2019-12-11 22:42:35 +01:00
fredtempez 933fd1be52 [10.0.010.dev] Libellés + sélection homepageId 2019-12-11 22:42:05 +01:00
fredtempez f51c04b355 [10.0.009.dev] éviter les erreurs de stockage des v9 2019-12-11 21:56:18 +01:00
fredtempez ec2be096ec [10.0.008.dev] notification d'import 2019-12-11 20:38:27 +01:00
fredtempez 0c1273e69a changes 2019-12-11 17:06:53 +01:00
fredtempez 8553d91f46 [10.0.007.dev] correction du titre dans le menu réduit 2019-12-11 16:14:47 +01:00
fredtempez 961a1d65b3 [10.0.007.dev) Désactiver une sauvegarde des données forcée 2019-12-11 11:59:10 +01:00
fredtempez b7c561f461 [10.0.006.dev] 2019-12-10 21:30:31 +01:00
fredtempez f0f161d50f [10.0.005.dev] fonction update 2019-12-10 21:20:04 +01:00
fredtempez 39cf6dc24b Merge branch 'master' into dev10 2019-12-10 18:27:30 +01:00
fredtempez 1bcb142d1f Changes 2019-12-10 18:17:00 +01:00
fredtempez a004ec2396 changes 2019-12-10 18:14:47 +01:00
fredtempez adf2de3ee9 Changes 2019-12-10 18:13:08 +01:00
fredtempez 791a7e649d [10.0.004.dev] Merge branch 'master' into dev10 2019-12-10 17:39:36 +01:00
Fred Tempez 26e219af00 [10.0.003.dev] gestion de l'update 2019-12-10 16:00:08 +01:00
Fred Tempez 7f2f2a4b56 [10.0.003.dev] Procédure d'update 2019-12-10 15:55:29 +01:00
Fred Tempez ceac534fb7 Merge branch 'master' into dev10 2019-12-10 15:40:23 +01:00
Fred Tempez 524226bd3b [10.0.002.dev] merge theme manager 2019-12-10 14:26:59 +01:00
Fred Tempez 98153c269f [10.0.002.dev] merge theme manager 2019-12-10 14:26:16 +01:00
Fred Tempez 31b1561750 [10.0.001.dev] Intégration gestion données manque l'import 2019-12-10 10:53:31 +01:00
Fred Tempez 72a37677c1 Changes 2019-12-10 08:32:18 +01:00
Fred Tempez 4959a3ea6c Merge branch 'master' into dev10 2019-12-10 08:31:30 +01:00
Fred Tempez f4a706efae [10] Version 2019-12-10 08:29:22 +01:00
Fred Tempez 65ac9e291b [10.0.000.dev] version 2019-12-10 08:28:47 +01:00
594 changed files with 19148 additions and 18308 deletions

15
.gitignore vendored Normal file → Executable file
View File

@ -1,6 +1,7 @@
# Fichiers temporaires
site/tmp/*.zip
site/tmp/*.gz
site/tmp/*.png
# Sauvegardes
site/backup/*
@ -12,8 +13,8 @@ site/data/fr/*.json
# Fichiers uploadés
site/file/source/*
site/file/thumb/*
site/file/source/
site/file/thumb/
# Dossiers vides dans GitHub
!.gitkeep
@ -31,3 +32,13 @@ site/data/head.inc.html
sitemap.xml.gz
sitemap.xml
robots.txt
site/data/journal.log
.DS_Store
site/.DS_Store
site/file/.DS_Store
site/tmp/5f7f5e998762c.png
site/tmp/5f7f5e9987628.png
site/tmp/5f7f5ea3e983b.png
site/tmp/5f7f5ea3e9837.png
site/tmp/5f7f5ea20d5eb.png
site/tmp/5f7f5ea20d5ee.png

0
.htaccess Normal file → Executable file
View File

View File

@ -1,11 +1,289 @@
# Changelog
## Version 10.3.12
Correction :
- Impossibilité de lister les commentaires des articles de blog dans la fenêtre de gestion.
## Version 10.3.11
Modification :
- Message sur l'utilisation des cookies
Correction :
- Recherche inopérante dans les articles des blogs.
## Version 10.3.10
Corrections :
- Conflit page inactive et droit d'un membre.
- Module de recherche, correction dans les pages enfants.
- Module formulaire, perte des données en cas d'édition du fomulaire ou des champs.
Modification :
- TinyMCE nettoyage init.js d'options non supportées.
## Version 10.3.09
Corrections :
- Configuration : persistance de l'ouverture des blocs.
- Réinitialisation du mot de passe :
- Remise à zéro du timer après renouvellement du mot de passe.
- Affichage de le fenêtre "Nouveau mot de passe" allégée.
- Redirection sur la page d'accueil.
- Modules news et blog : transparence icône RSS.
- Position de l'écran de configuration
## Version 10.3.08
Corrections :
- Notification de mise à jour d'update bloqué
- Backup : double commentaire entraînant un bug d'affichage
## Version 10.3.07
- Petites corrections
- Bouton format dans TinyMCE
## version 10.3.06
- Correction :
- Edition de page avec module, le changement de mise en page désactive le bouton d'option du module.
- Modification :
- Modules News et Blog : ajout de l'option flux RSS. L'option est activée par défaut.
## version 10.3.05
- Correction :
- Thème : import d'un thème d'administration impossible.
## version 10.3.04
- Corrections :
- Warning lors d'une primo installation.
- Position des entrées de menu sur les écrans de smartphone.
- Thème : import d'un thème, d'administration impossible.
- Thème : import d'un thème, nettoyage du dossier tmp.
- Thème administration : modification de l'appel du code CSS permettant une mise à jour du thème sans vider le cache.
- Thème du menu : alignement inopérant ; arrière-plan semi-transparent non uniforme.
- Supprime les warning lors d'une primo installation.
- Inversion des icônes + et - dans la configuration
- Améliorations :
- Thème menu : couleurs du sous-menu.
- Mise en page du corps des mails de notification.
- Paramètres de localisation.
- Maintenance terminée, redirection vers l'accueil.
- Marge haute dans les vues en mode light.
- Modifications :
- Changement de noms de classe :
- navLevel1 devient navMain
- navLevel2 devient navSub
- Mise à jour :
- TinyMCE 4.9.11
## version 10.3.03
- Correction :
- Localisation, affichage des accents, LC_TIME devient LC_ALL
- Modifications :
- Configuration des captchas. Addition simple de 0 à 9.
- Une icône remplace le lien Connexion dans le menu et dans le pied de page.
- Barre de membre déplacée à droite de la barre de menu.
## version 10.3.02
- Correction :
- Icône de pied de page github manquante.
- Modifications :
- Nouvelles images de captcha.
- Option de configuration, captcha demandé à la connexion.
- Méthode d'encodage UTF8.
## version 10.3.01
- Corrections :
- Configuration du site :
- Filtrage des pages affichées dans la configuration et initialisation après une mise à jour.
- Pages de recherche et des mentions vides, modification de la valeur en l'absence de choix.
- Libellés des pages d'erreur non sélectionnées "Page par défaut"
- Erreur de position du menu fixe en haut de page des membres simples et dans après une déconnexion automatique
- Modifications :
- Thème : import d'une archive de thème, vérification de la cohérence du contenu avant son installation.
- Configuration : suppression du bloc des versions, affichage de la version de ZwiiCMS dans le bloc Informations générales.
## version 10.3.00
- Corrections :
- Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom.
- Login : l'option "Se souvenir de moi" est fonctionnelle.
- Menu : déplacement de la classe "active".
- Le titre dans la configuration du module non affiché si le titre de la page est masqué.
- Masque de saisie : formulaire validé malgré la présence d'une notice d'erreur
- Classe jsonDb, suppression de la réinitialisation de la structure de données en cas d'absence du fichier.
- Modifications :
- Noyau :
- Mise en cache des données des modules.
- Module recherche :
- La recherche dans le site devient un module externe plutôt qu'un module interne ;
- Diverses corrections optimisations permettant une recherche à l'aide de plusieurs mot-clés.
- Module galerie :
- Les données du thème de galerie sont désormais stockées de manière unique, un seul thème par site pour toutes les galeries d'un même site.
- Configuration du site :
- Pages 403 (accès interdit), 404 (page introuvable) et site en maintenance personnalisables
- Sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur ; le nom de l'archive prend le nom du sous-domaine s'il existe.
- Captcha : addition présentée en lettres sous la forme d'images, réponse en chiffres ; correction du nom de la fonction (capcha en captcha).
- Page :
- Duplication d'une page.
- Mise à jour :
- Script favicon-switcher 1.2.2
## version 10.2.09
- Correction :
- Sécurisation de la fonction d'enregistrement des données.
## version 10.2.08
- Correction :
- Bug pageId, régression corrigée.
## version 10.2.07
- Correction :
- Défaut de chargement de flatpickr dans le module formulaire qui passe en version 2.4
## version 10.2.06
- Corrections :
- Anticipation de la dépréciation de l'option de cookie samesite=none.
- Warning : absence de fichier map dans le thème TinyMCE lightgray.
## version 10.2.05
- Correction :
- Champ date non affiché sous Chrome.
## version 10.2.04
- Mise à jour :
- Flatpickr 4.6.3
- Correction :
- Connexion avec un compte inexistant, notification incorrecte.
- Modifications :
- Position de l'icône d'ouverture et de fermeture des blocs.
- Thème administration, bouton standard couleur du texte au survol.
## version 10.2.03
- Corrections :
- Les entrées de menu disposent d'une classe par groupe de parent en lieu et place des ids.
- Edition du compte de l'utilisateur, empêcher le préremplissage de l'ancien mot de passe.
- Reformulation du mail de confirmation d'inscription.
- Champ de sélection de fichiers, suppression de la couleur des URL lors d'un survol
- Modifications :
- Sécurisation des deux cookies d'authentification (options httpOnly et secure).
- La couleur du texte des headers avec un lien est celle des titres et non des liens.
## version 10.2.02
- Corrections :
- Problème d'affichage du gestionnaire de fichier sous Safari.
- Configuration, favicon impossibles à sélectionner.
## version 10.2.01
- Corrections :
- Optimisation et correction de l'algorithme de contrôle d'accès.
- Erreur des noms de champ barre des membres dans le pied de page.
- Génération de l'image tag, amélioration du code et du message d'erreur.
- Edition de page, erreur lors de la sélection d'une icône de menu.
- Problème lors de l'installation, impossibilité d'obtenir l'écran de configuration.
## version 10.2.00
- Mise à jour :
- jQuery v3.5.1
- Nouveautés :
- Gestion des accès concurrents :
- deux utilisateurs ne peuvent accèder en modification à la même page du site ou de configuration
- la connexion d'un utilisateur sur un autre poste ou navigateur déconnecte la session précédente.
- sécurisation du login
- journalisation de l'utilisation du site
- Ecran de configuration et d'édition des pages, les blocs sont pliables et dépliables afin d'alléger l'occupation sur l'écran. Le statut des blocs (fermés ; ouverts) est persistante au cours de la session.
- Modifications :
- Thème, les sélecteurs de couleur affiche la valeur RGBa d'une couleur différente de celle de la sélection.
- Thème de l'administration, amélioration du rendu.
- Image tag : adaptations suite à la modification de l'API Google.
- Installation automatique d'une mise à jour en ligne : un nouvelle option de configuration permet de conserver
le fichier htaccess afin de préserver les modifications nécessaires à certains hébergeurs.
- Suppression de la barre de membre (membres simples) et déport des options dans le menu.
- Module Blog 2.02 : homogénéisation des interfaces.
- Module Gallery 2.26 : largeur proportionnelle des images.
- Corrections :
- Configuration, favicon clair et sombre : le bouton d'effacement initialise les deux champs.
- Amélioration de l'adaptation aux thèmes sombres.
- Erreur bouton Retour lors de l'édition du compte par un membre simple ou un éditeur.
## version 10.1.04
- Correction :
- Warning après modification du thème du site.
## version 10.1.03
- Mise à jour :
- Responsive File Manager : chargement impossible de certaines images JPEG.
## version 10.1.02
- Corrections :
- free.fr : désactivation totale de la fonction de récupération de données en ligne (update, image tag, etc..)
- Image Tag absente : non régénérée au lancement de la configuration du site, image masquée dans si absente.
## version 10.1.01
- Correction :
- Extension image tag.
## version 10.1.00
- Nouveautés :
- Distinction entre le thème du site et celui de l'administration. Sauvegarde et restauration de l'un ou de l'autre.
- Thème du site :
- Amélioration de l'aperçu du thème du site et de body.
- Couleur de l'encadrement et la bordure des blocs.
- Couleur du texte de la page active
- Menu : les entrées de menu disposent d'un id afin de faciliter la personnalisation CSS
- Corrections :
- Configuration SMTP : sur-cryptage du mot de passe.
- Warning dans la génération du sitemap en l'absence d'article.
- Quelques corrections liées à l'hébergeur Free.
- Configuration: sauvegarde automatique non enregistrée.
- Warning lors de la création du dossier thème
- Modifications :
- Optimisation des opérations de disque, mise en cache en lecture des données de pages. Aucun cache en écriture.
- Compatibilité des URL avec Microsoft IIS (c)
- Mise à jour :
- TinyMCE 4.9.10
## version 10.0.092
- Nouveautés :
- Compatibilité avec l'hébergeur free.fr
- Configuration :
- Options de réglage d'un serveur SMTP pour l'envoi des emails.
- Édition des scripts pour head et body dans une fenêtre dédiée.
- Thème :
- Thème des boutons des pages d'administration.
- Modification :
- Masque de configuration : changement de libellés.
- Scripts externes:
- Suppression du script fullPage.js
- Ajout de l'extension SMTP de PHPMailer
## version 10.0.091
- Mises à jour :
- SimpleLightBox v2.1.4
- TinyMCE v4.9.9
- PHPMailer 6.1.5
- Améliorations :
- Architecture de stockage des données.
- Les données sont désormais stockées dans des fichiers distincts (core, config, theme, user, page et module).
- Les données relatives aux pages et aux modules sont stockées dans un dossier localisé fr par défaut en préaration de la version multilangues.
- Gestion des données :
- Le système ne conserve plus en mémoire l'intégralité des données de site comme dans les versions précédentes.
- Les données du site sont chargées à la demande au lieu d'être lues dans leur intégralité.
- Les mises à jour et effacements sont appliquées en direct sur le disque.
- Modifications :
- Module gallery optimisé, tri dynamique, choix du thème.
- Module blog présentation optimisée avec options de position de l'image, la métadescription est le contenu de l'article.
- Chargement paresseux des images.
- Edition de page : suppression de l'option d'ouverture dans une lity.
- Protection des données des modules en cas de changement lors de l'édition d'une page.
Corrections de bug :
- Mise à jour automatique : procédure modifiée, désactivée si allow_url_fopen = off sur le serveur
## version 9.2.28
- Corrections :
- Mise à jour auto fonctionnelle
- Décalage du thème hors de l'écran
## version 9.2.27
- Corrections :
- Pages d'administration, thème spécifique
- Thème inactif lorsque la réécriture est activée.
- Couleur du texte des boutons gris dans l'interface d'administration.
- TinyMCE :
- TinyMCE :
- La taille de la police et la couleur sont celles définies dans le thème du site.
- Zone d'édition, padding de 5 px à gauche et à droite.
- Barre, sélecteur de page : couleur et taille fixe de la police.
@ -18,43 +296,43 @@
- TinymCE : Menu sticky + options de barre d'outils
## version 9.2.25
- Corrections :
- Corrections :
- Décalage du site dans SimpleLightbox.
- Zindex du pied de page en position fixe, sous la barre de consentement aux cookies.
- Modifications :
- Modifications :
- Désactivation de l'application du thème dans les pages d'administration. Création d'un aperçu dans Thème Site.
- Optimisation configuration simpleLightBox.
- Syntaxe colorée dans TinyMCE Codemirror.
- Configuration barre d'outils et menu.
- Module news : déplacement des styles dans common.css. Couleur de police de la signature dans custom.css-
- Module news : déplacement des styles dans common.css. Couleur de police de la signature dans custom.css-
## version 9.2.24
- Corrections :
- Corrections :
- Mauvaise configuration de SimpleLightBox
- Thème : marges du menu en position en-dehors du site
## version 9.2.23
- Nouveautés :
- Nouveautés :
- Configuration du réseau : proxy http ou tcp sans authentification.
- Menu burger remplacé pour une croix quand ouvert.
- Corrections :
- Corrections :
- Fonction magic_quotes dépréciée supprimée.
- Mise à jour en ligne :
- problème lors du stockage de décompte de la date de dernière vérification.
- réinitialisation du décompte de vérification lors de l'activation de l'option.
- Thème, Menu :
- Thème, Menu :
- Problème avec le menu fixe en-dehors du site et la barre d'outils de TinyMCE sous le menu. Solution, en édition de page l'option de menu fixe est temporairement désactivée.
- Alignement avec le contenu du menu dans le site incorrecte.
- Disparition de la position et de l'alignement du menu.
- Modifications :
- Modifications :
- TinyMCE : libellé des fonctions "Afficher dans"
- TinyMCE : nouvelle organisation de la barre d'outils.
- Module Form : option permettant d'ajouter le premier mail dans le formulaire au message de notification (Reply To) afin de répondre directement au message.
- Configuration du site :
- Configuration du site :
- bouton affichant le numéro de la version en ligne.
- uniformisation de la position des champs de saisie.
- Galerie : position du champ de tri des images.
- Mise à jour :
- Galerie : position du champ de tri des images.
- Mise à jour :
- SimpleLightBox passe en version 2.1.2
## version 9.2.22
@ -62,9 +340,9 @@
- Aperçu de la police dans les sélecteurs.
- Gestion du canal de mise à jour selon la version installée
- Module Blog : position des boutons d'édition de l'article au-dessus des commentaires.
- Module Gallery :
- Module Gallery :
- choix de la vignette d'album
- Ordres de tri des images d'une galerie, ascendant, descendant ou sans
- Ordres de tri des images d'une galerie, ascendant, descendant ou sans
- Tri, ordre naturel de la galerie et des images de la galerie
- Mises à jour :
- Configurations Code Mirror pour TinyMCE et standalone
@ -72,11 +350,11 @@
## version 9.2.21
- Correction :
- Footer / Texte personnalisé : suppression des sauts de ligne et de paragraphe.
- Modification :
- Modification :
- Thème / Body, couleurs de l'icône retour en haut de page perso personnalisables.
## version 9.2.20
- Corrections :
- Corrections :
- Footer / Texte personnalisé : problème d'alignement des colonnes
- Variable non déclarée dans main.php provoquant un warning
@ -89,7 +367,7 @@
- Corrections :
- Conformité balise p dans span (footer).
- Petites corrections.
- Modifications :
- Modifications :
- Installation par défaut : livraison d'une page de mentions légales.
- Image du fond (body), options responsive cover et contain.
- Réseaux sociaux, icône Youtube chaîne ou utilisateur.
@ -105,7 +383,7 @@
- Sauvegarde manuelle des données de site (dossiers file et data).
- Modification :
- Stocke la réécriture d'url dans baseUrl en cas de changement d'arborescence lors d'un transfert de site.
- Correction :
- Correction :
- Problème lors de la mise à jour de la variable dataVersion.
## version 9.2.15
@ -113,7 +391,7 @@
- Sauvegarde des données de site.
- Couleur du titre de site dans le menu réduit.
- L'effet de couleur de fond personnalisé d'une page sélectionnée dans le menu est limité aux pages parents.
- Améliorations :
- Améliorations :
- Affichage du contenu seul d'une page du site dans une popup Lity sans menu, bannière et pied de page.
- Editeur de texte ; effet accordéon, les accordéons peuvent être tous refermés.
- Thème ; menu : lorsque le menu est réduit, le titre du site peut être inséré à la gauche du menu burger.
@ -122,25 +400,25 @@
- Mise à jour :
- Script d'upload du gestionnaire de fichiers
- Modifications :
- Thème : optimisation des masques de saisie pour le site en largeur 750px.
- Corrections :
- Thème : gestion d'erreur lors de l'import d'un thème issu d'une version inférieure.
- Thème : optimisation des masques de saisie pour le site en largeur 750px.
- Corrections :
- Thème : gestion d'erreur lors de l'import d'un thème issu d'une version inférieure.
## version 9.2.13
- Corrections :
- Gestionnaire de fichiers, modifications des paramètres des miniatures.
- Filtrage du nom des pages dans la fenêtre d'édition des pages.
- Format de date dans le module Blog
- Module Form :
- Module Form :
- correction des options de champ pour le type étiquette
- Modifications :
- Modifications :
- Suppression d'options inutiles dans l'édition d'une page de type de barre latérale.
- Module Form :
- édition : champs doptions condensés
- édition : ordre des champs dans le sélecteur
- Module Form :
- édition : champs doptions condensés
- édition : ordre des champs dans le sélecteur
## version 9.2.12
- Modifications
- Modifications
- TinyMCE :
- Ajout d'un template effet accordéon.
- Supprimer le filtrage des éléments.
@ -154,30 +432,30 @@
- Effet bord arrondi, page sélectionnée
## version 9.2.11
- Corrections :
- Corrections :
- Marge du pied de page par défaut 5px
- Installation sans site exemple : suppression des barres latérales
- Edition de page :
- Edition de page :
- Affichage de l'option Fil d'ariane alors que le titre est masqué.
- Page parente, l'option "ne pas afficher les pages enfants dans le menu horizontal" est incompatible avec une page désactivée : désactivation et masquage lorsque la page est désactivée.
- Mauvais encodage des titres de pages perturbant l'affichage des caractères spéciaux ( ex: apostrophes ).
- Modifications :
- Modifications :
- Recherche d'une mise à jour en ligne, s'effectue une fois par jour et devient optionnelle.
- Amélioration de l'écran d'édition des pages.
- iframe responsive
## version 9.2.10
- Modifications préparatoires à la version 10 :
- Modifications préparatoires à la version 10 :
- Lors de l'installation, stockage de l'url de base dans l'éventualité de la restauration d'un backup et de son installation dans une autre arborescence.
- Modification des clés identifiant les légendes du module Gallery : suppression du point de séparation du nom de fichier de l'extension.
- Modifications :
- Thème, bannière : nouvelle option de hauteur calculée à partir de la dimension de l'image sélectionnée.
- Thème, bannière : informations sur l'image sélectionnée (largeur et hauteur).
- Thème, pied de page : réactivation de l'aperçu.
- Corrections :
- Thème, bannière : problème empêchant la bannière d'être cliquable lorsque la hauteur "responsive" de la bannière était sélectionnée.
- Corrections :
- Thème, bannière : problème empêchant la bannière d'être cliquable lorsque la hauteur "responsive" de la bannière était sélectionnée.
- Responsive File manager : erreur empêchant l'extraction d'une archive ZIP.
- Mise à jour :
- Mise à jour :
- CodeMirror 5.49.2 et modification des modules installés
## version 9.2.09
@ -188,33 +466,33 @@
## Version 9.2.08
- Correction :
- Edition de page : bug empêchant le paramétrage d'un module après un changement de gabarit.
- Modification :
- Modification :
- Aide de l'édition des pages
## Version 9.2.07
- Modification :
- Modification :
- Balise <object> responsive
- Placement possible de tous les modules
- Commande de placement libre des modules et du menu latéral [MENU] et [MODULE]
## Version 9.2.06
- Correction :
- Correction :
- Validation html
- Syntaxe du fichier robots.txt
- Syntaxe du fichier robots.txt
## Version 9.2.05
- Correction :
- Suppression totale de Swiper (dossier source et template Tinymce)
## Version 9.2.04
- Correction :
- Correction :
- Conserver htaccess dans le dossier temp lors du nettoyage
- Suppression :
- Suppression :
- Swiper
## Version 9.2.03
- Corrections :
- Menu fixe en dehors du site :
- Menu fixe en dehors du site :
- overlay du sous-menu activé au-dessus de la page
- impossibilité de sélectionner un élément sous un sous-menu
- Modules : les modes de gestion s'affichent en pleine page - réécriture du code.
@ -225,7 +503,7 @@
- Gestion d'erreur lors de l'installation automatisée d'une mise à jour
## Version 9.2.01
- Corrections :
- Corrections :
- Sauvegarde du thème : prise en compte du fichier custom.css
- Edition de page : libellés
- Thème ; footer : marges du pied de page placé hors du site
@ -245,31 +523,31 @@
- Correction :
- Menu : alignement avec le contenu, couleur de l'arrière-plan
## Version 9.1.14
## Version 9.1.14
- Correction :
- Validation w3C : espace manquant
## Version 9.1.13
- Corrections :
- Corrections :
- Erreur du sitemap.xml lorsqu'un blog ne contient pas d'article.
- OpenGraph : erreur lors de la suppression de l'imagette si absente.
## Version 9.1.12
- Amélioration :
- Amélioration :
- Contrôle d'erreur dans la gestion de l'imagette OpenGraph
- Correction :
- Correction :
- Sitemap.xml : prendre en compte les sous-pages d'une page parente masquée
## Version 9.1.11
- Correction :
- Correction :
- Générateur de sitemap.xml, correction de syntaxe.
## Version 9.1.10
- Améliorations :
- Améliorations :
- Page sitemap et sitemap.xml : les articles de blog avec le statut brouillon sont masqués.
- Sitemap.xml : ajout de la date de publication des articles.
- Réseau social : Github.
- Correction :
- Correction :
- Suppression du ? dans les URLs vers les fichiers sitemap de robots.txt
## Version 9.1.09
@ -282,56 +560,56 @@
- Prends en compte les articles de blog
- Affiche les pages désactivées sans lien
- Prends en compte les droits de l'utilisateur
- Corrections :
- Corrections :
- Déclaration de localisation manquante dans mail.php
- Bug avec le formulaire
- Désactivation url upload dans RFM
- Désactivation url upload dans RFM
## Version 9.1.08
- Corrections :
- Corrections :
- Validation du code html et du CSS commun
- Réécriture activée après chaque mise à jour auto.
- Modifications :
- Modifications :
- Thème 100% fluide sans marge
- Ecran de smartphone (ex : iPhone 6) : adaptation de la barre d'administration : le username est masqué et la taille des icônes est augmentée
- Chemins vers les données dans des constantes
- Modèles de bannières de plusieurs dimensions
- Hauteur de police par défaut 13px
- Mises à jour :
- Mises à jour :
- TinyMCE 4.9.4
- PHPMailer 6.07
- Jquery 3.4.1
## Version 9.1.07
- Correction :
- Correction :
- Ajout d'un utilisateur : autres contrôles avant envoi d'un mail de confirmation
- Suppression :
- Include de script.inc.php et head.inc.html dans main.php
## Version 9.1.06
- Corrections :
- Corrections :
- Ajout d'un utilisateur : pas d'envoi du mail de confirmation si les mots de passe ne sont pas identiques.
- Mise à jour automatique : effacement des archives téléchargées
- Z-index des sous-menus augmentés à 8 ; problème d'affichage avec codemirror
- Modification :
- Modification :
- Include de script.inc.php et head.inc.html dans main.php
## Version 9.1.05
- Correction :
- Correction :
- Site par défaut : lien Zwii masqué du menu horizontal
- Modifications :
- Modifications :
- Présentation de l'édition des pages
- Largeur dynamique du bouton envoyer dans le formulaire
- Largeur dynamique du bouton envoyer dans le formulaire
- Lien dans le footer vers le site Zwii
- Redirection, écran de confirmation
## Version 9.1.04
- Corrections :
- Corrections :
- Edition de page : problème mise en page
- Module Form (v1.9) : position et largeur des boutons
- Thème Pied de page : problème d'affichage
- Thème Site : boutons tronqués en 750px : 750px = 0.8em
- Modification :
- Modification :
- Aperçu de la bannière en mode responsive
## Version 9.1.03
@ -345,12 +623,12 @@
- Suppression Include
## Version 9.1.01
- Modifications :
- Modifications :
- Amélioration de l'algorithme de gestion des barres
- Script Google Analytics
- Menu : effet de surimpression pages filles
- Réorganisation de l'écran d'édition des pages
- Blog : notification hiérarchique lors de la rédaction d'un commentaire
- Blog : notification hiérarchique lors de la rédaction d'un commentaire
- Form : notification hiérarchique de la réception d'un message
- Thème header : hauteur proportionnelle de la bannière (responsive)
- Ajouts :
@ -360,60 +638,60 @@
- Option de masquage des pages enfants dans le menu principal
- Petits écrans, ordre des blocs : Page - Barre Gauche - Barre Droite
- Intégration de la classe Swiper http://idangero.us/swiper/
- Intégration de l'URL canonical
- Intégration de l'URL canonical
- Icône de suppression des pages dans la barre d'administration
- Gestion du sitemap.xml et du robots.txt
- Corrections :
- Form : option de redirection
## Version 9.0.21
- Mise à jour :
- Mise à jour :
- Code Mirror v5.46
- Corrections :
- Corrections :
- Liens de l'éditeur de page : impossibilité de sélectionner un lien vers une page parente
- Export des données du site, problème lors de la création de l'arborescence.
## Version 9.0.20
- Correction :
- Correction :
- Footer : Taille de la police du numéro de version
## Version 9.0.19
- Correction :
- Alignement du menu
- Correction :
- Alignement du menu
## Version 9.0.18
- Correction :
- Etat par défaut du numéro de version mal récupéré
- Correction :
- Etat par défaut du numéro de version mal récupéré
## Version 9.0.17
- Mises à jour :
- simpleLightBox 1.17.0
- Correction :
- Correction :
- Marges pour les petits écrans en mode connecté
- Ajustement CSS du pied de page
- Harmonisation du contenu des bulles d'aide
- Modifications :
- Harmonisation du contenu des bulles d'aide
- Modifications :
- Ajout du numéro de version dans le pied de page activable dans la configuration du thème
- Désactivation Aviary dans Responsive FileManager
- Désactivation Aviary dans Responsive FileManager
## Version 9.0.16
- Correction :
- Correction :
- Nom de page constitué de caractères filtrés empchant la création d'un Id valide.
- Module Gallery : bouton de fermeture sous Edge
## Version 9.0.15
- Corrections :
- Corrections :
- Débordement dans le pied de page quand le copyright est à droite
- Modifications :
- Modifications :
- Petits écrans, menu d'administration icônes plus grandes
- Masquage de l'icône de gestion du compte
- Masquage de l'icône de gestion du compte
## Version 9.0.14
- Corrections :
- Corrections :
- Débordement dans le pied de page quand le copyright est à droite
- Modifications :
- Modifications :
- Petits écrans, menu d'administration plus icônes plus grandes
- Masquage de l'icône de gestion du compte
- Masquage de l'icône de gestion du compte
## Version 9.0.13
- Modifications :
@ -455,7 +733,7 @@
- Blog 1.3 : image en tête d'article correctement affichée avec effet responsive.
- TinyMCE : taille des miniatures générées par défaut 480 x 320 en vue d'un affichage correct dans le module blog
- Pied de page : correction d'un problème d'affichage sur des écrans inférieurs à 992px
## Version 9.0.07
- Correction :
- Disparition du menu quand la bannière est masquée
@ -465,12 +743,12 @@
## Version 9.0.06
- Correction :
- Configuration des modes de codemirror
- Modifications :
- Modifications :
- TinyMCE : libellés fenêtre des liens
## Version 9.0.05
- Modifications :
- Thème :
- Thème :
- nouvelle position du menu dans le site quand la bannière est au-dessus.
- Simplification et ordre des libellés position du menu par rapport à la bannière
- Editeur de texte, scrolle lorsque l'éditeur est ouvert, la barre d'outil se colle sous la barre d'administration.
@ -480,8 +758,8 @@
usages : https://sorgalla.com/lity/
## Version 9.0.04
- Corrections :
- Module form 1.6 :
- Corrections :
- Module form 1.6 :
- erreur lors de la non sélection d'un groupe
- captcha inefficace
- Pour les testeurs : la mise à jour automatique n'est plus proposée lors d'une régression, lorsque le numéro de version en ligne est inférieur à celui de la version installée.
@ -489,7 +767,7 @@
- Redimensionnement des images map : permet d'obtenir des images map fonctionnelles lorsque les dimensions de l'image sont réduites par le thème ou la taille de l'écran.
- La carte peut être générée par https://www.image-map.net/
- Article (en) : https://blog.travismclarke.com/project/imagemap/
- Git : https://github.com/clarketm/image-map
- Git : https://github.com/clarketm/image-map
## Version 9.0.03
@ -504,12 +782,12 @@
## Version 9.0.01
- Modifications :
- Modifications :
- Abandon de l'envoi masqué des mails du formulaire
- Effacement Google+ des réseaux sociaux
- Rétablissement du background du header
- Opération sur un mauvais type affichant une notice
- Correction :
- Correction :
- La bannière hors site cliquable replacée dans le header
- Hauteur du footer hors site non appliquée
@ -524,8 +802,8 @@
- Nouvelle option de position fixe du menu type Facebook lorsque le menu et en haut de page et hors du site
- Nettoyage des images effacées
- Gabarits de pages : deux barres latérales, une à droite ou à gauche contenant des informations fixes.
- Libellé Modérateur devient Editeur
- Editeur de texte :
- Libellé Modérateur devient Editeur
- Editeur de texte :
- VisualBlocks dans TinyMCE
- CodeMirror dans TinyMCE
- Affichage de la version proposée dans la popup de mise à jour
@ -533,17 +811,17 @@
- Case à cocher dans les formulaires
- Bouton d'export au format CSV
- Bouton effacer toutes les données
- Notification d'un membre ou email libre
- Notification d'un membre ou email libre
- Edition de page :
- masquage des options inutiles selon le module
- nouvelle option : fil d'ariane des pages filles
- Barre d'administration fixe
Correctif :
Correctif :
- amélioration contre mesure CSRF
- Erreur dans la procédure d'update suite à un ancien numéro de versions sur 4 digits
Mise à jour :
Mise à jour :
- TinyColoPicker
- PhpMailer 6.0.6
- Responsive FileManager version 9.14.0
@ -555,37 +833,37 @@ Mise à jour :
* Correction :
- Module Form : faille CSRF gestion data
- Problème empêchant la suppression d'une galerie
* Modification :
* Modification :
- Module Form : Bouton tout effacer
## Version 8.5.8
* Correction :
- Erreur dans la procédure d'update suite à un ancien numéro de versions sur 4 digits
## Version 8.5.7
* Correction :
* Correction :
- Message d'erreur ecran modification du compte
## Version 8.5.6
* Correction :
* Correction :
- Destruction de la session au logout
- Thème : aperçu de la modification de la barre de menu au-dessus du site
* Modification :
* Modification :
- Mise à jour RFM 9.14
- Amélioration de la contre mesure CRSF
- Libellé dans TinyMCE (gabarit)
- Setlocal modification des paramètres FR
- Setlocal modification des paramètres FR
## Version 8.5.5
* Correction :
* Correction :
- Faille CSRF lors de l'effacement d'un membre
- Faille CSRF lors de l'effacement d'une galerie
- Faille CSRF lors de l'effacement d'un article de blog
- Faille CSRF lors de l'effacement d'un article de blog
- Faille CSRF lors de l'effacement d'un article de news
- Taille de la police dans le footer impossible à modifier
## Version 8.5.4
* Correction :
* Correction :
- Faille CSRF lors de l'effacement d'une page
## Verison 8.5.3
@ -599,40 +877,40 @@ Mise à jour :
- Bloc des colonnes dans et hors site :
- \#footersiteLeft, \#footerbodyLef
- \#footersiteCenter, \#footerbodyCenter
- \#footersiteRight, \#footerbodyRight
- \#footersiteRight, \#footerbodyRight
## Version 8.5.2
* Correction :
* Correction :
- Thème menu : aperçu quand le menu est au-dessus et en-dehors du site
## Version 8.5.1
* Correction :
- Nom de variable incorrect
## Version 8.5.0
* Correction :
* Correction :
- Suppression popup active par défaut dans le menu
- Suppression option de titre de page dans le menu Icone + Texte
* Modification :
* Modification :
- Thème du menu : sélection de la police de caractère
## Version 8.4.9
* Correction :
- Adresse d'une page inactive
* Modification :
* Modification :
- Blog : masquer une image dans l'article tout en conservant la miniature dans l'index
## version 8.4.8
* Correction :
## version 8.4.8
* Correction :
- Fautes de frappe
## Version 8.4.7
* correction :
- Chaine de mise à jour des variables internes
- Chaine de mise à jour des variables internes
## Version 8.4.6
* corrections :
* corrections :
- Encodage des dates dans la liste des articles news et blog
- Variable itemsperPage stockée dans le mauvais type
@ -643,11 +921,11 @@ Mise à jour :
- Inversion de deux balises dans Socials
## Version 8.4.4
* Correction :
- Valeur par défaut et d'update des éléments du footer dans les blocks
* Correction :
- Valeur par défaut et d'update des éléments du footer dans les blocks
## Version 8.4.3
* Correction :
* Correction :
- URL incorrecte dans Metaimage
- Erreur dans la génération du sitemap
- Taille du texte de la bannnière maximale relative (vmax)
@ -671,39 +949,39 @@ Mise à jour :
- Position des modules Galerie et Form dans une page ; haut ; bas ou libre avec les doubles crochets insérés dans l'article []
- Prise en compte des balises OpenGraph obligatoires title , description, type et images
- Modification de la position des boutons retour et éditer lors de l'affichage d'un article si connecté
- Mise en forme de la composition des articles et des news
- Mise en forme de la composition des articles et des news
- Suppression du message de l'édition des redirections
* Corrections :
* Corrections :
- Accès aux pages désactivées par le sitemap
- Réduction du temps d'affichage des notifications
- Image responsive en en-tête de l'article d'un blog
- Mise à jour du gestionnaire de fichiers en version 9.13.1
## version 8.3.13 :
* Modifications :
* Modifications :
- Bannière "responsive", nouvelles options de positionnement
- Bouton Edit dans Blog
- Options de position des menus selon la position de la bannière
- Bouton Edition dans un article du blog
- Balise ALT dans les images du menu
- Correction RFM
## version 8.3.12 :
* Modification :
* Modification :
- bouton de retour dans la page d'un article de blog
* Correction :
- miniatures des exemples
- miniatures des exemples
## version 8.3.11 :
* Modifications :
* Modifications :
- Thème : menu et sous menu sous forme de texte ou d'image (avec ou sans bulle)
- Thème : nouvelle option permettant de cliquer sur la bannière afin de revenir à la racine du site
- Thème : le menu peut être positionné en haut et hors de site sur la largeur de l'écran
- Page : nouvelle option permettant désactiver une page dans le menu. Cette option permet soit de mettre une page en maintenance tout en la laissant active dans le menu, soit de créer une entrée de menu principal sans contenu
- Page : nouvelle option permettant désactiver une page dans le menu. Cette option permet soit de mettre une page en maintenance tout en la laissant active dans le menu, soit de créer une entrée de menu principal sans contenu
- nouvelle option : la bannière devient cliquable et renvoie vers la page d'accueil
- nom des dossiers des images exemples
* Corrections :
* Corrections :
- bug des commentaires non déposés quand connecté
- bug présent depuis au moins la version 8.1 et qui faisait boucler l'édition d'une page avec un module de redirection; Après édition, un clic sur retour ou enregistrer renvoie vers la page d'accueil en édition.
- affichage d'une erreur 404 si le contenu d'une page est supprimé
@ -712,7 +990,7 @@ Mise à jour :
- nouvelles icones d'exemple pour les menus
## 8.2.9
* Correction : filemanger : erreur dans la navigation du filemanager dans la sélection de la favicon
* Modification : on peut effacer le contenu d'une page sans provoquer d'erreur 404
* Modification : on peut effacer le contenu d'une page sans provoquer d'erreur 404
## 8.2.8
* Correction : filemanager problème de lecture d'une seule extension
## 8.2.7

View File

@ -1,19 +1,24 @@
![](https://img.shields.io/github/last-commit/fredtempez/ZwiiCMS/master) ![](https://img.shields.io/github/release-date/fredtempez/ZwiiCMS)
# ZwiiCMS 9.2.27
# ZwiiCMS 10.3.12
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.
ZwiiCMS a été créé par un développeur de talent, [Rémi Jean](https://remijean.fr/). Il est désormais maintenu par la communauté.
ZwiiCMS a été créé par un développeur de talent, [Rémi Jean](https://remijean.fr/). Il est désormais maintenu par Fred Tempez aidé de la communauté.
[Site](http://zwiicms.com/) - [Forum](http://forum.zwiicms.com/) - [Version initiale](https://github.com/remijean/ZwiiCMS/) - [GitHub](https://github.com/fredtempez/ZwiiCMS)
[Site](http://zwiicms.fr/) - [Forum](http://forum.zwiicms.com/) - [Version initiale](https://github.com/remijean/ZwiiCMS/) - [GitHub](https://github.com/fredtempez/ZwiiCMS)
## Configuration recommandée
* PHP 5.6 ou plus
* Support de .htaccess
## Téléchargement de ZwiICMS
Pour télécharger la dernière version publiée, il faut vous rendre sur la page de téléchargemet du [site](https://zwiicms.fr/telechargements)
La version github est une **version de développement** qui peut encore contenir des bugs mais elle vous permet de tester les dernières nouveautés. Cette version n'est pas recommandée en production.
## Installation
Décompressez l'archive de Zwii et téléversez son contenu à la racine de votre serveur ou dans un sous-répertoire. C'est tout !
@ -50,6 +55,7 @@ Pour revenir à la version 8, renommez ce fichier "data.json".
```text
[R] core Cœur du système
[R] class Classes
[R] layout Mise en page
[R] module Modules du cœur
[R] vendor Librairies extérieures
@ -66,10 +72,19 @@ Pour revenir à la version 8, renommez ce fichier "data.json".
[R] site Contenu du site
[R] backup Sauvegardes automatiques
[R] data Répertoire des données
[F] core.json Contenu
[F] theme.json Thème
[R] fr Dossier localisé
[F] page.json Données des pages
[F] module.json Données des modules de pages
[F] admin.css Thème de la partie administration
[F] admin.json Données de la partie administration
[F] blacklist.json Données de connexion des comptes inconnus
[F] config.json Configuration du site
[F] core.json Configuration du noyau
[F] custom.css Feuille de style de la personnalisation avancée
[F] theme.css Thème compilé en CSS
[F] journal.log Journalisation des actions
[F] theme.css Thème du site
[F] theme.json Données du site
[F] user.json Données des utilisateurs
[R] file Répertoire d'upload du gestionnaire de fichiers
[R] source Ressources diverses
[R] thumb Miniatures des images
@ -79,4 +94,7 @@ Pour revenir à la version 8, renommez ce fichier "data.json".
[F] robots.txt Filtrage des répertoires accessibles aux robots des moteurs de recherche
[F] sitemap.xml Plan du site
[F] sitemap.xml.gz Version compressée
Le fichiers .htaccess contribuent à la sécurité en filtant l'accès aux répertoires sensibles.
```

14
core/class/autoload.php Executable file
View File

@ -0,0 +1,14 @@
<?php
class autoload {
public static function autoloader () {
require_once 'core/class/helper.class.php';
require_once 'core/class/template.class.php';
require_once 'core/class/SitemapGenerator.class.php';
require_once 'core/class/phpmailer/PHPMailer.class.php';
require_once 'core/class/phpmailer/Exception.class.php';
require_once 'core/class/phpmailer/SMTP.class.php';
require_once "core/class/jsondb/Dot.class.php";
require_once "core/class/jsondb/JsonDb.class.php";
}
}

507
core/class/helper.class.php Executable file
View File

@ -0,0 +1,507 @@
<?php
class helper {
/** Statut de la réécriture d'URL (pour éviter de lire le contenu du fichier .htaccess à chaque self::baseUrl()) */
public static $rewriteStatus = null;
/** Filtres personnalisés */
const FILTER_BOOLEAN = 1;
const FILTER_DATETIME = 2;
const FILTER_FLOAT = 3;
const FILTER_ID = 4;
const FILTER_INT = 5;
const FILTER_MAIL = 6;
const FILTER_PASSWORD = 7;
const FILTER_STRING_LONG = 8;
const FILTER_STRING_SHORT = 9;
const FILTER_TIMESTAMP = 10;
const FILTER_URL = 11;
/**
* Récupérer l'adresse IP sans tenit compte du proxy
* @return string IP adress
* Cette focntion est utilisé par user
*/
public static function getIp() {
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
$ip=$_SERVER['HTTP_CLIENT_IP'];
}
elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
}
else{
$ip=$_SERVER['REMOTE_ADDR'];
}
return $ip;
}
/**
* Fonction pour récupérer le numéro de version en ligne
* @param string $url à récupérer
* @return mixed données récupérées
*/
public static function urlGetContents ($url) {
// Ejecter free.fr
if (strpos(self::baseUrl(),'free.fr') > 0 ){
return false;
}
if(function_exists('file_get_contents') &&
ini_get('allow_url_fopen') ){
$url_get_contents_data = @file_get_contents($url); // Masque un warning éventuel
}elseif(function_exists('fopen') &&
function_exists('stream_get_contents') &&
ini_get('allow_url_fopen')){
$handle = fopen ($url, "r");
$url_get_contents_data = stream_get_contents($handle);
}else{
$url_get_contents_data = false;
}
return $url_get_contents_data;
}
/**
* Retourne les valeurs d'une colonne du tableau de données
* @param array $array Tableau cible
* @param string $column Colonne à extraire
* @param string $sort Type de tri à appliquer au tableau (SORT_ASC, SORT_DESC, ou null)
* @return array
*/
public static function arrayCollumn($array, $column, $sort = null) {
$newArray = [];
if(empty($array) === false) {
$newArray = array_map(function($element) use($column) {
return $element[$column];
}, $array);
switch($sort) {
case 'SORT_ASC':
asort($newArray);
break;
case 'SORT_DESC':
arsort($newArray);
break;
}
}
return $newArray;
}
/**
* Génère un backup des données de site
* @param string $folder dossier de sauvegarde
* @param array $exclude dossier exclus
* @return string nom du fichier de sauvegarde
*/
public static function autoBackup($folder, $filter = ['backup','tmp'] ) {
// Creation du ZIP
$baseName = str_replace('/','',helper::baseUrl(false,false));
$baseName = empty($baseName) ? 'ZwiiCMS' : $baseName;
$fileName = $baseName . '-backup-' . date('Y-m-d-h-i-s', time()) . '.zip';
$zip = new ZipArchive();
$zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$directory = 'site/';
//$filter = array('backup','tmp','file');
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator(
$directory,
RecursiveDirectoryIterator::SKIP_DOTS
),
function ($fileInfo, $key, $iterator) use ($filter) {
return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter);
}
)
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen(realpath($directory)) + 1);
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
return ($fileName);
}
/**
* Retourne true si le protocole est en TLS
* @return bool
*/
public static function isHttps() {
if(
(empty($_SERVER['HTTPS']) === false AND $_SERVER['HTTPS'] !== 'off')
OR $_SERVER['SERVER_PORT'] === 443
) {
return true;
} else {
return false;
}
}
/**
* Retourne l'URL de base du site
* @param bool $queryString Affiche ou non le point d'interrogation
* @param bool $host Affiche ou non l'host
* @return string
*/
public static function baseUrl($queryString = true, $host = true) {
// Protocole
$protocol = helper::isHttps() === true ? 'https://' : 'http://';
// Host
if($host) {
$host = $protocol . $_SERVER['HTTP_HOST'];
}
// Pathinfo
$pathInfo = pathinfo($_SERVER['PHP_SELF']);
// Querystring
if($queryString AND helper::checkRewrite() === false) {
$queryString = '?';
}
else {
$queryString = '';
}
return $host . rtrim($pathInfo['dirname'], ' ' . DIRECTORY_SEPARATOR) . '/' . $queryString;
}
/**
* Check le statut de l'URL rewriting
* @return bool
*/
public static function checkRewrite() {
if(self::$rewriteStatus === null) {
// Ouvre et scinde le fichier .htaccess
$htaccess = explode('# URL rewriting', file_get_contents('.htaccess'));
// Retourne un boolean en fonction du contenu de la partie réservée à l'URL rewriting
self::$rewriteStatus = (empty($htaccess[1]) === false);
}
return self::$rewriteStatus;
}
/**
* Renvoie le numéro de version de Zwii est en ligne
* @return string
*/
public static function getOnlineVersion() {
return (helper::urlGetContents('http://zwiicms.fr/update/'. common::ZWII_UPDATE_CHANNEL . '/version'));
}
/**
* Check si une nouvelle version de Zwii est disponible
* @return bool
*/
public static function checkNewVersion() {
if($version = helper::getOnlineVersion()) {
//return (trim($version) !== common::ZWII_VERSION);
return ((version_compare(common::ZWII_VERSION,$version)) === -1);
}
else {
return false;
}
}
/**
* Génère des variations d'une couleur
* @param string $rgba Code rgba de la couleur
* @return array
*/
public static function colorVariants($rgba) {
preg_match('#\(+(.*)\)+#', $rgba, $matches);
$rgba = explode(', ', $matches[1]);
return [
'normal' => 'rgba(' . $rgba[0] . ',' . $rgba[1] . ',' . $rgba[2] . ',' . $rgba[3] . ')',
'darken' => 'rgba(' . max(0, $rgba[0] - 15) . ',' . max(0, $rgba[1] - 15) . ',' . max(0, $rgba[2] - 15) . ',' . $rgba[3] . ')',
'veryDarken' => 'rgba(' . max(0, $rgba[0] - 20) . ',' . max(0, $rgba[1] - 20) . ',' . max(0, $rgba[2] - 20) . ',' . $rgba[3] . ')',
'text' => self::relativeLuminanceW3C($rgba) > .22 ? "#222" : "#DDD",
'rgb' => 'rgb(' . $rgba[0] . ',' . $rgba[1] . ',' . $rgba[2] . ')'
];
}
/**
* Supprime un cookie
* @param string $cookieKey Clé du cookie à supprimer
*/
public static function deleteCookie($cookieKey) {
unset($_COOKIE[$cookieKey]);
setcookie($cookieKey, '', time() - 3600, helper::baseUrl(false, false), '', false, true);
}
/**
* Filtre une chaîne en fonction d'un tableau de données
* @param string $text Chaîne à filtrer
* @param int $filter Type de filtre à appliquer
* @return string
*/
public static function filter($text, $filter) {
$text = trim($text);
switch($filter) {
case self::FILTER_BOOLEAN:
$text = (bool) $text;
break;
case self::FILTER_DATETIME:
$timezone = new DateTimeZone(core::$timezone);
$date = new DateTime($text);
$date->setTimezone($timezone);
$text = (int) $date->format('U');
break;
case self::FILTER_FLOAT:
$text = filter_var($text, FILTER_SANITIZE_NUMBER_FLOAT);
$text = (float) $text;
break;
case self::FILTER_ID:
$text = mb_strtolower($text, 'UTF-8');
$text = strip_tags(str_replace(
explode(',', 'á,à,â,ä,ã,å,ç,é,è,ê,ë,í,ì,î,ï,ñ,ó,ò,ô,ö,õ,ú,ù,û,ü,ý,ÿ,\',", '),
explode(',', 'a,a,a,a,a,a,c,e,e,e,e,i,i,i,i,n,o,o,o,o,o,u,u,u,u,y,y,-,-,-'),
$text
));
$text = preg_replace('/([^a-z0-9-])/', '', $text);
// Supprime les emoji
$text = preg_replace('/[[:^print:]]/', '', $text);
// Supprime les tirets en fin de chaine (emoji en fin de nom)
$text = rtrim($text,'-');
// Cas où un identifiant est vide
if (empty($text)) {
$text = uniqid('');
}
// Un ID ne peut pas être un entier, pour éviter les conflits avec le système de pagination
if(intval($text) !== 0) {
$text = 'i' . $text;
}
break;
case self::FILTER_INT:
$text = (int) filter_var($text, FILTER_SANITIZE_NUMBER_INT);
break;
case self::FILTER_MAIL:
$text = filter_var($text, FILTER_SANITIZE_EMAIL);
break;
case self::FILTER_PASSWORD:
$text = password_hash($text, PASSWORD_BCRYPT);
break;
case self::FILTER_STRING_LONG:
$text = mb_substr(filter_var($text, FILTER_SANITIZE_STRING), 0, 500000);
break;
case self::FILTER_STRING_SHORT:
$text = mb_substr(filter_var($text, FILTER_SANITIZE_STRING), 0, 500);
break;
case self::FILTER_TIMESTAMP:
$text = date('Y-m-d H:i:s', $text);
break;
case self::FILTER_URL:
$text = filter_var($text, FILTER_SANITIZE_URL);
break;
}
return $text;
}
/**
* Incrémente une clé en fonction des clés ou des valeurs d'un tableau
* @param mixed $key Clé à incrémenter
* @param array $array Tableau à vérifier
* @return string
*/
public static function increment($key, $array = []) {
// Pas besoin d'incrémenter si la clef n'existe pas
if($array === []) {
return $key;
}
// Incrémente la clef
else {
// Si la clef est numérique elle est incrémentée
if(is_numeric($key)) {
$newKey = $key;
while(array_key_exists($newKey, $array) OR in_array($newKey, $array)) {
$newKey++;
}
}
// Sinon l'incrémentation est ajoutée après la clef
else {
$i = 2;
$newKey = $key;
while(array_key_exists($newKey, $array) OR in_array($newKey, $array)) {
$newKey = $key . '-' . $i;
$i++;
}
}
return $newKey;
}
}
/**
* Minimise du css
* @param string $css Css à minimiser
* @return string
*/
public static function minifyCss($css) {
// Supprime les commentaires
$css = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $css);
// Supprime les tabulations, espaces, nouvelles lignes, etc...
$css = str_replace(["\r\n", "\r", "\n" ,"\t", ' ', ' ', ' '], '', $css);
$css = preg_replace(['(( )+{)', '({( )+)'], '{', $css);
$css = preg_replace(['(( )+})', '(}( )+)', '(;( )*})'], '}', $css);
$css = preg_replace(['(;( )+)', '(( )+;)'], ';', $css);
// Retourne le css minifié
return $css;
}
/**
* Minimise du js
* @param string $js Js à minimiser
* @return string
*/
public static function minifyJs($js) {
// Supprime les commentaires
$js = preg_replace('/\\/\\*[^*]*\\*+([^\\/][^*]*\\*+)*\\/|\s*(?<![\:\=])\/\/.*/', '', $js);
// Supprime les tabulations, espaces, nouvelles lignes, etc...
$js = str_replace(["\r\n", "\r", "\t", "\n", ' ', ' ', ' '], '', $js);
$js = preg_replace(['(( )+\))', '(\)( )+)'], ')', $js);
// Retourne le js minifié
return $js;
}
/**
* Crée un système de pagination (retourne un tableau contenant les informations sur la pagination (first, last, pages))
* @param array $array Tableau de donnée à utiliser
* @param string $url URL à utiliser, la dernière partie doit correspondre au numéro de page, par défaut utiliser $this->getUrl()
* @param string $item pagination nombre d'éléments par page
* @param null|int $sufix Suffixe de l'url
* @return array
*/
public static function pagination($array, $url, $item, $sufix = null) {
// Scinde l'url
$url = explode('/', $url);
// Url de pagination
$urlPagination = is_numeric($url[count($url) - 1]) ? array_pop($url) : 1;
// Url de la page courante
$urlCurrent = implode('/', $url);
// Nombre d'éléments à afficher
$nbElements = count($array);
// Nombre de page
$nbPage = ceil($nbElements / $item);
// Page courante
$currentPage = is_numeric($urlPagination) ? self::filter($urlPagination, self::FILTER_INT) : 1;
// Premier élément de la page
$firstElement = ($currentPage - 1) * $item;
// Dernier élément de la page
$lastElement = $firstElement + $item;
$lastElement = ($lastElement > $nbElements) ? $nbElements : $lastElement;
// Mise en forme de la liste des pages
$pages = '';
if($nbPage > 1) {
for($i = 1; $i <= $nbPage; $i++) {
$disabled = ($i === $currentPage) ? ' class="disabled"' : false;
$pages .= '<a href="' . helper::baseUrl() . $urlCurrent . '/' . $i . $sufix . '"' . $disabled . '>' . $i . '</a>';
}
$pages = '<div class="pagination">' . $pages . '</div>';
}
// Retourne un tableau contenant les informations sur la pagination
return [
'first' => $firstElement,
'last' => $lastElement,
'pages' => $pages
];
}
/**
* Calcul de la luminance relative d'une couleur
*/
public static function relativeLuminanceW3C($rgba) {
// Conversion en sRGB
$RsRGB = $rgba[0] / 255;
$GsRGB = $rgba[1] / 255;
$BsRGB = $rgba[2] / 255;
// Ajout de la transparence
$RsRGBA = $rgba[3] * $RsRGB + (1 - $rgba[3]);
$GsRGBA = $rgba[3] * $GsRGB + (1 - $rgba[3]);
$BsRGBA = $rgba[3] * $BsRGB + (1 - $rgba[3]);
// Calcul de la luminance
$R = ($RsRGBA <= .03928) ? $RsRGBA / 12.92 : pow(($RsRGBA + .055) / 1.055, 2.4);
$G = ($GsRGBA <= .03928) ? $GsRGBA / 12.92 : pow(($GsRGBA + .055) / 1.055, 2.4);
$B = ($BsRGBA <= .03928) ? $BsRGBA / 12.92 : pow(($BsRGBA + .055) / 1.055, 2.4);
return .2126 * $R + .7152 * $G + .0722 * $B;
}
/**
* Retourne les attributs d'une balise au bon format
* @param array $array Liste des attributs ($key => $value)
* @param array $exclude Clés à ignorer ($key)
* @return string
*/
public static function sprintAttributes(array $array = [], array $exclude = []) {
$exclude = array_merge(
[
'before',
'classWrapper',
'help',
'label'
],
$exclude
);
$attributes = [];
foreach($array as $key => $value) {
if(($value OR $value === 0) AND in_array($key, $exclude) === false) {
// Désactive le message de modifications non enregistrées pour le champ
if($key === 'noDirty') {
$attributes[] = 'data-no-dirty';
}
// Disabled
// Readonly
elseif(in_array($key, ['disabled', 'readonly'])) {
$attributes[] = sprintf('%s', $key);
}
// Autres
else {
$attributes[] = sprintf('%s="%s"', $key, $value);
}
}
}
return implode(' ', $attributes);
}
/**
* Retourne un segment de chaîne sans couper de mot
* @param string $text Texte à scinder
* @param int $start (voir substr de PHP pour fonctionnement)
* @param int $length (voir substr de PHP pour fonctionnement)
* @return string
*/
public static function subword($text, $start, $length) {
$text = trim($text);
if(strlen($text) > $length) {
$text = mb_substr($text, $start, $length);
$text = mb_substr($text, 0, min(mb_strlen($text), mb_strrpos($text, ' ')));
}
return $text;
}
/**
* Cryptage
* @param string $key la clé d'encryptage
* @param string $payload la chaine à coder
* @return string
*/
public static function encrypt($key, $payload) {
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
$encrypted = openssl_encrypt($payload, 'aes-256-cbc', $key, 0, $iv);
return base64_encode($encrypted . '::' . $iv);
}
/**
* Décryptage
* @param string $key la clé d'encryptage
* @param string $garble la chaine à décoder
* @return string
*/
public static function decrypt($key, $garble) {
list($encrypted_data, $iv) = explode('::', base64_decode($garble), 2);
return openssl_decrypt($encrypted_data, 'aes-256-cbc', $key, 0, $iv);
}
}

316
core/class/jsondb/Dot.class.php Executable file
View File

@ -0,0 +1,316 @@
<?php
namespace Prowebcraft;
use ArrayAccess;
/**
* Dot Notation
*
* This class provides dot notation access to arrays, so it's easy to handle
* multidimensional data in a clean way.
*/
class Dot implements ArrayAccess
{
/** @var array Data */
protected $data = [];
/**
* Constructor
*
* @param array|null $data Data
*/
public function __construct(array $data = null)
{
if (is_array($data)) {
$this->data = $data;
}
}
/**
* Get value of path, default value if path doesn't exist or all data
*
* @param array $array Source Array
* @param mixed|null $key Path
* @param mixed|null $default Default value
* @return mixed Value of path
*/
public static function getValue($array, $key, $default = null)
{
if (is_string($key)) {
// Iterate path
$keys = explode('.', $key);
foreach ($keys as $key) {
if (!isset($array[$key])) {
return $default;
}
$array = &$array[$key];
}
// Get value
return $array;
} elseif (is_null($key)) {
// Get all data
return $array;
}
return null;
}
/**
* Set value or array of values to path
*
* @param array $array Target array with data
* @param mixed $key Path or array of paths and values
* @param mixed|null $value Value to set if path is not an array
*/
public static function setValue(&$array, $key, $value)
{
if (is_string($key)) {
// Iterate path
$keys = explode('.', $key);
foreach ($keys as $key) {
if (!isset($array[$key]) || !is_array($array[$key])) {
$array[$key] = [];
}
$array = &$array[$key];
}
// Set value to path
$array = $value;
} elseif (is_array($key)) {
// Iterate array of paths and values
foreach ($key as $k => $v) {
self::setValue($array, $k, $v);
}
}
}
/**
* Add value or array of values to path
*
* @param array $array Target array with data
* @param mixed $key Path or array of paths and values
* @param mixed|null $value Value to set if path is not an array
* @param boolean $pop Helper to pop out last key if value is an array
*/
public static function addValue(&$array, $key, $value = null, $pop = false)
{
if (is_string($key)) {
// Iterate path
$keys = explode('.', $key);
if ($pop === true) {
array_pop($keys);
}
foreach ($keys as $key) {
if (!isset($array[$key]) || !is_array($array[$key])) {
$array[$key] = [];
}
$array = &$array[$key];
}
// Add value to path
$array[] = $value;
} elseif (is_array($key)) {
// Iterate array of paths and values
foreach ($key as $k => $v) {
self::addValue($array, $k, $v);
}
}
}
/**
* Delete path or array of paths
*
* @param array $array Target array with data
* @param mixed $key Path or array of paths to delete
*/
public static function deleteValue(&$array, $key)
{
if (is_string($key)) {
// Iterate path
$keys = explode('.', $key);
$last = array_pop($keys);
foreach ($keys as $key) {
if (!isset($array[$key])) {
return;
}
$array = &$array[$key];
}
if (isset($array[$last])) {
// Detele path
unset($array[$last]);
}
} elseif (is_array($key)) {
// Iterate array of paths
foreach ($key as $k) {
self::delete($k);
}
}
}
/**
* Get value of path, default value if path doesn't exist or all data
*
* @param mixed|null $key Path
* @param mixed|null $default Default value
* @return mixed Value of path
*/
public function get($key = null, $default = null)
{
return self::getValue($this->data, $key, $default);
}
/**
* Set value or array of values to path
*
* @param mixed $key Path or array of paths and values
* @param mixed|null $value Value to set if path is not an array
*/
public function set($key, $value = null)
{
return self::setValue($this->data, $key, $value);
}
/**
* Add value or array of values to path
*
* @param mixed $key Path or array of paths and values
* @param mixed|null $value Value to set if path is not an array
* @param boolean $pop Helper to pop out last key if value is an array
*/
public function add($key, $value = null, $pop = false)
{
return self::addValue($this->data, $key, $value, $pop);
}
/**
* Check if path exists
*
* @param string $key Path
* @return boolean
*/
public function has($key)
{
$keys = explode('.', (string)$key);
$data = &$this->data;
foreach ($keys as $key) {
if (!isset($data[$key])) {
return false;
}
$data = &$data[$key];
}
return true;
}
/**
* Delete path or array of paths
*
* @param mixed $key Path or array of paths to delete
*/
public function delete($key)
{
return self::deleteValue($this->data, $key);
}
/**
* Delete all data, data from path or array of paths and
* optionally format path if it doesn't exist
*
* @param mixed|null $key Path or array of paths to clean
* @param boolean $format Format option
*/
public function clear($key = null, $format = false)
{
if (is_string($key)) {
// Iterate path
$keys = explode('.', $key);
$data = &$this->data;
foreach ($keys as $key) {
if (!isset($data[$key]) || !is_array($data[$key])) {
if ($format === true) {
$data[$key] = [];
} else {
return;
}
}
$data = &$data[$key];
}
// Clear path
$data = [];
} elseif (is_array($key)) {
// Iterate array
foreach ($key as $k) {
$this->clear($k, $format);
}
} elseif (is_null($key)) {
// Clear all data
$this->data = [];
}
}
/**
* Set data
*
* @param array $data
*/
public function setData(array $data)
{
$this->data = $data;
}
/**
* Set data as a reference
*
* @param array $data
*/
public function setDataAsRef(array &$data)
{
$this->data = &$data;
}
/**
* ArrayAccess abstract methods
*/
public function offsetSet($offset, $value)
{
$this->set($offset, $value);
}
public function offsetExists($offset)
{
return $this->has($offset);
}
public function offsetGet($offset)
{
return $this->get($offset);
}
public function offsetUnset($offset)
{
$this->delete($offset);
}
/**
* Magic methods
*/
public function __set($key, $value = null)
{
$this->set($key, $value);
}
public function __get($key)
{
return $this->get($key);
}
public function __isset($key)
{
return $this->has($key);
}
public function __unset($key)
{
$this->delete($key);
}
}

View File

@ -0,0 +1,125 @@
<?php
/**
* Created by PhpStorm.
* User: Andrey Mistulov
* Company: Aristos
* Date: 14.03.2017
* Time: 15:25
*/
namespace Prowebcraft;
/**
* Class Data
* @package Aristos
*/
class JsonDb extends \Prowebcraft\Dot
{
protected $db = '';
protected $data = null;
protected $config = [];
public function __construct($config = [])
{
$this->config = array_merge([
'name' => 'data.json',
'backup' => 5,
'dir' => getcwd(),
'template' => getcwd() . DIRECTORY_SEPARATOR . 'data.template.json'
], $config);
$this->loadData();
parent::__construct();
}
/**
* Set value or array of values to path
*
* @param mixed $key Path or array of paths and values
* @param mixed|null $value Value to set if path is not an array
* @param bool $save Save data to database
* @return $this
*/
public function set($key, $value = null, $save = true)
{
parent::set($key, $value);
if ($save) $this->save();
return $this;
}
/**
* Add value or array of values to path
*
* @param mixed $key Path or array of paths and values
* @param mixed|null $value Value to set if path is not an array
* @param boolean $pop Helper to pop out last key if value is an array
* @param bool $save Save data to database
* @return $this
*/
public function add($key, $value = null, $pop = false, $save = true)
{
parent::add($key, $value, $pop);
if ($save) $this->save();
return $this;
}
/**
* Delete path or array of paths
*
* @param mixed $key Path or array of paths to delete
* @param bool $save Save data to database
* @return $this
*/
public function delete($key, $save = true)
{
parent::delete($key);
if ($save) $this->save();
return $this;
}
/**
* Delete all data, data from path or array of paths and
* optionally format path if it doesn't exist
*
* @param mixed|null $key Path or array of paths to clean
* @param boolean $format Format option
* @param bool $save Save data to database
* @return $this
*/
public function clear($key = null, $format = false, $save = true)
{
parent::clear($key, $format);
if ($save) $this->save();
return $this;
}
/**
* Local database upload
* @param bool $reload Reboot data?
* @return array|mixed|null
*/
protected function loadData($reload = false) {
if ($this->data === null || $reload) {
// $this->db = $this->config['dir'] . DIRECTORY_SEPARATOR . $this->config['name'];
$this->db = $this->config['dir'] . $this->config['name'];
if (!file_exists($this->db)) {
return null;
} else {
$this->data = json_decode(file_get_contents($this->db), true);
if (!$this->data === null) {
throw new \InvalidArgumentException('Database file ' . $this->db
. ' contains invalid json object. Please validate or remove file');
}
}
}
return $this->data;
}
/**
* Saving to local database
*/
public function save() {
file_put_contents($this->db, json_encode($this->data, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT));
}
}

3
core/class/phpmailer/.htaccess Executable file
View File

@ -0,0 +1,3 @@
# Bloque l'accès à la librairie
Order deny,allow
Deny from all

View File

@ -23,7 +23,7 @@ namespace PHPMailer\PHPMailer;
/**
* PHPMailer exception handler.
*
* @author Marcus Bointon <phpmailer@synchromedia.co.uk>
* @author Marcus Bointon <phpmailer@synchromedia.co.uk>
*/
class Exception extends \Exception
{

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

783
core/class/template.class.php Executable file
View File

@ -0,0 +1,783 @@
<?php
class template {
/**
* Crée un bouton
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function button($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'class' => '',
'disabled' => false,
'href' => 'javascript:void(0);',
'ico' => '',
'id' => $nameId,
'name' => $nameId,
'target' => '',
'uniqueSubmission' => false,
'value' => 'Bouton'
], $attributes);
// Retourne le html
return sprintf(
'<a %s class="button %s %s %s">%s</a>',
helper::sprintAttributes($attributes, ['class', 'disabled', 'ico', 'value']),
$attributes['disabled'] ? 'disabled' : '',
$attributes['class'],
$attributes['uniqueSubmission'] ? 'uniqueSubmission' : '',
($attributes['ico'] ? template::ico($attributes['ico'], 'right') : '') . $attributes['value']
);
}
/**
* Crée un champ captcha
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function captcha($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'class' => '',
'classWrapper' => '',
'help' => '',
'id' => $nameId,
'name' => $nameId,
'value' => '',
'limit' => false
], $attributes);
// Génère deux nombres pour le captcha
$numbers = array(0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20);
$letters = array('u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a');
$limit = $attributes['limit'] ? count($letters)-1 : 10 ;
mt_srand((float) microtime()*1000000);
$firstNumber = mt_rand ( 0 , $limit );
$secondNumber = mt_rand ( 0 , $limit );
$result = $firstNumber + $secondNumber;
$result = password_hash($result, PASSWORD_BCRYPT);
$firstLetter = uniqid();
$secondLetter = uniqid();
// Masquage image source
copy ('core/vendor/zwiico/png/'.$letters[$firstNumber] . '.png', 'site/tmp/' . $firstLetter . '.png');
copy ('core/vendor/zwiico/png/'.$letters[$secondNumber] . '.png', 'site/tmp/' . $secondLetter . '.png');
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="captcha inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
$html .= self::label($attributes['id'],
'<img src="' . helper::baseUrl(false) . 'site/tmp/' . $firstLetter . '.png" />' . template::ico('plus') . '<img class="captchaNumber" src="' . helper::baseUrl(false) . 'site/tmp/' . $secondLetter . '.png" /> en chiffres ?', [
'help' => $attributes['help']
]);
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// captcha
$html .= sprintf(
'<input type="text" %s>',
helper::sprintAttributes($attributes)
);
// Champ résultat caché
$html .= self::hidden($attributes['id'] . 'Result', [
'value' => $result,
'before' => false
]);
// Champs cachés contenant les nombres
/*
$html .= self::hidden($attributes['id'] . 'FirstNumber', [
'value' => $firstNumber,
'before' => false
]);
$html .= self::hidden($attributes['id'] . 'SecondNumber', [
'value' => $secondNumber,
'before' => false
]);
*/
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Crée une case à cocher à sélection multiple
* @param string $nameId Nom et id du champ
* @param string $value Valeur de la case à cocher
* @param string $label Label de la case à cocher
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function checkbox($nameId, $value, $label, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'before' => true,
'checked' => '',
'class' => '',
'classWrapper' => '',
'disabled' => false,
'help' => '',
'id' => $nameId,
'name' => $nameId
], $attributes);
// Sauvegarde des données en cas d'erreur
if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) {
$attributes['checked'] = (bool) common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Case à cocher
$html .= sprintf(
'<input type="checkbox" value="%s" %s>',
$value,
helper::sprintAttributes($attributes)
);
// Label
$html .= self::label($attributes['id'], '<span>' . $label . '</span>', [
'help' => $attributes['help']
]);
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Crée un champ date
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function date($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'autocomplete' => 'on',
'before' => true,
'class' => '',
'classWrapper' => '',
'noDirty' => false,
'disabled' => false,
'help' => '',
'id' => $nameId,
'label' => '',
'name' => $nameId,
'placeholder' => '',
'readonly' => true,
'value' => ''
], $attributes);
// Sauvegarde des données en cas d'erreur
if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) {
$attributes['value'] = common::$inputBefore[$attributes['id']];
}
else {
$attributes['value'] = ($attributes['value'] ? helper::filter($attributes['value'], helper::FILTER_TIMESTAMP) : '');
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Date visible
$html .= sprintf(
'<input type="text" class="datepicker %s" value="%s" %s>',
$attributes['class'],
$attributes['value'],
helper::sprintAttributes($attributes, ['class', 'value'])
);
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Crée un champ d'upload de fichier
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function file($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'before' => true,
'class' => '',
'classWrapper' => '',
'noDirty' => false,
'disabled' => false,
'extensions' => '',
'help' => '',
'id' => $nameId,
'label' => '',
'maxlength' => '500',
'name' => $nameId,
'type' => 2,
'value' => ''
], $attributes);
// Sauvegarde des données en cas d'erreur
if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) {
$attributes['value'] = common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Champ caché contenant l'url de la page
$html .= self::hidden($attributes['id'], [
'class' => 'inputFileHidden',
'disabled' => $attributes['disabled'],
'maxlength' => $attributes['maxlength'],
'value' => $attributes['value']
]);
// Champ d'upload
$html .= '<div class="inputFileManagerWrapper">';
$html .= sprintf(
'<a
href="' .
helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php' .
'?relative_url=1' .
'&field_id=' . $attributes['id'] .
'&type=' . $attributes['type'] .
'&akey=' . md5_file(core::DATA_DIR.'core.json') .
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '')
. '"
class="inputFile %s %s"
%s
data-lity
>
' . self::ico('upload', 'right') . '
<span class="inputFileLabel"></span>
</a>',
$attributes['class'],
$attributes['disabled'] ? 'disabled' : '',
helper::sprintAttributes($attributes, ['class', 'extensions', 'type', 'maxlength'])
);
$html .= self::button($attributes['id'] . 'Delete', [
'class' => 'inputFileDelete',
'value' => self::ico('cancel')
]);
$html .= '</div>';
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Ferme un formulaire
* @return string
*/
public static function formClose() {
return '</form>';
}
/**
* Ouvre un formulaire protégé par CSRF
* @param string $id Id du formulaire
* @return string
*/
public static function formOpen($id) {
// Ouverture formulaire
$html = '<form id="' . $id . '" method="post">';
// Stock le token CSRF
$html .= self::hidden('csrf', [
'value' => $_SESSION['csrf']
]);
// Retourne le html
return $html;
}
/**
* Crée une aide qui s'affiche au survole
* @param string $text Texte de l'aide
* @return string
*/
public static function help($text) {
return '<span class="helpButton" data-tippy-content="' . $text . '">' . self::ico('help') . '<!----></span>';
}
/**
* Crée un champ caché
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function hidden($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'before' => true,
'class' => '',
'noDirty' => false,
'id' => $nameId,
//'maxlength' => '500',
'name' => $nameId,
'value' => ''
], $attributes);
// Sauvegarde des données en cas d'erreur
if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) {
$attributes['value'] = common::$inputBefore[$attributes['id']];
}
// Texte
$html = sprintf('<input type="hidden" %s>', helper::sprintAttributes($attributes, ['before']));
// Retourne le html
return $html;
}
/**
* Crée un icône
* @param string $ico Classe de l'icône
* @param string $margin Ajoute un margin autour de l'icône (choix : left, right, all)
* @param bool $animate Ajoute une animation à l'icône
* @param string $fontSize Taille de la police
* @return string
*/
public static function ico($ico, $margin = '', $animate = false, $fontSize = '1em') {
return '<span class="zwiico-' . $ico . ($margin ? ' zwiico-margin-' . $margin : '') . ($animate ? ' animate-spin' : '') . '" style="font-size:' . $fontSize . '"><!----></span>';
}
/**
* Crée un label
* @param string $for For du label
* @param array $attributes Attributs ($key => $value)
* @param string $text Texte du label
* @return string
*/
public static function label($for, $text, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'class' => '',
'for' => $for,
'help' => ''
], $attributes);
// Ajout d'une aide
if($attributes['help'] !== '') {
$text = $text . self::help($attributes['help']);
}
// Retourne le html
return sprintf(
'<label %s>%s</label>',
helper::sprintAttributes($attributes),
$text
);
}
/**
* Crée un champ mail
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function mail($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'autocomplete' => 'on',
'before' => true,
'class' => '',
'classWrapper' => '',
'noDirty' => false,
'disabled' => false,
'help' => '',
'id' => $nameId,
'label' => '',
//'maxlength' => '500',
'name' => $nameId,
'placeholder' => '',
'readonly' => false,
'value' => ''
], $attributes);
// Sauvegarde des données en cas d'erreur
if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) {
$attributes['value'] = common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Texte
$html .= sprintf(
'<input type="email" %s>',
helper::sprintAttributes($attributes)
);
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Crée une notice
* @param string $id Id du champ
* @param string $notice Notice
* @return string
*/
public static function notice($id, $notice) {
return ' <span id="' . $id . 'Notice" class="notice ' . ($notice ? '' : 'displayNone') . '">' . $notice . '</span>';
}
/**
* Crée un champ mot de passe
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function password($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'autocomplete' => 'on',
'class' => '',
'classWrapper' => '',
'noDirty' => false,
'disabled' => false,
'help' => '',
'id' => $nameId,
'label' => '',
//'maxlength' => '500',
'name' => $nameId,
'placeholder' => '',
'readonly' => false
], $attributes);
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Mot de passe
$html .= sprintf(
'<input type="password" %s>',
helper::sprintAttributes($attributes)
);
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Crée un champ sélection
* @param string $nameId Nom et id du champ
* @param array $options Liste des options du champ de sélection ($value => $text)
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function select($nameId, array $options, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'before' => true,
'class' => '',
'classWrapper' => '',
'noDirty' => false,
'disabled' => false,
'help' => '',
'id' => $nameId,
'label' => '',
'name' => $nameId,
'selected' => '',
'fonts' => false
], $attributes);
// Sauvegarde des données en cas d'erreur
if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) {
$attributes['selected'] = common::$inputBefore[$attributes['id']];
}
// Liste des polices à intégrer
if ($attributes['fonts'] === true) {
foreach ($options as $fontId) {
echo "<link href='https://fonts.googleapis.com/css?family=".str_replace(" ", "+", $fontId)."' rel='stylesheet' type='text/css'>\n";
}
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Début sélection
$html .= sprintf('<select %s>',
helper::sprintAttributes($attributes)
);
foreach($options as $value => $text) {
$html .= $attributes['fonts'] === true ? sprintf(
'<option value="%s"%s style="font-family: %s;">%s</option>',
$value,
$attributes['selected'] == $value ? ' selected' : '', // Double == pour ignorer le type de variable car $_POST change les types en string
str_replace('+',' ',$value),
$text
) : sprintf(
'<option value="%s"%s>%s</option>',
$value,
$attributes['selected'] == $value ? ' selected' : '', // Double == pour ignorer le type de variable car $_POST change les types en string
$text
);
}
// Fin sélection
$html .= '</select>';
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Crée une bulle de dialogue
* @param string $text Texte de la bulle
* @return string
*/
public static function speech($text) {
return '<div class="speech"><div class="speechBubble">' . $text . '</div>' . template::ico('mimi speechMimi', '', false, '7em') . '</div>';
}
/**
* Crée un bouton validation
* @param string $nameId Nom & id du bouton validation
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function submit($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'class' => '',
'disabled' => false,
'ico' => 'check',
'id' => $nameId,
'name' => $nameId,
'uniqueSubmission' => false, //true avant 9.1.08
'value' => 'Enregistrer'
], $attributes);
// Retourne le html
return sprintf(
'<button type="submit" class="%s%s" %s>%s</button>',
$attributes['class'],
$attributes['uniqueSubmission'] ? 'uniqueSubmission' : '',
helper::sprintAttributes($attributes, ['class', 'ico', 'value']),
($attributes['ico'] ? template::ico($attributes['ico'], 'right') : '') . $attributes['value']
);
}
/**
* Crée un tableau
* @param array $cols Cols des colonnes (format: [col colonne1, col colonne2, etc])
* @param array $body Contenu (format: [[contenu1, contenu2, etc], [contenu1, contenu2, etc]])
* @param array $head Entêtes (format : [[titre colonne1, titre colonne2, etc])
* @param array $rowsId Id pour la numérotation des rows (format : [id colonne1, id colonne2, etc])
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function table(array $cols = [], array $body = [], array $head = [], array $attributes = [], array $rowsId = []) {
// Attributs par défaut
$attributes = array_merge([
'class' => '',
'classWrapper' => '',
'id' => ''
], $attributes);
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="tableWrapper ' . $attributes['classWrapper']. '">';
// Début tableau
$html .= '<table id="' . $attributes['id'] . '" class="table ' . $attributes['class']. '">';
// Entêtes
if($head) {
// Début des entêtes
$html .= '<thead>';
$html .= '<tr class="nodrag">';
$i = 0;
foreach($head as $th) {
$html .= '<th class="col' . $cols[$i++] . '">' . $th . '</th>';
}
// Fin des entêtes
$html .= '</tr>';
$html .= '</thead>';
}
// Pas de tableau d'Id transmis, générer une numérotation
if (empty($rowsId)) {
$rowsId = range(0,count($body));
}
// Début contenu
$j = 0;
foreach($body as $tr) {
// Id de ligne pour les tableaux drag and drop
$html .= '<tr id="' . $rowsId[$j++] . '">';
$i = 0;
foreach($tr as $td) {
$html .= '<td class="col' . $cols[$i++] . '">' . $td . '</td>';
}
$html .= '</tr>';
}
// Fin contenu
$html .= '</tbody>';
// Fin tableau
$html .= '</table>';
// Fin container
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Crée un champ texte court
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function text($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'autocomplete' => 'on',
'before' => true,
'class' => '',
'classWrapper' => '',
'noDirty' => false,
'disabled' => false,
'help' => '',
'id' => $nameId,
'label' => '',
//'maxlength' => '500',
'name' => $nameId,
'placeholder' => '',
'readonly' => false,
'value' => ''
], $attributes);
// Sauvegarde des données en cas d'erreur
if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) {
$attributes['value'] = common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Texte
$html .= sprintf(
'<input type="text" %s>',
helper::sprintAttributes($attributes)
);
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
/**
* Crée un champ texte long
* @param string $nameId Nom et id du champ
* @param array $attributes Attributs ($key => $value)
* @return string
*/
public static function textarea($nameId, array $attributes = []) {
// Attributs par défaut
$attributes = array_merge([
'before' => true,
'class' => '', // editorWysiwyg et editor possible pour utiliser un éditeur (il faut également instancier les librairies)
'classWrapper' => '',
'disabled' => false,
'noDirty' => false,
'help' => '',
'id' => $nameId,
'label' => '',
//'maxlength' => '500',
'name' => $nameId,
'readonly' => false,
'value' => ''
], $attributes);
// Sauvegarde des données en cas d'erreur
if($attributes['before'] AND array_key_exists($attributes['id'], common::$inputBefore)) {
$attributes['value'] = common::$inputBefore[$attributes['id']];
}
// Début du wrapper
$html = '<div id="' . $attributes['id'] . 'Wrapper" class="inputWrapper ' . $attributes['classWrapper'] . '">';
// Label
if($attributes['label']) {
$html .= self::label($attributes['id'], $attributes['label'], [
'help' => $attributes['help']
]);
}
// Notice
$notice = '';
if(array_key_exists($attributes['id'], common::$inputNotices)) {
$notice = common::$inputNotices[$attributes['id']];
$attributes['class'] .= ' notice';
}
$html .= self::notice($attributes['id'], $notice);
// Texte long
$html .= sprintf(
'<textarea %s>%s</textarea>',
helper::sprintAttributes($attributes, ['value']),
$attributes['value']
);
// Fin du wrapper
$html .= '</div>';
// Retourne le html
return $html;
}
}

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
var core = {};
@ -52,7 +52,8 @@ core.colorVariants = function(rgba) {
"normal": "rgba(" + rgba[0] + "," + rgba[1] + "," + rgba[2] + "," + rgba[3] + ")",
"darken": "rgba(" + Math.max(0, rgba[0] - 15) + "," + Math.max(0, rgba[1] - 15) + "," + Math.max(0, rgba[2] - 15) + "," + rgba[3] + ")",
"veryDarken": "rgba(" + Math.max(0, rgba[0] - 20) + "," + Math.max(0, rgba[1] - 20) + "," + Math.max(0, rgba[2] - 20) + "," + rgba[3] + ")",
"text": core.relativeLuminanceW3C(rgba) > .22 ? "inherit" : "white"
//"text": core.relativeLuminanceW3C(rgba) > .22 ? "inherit" : "white"
"text": core.relativeLuminanceW3C(rgba) > .22 ? "#222" : "#DDD"
};
};
@ -220,14 +221,18 @@ core.start = function() {
/**
* Message sur l'utilisation des cookies
*/
var analytics = "";
if (<?php echo json_encode($this->getData(['config', 'analyticsId'])); ?>) {
analytics = ' grâce au cookie Google Analytics'
}
if(<?php echo json_encode($this->getData(['config', 'cookieConsent'])); ?>) {
if(document.cookie.indexOf("ZWII_COOKIE_CONSENT") === -1) {
$("body").append(
$("<div>").attr("id", "cookieConsent").append(
$("<span>").text("En poursuivant votre navigation sur ce site, vous acceptez l'utilisation de cookies."),
$("<span>").html("<p>Ce site utilise des cookies pour assurer l'authentification, améliorer l'expérience utilisateur"+analytics+". <br/>En cliquant sur ”Jaccepte”, vous acceptez lutilisation de ces cookies.</p>"),
$("<span>")
.attr("id", "cookieConsentConfirm")
.text("OK")
.text("Accepter")
.on("click", function() {
// Créé le cookie d'acceptation
var expires = new Date();
@ -236,7 +241,19 @@ core.start = function() {
document.cookie = "ZWII_COOKIE_CONSENT=true;" + expires;
// Ferme le message
$(this).parents("#cookieConsent").fadeOut();
})
}),
$("<span>")
.attr("id", "cookieConsentRefuse")
.text("Refuser")
.on("click", function() {
// Créé le cookie d'acceptation
var expires = new Date();
expires.setFullYear(expires.getFullYear() + 1);
expires = "expires=" + expires.toUTCString();
document.cookie = "ZWII_COOKIE_CONSENT=false;" + expires;
// Ferme le message
$(this).parents("#cookieConsent").fadeOut();
}),
)
);
}
@ -259,10 +276,10 @@ core.start = function() {
var fileName = inputFileHiddenDOM.val();
if(fileName === "") {
fileName = "Choisissez un fichier";
$(".inputFileDelete").addClass("disabled");
$(inputFileHiddenDOM).addClass("disabled");
}
else {
$(".inputFileDelete").removeClass("disabled");
$(inputFileHiddenDOM).removeClass("disabled");
}
inputFileHiddenDOM.parent().find(".inputFileLabel").text(fileName);
}).trigger("change");
@ -345,8 +362,8 @@ core.start = function() {
var ratio = width / height;
if ( ($(window).width() / ratio) <= height) {
$("header").height( $(window).width() / ratio );
$("header").css("line-height", $(window).width() / ratio + "px");
}
$("header").css("line-height", $(window).width() / ratio + "px");
}
}
}).trigger("resize");
@ -388,17 +405,22 @@ core.relativeLuminanceW3C = function(rgba) {
$(document).ready(function(){
/**
* Affiche le sous-menu quand il est sticky
* Affiche le sous-menu quand il est sticky
*/
$("nav").mouseenter(function(){
$("#navfixedlogout .navLevel2").css({ 'pointer-events' : 'auto' });
$("#navfixedconnected .navLevel2").css({ 'pointer-events' : 'auto' });
$("#navfixedlogout .navSub").css({ 'pointer-events' : 'auto' });
$("#navfixedconnected .navSub").css({ 'pointer-events' : 'auto' });
});
$("nav").mouseleave(function(){
$("#navfixedlogout .navLevel2").css({ 'pointer-events' : 'none' });
$("#navfixedconnected .navLevel2").css({ 'pointer-events' : 'none' });
$("#navfixedlogout .navSub").css({ 'pointer-events' : 'none' });
$("#navfixedconnected .navSub").css({ 'pointer-events' : 'none' });
});
/**
* Chargement paresseux des images et des iframes
*/
$("img,picture,iframe").attr("loading","lazy");
/**
* Effet accordéon
*/
@ -408,7 +430,7 @@ $(document).ready(function(){
// on récupère la valeur data-speed si elle existe
var toggleSpeed = accordion.attr('data-speed') || 100;
// fonction pour afficher un élément
// fonction pour afficher un élément
function open(item, speed) {
// on récupère tous les éléments, on enlève l'élément actif de ce résultat, et on les cache
accordion.find('.accordion-item').not(item).removeClass('active')
@ -422,32 +444,32 @@ $(document).ready(function(){
.find('.accordion-content').slideUp(speed);
}
// on initialise l'accordéon, sans animation
// on initialise l'accordéon, sans animation
open(accordion.find('.active:first'), 0);
// au clic sur un titre...
accordion.on('click', '.accordion-title', function(ev) {
ev.preventDefault();
ev.preventDefault();
// Masquer l'élément déjà actif
if ($(this).closest('.accordion-item').hasClass('active')) {
close($(this).closest('.accordion-item'), toggleSpeed);
} else {
// ...on lance l'affichage de l'élément, avec animation
open($(this).closest('.accordion-item'), toggleSpeed);
// ...on lance l'affichage de l'élément, avec animation
open($(this).closest('.accordion-item'), toggleSpeed);
}
});
});
/**
* Icône du Menu Burger
* Icône du Menu Burger
*/
$("#toggle").click(function() {
$("#toggle").click(function() {
var changeIcon = $('#toggle').children("span");
if ( $(changeIcon).hasClass('zwiico-menu') ) {
$(changeIcon).removeClass('zwiico-menu').addClass('zwiico-cancel');
}
else {
else {
$(changeIcon).addClass('zwiico-menu');
};
});
});
});

2797
core/core.php Normal file → Executable file

File diff suppressed because it is too large Load Diff

View File

@ -1,70 +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 <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
*/
#site {
background-color: rgba(255, 255, 255, 1);
}
body:not(.editorWysiwyg),
.block h4,
input[type=email],
input[type=text],
input[type=password],
.inputFile,
select,
textarea:not(.editorWysiwyg),
.inputFile,
span .zwiico-help,
.button.buttonGrey {
color: rgba(33, 34, 35, 1);
}
.button,
button[type=submit],
input[type="checkbox"]:checked + label::before,
.speechBubble {
background-color: rgba(32, 59, 82, 1);
color: white;
}
.button:hover,
button[type=submit]:hover {
background-color: rgba(17,44,67,1);
}
.speechBubble::before {
border-color: rgba(32, 59, 82, 1) transparent transparent transparent;
}
body, .row > div {
font: "Open+Sans", sans-serif;
font-size: 13px;
}
body h1, h2, h3, h4, h5, h6 {
font-family: "Oswald";
color: rgba(74, 105, 189, 1);
}
.button.buttonGrey {
background: #ECEFF1;
}
.button.buttonGrey:hover {
background: #E2E7EA;
}
.button.buttonGrey:active {
background: #D8DFE3;
}

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**

View File

@ -2,12 +2,12 @@
<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#" lang="fr">
<head>
<meta charset="utf-8">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showFavicon(); ?>
<?php $layout->showVendor(); ?>
<?php $layout->showStyle(); ?>

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**
@ -20,7 +20,7 @@
/**
* Éléments génériques
*/
html,
body {
@ -39,7 +39,7 @@ body {
/**
* Petits écrans inférieurs à 768px de largeur, on supprime les marges
*/
*/
@media (max-width: 768px) {
body {
margin:0px;
@ -60,7 +60,7 @@ body {
@media (max-width: 768px) {
@media (max-width: 768px) {
.siteContainer {
display: flex;
flex-direction: column;
@ -154,6 +154,10 @@ img[align='right'] {
margin-left: 10px;
}
#metaImage {
height: 150px;
}
/*
Signature dans les articles blog et news
*/
@ -168,21 +172,16 @@ Signature dans les articles blog et news
* Module news
*/
/*
.newsTitle {
/*background-color: #ECEFF1;*/
background-color: #ECEFF1;
padding:5px;
}
}*/
.newsContent {
clear: left;
margin-left: 10px;
padding: 5px;
}
.newsDate {
font-size:0.8em;
font-style: italic;
color: grey;
margin-left:10px;
float: left;
/* padding: 5px;*/
}
.newsSignature {
margin-right:10px;
@ -208,7 +207,6 @@ Signature dans les articles blog et news
}
.table tbody tr {
background: #F6F7F8;
-webkit-transition: background .3s ease-out;
transition: background .3s ease-out;
}
.table tbody tr:nth-child(2n + 2) {
@ -358,7 +356,6 @@ td > .col12 {
display: inline-block;
padding: 0 12px;
color: #FFF;
-webkit-transition: background .3s ease-out;
transition: background .3s ease-out;
}
#bar a:hover {
@ -371,14 +368,15 @@ td > .col12 {
#bar select {
width: 250px;
border: 0;
color: #111112;
color: #111112;
font-size: 12px;
background-color: rgba(255, 255, 255, 1);
}
@media (min-width: 768px) {
#bar #barLeft {
float: left;
}
}
#bar #barRight {
float: right;
font-size: 12px;
@ -388,23 +386,23 @@ td > .col12 {
@media (max-width: 768px) {
#bar {
text-align: center;
padding: 0;
margin: 0;
padding: 0 1;
margin: 0 1;
}
#bar ul {
height: auto;
}
#bar #barSelectPage {
width: 50% ;
font-size: 0.6em;
width: 40% ;
font-size: 1em;
}
#bar #barLeft {
font-size: 1.6em;
float : none;
font-size: 1.2em;
float : none;
}
#bar #barRight {
font-size: 1.6em;
}
font-size: 1.4em;
}
#bar #displayUsername {
display: none;
}
@ -417,7 +415,7 @@ td > .col12 {
}
@media (min-width:769px) {
#site {
#site {
margin: 20px auto;
}
}
@ -430,7 +428,7 @@ td > .col12 {
}
header {
margin:0;
}
}
}
header {
@ -445,21 +443,21 @@ header span {
}
header .container {
overflow: hidden;
height: 1
00%;
height: 100%;
}
/* Elemnt du header */
/* Element du header
#themeHeaderImage {
font-style: italic;
font-size: 0.9em;
}
}*/
/* Menu */
/* Menu
body > nav {
/*margin: 0 -10px;*/
margin: 0 -10px;
}
*/
/* Items du menu */
nav a > img {
@ -501,9 +499,8 @@ nav li ul {
width: 200px;
z-index: -1;
opacity: 0;
-webkit-transition: .3s ease-out;
transition: .3s ease-out;
padding-left: 10px;
padding-left: 10px;
}
nav li ul li {
@ -511,6 +508,11 @@ nav li ul li {
text-align: left;
}
/*
nav .navSub a{
background-color:red !important;
}*/
nav li:hover ul {
z-index: 8;
opacity: 1;
@ -518,13 +520,38 @@ nav li:hover ul {
nav a {
display: inherit;
-webkit-transition: background .3s ease-out;
transition: background .3s ease-out;
}
nav a:hover {
text-decoration: none;
}
/* Barre de menu */
#menuLeft {
display: inline-flex;
}
#menuRight {
display: inline-flex ;
float: right;
}
/* fin barre de menu */
nav::after {
content: " ";
clear: both;
display: flex;
}
nav::before {
content: " ";
clear: left;
display: flex;
}
@media (min-width: 768px) {
nav #menu {
display: block;
@ -535,9 +562,18 @@ nav a:hover {
body > nav {
margin:0;
}
nav #toggle {
nav #toggle,
nav #menuLeft {
display: block;
}
float: none;
}
nav #menuLeft {
flex-direction: column;
float: none;
}
nav #menuRight {
font-size: 2em;
}
nav #menu {
display: none;
text-align: left;
@ -555,14 +591,14 @@ nav a:hover {
/* Taille du menu hamburger */
nav .zwiico-menu {
font-size:1.5em;
}
}
nav .zwiico-cancel {
font-size:1.5em;
}
}
/* Barre de navigation fixe quand le menu est en-dehors du site */
/* Barre de navigation fixe quand le menu est en-dehors du site */
#navfixedlogout {
position: -webkit-sticky; /* Safari */
position: sticky;
@ -577,8 +613,8 @@ nav a:hover {
position: sticky;
}
#navfixedconnected .navLevel2,
#navfixedlogout .navLevel2 {
#navfixedconnected .navSub,
#navfixedlogout .navSub {
pointer-events: none;
}
@ -624,7 +660,7 @@ section:after {
.moduleVersion {
font-size: 0.8em;
font-style: italic;
text-align: right;
text-align: right;
}
/* Pied de page */
@ -668,12 +704,12 @@ footer #footerbody > div {
padding:0
}
#footerText > p {
margin-top: 0;
margin-top: 0;
margin-bottom: 0;
}
#footerLoginLink,
#footerDisplayCopyright,
#footerLoginLink,
#footerDisplayCopyright,
#footerDisplayVersion,
#footerDisplaySiteMap,
#footerDisplayLegal,
@ -702,7 +738,6 @@ footer #footerSocials span {
margin: 0 5px;
display: inline-block;
border-radius: 2px;
-webkit-transition: background .3s ease-out;
transition: background .3s ease-out;
}
footer #footerSocials .zwiico-facebook {
@ -766,7 +801,6 @@ footer #footerSocials .zwiico-github:hover {
margin: 16px auto;
text-align: left;
border-radius: 2px;
-webkit-transition: background .3s ease-out;
transition: background .3s ease-out;
}
.speechBubble:before {
@ -792,7 +826,6 @@ footer #footerSocials .zwiico-github:hover {
cursor: pointer;
display: none;
border-radius: 50%;
-webkit-transition: background.3s ease-out;
transition: background .3s ease-out;
}
#backToTop:hover {
@ -802,36 +835,39 @@ footer #footerSocials .zwiico-github:hover {
background: rgba(33, 34, 35, 1);
}
/* Message sur les cookies */
#cookieConsent {
opacity: .9;
background: #212223;
position: fixed;
right: 0;
bottom: 0;
left: 0;
color: #FFF;
padding: 10px;
z-index: 60;
text-align: center;
font-size: .9em;
}
#cookieConsentConfirm {
cursor: pointer;
margin-left: 10px;
background: #666;
padding: 4px 8px;
display: inline-block;
-webkit-transition: background.3s ease-out;
transition: background .3s ease-out;
}
#cookieConsentConfirm:hover {
background: #777;
}
/* Message sur les cookies */
#cookieConsent {
width: 80%;
margin: auto;
opacity: .9;
background: #212223;
position: fixed;
right: 0;
bottom: 5%;
left: 0;
color: #FFF;
padding: 10px;
z-index: 60;
text-align: center;
font-size: 1em;
}
#cookieConsentConfirm, #cookieConsentRefuse {
cursor: pointer;
margin-left: 10px;
background: #666;
padding: 4px 8px;
display: inline-block;
transition: background .3s ease-out;
}
#cookieConsentConfirm:hover, #cookieConsentRefuse:hover {
background: #777;
}
/* Bloc */
.block {
border: 1px solid #D8DFE3;
/* border: 1px solid #D8DFE3;*/
padding: 20px 20px 10px;
margin: 20px 0;
word-wrap: break-word;
@ -846,7 +882,12 @@ footer #footerSocials .zwiico-github:hover {
.block h4 {
margin: -20px -20px 10px -20px;
padding: 10px;
background: #ECEFF1;
/* background: #ECEFF1;*/
}
.block h4 .openClose {
display: inline-flex ;
float: right;
}
/* Aides */
@ -865,6 +906,10 @@ footer #footerSocials .zwiico-github:hover {
width: 100vw;
max-width: 500px;
padding: 20px;
}
.lightbox > span {
color: black;
}
.lightbox .lightboxButtons {
text-align: center;
@ -888,12 +933,11 @@ input[type='password'],
select,
textarea {
padding: 10px; /* -1px à cause des bordures */
background: #FFF;
/*background: #FFF;*/
border: 1px solid #D8DFE3;
width: 100%;
border-radius: 2px;
font-family: inherit;
-webkit-transition: border .3s ease-out;
transition: border .3s ease-out;
}
select {
@ -914,7 +958,7 @@ input[type='password'].notice,
select.notice,
textarea.notice {
border: 1px solid #E74C3C;
background: #FAD7D3;
/*background: #FAD7D3;*/
}
input[type='email'].notice:hover,
input[type='text'].notice:hover,
@ -941,7 +985,6 @@ button {
cursor: pointer;
font-family: inherit;
border-radius: 2px;
-webkit-transition: background .3s ease-out;
transition: background .3s ease-out;
}
textarea {
@ -973,10 +1016,9 @@ label {
user-select: none;
cursor: pointer;
border-radius: 2px;
-webkit-transition: background .3s ease-out;
transition: background .3s ease-out;
}
/* Bouton redimensionnable pour le formulaire*/
/* Bouton redimensionnable pour le formulaire*/
#formSubmit {
width: max-content;
float: right;
@ -990,16 +1032,6 @@ label {
background: #F6F7F8 !important;
color: #94A5B0 !important;
}
.button.buttonRed {
background: #E74C3C;
color: #FFF;
}
.button.buttonRed:hover {
background: #E53E2D;
}
.button.buttonRed:active {
background: #E3301E;
}
/* Upload de fichiers */
.inputFile {
@ -1020,6 +1052,16 @@ label {
text-decoration: none;
}
/* Empêche le débordement et les sauts de ligne */
.inputFileManagerWrapper {
display: inline;
}
.inputFileManagerWrapper > .inputFile {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Pagination */
.pagination {
padding: 10px 0;
@ -1303,6 +1345,7 @@ th.col12 {
width: 100%;
}
/**
* Classes rapides
*/
@ -1336,13 +1379,14 @@ th.col12 {
}
/*
* Effet accordéon
*/
.accordion {
padding: 0;
list-style: none;
list-style: none;
}
.accordion-title {
display: block;
@ -1357,4 +1401,39 @@ th.col12 {
}
.accordion-content {
padding: 7px;
}
}
/* Captcha
*/
.captcha img{
height: 30px;
vertical-align: middle;
padding-left: 10px;
padding-right: 10px;
}
.captcha input[type='text'] {
width: 4em;
text-align: center;
margin: auto auto auto 2em;
}
/*
* Couleur des icônes + et -
*/
.zwiico-minus-circled,
.zwiico-plus-circled {
color: #D8890B;
font-size: 1.3em !important;
}
.zwiico-minus-circled,
.zwiico-plus-circled {
transition: all 1s ease;
}
.zwiico-minus-circled:hover,
.zwiico-plus-circled:hover {
-webkit-transform:scale(1.25); /* Safari et Chrome */
-moz-transform:scale(1.25); /* Firefox */
-ms-transform:scale(1.25); /* Internet Explorer 9 */
-o-transform:scale(1.25); /* Opera */
transform:scale(1.25);
}

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**
@ -17,4 +17,8 @@
/* Site */
#site {
max-width: 600px !important;
}
section {
min-height: 0px;
}

View File

@ -2,12 +2,12 @@
<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#" lang="fr">
<head>
<meta charset="utf-8">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showFavicon(); ?>
<?php $layout->showVendor(); ?>
<?php $layout->showStyle(); ?>
@ -18,7 +18,7 @@
</head>
<body>
<?php $layout->showNotification(); ?>
<div id="site" class="container">
<div id="site" class="container light">
<section><?php $layout->showContent(); ?></section>
</div>
<?php $layout->showScript(); ?>

View File

@ -71,7 +71,7 @@
<div style="display:none;font-size:1px;line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;mso-hide:all;font-family: sans-serif;">
<?php echo $subject; ?>
</div>
<div style="max-width: 500px; margin: auto;" class="email-container">
<div style="max-width: 500px; margin: auto; margin-top: 30px; border: #aaa 1px solid;" class="email-container">
<!--[if mso]>
<table role="presentation" cellspacing="0" cellpadding="0" border="0" width="500" align="center">
<tr>

View File

@ -2,41 +2,42 @@
<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#" lang="fr">
<head>
<meta charset="utf-8">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showFavicon(); ?>
<?php $layout->showVendor(); ?>
<?php $layout->showAnalytics(); ?>
<?php $layout->showAnalytics(); ?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR.'custom.css'); ?>">
<?php $layout->showStyle(); ?>
<?php if (file_exists(self::DATA_DIR .'head.inc.html')) {
include(self::DATA_DIR .'head.inc.html');
include(self::DATA_DIR .'head.inc.html');
}?>
</head>
<body>
<?php $layout->showBar(); ?>
<?php if($this->getUser('group') > self::GROUP_MEMBER): ?>
<?php $layout->showBar(); ?>
<?php endif;?>
<?php $layout->showNotification(); ?>
<?php if($this->getData(['theme', 'menu', 'position']) === 'body-first' || $this->getData(['theme', 'menu', 'position']) === 'top' ): ?>
<!-- Menu dans le fond du site avant la bannière -->
<nav
<?php
// Détermine si le menu est fixe en haut de page lorsque l'utilisateur n'est pas connecté
//
if($this->getData(['theme', 'menu', 'position']) === 'top' &&
$this->getData(['theme', 'menu', 'fixed']) === true) {
if ($this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD'))
{echo 'id="navfixedlogout"';}
elseif ($this->getUrl(0) !== 'theme')
{echo 'id="navfixedconnected"';}
}
?>
>
<!-- Détermine si le menu est fixe en haut de page lorsque l'utilisateur n'est pas connecté -->
<?php
if ( $this->getData(['theme', 'menu', 'position']) === 'top'
AND $this->getData(['theme', 'menu', 'fixed']) === true
AND $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD',true)
AND $this->getUser('group') > self::GROUP_MEMBER) {
echo '<nav id="navfixedconnected" >';
} else {
echo '<nav id="navfixedlogout" >';
}
?>
<!-- Menu Burger -->
<div id="toggle">
<?php if ($this->getData(['theme','menu','burgerTitle']) === true ): ?>
<div id="burgerText"><?php echo $this->getData(['config','title']);?></div>
@ -45,15 +46,14 @@
<div id="menu" class="
<?php if($this->getData(['theme', 'menu', 'position']) === 'top'){echo 'container-large';}else{echo'container';}
?>">
<?php $layout->showMenu(); ?>
<?php $layout->showMenu(); ?>
</div> <!--fin menu -->
</nav>
<?php endif; ?>
<?php if($this->getData(['theme', 'header', 'position']) === 'body'): ?>
<!-- Bannière dans le fond du site -->
<header>
<?php
<header>
<?php
if ($this->getData(['theme','header','linkHomePage'])){
echo "<a href='" . helper::baseUrl(false) . "'>" ;} ?>
<div id="headerContainer" class="container">
@ -69,7 +69,7 @@
</div> <!--fin container -->
<?php
if ($this->getData(['theme','header','linkHomePage'])){echo "</a>";}
?>
?>
</header>
<?php endif; ?>
@ -106,7 +106,7 @@
)
): ?>
<!-- Bannière dans le site -->
<?php
<?php
if ($this->getData(['theme','header','linkHomePage'])){
echo "<a href='" . helper::baseUrl(false) . "'>" ;} ?>
<header <?php if($this->getData(['theme', 'header', 'position']) === 'hide'): ?>class="displayNone"<?php endif; ?>>
@ -146,7 +146,7 @@
<?php endif; ?>
<!-- Corps de page -->
<section>
<?php
<?php
// Gabarit :
// Récupérer la config de la page courante
$blocks = explode('-',$this->getData(['page',$this->getUrl(0),'block']));
@ -154,48 +154,48 @@
$blockleft=$blockright="";
switch (sizeof($blocks)) {
case 1 : // une colonne
$content = 'col'. $blocks[0] ;
break;
case 2 : // 2 blocks
$content = 'col'. $blocks[0] ;
break;
case 2 : // 2 blocs
if ($blocks[0] < $blocks[1]) { // détermine la position de la colonne
$blockleft = 'col'. $blocks[0];
$content = 'col'. $blocks[1] ;
} else {
$content = 'col' . $blocks[0];
$blockright = 'col' . $blocks[1];
$blockright = 'col' . $blocks[1];
}
break;
case 3 : // 3 blocks
case 3 : // 3 blocs
$blockleft = 'col' . $blocks[0];
$content = 'col' . $blocks[1];
$blockright = 'col' . $blocks[2];
$blockright = 'col' . $blocks[2];
}
// Page pleine pour la configuration des modules et l'édition des pages sauf l'affichae d'un article de blog
// Page pleine pour la configuration des modules et l'édition des pages sauf l'affichage d'un article de blog
$pattern = ['config','edit','add','comment','data'];
if ((sizeof($blocks) === 1 ||
if ((sizeof($blocks) === 1 ||
in_array($this->getUrl(1),$pattern) )
) { // Pleine page en mode configuration
$layout->showContent();
if (file_exists(self::DATA_DIR . 'body.inc.html')) {
include( self::DATA_DIR . 'body.inc.html');
}
include( self::DATA_DIR . 'body.inc.html');
}
} else {
?>
<div class="row siteContainer">
<?php
if ($blockleft !== "") :?>
<div class="<?php echo $blockleft; ?>" id="contentLeft"><?php $layout->showBarContentLeft(); ?></div>
<div class="row siteContainer">
<?php
if ($blockleft !== "") :?>
<div class="<?php echo $blockleft; ?>" id="contentLeft"><aside><?php $layout->showBarContentLeft(); ?></aside></div>
<?php endif; ?>
<div class="<?php echo $content; ?>" id="contentSite"><?php $layout->showContent();
if (file_exists(self::DATA_DIR . 'body.inc.html')) {
include(self::DATA_DIR . 'body.inc.html');
include(self::DATA_DIR . 'body.inc.html');
}
?>
</div>
<?php
if ($blockright !== "") :?>
<div class="<?php echo $blockright; ?>" id="contentRight"><?php $layout->showBarContentRight(); ?></div>
<?php endif; ?>
<?php
if ($blockright !== "") :?>
<div class="<?php echo $blockright; ?>" id="contentRight"><aside><?php $layout->showBarContentRight(); ?></aside></div>
<?php endif; ?>
</div>
<?php }
?>
@ -211,7 +211,7 @@
$this->getData(['theme', 'footer', 'position']) === 'hide'
AND $this->getUrl(0) === 'theme'
)
) { $position = 'site';
) { $position = 'site';
} else {
$position = 'body';
if ( $this->getData(['theme', 'footer', 'fixed']) === true) {
@ -220,7 +220,7 @@
echo '</div>';
}
?>
<!-- Pied de page -->
<!-- Pied de page -->
<footer <?php if($this->getData(['theme', 'footer', 'position']) === 'hide'): ?>class="displayNone"<?php endif; ?>>
<?php
if ($position === 'site'): ?>

View File

@ -1,84 +0,0 @@
<?php $layout = new layout($this); ?>
<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#" lang="fr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?>
<?php $layout->showMetaType(); ?>
<?php $layout->showMetaImage(); ?>
<?php $layout->showFavicon(); ?>
<?php $layout->showVendor(); ?>
<?php $layout->showAnalytics(); ?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>data/theme.css?<?php echo md5_file(self::DATA_DIR.'theme.css'); ?>">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false) . self::DATA_DIR; ?>custom.css?<?php echo md5_file(self::DATA_DIR.'custom.css'); ?>">
<?php $layout->showStyle(); ?>
<?php if (file_exists(self::DATA_DIR . 'head.inc.html')) {
include( self::DATA_DIR . 'head.inc.html');
}?>
</head>
<body>
<?php $layout->showNotification(); ?>
<!-- Corps de page -->
<section>
<?php
// Gabarit :
// Récupérer la config de la page courante
$blocks = explode('-',$this->getData(['page',$this->getUrl(0),'block']));
// Initialiser
$blockleft=$blockright="";
switch (sizeof($blocks)) {
case 1 : // une colonne
$content = 'col'. $blocks[0] ;
break;
case 2 : // 2 blocks
if ($blocks[0] < $blocks[1]) { // détermine la position de la colonne
$blockleft = 'col'. $blocks[0];
$content = 'col'. $blocks[1] ;
} else {
$content = 'col' . $blocks[0];
$blockright = 'col' . $blocks[1];
}
break;
case 3 : // 3 blocks
$blockleft = 'col' . $blocks[0];
$content = 'col' . $blocks[1];
$blockright = 'col' . $blocks[2];
}
// Page pleine pour la configuration des modules et l'édition des pages sauf l'affichae d'un article de blog
$pattern = ['config','edit','add','comment','data'];
if ((sizeof($blocks) === 1 ||
in_array($this->getUrl(1),$pattern) )
) { // Pleine page en mode configuration
$layout->showContent();
if (file_exists(self::DATA_DIR . 'body.inc.html')) {
include(self::DATA_DIR . 'body.inc.html');
}
} else {
?>
<div class="row siteContainer">
<?php
if ($blockleft !== "") :?>
<div class="<?php echo $blockleft; ?>" id="contentLeft"><?php $layout->showBarContentLeft(); ?></div>
<?php endif; ?>
<div class="<?php echo $content; ?>" id="contentSite"><?php $layout->showContent();
if (file_exists(self::DATA_DIR . 'body.inc.html')) {
include(self::DATA_DIR . 'body.inc.html');
}
?>
</div>
<?php
if ($blockright !== "") :?>
<div class="<?php echo $blockright; ?>" id="contentRight"><?php $layout->showBarContentRight(); ?></div>
<?php endif; ?>
</div>
<?php }
?>
</section>
<!-- Lien remonter en haut -->
<div id="backToTop"><?php echo template::ico('up'); ?></div>
<?php $layout->showScript();?>
</body>
</html>

View File

@ -11,22 +11,27 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
class config extends common {
public static $actions = [
'export' => self::GROUP_ADMIN,
'backup' => self::GROUP_ADMIN,
'configMetaImage' => self::GROUP_ADMIN,
'generateFiles' => self::GROUP_ADMIN,
'updateRobots' => self::GROUP_ADMIN,
'index' => self::GROUP_ADMIN,
'updateOnline' => self::GROUP_ADMIN
'manage' => self::GROUP_ADMIN,
'updateBaseUrl' => self::GROUP_ADMIN,
'script' => self::GROUP_ADMIN,
'logReset' => self::GROUP_ADMIN,
'logDownload'=> self::GROUP_ADMIN,
'blacklistReset' => self::GROUP_ADMIN,
'blacklistDownload' => self::GROUP_ADMIN
];
public static $newVersion;
public static $timezones = [
'Pacific/Midway' => '(GMT-11:00) Midway Island',
'US/Samoa' => '(GMT-11:00) Samoa',
@ -147,20 +152,47 @@ class config extends common {
5 => '5 articles',
10 => '10 articles',
15 => '15 articles',
20 => '20 articles'
20 => '20 articles'
];
// Type de proxy
public static $proxyType = [
'tcp://' => 'TCP',
'http://' => 'HTTP'
];
// Authentification SMTP
public static $SMTPauth = [
true => 'Oui',
false => 'Non'
];
// Encryptation SMTP
public static $SMTPEnc = [
'' => 'Aucune',
'tls' => 'START TLS',
'ssl' => 'SSL/TLS'
];
// Sécurité de la connexion - tentative max avant blocage
public static $connectAttempt = [
999 => 'Aucun',
3 => '3 tentatives',
5 => '5 tentatives',
10 => '10 tentatives'
];
// Sécurité de la connexion - durée du blocage
public static $connectTimeout = [
0 => 'Aucun',
300 => '5 minutes',
600 => '10 minutes',
900 => '15 minutes'
];
/**
* Génére les fichiers pour les crawlers
*/
public function generateFiles() {
// Mettre à jour le site map
$successSitemap=$this->createSitemap('all');
$successSitemap=$this->createSitemap();
// Creer un fichier robots.txt
// Créer un fichier robots.txt
$successRobots=$this->updateRobots();
if ( $successSitemap === true &&
$successRobots >= 100) {
@ -177,10 +209,10 @@ class config extends common {
}
/**
* Met à jour un fichier robots.txt lors du changement de réécriture
* Met à jour un fichier robots.txt lors du changement de réécriture
*/
public function updateRobots() {
private function updateRobots() {
// Créer le fichier robot si absent
if (!file_exists('robots.txt')) {
$this->createRobots();
@ -189,7 +221,7 @@ class config extends common {
rename ('robots.txt','robots.bak');
$fileold = fopen('robots.bak','r');
$filenew = fopen('robots.txt','w');
while(!feof($fileold)) {
while(!feof($fileold)) {
$data = fgets($fileold);
if (strpos($data,'sitemap.xml') == 0) {
fwrite($filenew, $data);
@ -208,43 +240,32 @@ class config extends common {
/**
* Sauvegarde des données
*/
public function export() {
// Creation du ZIP
$fileName = str_replace('/','',helper::baseUrl(false,false)) . '-'. date('Y-m-d-h-i-s', time()) . '.zip';
$zip = new ZipArchive();
$zip->open(self::TEMP_DIR . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$directory = 'site/';
$filter = array('backup','tmp');
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator(
$directory,
RecursiveDirectoryIterator::SKIP_DOTS
),
function ($fileInfo, $key, $iterator) use ($filter) {
return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter);
}
)
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen(realpath($directory)) + 1);
$zip->addFile($filePath, $relativePath);
}
public function backup() {
// Soumission du formulaire
if($this->isPost()) {
// Creation du ZIP
$filter = $this->getInput('configBackupOption',helper::FILTER_BOOLEAN) === true ? ['backup','tmp'] : ['backup','tmp','file'];
$fileName = helper::autoBackup(self::TEMP_DIR,$filter);
// Créer le répertoire manquant
if (!is_dir(self::FILE_DIR.'source/backup')) {
mkdir(self::FILE_DIR.'source/backup');
}
// Copie dans les fichiers
$success = copy (self::TEMP_DIR . $fileName , self::FILE_DIR.'source/backup/' . $fileName);
// Détruire le temporaire
unlink(self::TEMP_DIR . $fileName);
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => json_encode($success)
]);
} else {
// Valeurs en sortie
$this->addOutput([
'title' => 'Sauvegarder',
'view' => 'backup'
]);
}
$zip->close();
// Téléchargement du ZIP
header('Content-Type: application/zip');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize(self::TEMP_DIR . $fileName));
readfile(self::TEMP_DIR . $fileName);
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_RAW
]);
unlink(self::TEMP_DIR . $fileName);
}
/**
@ -252,36 +273,134 @@ class config extends common {
* https://www.codexworld.com/capture-screenshot-website-url-php-google-api/
*/
public function configMetaImage() {
// fonction désactivée pour un site local
if ( strpos(helper::baseUrl(false),'localhost') > 0 OR strpos(helper::baseUrl(false),'127.0.0.1') > 0) {
$site = 'https://zwiicms.com/'; } else {
// fonction désactivée pour un site local
if ( strpos(helper::baseUrl(false),'localhost') > 0 OR strpos(helper::baseUrl(false),'127.0.0.1') > 0) {
$site = 'https://zwiicms.fr/'; } else {
$site = helper::baseUrl(false); }
$success= false;
$googlePagespeedData = @file_get_contents('https://www.googleapis.com/pagespeedonline/v2/runPagespeed?url='. $site .'&screenshot=true');
$googlePagespeedData = helper::urlGetContents('https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url='. $site .'&screenshot=true');
if ($googlePagespeedData !== false) {
$googlePagespeedData = json_decode($googlePagespeedData, true);
$screenshot = $googlePagespeedData['screenshot']['data'];
$screenshot = str_replace(array('_','-'),array('/','+'),$screenshot);
$data = 'data:image/jpeg;base64,'.$screenshot;
$data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));
// Effacer la miniature
if (file_exists(self::FILE_DIR.'thumb/screenshot.png')) {
unlink (self::FILE_DIR.'thumb/screenshot.png');
$data = str_replace('_','/',$googlePagespeedData['lighthouseResult']['audits']['final-screenshot']['details']['data']);
$data = str_replace('-','+',$data);
$img = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $data));
$success = file_put_contents( self::FILE_DIR.'source/screenshot.jpg',$img) ;
// Effacer la miniature png
if (file_exists(self::FILE_DIR.'source/screenshot.png')) {
unlink (self::FILE_DIR.'source/screenshot.png');
}
file_put_contents( self::FILE_DIR.'source/screenshot.png',$data);
$success =true;
}
// Valeurs en sortie
$this->addOutput([
'notification' => $success === false ? 'Service inaccessible ou erreur d\'écriture de l\'image' : 'Image générée avec succès',
'redirect' => helper::baseUrl() . 'config',
'state' => $success === false ? false : true
]);
}
/**
* Procédure d'importation
*/
public function manage() {
// Soumission du formulaire
if($this->isPost()) {
//if ($this->getInput('configManageImportFile'))
$fileZip = $this->getInput('configManageImportFile');
$file_parts = pathinfo($fileZip);
$folder = date('Y-m-d-h-i-s', time());
$zip = new ZipArchive();
if ($file_parts['extension'] !== 'zip') {
// Valeurs en sortie erreur
$this->addOutput([
'notification' => 'Le fichier n\'est pas une archive valide',
'redirect' => helper::baseUrl() . 'config/manage',
'state' => false
]);
}
$successOpen = $zip->open(self::FILE_DIR . 'source/' . $fileZip);
if ($successOpen === FALSE) {
// Valeurs en sortie erreur
$this->addOutput([
'notification' => 'Impossible de lire l\'archive',
'redirect' => helper::baseUrl() . 'config/manage',
'state' => false
]);
}
// Lire le contenu de l'archive dans le tableau files
for( $i = 0; $i < $zip->numFiles; $i++ ){
$stat = $zip->statIndex( $i );
$files [] = ( basename( $stat['name'] ));
}
// Détermination de la version à installer
if (in_array('theme.json',$files) === true &&
in_array('core.json',$files) === true &&
in_array ('user.json', $files) === false ) {
// V9 pas de fichier user dans l'archive
// Stocker le choix de conserver les users installées
$version = '9';
} elseif (in_array('theme.json',$files) === true &&
in_array('core.json',$files) === true &&
in_array ('user.json', $files) === true &&
in_array ('config.json', $files) === true ) {
// V10 valide
$version = '10';
// Option active, les users sont stockées
if ($this->getInput('configManageImportUser', helper::FILTER_BOOLEAN) === true ) {
$users = $this->getData(['user']);
}
} else { // Version invalide
// Valeurs en sortie erreur
$this->addOutput([
'notification' => 'Cette archive n\'est pas une sauvegarde valide',
'redirect' => helper::baseUrl() . 'config/manage',
'state' => false
]);
}
// Préserver les comptes des utilisateurs d'une version 9 si option cochée
// Positionnement d'une variable de session lue au constructeurs
if ($version === '9') {
$_SESSION['KEEP_USERS'] = $this->getInput('configManageImportUser', helper::FILTER_BOOLEAN);
}
// Extraire le zip ou 'site/'
$success = $zip->extractTo( 'site/' );
// Fermer l'archive
$zip->close();
// Restaurer les users originaux d'une v10 si option cochée
if (!empty($users) &&
$version === '10' &&
$this->getInput('configManageImportUser', helper::FILTER_BOOLEAN) === true) {
$this->setData(['user',$users]);
}
/*
if ($version === '9' ) {
$this->importData($this->getInput('configManageImportUser', helper::FILTER_BOOLEAN));
$this->setData(['core','dataVersion',0]);
}*/
// Met à jours les URL dans les contenus de page
// Message de notification
$notification = $success === true ? 'Restauration réalisée avec succès' : 'Erreur inconnue';
$redirect = $this->getInput('configManageImportUser', helper::FILTER_BOOLEAN) === true ? helper::baseUrl() . 'config/manage' : helper::baseUrl() . 'user/login/';
// Valeurs en sortie erreur
$this->addOutput([
'notification' => $notification,
'redirect' =>$redirect,
'state' => $success
]);
}
// Valeurs en sortie
$this->addOutput([
'notification' => $success === true ? 'Image tag réinitialisée' : "Erreur : image tag non créée",
'redirect' => helper::baseUrl() . 'config',
'state' => $success
'title' => 'Restaurer',
'view' => 'manage'
]);
}
}
/**
* Configuration
@ -289,25 +408,47 @@ class config extends common {
public function index() {
// Soumission du formulaire
if($this->isPost()) {
$success = true;
// Basculement en mise à jour auto
// Remise à 0 du compteur
if ($this->getData(['config','autoUpdate']) === false &&
$this->getInput('configAutoUpdate', helper::FILTER_BOOLEAN) === true) {
$this->setData(['core','lastAutoUpdate',0]);
}
// Vérification du proxy
$proxy = $this->getData(['config','proxyType']) . $this->getData(['config','proxyUrl']) . ':' . $this->getData(['config','proxyPort']);
// Empêcher la modification si défini dans footer
if ( $this->getData(['theme','footer','displaySearch']) === true
AND $this->getInput('configSearchPageId') === 'none'
){
$searchPageId = $this->getData(['config','searchPageId']);
self::$inputNotices['configSearchPageId'] = 'Désactiver l\'option dans le pied de page';
$success = false;
} else {
$searchPageId = $this->getInput('configSearchPageId');
}
// Empêcher la modification si défini dans footer
if ( $this->getData(['theme','footer','displayLegal']) === true
AND $this->getInput('configLegalPageId') === 'none'
){
$legalPageId = $this->getData(['config','legalPageId']);
self::$inputNotices['configLegalPageId'] = 'Désactiver l\'option dans le pied de page';
$success = false;
} else {
$legalPageId = $this->getInput('configLegalPageId');
}
// Sauvegarder
$this->setData([
'config',
[
'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true),
'page404' => $this->getInput('configPage404'),
'page403' => $this->getInput('configPage403'),
'page302' => $this->getInput('configPage302'),
'analyticsId' => $this->getInput('configAnalyticsId'),
'autoBackup' => $this->getInput('configAutoBackup', helper::FILTER_BOOLEAN),
'maintenance' => $this->getInput('configMaintenance', helper::FILTER_BOOLEAN),
'cookieConsent' => $this->getInput('configCookieConsent', helper::FILTER_BOOLEAN),
'favicon' => $this->getInput('configFavicon'),
'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true),
'metaDescription' => $this->getInput('configMetaDescription', helper::FILTER_STRING_LONG, true),
'faviconDark' => $this->getInput('configFaviconDark'),
'social' => [
'facebookId' => $this->getInput('configSocialFacebookId'),
'linkedinId' => $this->getInput('configSocialLinkedinId'),
@ -319,19 +460,37 @@ class config extends common {
'githubId' => $this->getInput('configSocialGithubId')
],
'timezone' => $this->getInput('configTimezone', helper::FILTER_STRING_SHORT, true),
'title' => $this->getInput('configTitle', helper::FILTER_STRING_SHORT, true),
'itemsperPage' => $this->getInput('configItemsperPage', helper::FILTER_INT,true),
'legalPageId' => $this->getInput('configLegalPageId'),
'legalPageId' => $legalPageId,
'searchPageId' => $searchPageId,
'metaDescription' => $this->getInput('configMetaDescription', helper::FILTER_STRING_LONG, true),
'title' => $this->getInput('configTitle', helper::FILTER_STRING_SHORT, true),
'autoUpdate' => $this->getInput('configAutoUpdate', helper::FILTER_BOOLEAN),
'autoUpdateHtaccess' => $this->getInput('configAutoUpdateHtaccess', helper::FILTER_BOOLEAN),
'proxyType' => $this->getInput('configProxyType'),
'proxyUrl' => $this->getInput('configProxyUrl'),
'proxyPort' => $this->getInput('configProxyPort',helper::FILTER_INT)
'proxyPort' => $this->getInput('configProxyPort',helper::FILTER_INT),
'captchaStrong' => $this->getInput('configCaptchaStrong',helper::FILTER_BOOLEAN),
'smtp' => [
'enable' => $this->getInput('configSmtpEnable',helper::FILTER_BOOLEAN),
'host' => $this->getInput('configSmtpHost',helper::FILTER_STRING_SHORT),
'port' => $this->getInput('configSmtpPort',helper::FILTER_INT),
'auth' => $this->getInput('configSmtpAuth',helper::FILTER_BOOLEAN),
'secure' => $this->getInput('configSmtpSecure'),
'username' => $this->getInput('configSmtpUsername',helper::FILTER_STRING_SHORT),
'password' =>helper::encrypt($this->getData(['config','smtp','username']),$this->getInput('configSmtpPassword')),
'sender' => $this->getInput('configSmtpSender',helper::FILTER_MAIL)
],
'connect' => [
'attempt' => $this->getInput('configConnectAttempt',helper::FILTER_INT),
'timeout' => $this->getInput('configConnectTimeout',helper::FILTER_INT),
'log' => $this->getInput('configConnectLog',helper::FILTER_BOOLEAN),
'captcha' => $this->getInput('configConnectCaptcha',helper::FILTER_BOOLEAN),
]
]
]);
if(self::$inputNotices === []) {
// Ecrire les fichiers de script
file_put_contents(self::DATA_DIR . 'head.inc.html',$this->getInput('configScriptHead',null));
file_put_contents(self::DATA_DIR . 'body.inc.html',$this->getInput('configScriptBody',null));
// Active la réécriture d'URL
$rewrite = $this->getInput('rewrite', helper::FILTER_BOOLEAN);
if(
@ -365,8 +524,8 @@ class config extends common {
// Change le statut de la réécriture d'URL (pour le helper::baseUrl() de la redirection)
helper::$rewriteStatus = false;
}
// Met à jour la baseUrl
$this->setData(['core', 'baseUrl', helper::baseUrl(true,false) ]);
// Met à jour la baseUrl
$this->setData(['core', 'baseUrl', helper::baseUrl(true,false) ]);
}
// Générer robots.txt et sitemap
$this->generateFiles();
@ -374,13 +533,15 @@ class config extends common {
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => 'Modifications enregistrées',
'state' => true
'state' => $success
]);
}
// Initialisation du screen
if (!file_exists(self::FILE_DIR.'source/screenshot.png')) {
// Initialisation du screen - APPEL AUTO DESACTIVE POUR EVITER UN RALENTISSEMENT
/*
if (!file_exists(self::FILE_DIR.'source/screenshot.jpg')) {
$this->configMetaImage();
}
*/
// Valeurs en sortie
$this->addOutput([
'title' => 'Configuration',
@ -388,44 +549,225 @@ class config extends common {
]);
}
/**
* Mise à jour présente
*/
public function updateOnline() {
// Nouvelle version
self::$newVersion = file_get_contents('http://zwiicms.com/update/' . common::ZWII_UPDATE_CHANNEL . '/version');
public function script() {
// Soumission du formulaire
if($this->isPost()) {
// Ecrire les fichiers de script
if ($this->geturl(2) === 'head') {
file_put_contents(self::DATA_DIR . 'head.inc.html',$this->getInput('configScriptHead',null));
}
if ($this->geturl(2) === 'body') {
file_put_contents(self::DATA_DIR . 'body.inc.html',$this->getInput('configScriptBody',null));
}
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'config/script/'. $this->geturl(2),
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'notification' => 'Version installée : '. common::ZWII_VERSION . '<br>Version de la mise à jour en ligne : '. self::$newVersion ,
'redirect' => helper::baseUrl() . 'config',
'state' => true
'title' => 'Éditeur de script dans ' . ucfirst($this->geturl(2)) ,
'vendor' => [
'codemirror'
],
'view' => 'script'
]);
}
}
class configHelper extends helper {
/**
* Scan le contenu d'un dossier et de ses sous-dossiers
* @param string $dir Dossier à scanner
* @return array
* Met à jour les données de site avec l'adresse transmise
*/
public static function scanDir($dir) {
$dirContent = [];
$iterator = new DirectoryIterator($dir);
foreach($iterator as $fileInfos) {
if(in_array($fileInfos->getFilename(), ['.', '..', 'backup'])) {
continue;
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->getData(['page',$parentId,'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->setData(['page',$parentId,'content', $replace ]);
$c3 += $c1 + $c2;
}
elseif($fileInfos->isDir()) {
$dirContent = array_merge($dirContent, self::scanDir($fileInfos->getPathname()));
}
else {
$dirContent[] = $fileInfos->getPathname();
foreach($childIds as $childId) {
$content = $this->getData(['page',$childId,'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->setData(['page',$childId,'content', $replace ]);
$c3 += $c1 + $c2;
}
}
}
return $dirContent;
// 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([
'notification' => $success ? $c3. ' conversion' . ($c3 > 1 ? 's' : '') . ' effectuée' . ($c3 > 1 ? 's' : '') : 'Aucune conversion',
'redirect' => helper::baseUrl() . 'config/manage',
'state' => $success ? true : false
]);
}
/**
* Vider le fichier de log
*/
public function logReset() {
if ( file_exists(self::DATA_DIR . 'journal.log') ) {
unlink(self::DATA_DIR . 'journal.log');
// Créer les en-têtes des journaux
$d = 'Date;Heure;IP;Id;Action' . PHP_EOL;
file_put_contents(self::DATA_DIR . 'journal.log',$d);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Journal réinitialisé avec succès',
'state' => true
]);
} else {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Aucun journal à effacer',
'state' => false
]);
}
}
/**
* Télécharger le fichier de log
*/
public function logDownload() {
$fileName = self::DATA_DIR . 'journal.log';
if (file_exists($fileName)) {
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize($fileName));
readfile( $fileName);
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_RAW
]);
// Valeurs en sortie
$this->addOutput([
'title' => 'Configuration',
'view' => 'index'
]);
} else {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Aucun fichier journal à télécharger',
'state' => false
]);
}
}
/**
* Tableau des IP blacklistés
*/
public function blacklistDownload () {
$fileName = self::TEMP_DIR . 'blacklist.log';
$d = 'Date dernière tentative;Heure dernière tentative;Id;Adresse IP;Nombre d\'échecs' . PHP_EOL;
file_put_contents($fileName,$d);
if ( file_exists($fileName) ) {
$d = $this->getData(['blacklist']);
$data = '';
foreach ($d as $key => $item) {
$data .= mb_detect_encoding(strftime('%d/%m/%y',$item['lastFail']), 'UTF-8', true)
? strftime('%d/%m/%y',$item['lastFail']) . ';' . utf8_encode(strftime('%R',$item['lastFail'])) . ';'
: utf8_encode(strftime('%d/%m/%y',$item['lastFail'])) . ';' . utf8_encode(strftime('%R',$item['lastFail'])) . ';' ;
$data .= $key . ';' . $item['ip'] . ';' . $item['connectFail'] . PHP_EOL;
}
file_put_contents($fileName,$data,FILE_APPEND);
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $fileName . '"');
header('Content-Length: ' . filesize($fileName));
readfile( $fileName);
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_RAW
]);
unlink(self::TEMP_DIR . 'blacklist.log');
// Valeurs en sortie
$this->addOutput([
'title' => 'Configuration',
'view' => 'index'
]);
} else {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Aucune liste noire à télécharger',
'state' => false
]);
}
}
/**
* Réinitialiser les ip blacklistées
*/
public function blacklistReset() {
if ( file_exists(self::DATA_DIR . 'blacklist.json') ) {
unlink(self::DATA_DIR . 'blacklist.json');
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Liste noire réinitialisée avec succès',
'state' => true
]);
} else {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Pas de liste à effacer',
'state' => false
]);
}
}
/**
* 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;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -0,0 +1,61 @@
/**
* 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 <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
/**
* Effet d'animation
*/
/* Start by setting display:none to make this hidden.
Then we position it in relation to the viewport window
with position:fixed. Width, height, top and left speak
for themselves. Background we set to 80% white with
our animation centered, and no-repeating */
.modal {
display: none;
position: fixed;
z-index: 1000;
top: 0;
left: 0;
height: 100%;
width: 100%;
background: rgba( 0, 0, 0, .9 )
url('core/module/config/ressource/ajax-loader.png')
50% 45%
no-repeat;
}
.alertMessage {
color: lightgrey;
display: none;
display: flex;
align-items: center;
justify-content: center;
}
/* When the body has the loading class, we turn
the scrollbar off with overflow:hidden */
body.loading .modal .alertMessage {
overflow: hidden;
}
/* Anytime the body has the loading class, our
modal element will be visible */
body.loading .modal .alertMessage {
display: block;
}

View File

@ -0,0 +1,43 @@
/**
* 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 Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
$( document).ready(function() {
$("#configBackupForm").submit( function(e){
$("#configBackupSubmit").addClass("disabled").prop("disabled", true);
e.preventDefault();
if ($("input[name=configBackupOption]").is(':checked')) {
$("body").addClass("loading");
$(".modal").addClass("alertMessage");
}
var url = "<?php echo helper::baseUrl() . $this->getUrl(0); ?>/backup";
$.ajax({
type: "POST",
url: url,
data: $("form").serialize(),
success: function(data){
$("body").removeClass("loading");
core.alert("La sauvegarde a été générée avec succès.");
},
error: function(data){
$("body").removeClass("loading");
core.alert("Une erreur s'est produite, la sauvegarde n'a pas été générée !");
},
complete: function(){
if ($("input[name=configBackupOption]").is(':checked')) {
$(".modal").removeClass("alertMessage");
}
$("#configBackupSubmit").removeClass("disabled").prop("disabled", false);
}
});
});
});

View File

@ -0,0 +1,36 @@
<?php echo template::formOpen('configBackupForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configBackupBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('configBackupSubmit',[
'value' => 'Sauvegarder'
]); ?>
</div>
<div class="modal">Merci de patienter, je travaille pour vous.<!-- Emplacement pour l'animation --></div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Paramètre</h4>
<div class="row">
<div class="col12">
<?php echo template::checkbox('configBackupOption', true, 'Inclure le contenu du gestionnaire de fichiers', [
'checked' => true,
'help' => 'Si le contenu du gestionnaire de fichiers est très volumineux, mieux vaut une copie par FTP.'
]); ?>
</div>
<div class="col12">
<em>L'archive est générée dans <a href="<?php echo helper::baseUrl(false); ?>core/vendor/filemanager/dialog.php?fldr=backup&type=0&akey=<?php echo md5_file(self::DATA_DIR.'core.json'); ?>" data-lity>le dossier Backup</a> du gestionnaire de fichiers.</em>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

26
core/module/config/view/index/index.css Normal file → Executable file
View File

@ -9,7 +9,29 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/
.blockContainer {
display : none;
}
#info .zwiico-plus-circled {
display: inline;
}
.zwiico-minus-circled,
#info .zwiico-minus-circled {
display: none;
}
.zwiico-minus-circled,
.zwiico-plus-circled {
cursor: pointer;
}

View File

@ -0,0 +1,135 @@
/**
* 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 Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
$( document).ready(function() {
/**
* Afficher et masquer options SMTP
*/
if ($("input[name=configSmtpEnable]").is(':checked')) {
$("#configSmtpParam").addClass("disabled");
$("#configSmtpParam").slideDown();
} else {
$("#configSmtpParam").removeClass("disabled");
$("#configSmtpParam").slideUp();
}
/**
* Afficher et masquer options Auth
*/
if ($("select[name=configSmtpAuth]").val() == true) {
$("#configSmtpAuthParam").addClass("disabled");
$("#configSmtpAuthParam").slideDown();
} else {
$("#configSmtpAuthParam").removeClass("disabled");
$("#configSmtpAuthParam").slideUp();
}
/**
* Initialisation des blocs
*/
var i = [ "social", "ceo", "network", "smtp", "login", "logs", "script" ];
$.each(i,function(e) {
if (getCookie(i[e]) === "true") {
$("#" + i[e]).find(".zwiico-plus-circled").hide();
$("#" + i[e]).find(".zwiico-minus-circled").show();
$("#" + i[e]).find(".blockContainer").show();
}
});
/**
*
* Blocs dépliants
*/
$("div .block").click(function(e) {
$(this).find(".zwiico-plus-circled").toggle();
$(this).find(".zwiico-minus-circled").toggle();
$(this).find(".blockContainer").slideToggle();
/*
* Sauvegarder la position des blocs
* true = bloc déplié
*/
document.cookie = $(this).attr('id') + "=" + $(this).find(".zwiico-minus-circled").is(":visible") + ";expires=Fri, 31 Dec 9999 23:59:59 GMT;path=/;SameSite=Lax";
}).on("click", "span > input, input, textarea, label, option, button, a:not(.inputFile), .blockContainer", function(e) {
// Empêcher les déclenchements dans les blocs
e.stopPropagation();
});
/**
* Afficher et masquer options SMTP
*/
$("input[name=configSmtpEnable]").on("change", function() {
if ($("input[name=configSmtpEnable]").is(':checked')) {
$("#configSmtpParam").addClass("disabled");
$("#configSmtpParam").slideDown();
} else {
$("#configSmtpParam").removeClass("disabled");
$("#configSmtpParam").slideUp();
}
});
/**
* Afficher et masquer options Auth
*/
$("select[name=configSmtpAuth]").on("change", function() {
if ($("select[name=configSmtpAuth]").val() == true) {
$("#configSmtpAuthParam").addClass("disabled");
$("#configSmtpAuthParam").slideDown();
} else {
$("#configSmtpAuthParam").removeClass("disabled");
$("#configSmtpAuthParam").slideUp();
}
});
/**
* Options de blocage de connexions
* Contrôle la cohérence des sélections et interdit une seule valeur Aucune
*/
$("select[name=configConnectAttempt]").on("change", function() {
if ($("select[name=configConnectAttempt]").val() === "999") {
$("select[name=configConnectTimeout]").val(0);
} else {
if ($("select[name=configConnectTimeout]").val() === "0") {
$("select[name=configConnectTimeout]").val(300);
}
}
});
$("select[name=configConnectTimeout]").on("change", function() {
if ($("select[name=configConnectTimeout]").val() === "0") {
$("select[name=configConnectAttempt]").val(999);
} else {
if ($("select[name=configConnectAttempt]").val() === "999") {
$("select[name=configConnectAttempt]").val(3);
}
}
});
});
/**
* Lire un cookie s'il existe
*/
function getCookie(name) {
var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
}

View File

@ -8,7 +8,19 @@
'value' => 'Accueil'
]); ?>
</div>
<div class="col2 offset8">
<div class="col2 offset4">
<?php echo template::button('configManageButton', [
'href' => helper::baseUrl() . 'config/backup',
'value' => 'Sauvegarder'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configManageButton', [
'href' => helper::baseUrl() . 'config/manage',
'value' => 'Restaurer'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('configSubmit'); ?>
</div>
</div>
@ -17,34 +29,40 @@
<div class="block">
<h4>Informations générales</h4>
<div class="row">
<div class="col4">
<?php echo template::select('configHomePageId', helper::arrayCollumn($this->getData(['page']), 'title', 'SORT_ASC'), [
'label' => 'Page d\'accueil',
'selected' => $this->getData(['config', 'homePageId'])
]); ?>
</div>
<div class="col8">
<div class="col9">
<?php echo template::text('configTitle', [
'label' => 'Titre du site',
'value' => $this->getData(['config', 'title']),
'help' => 'Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.'
]); ?>
</div>
</div>
<div class="col3">
<?php echo template::text('configVersion', [
'label' => 'ZwiiCMS Version',
'value' => common::ZWII_VERSION,
'readonly' => true
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('configMetaDescription', [
'label' => 'Description du site',
'value' => $this->getData(['config', 'metaDescription']),
'help' => 'La description participe au référencement, n\'oubliez pas de personnaliser la description de chaque page sans un copié collé.'
]); ?>
</div>
</div>
<?php echo template::textarea('configMetaDescription', [
'label' => 'Description du site',
'value' => $this->getData(['config', 'metaDescription']),
'help' => 'Elle apparaît dans les partages sur les réseaux sociaux.'
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Réglages</h4>
<h4>Paramètres généraux</h4>
<?php $error = helper::urlGetContents('http://zwiicms.fr/update/' . common::ZWII_UPDATE_CHANNEL . '/version');?>
<div class="row">
<div class="col6">
<div class="col4">
<?php echo template::file('configFavicon', [
'type' => 1,
'help' => 'Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
@ -52,7 +70,15 @@
'value' => $this->getData(['config', 'favicon'])
]); ?>
</div>
<div class="col6">
<div class="col4">
<?php echo template::file('configFaviconDark', [
'type' => 1,
'help' => 'Sélectionnez une icône adaptée à un thème sombre.<br>Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
'label' => 'Favicon thème sombre',
'value' => $this->getData(['config', 'faviconDark'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('configItemsperPage', $module::$ItemsList, [
'label' => 'Articles par page',
'selected' => $this->getData(['config', 'itemsperPage']),
@ -61,308 +87,511 @@
</div>
</div>
<div class="row">
<div class="col6">
<div class="col4">
<?php echo template::select('configTimezone', $module::$timezones, [
'label' => 'Fuseau horaire',
'selected' => $this->getData(['config', 'timezone']),
'help' => 'Le fuseau horaire est utile au bon référencement'
]); ?>
</div>
<div class="col6">
<?php $listePageId = array_merge(['' => 'Sélectionner'] , helper::arrayCollumn($this->getData(['page']), 'title', 'SORT_ASC') );
?>
<?php echo template::select('configLegalPageId', $listePageId , [
'label' => 'Mentions légales',
'selected' => $this->getData(['config', 'legalPageId']),
'help' => 'Les mentions légales sont obligatoires en France'
]); ?>
</div>
</div>
<div class="col12">
<div class="row">
<?php echo template::checkbox('configCookieConsent', true, 'Message de consentement aux cookies', [
'checked' => $this->getData(['config', 'cookieConsent'])
]); ?>
</div>
</div>
<div class="col12">
<div class="row">
<div class="col4 verticalAlignBottom">
<?php echo template::checkbox('configCookieConsent', true, 'Consentement aux cookies', [
'checked' => $this->getData(['config', 'cookieConsent'])
]); ?>
</div>
<div class="col4 verticalAlignBottom">
<?php echo template::checkbox('configCaptchaStrong', true, 'Captcha renforcé', [
'checked' => $this->getData(['config','captchaStrong']),
'help' => 'Option recommandée pour sécuriser la connexion. S\'applique à tous les captchas du site.'
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::checkbox('rewrite', true, 'Réécriture d\'URL', [
'checked' => helper::checkRewrite(),
'help' => 'Vérifiez d\'abord que votre serveur l\'autorise : ce n\'est pas le cas chez Free.'
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Réseaux sociaux</h4>
<div class="row">
<div class="col4">
<?php echo template::text('configSocialFacebookId', [
'help' => 'Saisissez votre ID : https://www.facebook.com/[ID].',
'label' => 'Facebook',
'value' => $this->getData(['config', 'social', 'facebookId'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('configSocialInstagramId', [
'help' => 'Saisissez votre ID : https://www.instagram.com/[ID].',
'label' => 'Instagram',
'value' => $this->getData(['config', 'social', 'instagramId'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('configSocialTwitterId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
'label' => 'Twitter',
'value' => $this->getData(['config', 'social', 'twitterId'])
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::text('configSocialYoutubeId', [
'help' => 'ID de la chaîne : https://www.youtube.com/channel/[ID].',
'label' => 'Chaîne Youtube',
'value' => $this->getData(['config', 'social', 'youtubeId'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('configSocialYoutubeUserId', [
'help' => 'Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].',
'label' => 'Youtube',
'value' => $this->getData(['config', 'social', 'youtubeUserId'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('configSocialPinterestId', [
'help' => 'Saisissez votre ID : https://pinterest.com/[ID].',
'label' => 'Pinterest',
'value' => $this->getData(['config', 'social', 'pinterestId'])
]); ?>
</div>
</div>
<div class="row">
<div class="col4 offset2">
<?php echo template::text('configSocialGithubId', [
'help' => 'Saisissez votre ID Github : https://github.com/[ID].',
'label' => 'Github',
'value' => $this->getData(['config', 'social', 'githubId'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('configSocialLinkedinId', [
'help' => 'Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].',
'label' => 'Linkedin',
'value' => $this->getData(['config', 'social', 'linkedinId'])
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Gestion et sauvegarde</h4>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAutoBackup', true, 'Sauvegarde automatisée quotidienne partielle', [
'checked' => $this->getData(['config', 'autoBackup']),
'help' => '<p>Une archive contenant le dossier /site/data est copiée dans le dossier \'site/backup\'. La sauvegarde est conservée pendant 30 jours.</p><p>Le contenu du gestionnaire de fichiers n\'est pas sauvegardé.</p>'
]); ?>
</div>
<div class="col4 offset1">
<?php echo template::button('configExport', [
'href' => helper::baseUrl() . 'config/export',
'value' => 'Exporter une copie intégrale du site',
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAutoUpdate', true, 'Recherche de mise à jour automatisée ', [
'checked' => $this->getData(['config', 'autoUpdate']),
'help' => 'Vérification de l\'existence d\'une mise à jour en ligne une fois par jour.'
]); ?>
</div>
<div class="col3">
<?php echo template::button('configUpdateOnline', [
'href' => helper::baseUrl() . 'config/updateOnline',
'value' => 'Version en ligne'
]); ?>
</div>
<div class="col3">
<?php echo template::button('configUpdateForced', [
'href' => helper::baseUrl() . 'install/update',
'value' => 'Mise à jour forcée'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::checkbox('configMaintenance', true, 'Site en maintenance', [
'checked' => $this->getData(['config', 'maintenance'])
]); ?>
</div>
</div>
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('configAutoBackup', true, 'Sauvegarde quotidienne', [
'checked' => $this->getData(['config', 'autoBackup']),
'help' => '<p>Une archive contenant le dossier /site/data est copiée dans le dossier \'site/backup\'. La sauvegarde est conservée pendant 30 jours.</p><p>Les fichiers du site ne sont pas sauvegardés automatiquement.</p>'
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::checkbox('configAutoUpdate', true, 'Mise à jour en ligne', [
'checked' => $this->getData(['config', 'autoUpdate']),
'help' => 'Vérifie une fois par jour l\'existence d\'une mise à jour.',
'disabled' => !$error
]); ?>
</div>
<div class="col4 ">
<?php echo template::checkbox('configAutoUpdateHtaccess', true, 'Préserver htaccess', [
'checked' => $this->getData(['config', 'autoUpdateHtaccess']),
'help' => 'Lors d\'une mise à jour automatique, conserve le fichier htaccess de la racine du site.',
'disabled' => !$error
]); ?>
</div>
<div class="col4 ">
<?php echo template::button('configUpdateForced', [
'ico' => 'download-cloud',
'href' => helper::baseUrl() . 'install/update',
'value' => 'Mise à jour manuelle',
'class' => 'buttonRed',
'disabled' => !$error
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Référencement</h4>
<h4>Pages spéciales</h4>
<div class="row">
<div class="col6">
<div class="row">
<div class="col10 offset1">
<?php echo template::button('configMetaImage', [
<div class="col4">
<?php
$pages = $this->getData(['page']);
foreach($pages as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true) {
unset($pages[$page]);
}
}
$orphans = $this->getData(['page']);
foreach($orphans as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true ||
$this->getdata(['page',$page, 'position']) !== 0) {
unset($orphans[$page]);
}
}
echo template::select('configHomePageId', helper::arrayCollumn($pages, 'title', 'SORT_ASC'), [
'label' => 'Accueil du site',
'selected' =>$this->getData(['config', 'homePageId']),
'help' => 'La première page que vos visiteurs verront.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configLegalPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($pages, 'title', 'SORT_ASC') ) , [
'label' => 'Mentions légales',
'selected' => $this->getData(['config', 'legalPageId']),
'help' => 'Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configSearchPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($pages, 'title', 'SORT_ASC') ) , [
'label' => 'Recherche dans le site',
'selected' => $this->getData(['config', 'searchPageId']),
'help' => 'Sélectionner la page "Recherche" ou une page contenant le module "Recherche" permet d\'activer un lien dans le pied de page. '
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php
echo template::select('configPage403', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($orphans, 'title', 'SORT_ASC')), [
'label' => 'Accès interdit, erreur 403',
'selected' =>$this->getData(['config', 'page403']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
<div class="col4">
<?php
echo template::select('configPage404', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($orphans, 'title', 'SORT_ASC')), [
'label' => 'Page inexistante, erreur 404',
'selected' =>$this->getData(['config', 'page404']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
<div class="col4">
<?php
echo template::select('configPage302', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($orphans, 'title', 'SORT_ASC')), [
'label' => 'Site en maintenance',
'selected' =>$this->getData(['config', 'page302']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="social">
<h4>Réseaux sociaux
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::text('configSocialFacebookId', [
'help' => 'Saisissez votre ID : https://www.facebook.com/[ID].',
'label' => 'Facebook',
'value' => $this->getData(['config', 'social', 'facebookId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configSocialInstagramId', [
'help' => 'Saisissez votre ID : https://www.instagram.com/[ID].',
'label' => 'Instagram',
'value' => $this->getData(['config', 'social', 'instagramId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configSocialYoutubeId', [
'help' => 'ID de la chaîne : https://www.youtube.com/channel/[ID].',
'label' => 'Chaîne Youtube',
'value' => $this->getData(['config', 'social', 'youtubeId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configSocialYoutubeUserId', [
'help' => 'Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].',
'label' => 'Youtube',
'value' => $this->getData(['config', 'social', 'youtubeUserId'])
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::text('configSocialTwitterId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
'label' => 'Twitter',
'value' => $this->getData(['config', 'social', 'twitterId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configSocialPinterestId', [
'help' => 'Saisissez votre ID : https://pinterest.com/[ID].',
'label' => 'Pinterest',
'value' => $this->getData(['config', 'social', 'pinterestId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configSocialLinkedinId', [
'help' => 'Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].',
'label' => 'Linkedin',
'value' => $this->getData(['config', 'social', 'linkedinId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configSocialGithubId', [
'help' => 'Saisissez votre ID Github : https://github.com/[ID].',
'label' => 'Github',
'value' => $this->getData(['config', 'social', 'githubId'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="ceo">
<h4>Référencement
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col4 offset1">
<div class="row">
<div class="col12">
<?php echo template::button('configMetaImage', [
'href' => helper::baseUrl() . 'config/configMetaImage',
'value' => 'Rafraîchir la capture d\'écran Open Graph'
]); ?>
'value' => 'Capture Open Graph',
'ico' => 'pencil'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::button('configSiteMap', [
'href' => helper::baseUrl() . 'config/generateFiles',
'value' => 'Sitemap.xml / Robots.txt',
'ico' => 'pencil'
]); ?>
</div>
</div>
</div>
<div class="col6 offset1">
<?php if (file_exists(self::FILE_DIR.'source/screenshot.jpg')): ?>
<div class="row">
<div class="col8 offset2 textAlignCenter">
<img src="<?php echo helper::baseUrl(false) . self::FILE_DIR.'source/screenshot.jpg';?>" data-tippy-content="Cette capture d'écran est nécessaire aux partages sur les réseaux sociaux. Elle est régénérée lorsque le fichier 'screenshot.jpg' est effacé du gestionnaire de fichiers." />
</div>
</div>
<?php endif;?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="login">
<h4>Sécurité de la connexion
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::select('configConnectAttempt', $module::$connectAttempt , [
'label' => 'Connexions successives',
'selected' => $this->getData(['config', 'connect', 'attempt'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('configConnectTimeout', $module::$connectTimeout , [
'label' => 'Blocage après échecs',
'selected' => $this->getData(['config', 'connect', 'timeout'])
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<label id="helpBlacklist">Comptes inexistants
<?php echo template::help(
'La liste noire énumère les tentatives de connexion à partir de comptes inexistants. Sont stockés : la date, l\'heure, le nom du compte et l\'IP.
Après le nombre de tentatives autorisées, l\'IP et le compte sont bloqués.');
?>
</label>
<?php echo template::button('configConnectblacListDownload', [
'href' => helper::baseUrl() . 'config/blacklistDownload',
'value' => 'Télécharger liste noire',
'ico' => 'download'
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('ConfigConnectReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/blacklistReset',
'value' => 'Réinitialiser liste',
'ico' => 'cancel'
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::checkbox('configConnectCaptcha', true, 'Captcha à la connexion', [
'checked' => $this->getData(['config', 'connect','captcha'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="logs">
<h4>Journalisation
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col4 verticalAlignBottom">
<?php echo template::checkbox('configConnectLog', true, 'Activer la journalisation', [
'checked' => $this->getData(['config', 'connect', 'log'])
]); ?>
</div>
<div class="col3 offset2">
<?php echo template::button('ConfigLogDownload', [
'href' => helper::baseUrl() . 'config/logDownload',
'value' => 'Télécharger journal',
'ico' => 'download'
]); ?>
</div>
<div class="col3">
<?php echo template::button('ConfigLogReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/logReset',
'value' => 'Réinitialiser journal',
'ico' => 'cancel'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="network">
<h4>Réseau
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col2">
<?php echo template::select('configProxyType', $module::$proxyType, [
'label' => 'Type de proxy',
'selected' => $this->getData(['config', 'proxyType'])
]); ?>
</div>
<div class="col8">
<?php echo template::text('configProxyUrl', [
'label' => 'Adresse du proxy',
'placeholder' => 'cache.proxy.fr',
'value' => $this->getData(['config', 'proxyUrl'])
]); ?>
</div>
<div class="col2">
<?php echo template::text('configProxyPort', [
'label' => 'Port du proxy',
'placeholder' => '6060',
'value' => $this->getData(['config', 'proxyPort'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="smtp">
<h4>Messagerie SMTP
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col12">
<?php echo template::checkbox('configSmtpEnable', true, 'Activer SMTP', [
'checked' => $this->getData(['config', 'smtp','enable']),
'help' => 'Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d\'envoi de mail.'
]); ?>
</div>
</div>
<div id="configSmtpParam">
<div class="row">
<div class="col10 offset1">
<?php echo template::button('configSiteMap', [
'href' => helper::baseUrl() . 'config/generateFiles',
'value' => 'Rafraîchir sitemap.xml et robots.txt'
<div class="col8">
<?php echo template::text('configSmtpHost', [
'label' => 'Adresse SMTP',
'placeholder' => 'smtp.fr',
'value' => $this->getData(['config', 'smtp','host'])
]); ?>
</div>
<div class="col2">
<?php echo template::text('configSmtpPort', [
'label' => 'Port SMTP',
'placeholder' => '589',
'value' => $this->getData(['config', 'smtp','port'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('configSmtpAuth', $module::$SMTPauth, [
'label' => 'Authentification',
'selected' => $this->getData(['config', 'smtp','auth'])
]); ?>
</div>
</div>
</div>
<div class="col6 textAlignCenter">
<img id="metaImage" src="<?php echo helper::baseUrl(false) . self::FILE_DIR.'source/screenshot.png';?>" data-tippy-content="Cette capture d'écran est nécessaire aux partages sur les réseaux sociaux. Elle est régénérée lorsque le fichier 'screenshot.png' est effacé du gestionnaire de fichiers." />
<div id="configSmtpAuthParam">
<div class="row">
<div class="col5">
<?php echo template::text('configSmtpUsername', [
'label' => 'Nom utilisateur',
'value' => $this->getData(['config', 'smtp','username' ])
]); ?>
</div>
<div class="col5">
<?php echo template::password('configSmtpPassword', [
'label' => 'Mot de passe',
'autocomplete' => 'off',
'value' => $this->getData(['config', 'smtp','username' ]) ? helper::decrypt ($this->getData(['config', 'smtp','username' ]),$this->getData(['config','smtp','password'])) : ''
]); ?>
</div>
<div class="col2">
<?php echo template::select('configSmtpSecure', $module::$SMTPEnc , [
'label' => 'Sécurité',
'selected' => $this->getData(['config', 'smtp','secure'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<?php
// Lire le contenu des fichiers de script
$headerFile = "";
if (file_exists( self::DATA_DIR . 'head.inc.html')) {
$headerFile = file_get_contents (self::DATA_DIR . 'head.inc.html');
}
$bodyFile = "";
if (file_exists( self::DATA_DIR . 'body.inc.html')) {
$bodyFile = file_get_contents (self::DATA_DIR . 'body.inc.html');
}
?>
<div class="block">
<h4>Options avancées</h4>
<div class="row">
<div class="col3">
<?php echo template::text('configAnalyticsId', [
'help' => 'Saisissez l\'ID de suivi.',
'label' => 'Google Analytics',
'placeholder' => 'UA-XXXXXXXX-X',
'value' => $this->getData(['config', 'analyticsId'])
]); ?>
<div class="block" id="script">
<h4>Scripts
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::textarea('configScriptHead', [
'label' => 'Insérer un script dans "Head"',
'value' => $headerFile
]); ?>
</div>
<div class="col6">
<?php echo template::textarea('configScriptBody', [
'label' => 'Insérer un script dans "Body"',
'value' => $bodyFile
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::text('configAnalyticsId', [
'help' => 'Saisissez l\'ID de suivi.',
'label' => 'Google Analytics',
'placeholder' => 'UA-XXXXXXXX-X',
'value' => $this->getData(['config', 'analyticsId'])
]); ?>
</div>
<div class="col3 offset3 verticalAlignBottom">
<?php echo template::button('configScriptHead', [
'href' => helper::baseUrl() . 'config/script/head',
'value' => 'Script dans head',
'ico' => 'pencil'
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('ConfigScriptBody', [
'href' => helper::baseUrl() . 'config/script/body',
'value' => 'Script dans body',
'ico' => 'pencil'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Paramètres réseaux</h4>
<div class="row">
<div class="col2">
<?php echo template::select('configProxyType', $module::$proxyType, [
'label' => 'Type de proxy',
'selected' => $this->getData(['config', 'proxyType'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('configProxyUrl', [
'label' => 'Adresse du proxy',
'placeholder' => 'cache.proxy.fr',
'value' => $this->getData(['config', 'proxyUrl'])
]); ?>
</div>
<div class="col2">
<?php echo template::text('configProxyPort', [
'label' => 'Port du proxy',
'placeholder' => '6060',
'value' => $this->getData(['config', 'proxyPort'])
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Versions système</h4>
<div class="row">
<div class="col2">
<?php echo template::text('configVersion', [
'label' => 'ZwiiCMS',
'readonly' => true,
'value' => common::ZWII_VERSION
]); ?>
</div>
<div class="col2">
<?php echo template::text('moduleBlogVersion', [
'label' => 'Blog',
'readonly' => true,
'value' => blog::BLOG_VERSION
]); ?>
</div>
<div class="col2">
<?php echo template::text('moduleFormVersion', [
'label' => 'Form',
'readonly' => true,
'value' => form::FORM_VERSION
]); ?>
</div>
<div class="col2">
<?php echo template::text('moduleGalleryVersion', [
'label' => 'Gallery',
'readonly' => true,
'value' => gallery::GALLERY_VERSION
]); ?>
</div>
<div class="col2">
<?php echo template::text('moduleNewsVersion', [
'label' => 'News',
'readonly' => true,
'value' => news::NEWS_VERSION
]); ?>
</div>
<div class="col2">
<?php echo template::text('moduleRedirectionVersion', [
'label' => 'Redirection',
'readonly' => true,
'value' => redirection::REDIRECTION_VERSION
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -6,20 +6,13 @@
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @authorFrédéric Tempez <frederic.tempez@outlook.com>
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
$( document ).ready(function() {
/*
asc=false;
var sorted=$('.pictureBox').sort(function(a,b){
return (asc ==
($(a).data('sort') < $(b).data('sort'))) ? 1 : -1;
});
asc = asc ? false : true;
$('body').html(sorted);
*/
});
/** NE PAS EFFACER
* admin.css
*/

View File

@ -0,0 +1,83 @@
<?php echo template::formOpen('configManageForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configManageBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('configManageSubmit',[
'value' => 'Restaurer'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Paramètres</h4>
<div class="row">
<div class="col10 offset1">
<div class="row">
<?php echo template::file('configManageImportFile', [
'label' => 'Sélectionnez une archive au format ZIP',
'type' => 2,
'help' => 'L\'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.'
]); ?>
</div>
<div class="row">
<?php echo template::checkbox('configManageImportUser', true, 'Préserver les comptes des utilisateurs déjà installés', [
'checked' => true
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Conversion des URL <?php echo template::help('Conversion des URL des ressources multimédia après le transfert d\'une archive entre deux sites aux adresses différentes.');?></h4>
<div class="row">
<div class="col4 offset1">
<?php
if (is_null($this->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('configManageBaseURLToConvert', [
'label' => 'Dossier de l\'archive' ,
'value' => $baseUrlValue,
'readonly' => true,
'help' => 'Dossier de base du site stockée dans la sauvegarde.'
]); ?>
</div>
<div class="col4">
<?php echo template::text('configManageCurrentURL', [
'label' => 'Dossier du site actuel',
'value' => helper::baseUrl(false,false),
'readonly' => true,
'help' => 'Dossier du base site actuel.'
]); ?>
</div>
<div class="col2 verticalAlignMiddle">
<?php echo template::button('configManageUpdateBaseURLButton', [
'href' => helper::baseUrl() . 'config/updateBaseUrl',
'class' => $buttonClass,
'value' => 'convertir'
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -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 <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/

View File

@ -0,0 +1,38 @@
<?php echo template::formOpen('configScript'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configManageBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('configManageSubmit',[
'value' => 'Valider',
'ico' => 'check'
]); ?>
</div>
</div>
<?php if ($this->geturl(2) === 'head'): ?>
<div class="row">
<div class="col12">
<?php echo template::textarea('configScriptHead', [
'value' => file_exists( self::DATA_DIR . 'head.inc.html') ? file_get_contents (self::DATA_DIR . 'head.inc.html') : '' ,
'class' => 'editor'
]); ?>
</div>
</div>
<?php endif ?>
<?php if ($this->geturl(2) === 'body'): ?>
<div class="row">
<div class="col12">
<?php echo template::textarea('configScriptBody', [
'value' => file_exists( self::DATA_DIR . 'body.inc.html') ? file_get_contents (self::DATA_DIR . 'body.inc.html') : '' ,
'class' => 'editor'
]); ?>
</div>
</div>
<?php endif ?>
<?php echo template::formClose(); ?>

View File

@ -9,16 +9,16 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
class install extends common {
public static $actions = [
'index' => self::GROUP_VISITOR,
'steps' => self::GROUP_ADMIN,
'update' => self::GROUP_ADMIN,
'removeAll' => self::GROUP_ADMIN,
'update' => self::GROUP_ADMIN
];
@ -40,45 +40,20 @@ class install extends common {
else {
// Soumission du formulaire
if($this->isPost()) {
$success = true;
// Double vérification pour le mot de passe
if($this->getInput('installPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('installConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
self::$inputNotices['installConfirmPassword'] = 'Incorrect';
$success = false;
}
// Crée l'utilisateur
// Utilisateur
$userFirstname = $this->getInput('installFirstname', helper::FILTER_STRING_SHORT, true);
$userLastname = $this->getInput('installLastname', helper::FILTER_STRING_SHORT, true);
$userMail = $this->getInput('installMail', helper::FILTER_MAIL, true);
$userId = $this->getInput('installId', helper::FILTER_ID, true);
// Configure certaines données par défaut
if ($this->getInput('installDefaultData',helper::FILTER_BOOLEAN) === FALSE) {
foreach($this->getHierarchy(null, false) as $parentPageId => $childrenPageIds) {
if ( $parentPageId !== 'accueil') {
if ($this->getdata(['page',$parentPageId,'moduleId'])) {
$this->deleteData(['page',$parentPageId]);
}
}
foreach($childrenPageIds as $childKey) {
$this->deleteData(['page', $childKey]);
}
}
// Effacer les barres
$this->deleteData(['page', 'barre']);
$this->deleteData(['page', 'barrelateraleavecmenu']);
// Effacer les modules
$this->deleteData(['module']);
// Ajouter ici la liste des pages privées qui ne sont pas vues lors de l'installation.
$this->deleteData(['page', 'privee']);
// Effacer les fichiers par défaut
if (is_dir(self::FILE_DIR.'source/galerie')) {
$this->removeAll(self::FILE_DIR.'source/galerie');
$this->removeAll(self::FILE_DIR.'thumb/galerie');
}
} else {
$this->setData(['module', 'blog', 'mon-premier-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'mon-deuxieme-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'mon-troisieme-article', 'userId', $userId]);
}
$this->setData([
// Création de l'utilisateur si les données sont complétées.
// success retour de l'enregistrement des données
$success = $this->setData([
'user',
$userId,
[
@ -89,8 +64,11 @@ class install extends common {
'mail' => $userMail,
'password' => $this->getInput('installPassword', helper::FILTER_PASSWORD, true)
]
]);
]);
// Compte créé, envoi du mail et création des données du site
if ($success) { // Formulaire complété envoi du mail
// Envoie le mail
// Sent contient true si réussite sinon code erreur d'envoi en clair
$sent = $this->sendMail(
$userMail,
'Installation de votre site',
@ -100,16 +78,39 @@ class install extends common {
'<strong>Identifiant du compte :</strong> ' . $this->getInput('installId') . '<br>',
null
);
// Créer les dossiers
if (!is_dir(self::FILE_DIR.'source/banniere/')) {
mkdir(self::FILE_DIR.'source/banniere/');}
if (!is_dir(self::FILE_DIR.'thumb/banniere/')) {
mkdir(self::FILE_DIR.'thumb/banniere/');
}
// Copier les fichiers
copy('core/module/install/ressource/file/source/banniere960.jpg',self::FILE_DIR.'source/banniere/banniere960.jpg');
copy('core/module/install/ressource/file/thumb/banniere960.jpg',self::FILE_DIR.'thumb/banniere/banniere960.jpg');
// Copie des icônes
copy('core/module/install/ressource/file/source/favicon.ico',self::FILE_DIR.'source/favicon.ico');
copy('core/module/install/ressource/file/source/faviconDark.ico',self::FILE_DIR.'source/faviconDark.ico');
// Configure certaines données par défaut
if ($this->getInput('installDefaultData',helper::FILTER_BOOLEAN) === FALSE) {
$this->initData('page','fr',true);
$this->initData('module','fr',true);
$this->setData(['module', 'blog', 'posts', 'mon-premier-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'posts', 'mon-deuxieme-article', 'userId', $userId]);
$this->setData(['module', 'blog', 'posts', 'mon-troisieme-article', 'userId', $userId]);
}
// Stocker le dossier d'installation
$this->setData(['core', 'baseUrl', helper::baseUrl(false,false) ]);
// Générer un fichier robots.txt
$this->createRobots();
// Créer sitemap
$this->createSitemap('all');
$this->createSitemap();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl(false),
'notification' => ($sent === true ? 'Installation terminée' : $sent),
'state' => ($sent === true ? true : null)
]);
}
}
// Valeurs en sortie
@ -129,14 +130,19 @@ class install extends common {
// Préparation
case 1:
$success = true;
// Copie du fichier de données
copy(self::DATA_DIR.'core.json', self::BACKUP_DIR . date('Y-m-d', time()) . '-core-update.json');
copy(self::DATA_DIR.'theme.json', self::BACKUP_DIR . date('Y-m-d', time()) . '-theme-update.json');
// Nettoyage des fichiers temporaires
if(file_exists(self::TEMP_DIR.'update.tar.gz')) {
// RAZ la mise à jour auto
$this->setData(['core','updateAvailable', false]);
// Backup du dossier Data
helper::autoBackup(self::BACKUP_DIR,['backup','tmp','file']);
// Sauvegarde htaccess
if ($this->getData(['config','autoUpdateHtaccess'])) {
$success = copy('.htaccess', '.htaccess' . '.bak');
}
// Nettoyage des fichiers d'installation précédents
if(file_exists(self::TEMP_DIR.'update.tar.gz') && $success) {
$success = unlink(self::TEMP_DIR.'update.tar.gz');
}
if(file_exists(self::TEMP_DIR.'update.tar') && $success === true) {
if(file_exists(self::TEMP_DIR.'update.tar') && $success) {
$success = unlink(self::TEMP_DIR.'update.tar');
}
// Valeurs en sortie
@ -151,7 +157,7 @@ class install extends common {
// Téléchargement
case 2:
// Téléchargement depuis le serveur de Zwii
$success = (file_put_contents(self::TEMP_DIR.'update.tar.gz', file_get_contents('https://zwiicms.com/update/' . common::ZWII_UPDATE_CHANNEL . '/update.tar.gz')) !== false);
$success = (file_put_contents(self::TEMP_DIR.'update.tar.gz', helper::urlGetContents('https://zwiicms.fr/update/' . common::ZWII_UPDATE_CHANNEL . '/update.tar.gz')) !== false);
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
@ -176,7 +182,7 @@ class install extends common {
} catch (Exception $e) {
$success = $e->getMessage();
}
// Netooyage du dossier
// Nettoyage du dossier
if(file_exists(self::TEMP_DIR.'update.tar.gz')) {
unlink(self::TEMP_DIR.'update.tar.gz');
}
@ -211,6 +217,15 @@ class install extends common {
FILE_APPEND
) !== false);
}
// Recopie htaccess
if ($this->getData(['config','autoUpdateHtaccess']) &&
$success && file_exists( '.htaccess.bak')
) {
// L'écraser avec le backup
$success = copy( '.htaccess.bak' ,'.htaccess' );
// Effacer l ebackup
unlink('.htaccess.bak');
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
@ -228,7 +243,7 @@ class install extends common {
*/
public function update() {
// Nouvelle version
self::$newVersion = file_get_contents('http://zwiicms.com/update/' . common::ZWII_UPDATE_CHANNEL . '/version');
self::$newVersion = helper::urlGetContents('http://zwiicms.com/update/' . common::ZWII_UPDATE_CHANNEL . '/version');
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
@ -237,16 +252,5 @@ class install extends common {
]);
}
/**
* Effacer un dossier non vide.
*/
private function removeAll ( $path ) {
foreach ( new DirectoryIterator($path) as $item ):
if ( $item->isFile() ) unlink($item->getRealPath());
if ( !$item->isDot() && $item->isDir() ) $this->removeAll($item->getRealPath());
endforeach;
rmdir($path);
}
}

View File

@ -0,0 +1,10 @@
# Bloque l'accès aux données
<Files *.json>
Order deny,allow
Deny from all
</Files>
# Bloque l'accès htaccess
<Files .htaccess>
Order deny,allow
Deny from all
</Files>

621
core/module/install/ressource/defaultdata.php Normal file → Executable file

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@ -0,0 +1 @@
/* Vide */

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**

View File

@ -20,7 +20,7 @@
</div>
<?php echo template::mail('installMail', [
'autocomplete' => 'off',
'label' => 'Adresse mail'
'label' => 'Adresse mail'
]); ?>
<div class="row">
<div class="col6">
@ -38,10 +38,10 @@
</div>
<div class="row">
<div class="col12">
<?php echo template::checkbox('installDefaultData',true , 'Charger un exemple de site', [
'checked' => true
<?php echo template::checkbox('installDefaultData',true , 'Ne pas charger l\'exemple de site (utilisateurs avancés)', [
'checked' => false
]);
?>
?>
</div>
</div>
<div class="row">

7
core/module/install/view/update/update.css Normal file → Executable file
View File

@ -9,9 +9,10 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/

View File

@ -60,11 +60,4 @@ function step(i, data) {
}
});
}
$(window).on("load", step(1, null));
/**
* Paramètres par défaut au chargement
*/
$( document ).ready(function() {
$("section").addClass("updateForm");
});
$(window).on("load", step(1, null));

View File

@ -9,7 +9,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
class maintenance extends common {
@ -22,12 +22,28 @@ class maintenance extends common {
* Maintenance
*/
public function index() {
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => 'Maintenance en cours...',
'view' => 'index'
]);
// Redirection vers l'accueil après rafraîchissement et que la maintenance est terminée.
if($this->getData(['config', 'maintenance']) == False){
header('Location:' . helper::baseUrl());
exit();
}
// Page perso définie et existante
if ($this->getData(['config','page302']) !== 'none'
AND $this->getData(['page',$this->getData(['config','page302'])]) ) {
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => $this->getData(['page',$this->getData(['config','page302']),'title']),
'content' => $this->getdata(['page',$this->getData(['config','page302']),'content']),
'view' => 'index'
]);
} else {
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => 'Maintenance en cours...',
'view' => 'index'
]);
}
}
}

View File

@ -0,0 +1 @@
/* vide */

View File

@ -2,7 +2,7 @@
<div class="row">
<div class="col4 offset8 textAlignCenter">
<?php echo template::button('maintenanceLogin', [
'value' => 'Administration',
'value' => 'Connexion',
'href' => helper::baseUrl() . 'user/login',
'ico' => 'lock'
]); ?>

View File

@ -11,7 +11,7 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
class page extends common {
@ -19,20 +19,29 @@ class page extends common {
public static $actions = [
'add' => self::GROUP_MODERATOR,
'delete' => self::GROUP_MODERATOR,
'edit' => self::GROUP_MODERATOR
'edit' => self::GROUP_MODERATOR,
'duplicate' => self::GROUP_MODERATOR
];
public static $pagesNoParentId = [
'' => 'Aucune'
];
public static $pagesBarId = [
'' => 'Aucune'
];
];
public static $moduleIds = [];
// Nom des modules
public static $moduleNames = [
'news' => 'Nouvelles',
'blog' => 'Blog',
'form' => 'Formulaire',
'gallery' => 'Galerie',
'redirection' => 'Redirection',
'search' => 'Recherche'
];
public static $typeMenu = [
'text' => 'Texte',
'icon' => 'Icône',
'icontitle' => 'Icône et bulle'
'icontitle' => 'Icône avec bulle de texte'
];
// Position du module
public static $modulePosition = [
@ -53,10 +62,66 @@ class page extends common {
];
public static $displayMenu = [
'none' => 'Aucun',
'parents' => 'Le menu horizontal',
'parents' => 'Le menu',
'children' => 'Le sous-menu de la page parente'
];
/**
* Duplication
*/
public function duplicate() {
// Adresse sans le token
$url = explode('&',$this->getUrl(2));
// La page n'existe pas
if($this->getData(['page', $url[0]]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
} // Jeton incorrect
elseif(!isset($_GET['csrf'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => 'Jeton invalide'
]);
}
elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => 'Suppression non autorisée'
]);
}
// Duplication de la page
$pageTitle = $this->getData(['page',$url[0],'title']);
$pageId = helper::increment(helper::filter($pageTitle, helper::FILTER_ID), $this->getData(['page']));
$data = $this->getData([
'page',
$url[0]
]);
// Ecriture
$this->setData (['page',$pageId,$data]);
$notification = 'La page a été dupliquée';
// Duplication du module présent
if ($this->getData(['page',$url[0],'moduleId'])) {
$data = $this->getData([
'module',
$url[0]
]);
// Ecriture
$this->setData (['module',$pageId,$data]);
$notification = 'La page et son module ont été dupliqués';
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $pageId,
'notification' => $notification,
'state' => true
]);
}
/**
* Création
*/
@ -66,10 +131,10 @@ class page extends common {
$this->setData([
'page',
$pageId,
[
[
'typeMenu' => 'text',
'iconUrl' => '',
'disable' => false,
'disable' => false,
'content' => 'Contenu de votre nouvelle page.',
'hideTitle' => false,
'breadCrumb' => false,
@ -81,7 +146,6 @@ class page extends common {
'position' => 0,
'group' => self::GROUP_VISITOR,
'targetBlank' => false,
'targetLity' => false,
'title' => $pageTitle,
'block' => '12',
'barLeft' => '',
@ -114,13 +178,67 @@ class page extends common {
$this->addOutput([
'access' => false
]);
} // Jeton incorrect
elseif(!isset($_GET['csrf'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => 'Jeton invalide'
]);
}
elseif ($_GET['csrf'] !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => 'Suppression non autorisée'
]);
}
// Impossible de supprimer la page d'accueil
elseif($url[0] === $this->getData(['config', 'homePageId'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $url[0],
'notification' => 'Impossible de supprimer la page d\'accueil'
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Désactiver la page dans la configuration avant de la supprimer'
]);
}
// Impossible de supprimer la page de recherche affectée
elseif($url[0] === $this->getData(['config', 'searchPageId'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Désactiver la page dans la configuration avant de la supprimer'
]);
}
// Impossible de supprimer la page des mentions légales affectée
elseif($url[0] === $this->getData(['config', 'legalPageId'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Désactiver la page dans la configuration avant de la supprimer'
]);
}
// Impossible de supprimer la page des mentions légales affectée
elseif($url[0] === $this->getData(['config', 'page404'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Désactiver la page dans la configuration avant de la supprimer'
]);
}
// Impossible de supprimer la page des mentions légales affectée
elseif($url[0] === $this->getData(['config', 'page403'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Désactiver la page dans la configuration avant de la supprimer'
]);
}
// Impossible de supprimer la page des mentions légales affectée
elseif($url[0] === $this->getData(['config', 'page302'])) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config',
'notification' => 'Désactiver la page dans la configuration avant de la supprimer'
]);
}
// Jeton incorrect
@ -147,12 +265,12 @@ class page extends common {
]);
}
// Suppression
else {
// Met à jour le site map
$this->createSitemap('all');
// Effacer la page
else {
// Effacer la page
$this->deleteData(['page', $url[0]]);
$this->deleteData(['module', $url[0]]);
// Met à jour le site map
$this->createSitemap('all');
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl(false),
@ -161,7 +279,7 @@ class page extends common {
]);
}
}
/**
* Édition
@ -177,12 +295,17 @@ class page extends common {
// La page existe
else {
// Soumission du formulaire
if($this->isPost()) {
$pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true);
if($this->isPost()) {
// Génére l'ID si le titre de la page a changé
if ( $this->getInput('pageEditTitle') !== $this->getData(['page',$this->getUrl(2),'title']) ) {
$pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true);
} else {
$pageId = $this->getUrl(2);
}
// un dossier existe du même nom (erreur en cas de redirection)
if (file_exists($pageId)) {
$pageId = uniqid($pageId . '-');
}
$pageId = uniqid($pageId);
}
// Si l'id a changée
if ($pageId !== $this->getUrl(2)) {
// Incrémente le nouvel id de la page
@ -209,6 +332,22 @@ class page extends common {
if($pageId !== $this->getUrl(2)) {
$this->deleteData(['page', $this->getUrl(2)]);
}
// Traitement des pages spéciales affectées dans la config :
if ($this->getUrl(2) === $this->getData(['config', 'legalPageId']) ) {
$this->setData(['config','legalPageId', $pageId]);
}
if ($this->getUrl(2) === $this->getData(['config', 'searchPageId']) ) {
$this->setData(['config','searchPageId', $pageId]);
}
if ($this->getUrl(2) === $this->getData(['config', 'page404']) ) {
$this->setData(['config','page404', $pageId]);
}
if ($this->getUrl(2) === $this->getData(['config', 'page403']) ) {
$this->setData(['config','page403', $pageId]);
}
if ($this->getUrl(2) === $this->getData(['config', 'page302']) ) {
$this->setData(['config','page302', $pageId]);
}
// Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents
$lastPosition = 1;
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
@ -233,7 +372,7 @@ class page extends common {
$hideTitle = $this->getInput('pageEditHideTitle', helper::FILTER_BOOLEAN);
} else {
// Une barre ne peut pas avoir de barres
// Une barre ne peut pas avoir de barres
$barLeft = "";
$barRight = "";
// Une barre est masquée
@ -244,10 +383,10 @@ class page extends common {
$this->setData([
'page',
$pageId,
[
[
'typeMenu' => $this->getinput('pageTypeMenu'),
'iconUrl' => $this->getinput('pageIconUrl'),
'disable'=> $this->getinput('pageEditDisable', helper::FILTER_BOOLEAN),
'disable'=> $this->getinput('pageEditDisable', helper::FILTER_BOOLEAN),
'content' => (empty($this->getInput('pageEditContent', null)) ? '<p>&nbsp;</p>' : $this->getInput('pageEditContent', null)),
'hideTitle' => $hideTitle,
'breadCrumb' => $this->getInput('pageEditbreadCrumb', helper::FILTER_BOOLEAN),
@ -259,7 +398,6 @@ class page extends common {
'position' => $position,
'group' => $this->getinput('pageEditBlock') !== 'bar' ? $this->getInput('pageEditGroup', helper::FILTER_INT) : 0,
'targetBlank' => $this->getInput('pageEditTargetBlank', helper::FILTER_BOOLEAN),
'targetLity' => $this->getInput('pageEditTargetBlank', helper::FILTER_BOOLEAN) === true ? false : $this->getInput('pageEditTargetLity', helper::FILTER_BOOLEAN),
'title' => $this->getInput('pageEditTitle', helper::FILTER_STRING_SHORT),
'block' => $this->getinput('pageEditBlock'),
'barLeft' => $barLeft,
@ -269,7 +407,7 @@ class page extends common {
'hideMenuHead' => $this->getinput('pageEditHideMenuHead', helper::FILTER_BOOLEAN),
'hideMenuChildren' => $this->getinput('pageEditHideMenuChildren', helper::FILTER_BOOLEAN),
]
]);
]);
// Barre renommée : changement le nom de la barre dans les pages mères
if ($this->getinput('pageEditBlock') === 'bar') {
foreach ($this->getHierarchy() as $eachPageId=>$parentId) {
@ -310,29 +448,33 @@ class page extends common {
}
}
// Liste des modules
$moduleIds = [
'' => 'Aucun'
];
$moduleIds = [];
$iterator = new DirectoryIterator('module/');
foreach($iterator as $fileInfos) {
if(is_file($fileInfos->getPathname() . '/' . $fileInfos->getFilename() . '.php')) {
$moduleIds[$fileInfos->getBasename()] = ucfirst($fileInfos->getBasename());
if (array_key_exists($fileInfos->getBasename(),self::$moduleNames)) {
$moduleIds[$fileInfos->getBasename()] = self::$moduleNames[$fileInfos->getBasename()];
} else {
$moduleIds[$fileInfos->getBasename()] = ucfirst($fileInfos->getBasename());
}
}
}
self::$moduleIds = $moduleIds;
self::$moduleIds = $moduleIds;
asort(self::$moduleIds);
self::$moduleIds = array_merge( ['' => 'Aucun'] , self::$moduleIds);
// Pages sans parent
foreach($this->getHierarchy() as $parentPageId => $childrenPageIds) {
if($parentPageId !== $this->getUrl(2)) {
self::$pagesNoParentId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
}
}
}
// Pages barre latérales
foreach($this->getHierarchy(null,false,true) as $parentPageId => $childrenPageIds) {
if($parentPageId !== $this->getUrl(2) &&
$this->getData(['page', $parentPageId, 'block']) === 'bar') {
self::$pagesBarId[$parentPageId] = $this->getData(['page', $parentPageId, 'title']);
}
}
}
// Valeurs en sortie
$this->addOutput([
'title' => $this->getData(['page', $this->getUrl(2), 'title']),

29
core/module/page/view/edit/edit.css Normal file → Executable file
View File

@ -9,8 +9,33 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
@import url("core/layout/admin.css");
#ceo > .blockContainer,
#advanced > .blockContainer {
display: none;
}
#info .zwiico-minus-circled,
#layout .zwiico-minus-circled,
#location .zwiico-minus-circled {
display: inline;
}
.zwiico-minus-circled,
#info .zwiico-plus-circled,
#layout .zwiico-plus-circled,
#location .zwiico-plus-circled {
display: none;
}
.zwiico-minus-circled,
.zwiico-plus-circled {
cursor: pointer;
}

View File

@ -9,7 +9,7 @@
* @authorFrédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**
@ -17,16 +17,76 @@
*/
$("#pageEditDelete").on("click", function() {
var _this = $(this);
return core.confirm("Êtes-vous sûr de vouloir supprimer cette page ?", function() {
return core.confirm("Confirmez-vous la suppression de cette page ?", function() {
$(location).attr("href", _this.attr("href"));
});
});
/**
$("#pageEditModuleId").on("click", function() {
protectModule();
});
function protectModule() {
var oldModule = $("#pageEditModuleIdOld").val();
var oldModuleText = $("#pageEditModuleIdOldText").val();
var newModule = $("#pageEditModuleId").val();
if ( oldModule !== "" &&
oldModule !== newModule) {
var _this = $(this);
core.confirm("Les données du module " + oldModuleText + " seront effacées. Confirmez-vous ?",
function() {
$(location).attr("href", _this.attr("href"));
return true;
},
function() {
$("#pageEditModuleId").val(oldModule);
return false;
}
);
}
}
/**
* Paramètres par défaut au chargement
*/
*/
$( document ).ready(function() {
/**
* Initialisation des blocs
*/
var i = ["info", "layout", "setup", "location", "advanced", "ceo" ];
$.each(i,function(e) {
if (getCookie(i[e]) === "true") {
$("#" + i[e]).find(".zwiico-plus-circled").hide();
$("#" + i[e]).find(".zwiico-minus-circled").show();
$("#" + i[e]).find(".blockContainer").show();
}
});
/**
* Blocs dépliants
*
* Sauvegarder la position des blocs
* true = bloc déplié
*/
$("div .block").click(function(e) {
$(this).find(".zwiico-plus-circled").toggle();
$(this).find(".zwiico-minus-circled").toggle();
$(this).find(".blockContainer").slideToggle();
/*
* Sauvegarder la position des blocs
* true = bloc déplié
*/
document.cookie = $(this).attr('id') + "=" + $(this).find(".zwiico-minus").is(":visible") + ";expires=Fri, 31 Dec 9999 23:59:59 GMT;path=/;SameSite=Lax";
}).on("click", "span > input, input, textarea, label, option, button, a:not(.inputFile) , .blockContainer", function(e) {
// Empêcher les déclenchements dans les blocs
e.stopPropagation();
});
/*
* Enleve le menu fixe en édition de page
*/
@ -38,12 +98,12 @@ $( document ).ready(function() {
*/
if($("#pageEditModuleId").val() === "") {
$("#pageEditModuleConfig").addClass("disabled");
$("#pageEditContentContainer").hide();
$("#pageEditContentContainer").hide();
}
else {
$("#pageEditModuleConfig").removeClass("disabled");
$("#pageEditContentContainer").hide();
$("#pageEditBlock option[value='bar']").remove();
$("#pageEditBlock option[value='bar']").remove();
}
/**
@ -52,13 +112,13 @@ $( document ).ready(function() {
if( $("#pageEditModuleId").val() === "redirection" ||
$("#pageEditModuleId").val() === "" ) {
$("#configModulePositionWrapper").removeClass("disabled");
$("#configModulePositionWrapper").slideUp();
$("#configModulePositionWrapper").slideUp();
}
else {
$("#configModulePositionWrapper").addClass("disabled");
$("#configModulePositionWrapper").slideDown();
$("#configModulePositionWrapper").slideDown();
}
/**
* Masquer et démasquer le contenu pour les modules code et redirection
@ -68,7 +128,7 @@ $( document ).ready(function() {
$("#pageEditContentWrapper").slideUp();
} else {
$("#pageEditContentWrapper").addClass("disabled");
$("#pageEditContentWrapper").slideDown();
$("#pageEditContentWrapper").slideDown();
}
/**
* Masquer et démasquer le masquage du titre pour le module redirection
@ -77,49 +137,49 @@ $( document ).ready(function() {
$("#pageEditHideTitleWrapper").removeClass("disabled");
$("#pageEditHideTitleWrapper").hide();
$("#pageEditBlockLayout").removeClass("disabled");
$("#pageEditBlockLayout").hide();
} else {
$("#pageEditBlockLayout").hide();
} else {
$("#pageEditHideTitleWrapper").addClass("disabled");
$("#pageEditHideTitleWrapper").show();
$("#pageEditBlockLayout").addClass("disabled");
$("#pageEditBlockLayout").show();
$("#pageEditBlockLayout").show();
}
/**
* Masquer et démasquer la sélection des barres
* Masquer et démasquer la sélection des barres
*/
switch ($("#pageEditBlock").val()) {
case "bar":
case "bar":
case "12":
$("#pageEditBarLeftWrapper").removeClass("disabled");
$("#pageEditBarLeftWrapper").slideUp();
$("#pageEditBarRightWrapper").removeClass("disabled");
$("#pageEditBarRightWrapper").slideUp();
$("#pageEditBarRightWrapper").slideUp();
break;
case "3-9":
case "4-8":
$("#pageEditBarLeftWrapper").addClass("disabled");
$("#pageEditBarLeftWrapper").slideDown();
$("#pageEditBarRightWrapper").removeClass("disabled");
$("#pageEditBarRightWrapper").slideUp();
$("#pageEditBarRightWrapper").slideUp();
break;
case "9-3":
case "8-4":
$("#pageEditBarLeftWrapper").removeClass("disabled");
$("#pageEditBarLeftWrapper").slideUp();
$("#pageEditBarLeftWrapper").slideUp();
$("#pageEditBarRightWrapper").addClass("disabled");
$("#pageEditBarRightWrapper").slideDown();
$("#pageEditBarRightWrapper").slideDown();
break;
case "3-6-3":
case "2-7-3":
case "3-7-2":
case "3-7-2":
$("#pageEditBarLeftWrapper").addClass("disabled");
$("#pageEditBarLeftWrapper").slideDown();
$("#pageEditBarRightWrapper").addClass("disabled");
$("#pageEditBarRightWrapper").slideDown();
$("#pageEditBarRightWrapper").slideDown();
break;
};
if ($("#pageEditBlock").val() === "bar") {
if ($("#pageEditBlock").val() === "bar") {
$("#pageEditMenu").removeClass("disabled");
$("#pageEditMenu").hide();
$("#pageEditHideTitleWrapper").removeClass("disabled");
@ -129,26 +189,28 @@ $( document ).ready(function() {
$("#pageEditModuleIdWrapper").removeClass("disabled");
$("#pageEditModuleIdWrapper").slideUp();
$("#pageEditModuleConfig").removeClass("disabled");
$("#pageEditModuleConfig").slideUp();
$("#pageEditModuleConfig").slideUp();
$("#pageEditDisplayMenuWrapper").addClass("disabled");
$("#pageEditDisplayMenuWrapper").slideDown();
$("#pageTypeMenuWrapper").removeClass("disabled");
$("#pageTypeMenuWrapper").slideUp();
$("#pageTypeMenuWrapper").slideUp();
$("#pageEditSeoWrapper").removeClass("disabled");
$("#pageEditSeoWrapper").slideUp();
$("#pageEditSeoWrapper").slideUp();
$("#pageEditAdvancedWrapper").removeClass("disabled");
$("#pageEditAdvancedWrapper").slideUp();
/*
$("#pageEditBlockLayout").removeClass("col6");
$("#pageEditBlockLayout").addClass("col12");
*/
} else {
$("#pageEditDisplayMenuWrapper").removeClass("disabled");
$("#pageEditDisplayMenuWrapper").slideUp();
$("#pageEditDisplayMenuWrapper").slideUp();
}
/**
* Masquer ou afficher le chemin de fer
* Quand le titre est masqué
* Quand le titre est masqué
*/
if ($("input[name=pageEditHideTitle]").is(':checked') ||
$("#pageEditParentPageId").val() === "" ) {
@ -158,30 +220,30 @@ $( document ).ready(function() {
} else {
if ($("#pageEditParentPageId").val() !== "") {
$("#pageEditbreadCrumbWrapper").addClass("disabled");
$("#pageEditbreadCrumbWrapper").slideDown();
}
}
$("#pageEditbreadCrumbWrapper").slideDown();
}
}
/**
* Masquer ou afficher la sélection de l'icône
* Masquer ou afficher la sélection de l'icône
*/
if ($("#pageTypeMenu").val() !== "text") {
$("#pageIconUrlWrapper").addClass("disabled");
$("#pageIconUrlWrapper").slideDown();
} else {
} else {
$("#pageIconUrlWrapper").removeClass("disabled");
$("#pageIconUrlWrapper").slideUp();
$("#pageIconUrlWrapper").slideUp();
}
/**
/**
* Cache les options de masquage dans les menus quand la page n'est pas affichée.
*/
if ($("#pageEditPosition").val() === "0" ) {
$("#pageEditHideMenuSideWrapper").removeClass("disabled");
$("#pageEditHideMenuSideWrapper").slideUp();
$("#pageEditHideMenuSideWrapper").slideUp();
} else {
$("#pageEditHideMenuSideWrapper").addClass("disabled");
$("#pageEditHideMenuSideWrapper").slideDown();
$("#pageEditHideMenuSideWrapper").slideDown();
}
/**
@ -195,37 +257,20 @@ $( document ).ready(function() {
$("#pageEditHideMenuChildrenWrapper").slideDown();
}
/**
* Cache le l'option "ne pas afficher les pages enfants dans le menu horizontal" lorsque la page est désactivée
*/
/**
* Cache le l'option "ne pas afficher les pages enfants dans le menu horizontal" lorsque la page est désactivée
*/
if ($("#pageEditDisable").is(':checked') ) {
$("#pageEditHideMenuChildrenWrapper").removeClass("disabled");
$("#pageEditHideMenuChildrenWrapper").slideUp();
$("#pageEditHideMenuChildrenWrapper").slideUp();
} else {
$("#pageEditHideMenuChildrenWrapper").addClass("disabled");
$("#pageEditHideMenuChildrenWrapper").slideDown();
$("#pageEditHideMenuChildrenWrapper").slideDown();
}
});
/**
* Empêche la double sélection Blank et Lity
*/
var pageEditTargetBlankDOM = $("#pageEditTargetBlank");
pageEditTargetBlankDOM.on("change", function() {
if ($(this).is(':checked') &&
$("#pageEditTargetLity").is(':checked') ) {
$("#pageEditTargetLity").prop("checked", false);
}
});
var pageEditTargetLityDOM = $("#pageEditTargetLity");
pageEditTargetLityDOM.on("change", function() {
if ($(this).is(':checked') &&
$("#pageEditTargetBlank").is(':checked') ) {
$("#pageEditTargetBlank").prop("checked", false);
}
});
/**
* Cache le l'option "ne pas afficher les pages enfants dans le menu horizontal" lorsque la page est désactivée
@ -235,25 +280,25 @@ pageEditDisableDOM.on("change", function() {
if ($(this).is(':checked') ) {
$("#pageEditHideMenuChildrenWrapper").removeClass("disabled");
$("#pageEditHideMenuChildrenWrapper").slideUp();
$("#pageEditHideMenuChildren").prop("checked", false);
$("#pageEditHideMenuChildren").prop("checked", false);
} else {
$("#pageEditHideMenuChildrenWrapper").addClass("disabled");
$("#pageEditHideMenuChildrenWrapper").slideDown();
$("#pageEditHideMenuChildrenWrapper").slideDown();
}
});
/**
/**
* Cache les options de masquage dans les menus quand la page n'est pas affichée.
*/
var pageEditPositionDOM = $("#pageEditPosition");
pageEditPositionDOM.on("change", function() {
if ($(this).val() === "0" ) {
$("#pageEditHideMenuSideWrapper").removeClass("disabled");
$("#pageEditHideMenuSideWrapper").slideUp();
$("#pageEditHideMenuSideWrapper").slideUp();
} else {
$("#pageEditHideMenuSideWrapper").addClass("disabled");
$("#pageEditHideMenuSideWrapper").slideDown();
$("#pageEditHideMenuSideWrapper").slideDown();
}
});
@ -266,12 +311,12 @@ pageEditModuleIdDOM.on("change", function() {
if($(this).val() === "") {
$("#pageEditModuleConfig").addClass("disabled");
$("#pageEditContentContainer").slideDown();
$("#pageEditBlock").append('<option value="bar">Barre latérale</option>');
$("#pageEditBlock").append('<option value="bar">Barre latérale</option>');
}
else {
$("#pageEditModuleConfig").removeClass("disabled");
$("#pageEditContentContainer").slideUp();
$("#pageEditBlock option[value='bar']").remove();
$("#pageEditBlock option[value='bar']").remove();
}
});
@ -283,14 +328,14 @@ pageEditModuleIdDOM.on("change", function() {
* */
var pageEditModuleIdDOM = $("#pageEditModuleId");
pageEditModuleIdDOM.on("change", function() {
if( $(this).val() === "redirection" ||
if( $(this).val() === "redirection" ||
$(this).val() === "") {
$("#configModulePositionWrapper").removeClass("disabled");
$("#configModulePositionWrapper").slideUp();
$("#configModulePositionWrapper").slideUp();
}
else {
$("#configModulePositionWrapper").addClass("disabled");
$("#configModulePositionWrapper").slideDown();
$("#configModulePositionWrapper").slideDown();
}
});
@ -308,7 +353,7 @@ pageEditModuleIdDOM.on("change", function() {
}
else {
$("#pageEditContentWrapper").addClass("disabled");
$("#pageEditContentWrapper").slideDown();
$("#pageEditContentWrapper").slideDown();
}
});
@ -321,21 +366,21 @@ var pageEditModuleIdDOM = $("#pageEditModuleId");
pageEditModuleIdDOM.on("change", function() {
if( $(this).val() === "redirection") {
$("#pageEditHideTitleWrapper").removeClass("disabled");
$("#pageEditHideTitleWrapper").slideUp();
$("#pageEditHideTitleWrapper").slideUp();
$("#pageEditBlockLayout").removeClass("disabled");
$("#pageEditBlockLayout").slideUp();
}
else {
else {
$("#pageEditHideTitleWrapper").addClass("disabled");
$("#pageEditHideTitleWrapper").slideDown();
$("#pageEditBlockLayout").addClass("disabled");
$("#pageEditBlockLayout").slideDown();
$("#pageEditBlockLayout").slideDown();
}
});
/**
* Masquer et démasquer la sélection des barres
* Masquer et démasquer la sélection des barres
*/
var pageEditBlockDOM = $("#pageEditBlock");
pageEditBlockDOM.on("change", function() {
@ -345,30 +390,30 @@ pageEditBlockDOM.on("change", function() {
$("#pageEditBarLeftWrapper").removeClass("disabled");
$("#pageEditBarLeftWrapper").slideUp();
$("#pageEditBarRightWrapper").removeClass("disabled");
$("#pageEditBarRightWrapper").slideUp();
$("#pageEditBarRightWrapper").slideUp();
break;
case "3-9":
case "4-8":
$("#pageEditBarLeftWrapper").addClass("disabled");
$("#pageEditBarLeftWrapper").slideDown();
$("#pageEditBarRightWrapper").removeClass("disabled");
$("#pageEditBarRightWrapper").slideUp();
$("#pageEditBarRightWrapper").slideUp();
break;
case "9-3":
case "8-4":
$("#pageEditBarLeftWrapper").removeClass("disabled");
$("#pageEditBarLeftWrapper").slideUp();
$("#pageEditBarLeftWrapper").slideUp();
$("#pageEditBarRightWrapper").addClass("disabled");
$("#pageEditBarRightWrapper").slideDown();
$("#pageEditBarRightWrapper").slideDown();
break;
case "3-6-3":
case "2-7-3":
case "3-7-2":
case "3-7-2":
$("#pageEditBarLeftWrapper").addClass("disabled");
$("#pageEditBarLeftWrapper").slideDown();
$("#pageEditBarRightWrapper").addClass("disabled");
$("#pageEditBarRightWrapper").slideDown();
break;
$("#pageEditBarRightWrapper").slideDown();
break;
}
if ($(this).val() === "bar") {
$("#pageEditMenu").removeClass("disabled");
@ -376,50 +421,69 @@ pageEditBlockDOM.on("change", function() {
$("#pageEditHideTitleWrapper").removeClass("disabled");
$("#pageEditHideTitleWrapper").slideUp();
$("#pageTypeMenuWrapper").removeClass("disabled");
$("#pageTypeMenuWrapper").slideUp();
$("#pageTypeMenuWrapper").slideUp();
$("#pageEditSeoWrapper").removeClass("disabled");
$("#pageEditSeoWrapper").slideUp();
$("#pageEditSeoWrapper").slideUp();
$("#pageEditAdvancedWrapper").removeClass("disabled");
$("#pageEditAdvancedWrapper").slideUp();
$("#pageEditAdvancedWrapper").slideUp();
$("#pageEditbreadCrumbWrapper").removeClass("disabled");
$("#pageEditbreadCrumbWrapper").slideUp();
$("#pageEditModuleIdWrapper").removeClass("disabled");
$("#pageEditModuleIdWrapper").slideUp();
$("#pageEditModuleConfig").removeClass("disabled");
$("#pageEditModuleConfig").slideUp();
$("#pageEditModuleConfig").slideUp();
$("#pageEditDisplayMenuWrapper").addClass("disabled");
$("#pageEditDisplayMenuWrapper").slideDown();
$("#pageEditDisplayMenuWrapper").slideDown();
/*
$("#pageEditBlockLayout").removeClass("col6");
$("#pageEditBlockLayout").addClass("col12");
$("#pageEditBlockLayout").addClass("col12");
*/
} else {
$("#pageEditMenu").addClass("disabled");
$("#pageEditMenu").show();
$("#pageEditMenu").show();
$("#pageEditHideTitleWrapper").addClass("disabled");
$("#pageEditHideTitleWrapper").slideDown();
$("#pageEditHideTitleWrapper").slideDown();
$("#pageTypeMenuWrapper").addClass("disabled");
$("#pageTypeMenuWrapper").slideDown();
$("#pageTypeMenuWrapper").slideDown();
$("#pageEditSeoWrapper").addClass("disabled");
$("#pageEditSeoWrapper").slideDown();
$("#pageEditSeoWrapper").slideDown();
$("#pageEditAdvancedWrapper").addClass("disabled");
$("#pageEditAdvancedWrapper").slideDown();
$("#pageEditAdvancedWrapper").slideDown();
$("#pageEditModuleIdWrapper").addClass("disabled");
$("#pageEditModuleIdWrapper").slideDown();
$("#pageEditModuleConfig").addClass("disabled");
$("#pageEditModuleConfig").slideDown();
$("#pageEditModuleIdWrapper").slideDown();
$("#pageEditModuleConfig").slideDown();
$("#pageEditDisplayMenuWrapper").removeClass("disabled");
$("#pageEditDisplayMenuWrapper").slideUp();
$("#pageEditDisplayMenuWrapper").slideUp();
if ($("#pageEditParentPageId").val() !== "") {
$("#pageEditbreadCrumbWrapper").addClass("disabled");
$("#pageEditbreadCrumbWrapper").slideDown();
}
if ($("#pageEditModuleId").val() === "") {
$("#pageEditModuleConfig").addClass("disabled");
} else {
$("#pageEditModuleConfig").removeClass("disabled");
}
/*
$("#pageEditBlockLayout").removeClass("col12");
$("#pageEditBlockLayout").addClass("col6");
}
*/
}
});
/**
* Lire un cookie s'il existe
*/
function getCookie(name) {
var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
}
/**
* Masquer ou afficher le chemin de fer
* Quand le titre est masqué
* Quand le titre est masqué
*/
var pageEditHideTitleDOM = $("#pageEditHideTitle");
pageEditHideTitleDOM.on("change", function() {
@ -429,13 +493,13 @@ pageEditHideTitleDOM.on("change", function() {
} else {
if ($("#pageEditParentPageId").val() !== "") {
$("#pageEditbreadCrumbWrapper").addClass("disabled");
$("#pageEditbreadCrumbWrapper").slideDown();
}
$("#pageEditbreadCrumbWrapper").slideDown();
}
}
});
/**
/**
* Masquer ou afficher le chemin de fer
* Quand la page n'est pas mère et que le menu n'est pas masqué
*/
@ -444,11 +508,11 @@ pageEditParentPageIdDOM.on("change", function() {
if ($(this).val() === "" &&
!$('input[name=pageEditHideTitle]').is(':checked') ) {
$("#pageEditbreadCrumbWrapper").removeClass("disabled");
$("#pageEditbreadCrumbWrapper").slideUp();
$("#pageEditbreadCrumbWrapper").slideUp();
} else {
$("#pageEditbreadCrumbWrapper").addClass("disabled");
$("#pageEditbreadCrumbWrapper").slideDown();
$("#pageEditbreadCrumbWrapper").slideDown();
}
if ($(this).val() !== "") {
$("#pageEditHideMenuChildrenWrapper").removeClass("disabled");
@ -462,16 +526,16 @@ pageEditParentPageIdDOM.on("change", function() {
/**
* Masquer ou afficher la sélection de l'icône
* Masquer ou afficher la sélection de l'icône
*/
var pageTypeMenuDOM = $("#pageTypeMenu");
pageTypeMenuDOM.on("change", function() {
if ($(this).val() !== "text") {
$("#pageIconUrlWrapper").addClass("disabled");
$("#pageIconUrlWrapper").slideDown();
} else {
} else {
$("#pageIconUrlWrapper").removeClass("disabled");
$("#pageIconUrlWrapper").slideUp();
$("#pageIconUrlWrapper").slideUp();
}
});
@ -482,8 +546,8 @@ pageTypeMenuDOM.on("change", function() {
* Soumission du formulaire pour éditer le module
*/
$("#pageEditModuleConfig").on("click", function() {
$("#pageEditModuleRedirect").val(1);
$("#pageEditForm").trigger("submit");
$("#pageEditModuleRedirect").val(1);
$("#pageEditForm").trigger("submit");
});
/**

View File

@ -5,7 +5,7 @@ echo template::formOpen('pageEditForm');
<div class="row">
<div class="col2">
<?php $href = helper::baseUrl() . $this->getUrl(2); ?>
<?php if ($this->getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code')$href = helper::baseUrl(); ?>
<?php if ($this->getData(['page', $this->getUrl(2), 'moduleId']) === 'redirection' || 'code')$href = helper::baseUrl(); ?>
<?php echo template::button('pageEditBack', [
'class' => 'buttonGrey',
'href' => $href,
@ -13,7 +13,14 @@ echo template::formOpen('pageEditForm');
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset6">
<div class="col2 offset4">
<?php echo template::button('pageEditDuplicate', [
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
'value' => 'Dupliquer',
'ico' => 'clone'
]); ?>
</div>
<div class="col2">
<?php echo template::button('pageEditDelete', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '&csrf=' . $_SESSION['csrf'],
@ -27,8 +34,8 @@ echo template::formOpen('pageEditForm');
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Informations générales</h4>
<div class="block" id="info">
<h4>Informations générales</h4>
<div class="row">
<div class="col8">
<?php echo template::text('pageEditTitle', [
@ -45,11 +52,15 @@ echo template::formOpen('pageEditForm');
'label' => 'Module',
'selected' => $this->getData(['page', $this->getUrl(2), 'moduleId'])
]); ?>
<?php echo template::hidden('pageEditModuleIdOld',['value' => $this->getData(['page', $this->getUrl(2), 'moduleId'])]); ?>
<?php echo template::hidden('pageEditModuleIdOldText',[
'value' => array_key_exists($this->getData(['page', $this->getUrl(2), 'moduleId']),$module::$moduleNames)? $module::$moduleNames[$this->getData(['page', $this->getUrl(2), 'moduleId'])] : ucfirst($this->getData(['page', $this->getUrl(2), 'moduleId']))
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('pageEditModuleConfig', [
'disabled' => (bool) $this->getData(['page', $this->getUrl(2), 'moduleId']) === false,
'uniqueSubmission' => true,
'uniqueSubmission' => true,
'value' => template::ico('gear')
]); ?>
</div>
@ -59,21 +70,21 @@ echo template::formOpen('pageEditForm');
<div class="row">
<div class="col4">
<?php echo template::select('pageTypeMenu', $module::$typeMenu,[
'help' => 'La page peut être représentée par une image de petite taille.',
'label' => 'Apparence dans le menu horizontal',
'label' => 'Aspect du lien',
'selected' => $this->getData(['page', $this->getUrl(2), 'typeMenu'])
]); ?>
</div>
<div class="col4">
<?php echo template::file('pageIconUrl', [
'label' => 'Icône du menu',
'help' => 'Sélectionnez une image ou une icône de petite dimension',
'label' => 'Icône',
'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('configModulePosition', $module::$modulePosition,[
'help' => 'En position libre ajoutez le module en plaçant [MODULE] à l\'endroit voulu dans votre page.',
'label' => 'Position du module dans la page',
'label' => 'Position du module',
'selected' => $this->getData(['page', $this->getUrl(2), 'modulePosition'])
]); ?>
</div>
@ -81,156 +92,194 @@ echo template::formOpen('pageEditForm');
</div>
</div>
</div>
<?php echo template::textarea('pageEditContent', [
'class' => 'editorWysiwyg',
'value' => $this->getData(['page', $this->getUrl(2), 'content'])
]); ?>
<div class="row">
<div class="col6" id="pageEditBlockLayout">
<div class="block" >
<h4>Mise en page</h4>
<div class="row">
<div class="col12">
<?php echo template::select('pageEditBlock', $module::$pageBlocks, [
'label' => 'Gabarits de page / Barre latérale',
'help' => 'Pour définir la page comme barre latérale, choisissez l\'option dans la liste.',
'selected' => $this->getData(['page', $this->getUrl(2) , 'block'])
]); ?>
<div class="col12">
<?php echo template::textarea('pageEditContent', [
'class' => 'editorWysiwyg',
'value' => $this->getData(['page', $this->getUrl(2), 'content'])
]); ?>
</div>
</div>
<div class="row">
<div class="col12" id="pageEditBlockLayout">
<div class="block" id="layout">
<h4>Mise en page
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
<div class="col12">
<!-- Sélection des barres latérales -->
<?php if($this->getHierarchy($this->getUrl(2),false,true)): ?>
<?php echo template::hidden('pageEditBarLeft', [
'value' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
</h4>
<div class="blockContainer">
<div class="row">
<div class="col6">
<div class="row">
<div class="col12">
<?php echo template::select('pageEditBlock', $module::$pageBlocks, [
'label' => 'Gabarits de page / Barre latérale',
'help' => 'Pour définir la page comme barre latérale, choisissez l\'option dans la liste.',
'selected' => $this->getData(['page', $this->getUrl(2) , 'block'])
]); ?>
</div>
</div>
</div>
<div class="col6">
<!-- Sélection des barres latérales -->
<?php if($this->getHierarchy($this->getUrl(2),false,true)): ?>
<?php echo template::hidden('pageEditBarLeft', [
'value' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditBarLeft', $module::$pagesBarId, [
'label' => 'Barre latérale gauche :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php endif; ?>
<?php if($this->getHierarchy($this->getUrl(2),false,true)): ?>
<?php echo template::hidden('pageEditBarRight', [
'value' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditBarRight', $module::$pagesBarId, [
'label' => 'Barre latérale droite :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php endif; ?>
<?php echo template::select('pageEditDisplayMenu', $module::$displayMenu, [
'label' => 'Contenu du menu vertical',
'selected' => $this->getData(['page', $this->getUrl(2), 'displayMenu']),
'help' => 'Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.'
]); ?>
<?php else: ?>
<?php echo template::select('pageEditBarLeft', $module::$pagesBarId, [
'label' => 'Barre latérale gauche :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php endif; ?>
</div>
<div class="col12">
<?php if($this->getHierarchy($this->getUrl(2),false,true)): ?>
<?php echo template::hidden('pageEditBarRight', [
'value' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditBarRight', $module::$pagesBarId, [
'label' => 'Barre latérale droite :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php endif; ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditHideTitle', true, 'Titre masqué', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideTitle'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditbreadCrumb', true, 'Fil d\'Ariane', [
'checked' => $this->getData(['page', $this->getUrl(2), 'breadCrumb'])
]); ?>
</div>
<div class="col12">
<?php echo template::select('pageEditDisplayMenu', $module::$displayMenu, [
'label' => 'Configuration du menu vertical',
'selected' => $this->getData(['page', $this->getUrl(2), 'displayMenu']),
'help' => 'Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.'
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="col6" id="pageEditMenu">
<div class="block">
<h4>Emplacement</h4>
<div class="row">
<div class="col6">
<?php echo template::select('pageEditPosition', [], [
'label' => 'Position',
'help' => '\'Ne pas afficher\' crée une page orpheline non accessible par le biais des menus.'
]); ?>
</div>
<div class="col6">
<?php if($this->getHierarchy($this->getUrl(2), false)): ?>
<?php echo template::hidden('pageEditParentPageId', [
'value' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditParentPageId', $module::$pagesNoParentId, [
'label' => 'Page parent',
'selected' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php endif; ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditTargetBlank', true, 'Nouvel onglet', [
'checked' => $this->getData(['page', $this->getUrl(2), 'targetBlank'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditTargetLity', true, 'Popup Intégrée', [
'checked' => $this->getData(['page', $this->getUrl(2), 'targetLity'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditDisable', true, 'Désactivée', [
'disabled' => (bool) ($this->getdata(['config','homePageId']) === $this->getUrl(2)) ? true : false,
'checked' => (bool) ($this->getdata(['config','homePageId']) === $this->getUrl(2)) ? false : $this->getData(['page', $this->getUrl(2), 'disable']),
'help' => 'Une page désactivée n\'est pas cliquable en mode déconnecté, les pages enfants sont visibles et accessibles. La page d\'accueil n\'est pas désactivable.'
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class='row' id="pageEditSeoWrapper">
<div class="col12">
<div class="block">
<h4>Référencement</h4>
<div class='col6'>
<?php echo template::select('pageEditGroup', self::$groupPublics, [
'label' => 'Groupe requis pour accéder à la page :',
'selected' => $this->getData(['page', $this->getUrl(2), 'group'])
]); ?>
<div class="row">
<div class="col12" id="pageEditMenu">
<div class="block" id="location">
<h4>Emplacement dans le menu
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col6">
<?php echo template::select('pageEditPosition', [], [
'label' => 'Position',
'help' => '\'Ne pas afficher\' crée une page orpheline non accessible par le biais des menus.'
]); ?>
</div>
<div class="col6">
<?php if($this->getHierarchy($this->getUrl(2), false)): ?>
<?php echo template::hidden('pageEditParentPageId', [
'value' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditParentPageId', $module::$pagesNoParentId, [
'label' => 'Page parent',
'selected' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php endif; ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditDisable', true, 'Désactivée', [
'checked' => $this->getData(['page', $this->getUrl(2), 'disable']),
'help' => 'Une page désactivée n\'est pas cliquable en mode déconnecté, les pages enfants sont visibles et accessibles. La page d\'accueil n\'est pas désactivable.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditTargetBlank', true, 'Nouvel onglet', [
'checked' => $this->getData(['page', $this->getUrl(2), 'targetBlank'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditHideTitle', true, 'Titre masqué', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideTitle'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditbreadCrumb', true, 'Fil d\'Ariane', [
'checked' => $this->getData(['page', $this->getUrl(2), 'breadCrumb']),
'help' => 'Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.'
]); ?>
</div>
</div>
</div>
<div class='col12'>
<?php echo template::text('pageEditMetaTitle', [
'label' => 'Méta-titre',
'value' => $this->getData(['page', $this->getUrl(2), 'metaTitle'])
]); ?>
<?php echo template::textarea('pageEditMetaDescription', [
'label' => 'Méta-description',
//'maxlength' => '500',
'value' => $this->getData(['page', $this->getUrl(2), 'metaDescription'])
]); ?>
</div>
</div>
</div>
</div>
<div class='row' id="pageEditAdvancedWrapper">
<div class="col12">
<div class="block">
<h4>Options Avancées</h4>
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditHideMenuChildren', true, 'Masquer les pages enfants dans le menu horizontal', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideMenuChildren']),
'help' => 'Les pages enfants ne sont pas visibles dans le menu horizontal, elles se seront dans un menu vertical. La page doit intégrer un lien vers l\'une des pages enfants sinon elles ne seront pas accessibles.'
<div class="block" id="advanced">
<h4>Options d'emplacement avancées
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col6">
<?php echo template::checkbox('pageEditHideMenuChildren', true, 'Masquer les pages enfants dans le menu horizontal', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideMenuChildren'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditHideMenuSide', true, 'Masquer la page et les pages enfants dans le menu d\'une barre latérale' , [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideMenuSide']),
'help' => 'La page est affichée dans un menu horizontal mais pas dans le menu vertical d\'une barre latérale.'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class='row' id="pageEditSeoWrapper">
<div class="col12">
<div class="block" id="ceo">
<h4>Permission et référencement
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class='col6'>
<?php echo template::select('pageEditGroup', self::$groupPublics, [
'label' => 'Groupe requis pour accéder à la page :',
'selected' => $this->getData(['page', $this->getUrl(2), 'group'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('pageEditHideMenuSide', true, 'Masquer la page dans le menu vertical', [
'checked' => $this->getData(['page', $this->getUrl(2), 'hideMenuSide']),
'help' => 'La page est affichée dans un menu horizontal mais pas dans un menu vertical inséré dans une barre latérale.'
</div>
<div class='col12'>
<?php echo template::text('pageEditMetaTitle', [
'label' => 'Méta-titre',
'value' => $this->getData(['page', $this->getUrl(2), 'metaTitle'])
]); ?>
</div>
<?php echo template::textarea('pageEditMetaDescription', [
'label' => 'Méta-description',
//'maxlength' => '500',
'value' => $this->getData(['page', $this->getUrl(2), 'metaDescription'])
]); ?>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,211 +0,0 @@
<?php
/**
* 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 <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
*
* Module search
* Produit par la communauté à partit d'un développement de Sylvain Lelièvre
*/
// Module de recherche d'un mot ou d'une phrase clef
class search extends common {
public static $actions = [
'index' => self::GROUP_VISITOR
];
public function index() {
if($this->isPost()) {
//Initialisations variables
$success = true;
$result = '';
$notification = '';
$total='';
$this->setData(['search',$total,0]);
// Récupération du mot clef passé par le formulaire de ...view/index.php, avec caractères accentués
$motclef=$this->getInput('searchMotphraseclef');
// Récupération de l'état de l'option mot entier passé par le même formulaire
$motentier=$this->getInput('searchMotentier', helper::FILTER_BOOLEAN);
//Pour affichage de l'entête du résultat
$result = '<h1>Recherche avec le mot clef : '.$motclef.'<br/></h1>';
if ($motclef !== "" && strlen($motclef) > 2) {
foreach($this->getHierarchy(null,false,null) as $parentId => $childIds) {
if ($this->getData(['page', $parentId, 'disable']) === false &&
$this->getUser('group') >= $this->getData(['page', $parentId, 'group']) &&
$this->getData(['page', $parentId, 'block']) !== 'bar') {
$url = $parentId;
$titre = $this->getData(['page', $parentId, 'title']);
$contenu = $this->getData(['page', $parentId, 'content']);
// Pages sauf pages filles et articles de blog
$result .= $this->occurrence($url, $titre, $contenu, $motclef, $motentier);
}
foreach($childIds as $childId) {
// Sous page
if ($this->getData(['page', $childId, 'disable']) === false &&
$this->getUser('group') >= $this->getData(['page', $parentId, 'group']) &&
$this->getData(['page', $parentId, 'block']) !== 'bar') {
$url = $childId;
$titre = $this->getData(['page', $childId, 'title']);
$contenu = $this->getData(['page', $childId, 'content']);
//Pages filles
$result .= $this->occurrence($url, $titre, $contenu, $motclef, $motentier);
}
// Articles d'une sous-page blog
if ($this->getData(['page', $childId, 'moduleId']) === 'blog')
{
foreach($this->getData(['module',$childId]) as $articleId => $article) {
if($this->getData(['module',$childId,$articleId,'state']) === true) {
$url = $childId . '/' . $articleId;
$titre = $article['title'];
$contenu = $article['content'];
// Articles de sous-page de type blog
$result .= $this->occurrence($url, $titre, $contenu, $motclef, $motentier);
}
}
}
}
// Articles d'un blog
if ($this->getData(['page', $parentId, 'moduleId']) === 'blog' ) {
foreach($this->getData(['module',$parentId]) as $articleId => $article) {
if($this->getData(['module',$parentId,$articleId,'state']) === true)
{
$url = $parentId. '/' . $articleId;
$titre = $article['title'];
$contenu = $article['content'];
// Articles de Blog
$result .= $this->occurrence($url, $titre, $contenu, $motclef, $motentier);
}
}
}
}
// Message de synthèse de la recherche
if ($this->getData(['search',$total])===0) {
$notification = 'Mot clef non trouv&eacute;. Avez-vous pens&eacute; aux accents ?';
$result .='Mot clef non trouv&eacute;. Avez-vous pens&eacute; aux accents ?';
$success = false;
} else {
$result .= 'Nombre d\'occurrences : '.$this->getData(['search',$total]);
$notification = 'Nombre d\'occurrences : '.$this->getData(['search',$total]);
$success = true;
}
} else {
$notification = 'Trop court ! Minimum 3 caract&egrave;res';
$result = 'Trop court ! Minimum 3 caract&egrave;res';
$success = false;
}
$_POST['result'] = $result;
$_POST['occurence'] = $total;
// Valeurs en sortie, affichage du résultat
$this->addOutput([
'title' => '',
'view' => 'result',
'notification' => $notification,
'state' => $success
]);
} else {
// Valeurs en sortie, affichage du formulaire
$this->addOutput([
'title' => '',
'view' => 'index'
]);
}
}
// Fonction de recherche des occurences dans $contenu
// Renvoie le résulat sous forme de chaîne
private function occurrence($url, $titre, $contenu, $motclef, $motentier)
{
// Nettoyage de $contenu : on enlève tout ce qui est inclus entre < et >
$contenu = $this->nettoyer_html($contenu);
// Accentuation
$contenu = html_entity_decode($contenu);
// Initialisations
$nboccu = 0;
$dejavu = '';
$total = '';
$resultat= '';
// Recherche des occurrences
do {
$occu = stristr($contenu,$motclef);
if ($occu !== false) {
if ($motentier === true) {
$controle_entier=$this->test_motentier($contenu,$motclef);
} else {
$controle_entier=true;
}
if ($controle_entier) {
if ($titre !== $dejavu) {
$resultat = '<p><br/>Mot clef trouv&eacute; dans la page : <a href="./?'.$url.'" target="_blank" rel="noopener">'.$titre.'</a><br/></p>';
}
$dejavu = $titre;
$nboccu++;
$resultat .= '<p>'.$nboccu.' - "...<em>'.substr($occu,0,200).'</em>..."<br/></p>';
}
// Pour recherche d'une autre occurrence dans le même contenu
$contenu = substr($occu,10);
}
}
while($occu != '');
$this->setData(['search',$total,$this->getData(['search',$total]) + $nboccu]);
return $resultat;
}
// Déclaration de la fonction nettoyer(string $contenu) : string
// Supprime de $contenu les caractères placés entre < et >, donc les balises html comme <p> <br/> etc...
// Retourne $contenu nettoyée, le résultat est sensiblement différent de celui obtenu avec la fonction strip_tags()
private function nettoyer_html($contenu)
{
do {
$pos1=strpos($contenu,chr(60));
if($pos1!==false) {
$pos2=strpos($contenu,chr(62));
if($pos2!==false) $contenu=substr_replace($contenu," ",$pos1,($pos2 - $pos1 + 1));
}
}
while($pos1!==false);
return $contenu;
}
// Déclaration de la fonction test_motentier(string $chaine, string $clef) : bool
// Vérifie si dans la string $chaine, $clef est un mot entier
// $clef ne doit pas être précédé ni suivi d'une lettre maj ou min
private function test_motentier($chaine, $clef)
{
$resultat=true;
$pos1=stripos($chaine,$clef);
$avant=ord(substr($chaine,$pos1-1, 1));
$apres=ord(substr($chaine,$pos1+strlen($clef),1));
// Traitement pour le caractère qui précède et celui qui suit
if (($avant>=65 && $avant<=90) ||
($avant>=97 && $avant<=122) ||
($apres>=65 && $apres<=90) ||
($apres>=97 && $apres<=122) ) {
$resultat=false;
}
return $resultat;
}
}

View File

@ -1,27 +0,0 @@
<?php echo template::formOpen('searchForm'); ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>Recherche</h4>
<div class="row">
<div class="col10 verticalAlignBottom">
<?php echo template::text('searchMotphraseclef', [
'label' => 'Mot ou phrase',
'help' => 'Tout ou partie d\'un mot ou d\'une phrase, sans guillemets. N\'oubliez pas les accents.'
]); ?>
</div>
<div class="col2 verticalAlignBottom">
<?php echo template::submit('pageEditSubmit', [
'value' => 'Ok'
]); ?>
</div>
</div>
<div class="row">
<?php echo template::checkbox('searchMotentier', true, 'Mot entier uniquement', [
'checked' => false
]); ?>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -1,38 +0,0 @@
<?php echo template::formOpen('searchForm'); ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>Recherche</h4>
<div class="row">
<div class="col10 verticalAlignBottom">
<?php echo template::text('searchMotphraseclef', [
'label' => 'Mot ou phrase',
'value' => isset($_POST['searchMotphraseclef']) === true ? $_POST['searchMotphraseclef'] : '',
'help' => 'Tout ou partie d\'un mot ou d\'une phrase, sans guillemets. N\'oubliez pas les accents.'
]); ?>
</div>
<div class="col2 verticalAlignBottom">
<?php echo template::submit('pageEditSubmit', [
'value' => 'Ok'
]); ?>
</div>
</div>
<div class="row">
<?php echo template::checkbox('searchMotentier', true, 'Mot entier uniquement', [
'checked' => isset($_POST['searchMotentier']) === true ? $_POST['searchMotentier'] : ''
]); ?>
</div>
</div>
</div>
<div class="col12">
<div class="block">
<h4>Résultat(s)</h4>
<?php if (isset($_POST['result'])) {
echo $_POST['result'];
} else {
echo "Rien à afficher";
} ?>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -9,7 +9,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
class sitemap extends common {

View File

@ -0,0 +1 @@
/* Vide */

View File

@ -1,52 +1,52 @@
<ul>
<?php foreach($this->getHierarchy(null,true,null) as $parentId => $childIds): ?>
<li>
<?php
<?php
if ($this->getData(['page', $parentId, 'disable']) === false && $this->getUser('group') >= $this->getData(['page', $parentId, 'group']))
{ ?>
{ ?>
<a href="<?php echo helper::baseUrl() . $parentId; ?>"><?php echo $this->getData(['page', $parentId, 'title']); ?></a>
<?php
} else {
<?php
} else {
// page désactivée
echo $this->getData(['page', $parentId, 'title']);
echo $this->getData(['page', $parentId, 'title']);
} ?>
<ul>
<?php foreach($childIds as $childId): ?>
<li>
<!-- Sous-page -->
<?php if ($this->getData(['page', $childId, 'disable']) === false && $this->getUser('group') >= $this->getData(['page', $parentId, 'group']))
{ ?>
<?php if ($this->getData(['page', $childId, 'disable']) === false && $this->getUser('group') >= $this->getData(['page', $parentId, 'group']))
{ ?>
<a href="<?php echo helper::baseUrl() . $childId; ?>"><?php echo $this->getData(['page', $childId, 'title']); ?></a>
<?php } else { ?>
<!-- page désactivée -->
<?php echo $this->getData(['page', $childId, 'title']); }?>
<?php echo $this->getData(['page', $childId, 'title']); }?>
<!-- articles d'une sous-page blog-->
<ul>
<?php if ($this->getData(['page', $childId, 'moduleId']) === 'blog') { ?>
<?php
foreach($this->getData(['module',$childId]) as $articleId => $article): ?>
<?php if($this->getData(['module',$childId,$articleId,'state']) === true) {?>
<?php if($this->getData(['module',$childId,'posts',$articleId,'state']) === true) {?>
<li>
<a href="<?php echo helper::baseUrl() . $childId . '/' . $articleId;?>"><?php echo $article['title']; ?></a>
</li>
<?php } ?>
<?php } ?>
<?php endforeach;
} ?>
</ul>
</ul>
</li>
<?php endforeach; ?>
<!-- ou articles d'un blog-->
<?php if ($this->getData(['page', $parentId, 'moduleId']) === 'blog' ) { ?>
<?php
foreach($this->getData(['module',$parentId]) as $articleId => $article): ?>
<?php if($this->getData(['module',$parentId,$articleId,'state']) === true) {?>
<li>
<a href="<?php echo helper::baseUrl() . $parentId. '/' . $articleId;?>"><?php echo $article['title']; ?></a>
</li>
<?php } ?>
<?php if ($this->getData(['page', $parentId, 'moduleId']) === 'blog' &&
!empty($this->getData(['module',$parentId, 'posts' ])) ) { ?>
<?php foreach($this->getData(['module',$parentId, 'posts' ]) as $articleId => $article): ?>
<?php if($this->getData(['module',$parentId,'posts',$articleId,'state']) === true ): ?>
<li>
<a href="<?php echo helper::baseUrl() . $parentId. '/' . $articleId;?>"><?php echo $article['title']; ?></a>
</li>
<?php endif; ?>
<?php endforeach;
} ?>
</ul>

View File

@ -50,7 +50,7 @@ ul #menuSide {
/* Block menu à droite */
#menuSideRight {
}
/* Block menu à gauchle */
/* Block menu à gauche */
#menuSideLeft {
}
@ -173,10 +173,6 @@ textarea:hover {
.newsContent {
}
.newsDate {
color: #404040;
}
.newsSignature {
color: #404040;
}

View File

@ -9,7 +9,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
* @copyright : Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
*/
@ -24,10 +24,13 @@ class theme extends common {
'index' => self::GROUP_ADMIN,
'menu' => self::GROUP_ADMIN,
'reset' => self::GROUP_ADMIN,
'resetAdmin' => self::GROUP_ADMIN,
'site' => self::GROUP_ADMIN,
'admin' => self::GROUP_ADMIN,
'manage' => self::GROUP_ADMIN,
'export' => self::GROUP_ADMIN,
'save' => self::GROUP_ADMIN
'save' => self::GROUP_ADMIN,
'checkImport' => self::GROUP_ADMIN
];
public static $aligns = [
'left' => 'À gauche',
@ -70,16 +73,16 @@ class theme extends common {
public static $footerblocks = [
1 => [
'hide' => 'Masqué',
'center' => 'Affiché' ],
'center' => 'Affiché' ],
2 => [
'hide' => 'Masqué',
'left' => 'A gauche',
'right' => 'A droite' ],
'left' => 'À gauche',
'right' => 'À droite' ],
3 => [
'hide' => 'Masqué',
'left' => 'A gauche',
'left' => 'À gauche',
'center' => 'Au centre',
'right' => 'A droite' ],
'right' => 'À droite' ],
4 => [
'hide' => 'Masqué',
'left' => 'En haut',
@ -110,7 +113,7 @@ class theme extends common {
'1.1em' => 'Moyenne (110%)',
'1.2em' => 'Grande (120%)',
'1.3em' => 'Très grande (130%)'
];
];
public static $headerFontSizes = [
'1.6em' => 'Très petite (160%)',
'1.8em' => 'Petite (180%)',
@ -158,7 +161,7 @@ class theme extends common {
'25px 15px' => 'Très grande'
];
public static $menuPositionsSite = [
'top' => 'En-dehors du site',
'top' => 'En-dehors du site',
'site-first' => 'Avant la bannière',
'site-second' => 'Après la bannière',
'hide' => 'Caché'
@ -169,7 +172,7 @@ class theme extends common {
'body-second' => 'Après la bannière',
'site' => 'Dans le site',
'hide' => 'Caché'
];
];
public static $menuRadius = [
'0px' => 'Aucun',
'3px 3px 0px 0px' => 'Très léger',
@ -208,7 +211,7 @@ class theme extends common {
'16px' => '16 pixels'
];
public static $bodySizes = [
'auto' => 'Automatique',
'auto' => 'Automatique',
'100% 100%' => 'Image étirée (100% 100%)',
'cover' => 'Responsive (cover)',
'contain' => 'Responsive (contain)'
@ -217,7 +220,7 @@ class theme extends common {
'none' => 'Standard',
'lowercase' => 'Minuscules',
'uppercase' => 'Majuscules',
'capitalize' => 'Majuscule à chaque mot'
'capitalize' => 'Majuscule à chaque mot'
];
public static $widths = [
'750px' => 'Petite (750 pixels)',
@ -225,19 +228,57 @@ class theme extends common {
'1170px' => 'Grande (1170 pixels)',
'100%' => 'Fluide (100%)'
];
public static $headerWide = [
'auto auto' => 'Automatique',
public static $headerWide = [
'auto auto' => 'Automatique',
'100% 100%' => 'Image étirée (100% 100%)',
'cover' => 'Responsive (cover)',
'contain' => 'Responsive (contain)'
];
public static $footerTemplate = [
public static $footerTemplate = [
'1' => 'Une seule colonne',
'2' => 'Deux colonnes : 1/2 - 1/2',
'3' => 'Trois colonnes : 1/3 - 1/3 - 1/3',
'4' => 'Trois lignes superposées'
];
/**
* Thème des écrans d'administration
*/
public function admin() {
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['admin', [
'backgroundColor' => $this->getInput('adminBackgroundColor'),
'colorTitle' => $this->getInput('adminColorTitle'),
'colorText' => $this->getInput('adminColorText'),
'colorButtonText' => $this->getInput('adminColorButtonText'),
'backgroundColorButton' => $this->getInput('adminColorButton'),
'backgroundColorButtonGrey' => $this->getInput('adminColorGrey'),
'backgroundColorButtonRed' => $this->getInput('adminColorRed'),
'backgroundColorButtonGreen'=> $this->getInput('adminColorGreen'),
'fontText' => $this->getInput('adminFontText'),
'fontSize' => $this->getInput('adminFontTextSize'),
'fontTitle' => $this->getInput('adminFontTitle'),
'backgroundBlockColor' => $this->getInput('adminBackGroundBlockColor'),
'borderBlockColor' => $this->getInput('adminBorderBlockColor'),
]]);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Modifications enregistrées',
'redirect' => helper::baseUrl() . 'theme/admin',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Administration',
'view' => 'admin',
'vendor' => [
'tinycolorpicker'
],
]);
}
/**
* Mode avancé
*/
@ -302,7 +343,7 @@ class theme extends common {
public function footer() {
// Soumission du formulaire
if($this->isPost()) {
if ( $this->getInput('themeFooterCopyrightPosition') === 'hide' &&
if ( $this->getInput('themeFooterCopyrightPosition') === 'hide' &&
$this->getInput('themeFooterSocialsPosition') === 'hide' &&
$this->getInput('themeFooterTextPosition') === 'hide' ) {
// Valeurs en sortie
@ -327,7 +368,7 @@ class theme extends common {
'copyrightPosition' => $this->getInput('themeFooterCopyrightPosition'),
'textPosition' => $this->getInput('themeFooterTextPosition'),
'socialsPosition' => $this->getInput('themeFooterSocialsPosition'),
'textTransform' => $this->getInput('themeFooterTextTransform'),
'textTransform' => $this->getInput('themeFooterTextTransform'),
'font' => $this->getInput('themeFooterFont'),
'fontSize' => $this->getInput('themeFooterFontSize'),
'fontWeight' => $this->getInput('themeFooterFontWeight'),
@ -335,7 +376,8 @@ class theme extends common {
'displaySiteMap' => $this->getInput('themefooterDisplaySiteMap', helper::FILTER_BOOLEAN),
'displayCopyright' => $this->getInput('themefooterDisplayCopyright', helper::FILTER_BOOLEAN),
'displayLegal' => $this->getInput('themeFooterDisplayLegal', helper::FILTER_BOOLEAN),
'displaySearch' => $this->getInput('themeFooterDisplaySearch', helper::FILTER_BOOLEAN),
'displaySearch' => $this->getInput('themeFooterDisplaySearch', helper::FILTER_BOOLEAN),
'displayMemberBar'=> $this->getInput('themeFooterDisplayMemberBar', helper::FILTER_BOOLEAN),
'template' => $this->getInput('themeFooterTemplate')
]]);
// Valeurs en sortie
@ -366,7 +408,6 @@ class theme extends common {
// Si une image est positionnée, l'arrière en transparent.
$this->setData(['theme', 'header', [
'backgroundColor' => $this->getInput('themeHeaderBackgroundColor'),
'textTransform' => $this->getInput('themeHeaderTextTransform'),
'font' => $this->getInput('themeHeaderFont'),
'fontSize' => $this->getInput('themeHeaderFontSize'),
'fontWeight' => $this->getInput('themeHeaderFontWeight'),
@ -378,7 +419,8 @@ class theme extends common {
'position' => $this->getInput('themeHeaderPosition'),
'textAlign' => $this->getInput('themeHeaderTextAlign'),
'textColor' => $this->getInput('themeHeaderTextColor'),
'textHide' => $this->getInput('themeHeaderTextHide', helper::FILTER_BOOLEAN),
'textHide' => $this->getInput('themeHeaderTextHide', helper::FILTER_BOOLEAN),
'textTransform' => $this->getInput('themeHeaderTextTransform'),
'linkHomePage' => $this->getInput('themeHeaderlinkHomePage',helper::FILTER_BOOLEAN),
'imageContainer' => $this->getInput('themeHeaderImageContainer')
]]);
@ -387,17 +429,19 @@ class theme extends common {
$this->getData(['theme','menu','position']) !== 'site' &&
$this->getData(['theme','menu','position']) !== 'top' ) {
case 'site' :
$position = str_replace ('body','site',$this->getData(['theme','menu','position']));
$position = str_replace ('body','site',$this->getData(['theme','menu','position']));
break;
case 'body' :
$position = str_replace ('site','body',$this->getData(['theme','menu','position']));
break;
default:
$position = $this->getData(['theme','menu','position']);
$position = $this->getData(['theme','menu','position']);
}
$this->setData(['theme', 'menu', [
'backgroundColor' => $this->getData(['theme', 'menu', 'backgroundColor']),
'font' => $this->getData(['theme', 'menu', 'font']),
'backgroundColorSub' => $this->getData(['theme', 'menu', 'backgroundColorSub']),
'font' => $this->getData(['theme', 'menu', 'font']),
'fontSize' => $this->getData(['theme', 'menu', 'fontSize']),
'fontWeight' => $this->getData(['theme', 'menu', 'fontWeight']),
'height' => $this->getData(['theme', 'menu', 'height']),
@ -410,8 +454,9 @@ class theme extends common {
'fixed' => $this->getData(['theme','menu','fixed']),
'activeColorAuto' => $this->getData(['theme','menu','activeColorAuto']),
'activeColor' => $this->getData(['theme','menu','activeColor']),
'activeTextColor' => $this->getData(['theme','menu','activeTextColor']),
'radius' => $this->getData(['theme','menu','radius']),
'burgerTitle' => $this->getData(['theme','menu','burgerTitle'])
'memberBar' => $this->getData(['theme','menu','memberBar'])
]]);
// Valeurs en sortie
$this->addOutput([
@ -436,7 +481,7 @@ class theme extends common {
public function index() {
// Valeurs en sortie
$this->addOutput([
'title' => 'Personnalisation du thème',
'title' => 'Personnalisation des thèmes',
'view' => 'index'
]);
}
@ -449,7 +494,8 @@ class theme extends common {
if($this->isPost()) {
$this->setData(['theme', 'menu', [
'backgroundColor' => $this->getInput('themeMenuBackgroundColor'),
'font' => $this->getInput('themeMenuFont'),
'backgroundColorSub' => $this->getInput('themeMenuBackgroundColorSub'),
'font' => $this->getInput('themeMenuFont'),
'fontSize' => $this->getInput('themeMenuFontSize'),
'fontWeight' => $this->getInput('themeMenuFontWeight'),
'height' => $this->getInput('themeMenuHeight'),
@ -462,8 +508,10 @@ class theme extends common {
'fixed' => $this->getInput('themeMenuFixed', helper::FILTER_BOOLEAN),
'activeColorAuto' => $this->getInput('themeMenuActiveColorAuto', helper::FILTER_BOOLEAN),
'activeColor' => $this->getInput('themeMenuActiveColor'),
'activeTextColor' => $this->getInput('themeMenuActiveTextColor'),
'radius' => $this->getInput('themeMenuRadius'),
'burgerTitle' => $this->getInput('themeMenuBurgerTitle', helper::FILTER_BOOLEAN)
'burgerTitle' => $this->getInput('themeMenuBurgerTitle', helper::FILTER_BOOLEAN),
'memberBar' => $this->getInput('themeMenuMemberBar', helper::FILTER_BOOLEAN)
]]);
// Valeurs en sortie
$this->addOutput([
@ -496,6 +544,21 @@ class theme extends common {
]);
}
/**
* Réinitialisation de la personnalisation avancée
*/
public function resetAdmin() {
// Supprime le fichier de personnalisation avancée
//unlink(self::DATA_DIR.'admin.json');
$this->initData('admin');
// Valeurs en sortie
$this->addOutput([
'notification' => 'Thème réinitialisé',
'redirect' => helper::baseUrl() . 'theme/admin',
'state' => true
]);
}
/**
* Options du site
*/
@ -508,18 +571,25 @@ class theme extends common {
'fontWeight' => $this->getInput('themeTitleFontWeight'),
'textTransform' => $this->getInput('themeTitleTextTransform')
]]);
$this->setData(['theme', 'button', 'backgroundColor', $this->getInput('themeButtonBackgroundColor')]);
$this->setData(['theme', 'link', 'textColor', $this->getInput('themeLinkTextColor')]);
$this->setData(['theme', 'text', [
'font' => $this->getInput('themeTextFont'),
'fontSize' => $this->getInput('themeTextFontSize'),
'textColor' => $this->getInput('themeTextTextColor'),
'linkColor'=> $this->getInput('themeTextLinkColor')
]]);
$this->setData(['theme', 'site', [
'backgroundColor' => $this->getInput('themeSiteBackgroundColor'),
'radius' => $this->getInput('themeSiteRadius'),
'shadow' => $this->getInput('themeSiteShadow'),
'width' => $this->getInput('themeSiteWidth')
'width' => $this->getInput('themeSiteWidth'),
'margin' => $this->getInput('themeSiteMargin',helper::FILTER_BOOLEAN)
]]);
$this->setData(['theme', 'button', [
'backgroundColor' => $this->getInput('themeButtonBackgroundColor')
]]);
$this->setData(['theme', 'block', [
'backgroundColor' => $this->getInput('themeBlockBackgroundColor'),
'borderColor' => $this->getInput('themeBlockBorderColor')
]]);
// Valeurs en sortie
$this->addOutput([
@ -545,38 +615,70 @@ class theme extends common {
public function manage() {
if($this->isPost() ) {
$zipFilename = $this->getInput('themeManageImport', helper::FILTER_STRING_SHORT, true);
$tempFolder = uniqid();
$zip = new ZipArchive();
if ($zip->open(self::FILE_DIR.'source/'.$zipFilename) === TRUE) {
$zip->extractTo('.');
mkdir (self::TEMP_DIR . $tempFolder);
$zip->extractTo(self::TEMP_DIR . $tempFolder );
$modele = '';
// Archive de thème ?
if (
file_exists(self::TEMP_DIR . $tempFolder . '/site/data/custom.css')
AND file_exists(self::TEMP_DIR . $tempFolder . '/site/data/theme.css')
AND file_exists(self::TEMP_DIR . $tempFolder . '/site/data/theme.json')
) {
$modele = 'theme';
}
if(
file_exists(self::TEMP_DIR . $tempFolder . '/site/data/admin.json')
AND file_exists(self::TEMP_DIR . $tempFolder . '/site/data/admin.css')
) {
$modele = 'admin';
}
if (!empty($modele)
) {
// traiter l'archive
$success = $zip->extractTo('.');
// traitement de l'erreur
$notification = $success ? 'Le thème a été importé' : 'Erreur lors de l\'extraction, vérifiez les permissions.';
// Check le thème
$this->checkImport($modele);
} else {
// pas une archive de thème
$success = false;
$notification = 'Ce n\'est pas l\'archive d\'un thème !';
}
// Supprimer le dossier temporaire même si le thème est invalide
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
} else {
// erreur à l'ouverture
$success = false;
$notification = 'Impossible d\'ouvrir l\'archive';
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'theme'
]);
} else {
$this->addOutput([
'notification' => 'Erreur avec le thème <b>'.$zipFilename.'</b>',
'redirect' => helper::baseUrl() . 'theme/manage'
]);
}
'notification' => $notification,
'state' => $success,
'title' => 'Gestion des thèmes',
'view' => 'manage'
]);;
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Gestion des thèmes',
'view' => 'manage'
]);
}
/**
* Export du thème
*/
public function export() {
// Make zip
$zipFilename = $this->makezip();
$zipFilename = $this->makezip($this->getUrl(2));
// Téléchargement du ZIP
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
@ -586,7 +688,7 @@ class theme extends common {
readfile(self::TEMP_DIR . $zipFilename);
// Nettoyage du dossier
unlink (self::TEMP_DIR . $zipFilename);
die();
exit();
}
/**
@ -594,44 +696,99 @@ class theme extends common {
*/
public function save() {
// Make zip
$zipFilename = $this->makezip();
$zipFilename = $this->makezip($this->getUrl(2));
// Téléchargement du ZIP
mkdir(self::FILE_DIR.'source/theme');
if (!is_dir(self::FILE_DIR.'source/theme')) {
mkdir(self::FILE_DIR.'source/theme');
}
copy (self::TEMP_DIR . $zipFilename , self::FILE_DIR.'source/theme/' . $zipFilename);
// Nettoyage du dossier
unlink (self::TEMP_DIR . $zipFilename);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Archive <b>'.$zipFilename.'</b> sauvegardée dans fichiers',
'notification' => 'Archive <b>'.$zipFilename.'</b> sauvegardée avec succès',
'redirect' => helper::baseUrl() . 'theme/manage',
'state' => true
]);
}
/**
* Contrôle du thème
* Vérifie la présence de toutes les clés par rapport au thème par défaut
* les créer si elles n'existent pas.
*/
private function checkImport ($modele = 'theme') {
require_once('core/module/install/ressource/defaultdata.php');
switch ($modele) {
case 'theme':
$default['theme'] = init::$defaultData['theme'];
// Check le thème
$dataKeys = ['body','footer','header','menu','site','block','text','title','button'];
// Parcourir les clés principales et stocker les contenus
foreach($dataKeys as $key1) {
$itemKeys = $default['theme'][$key1];
// Parcourir les clés secondaires
foreach ($itemKeys as $key2 => $value) {
// Données nulles ou vides instaurer la donnée par défaut
if ($this->getData(['theme',$key1,$key2]) === NULL
OR empty($this->getData(['theme',$key1,$key2]) )
) {
$this->setData(['theme',$key1,$key2,$value]);
}
}
}
break;
case 'admin':
// Check Admin
$default['admin'] = init::$defaultData['admin'];
// Pas de clé secondaire
$itemKeys = $default['admin'];
foreach ($itemKeys as $key1 => $value) {
// Données nulles ou vides instaurer la donnée par défaut
if ($this->getData(['admin',$key1]) === NULL
OR empty($this->getData(['admin',$key1]) )
) {
$this->setData(['admin',$key1,$value]);
}
}
break;
}
}
/**
* construction du zip
* @param string $modele theme ou admin
*/
public function makezip() {
private function makezip($modele) {
// Creation du dossier
// $zipFilename = 'theme-'.date('dmY').'-'.date('hm').'-'.rand(10,99).'.zip';
$zipFilename = 'theme '.date('d m Y').' '.date('H i s ').'.zip';
$zipFilename = $modele . ' ' .date('d m Y').' '.date('H i s ').'.zip';
$zip = new ZipArchive();
if ($zip->open(self::TEMP_DIR . $zipFilename, ZipArchive::CREATE | ZipArchive::OVERWRITE ) === TRUE) {
$zip->addFile(self::DATA_DIR.'theme.json',self::DATA_DIR.'theme.json');
$zip->addFile(self::DATA_DIR.'theme.css',self::DATA_DIR.'theme.css');
$zip->addFile(self::DATA_DIR.'custom.css',self::DATA_DIR.'custom.css');
if ($this->getData(['theme','body','image']) !== '' ) {
$zip->addFile(self::FILE_DIR.'source/'.$this->getData(['theme','body','image']),
self::FILE_DIR.'source/'.$this->getData(['theme','body','image'])
);
}
if ($this->getData(['theme','header','image']) !== '' ) {
$zip->addFile(self::FILE_DIR.'source/'.$this->getData(['theme','header','image']),
self::FILE_DIR.'source/'.$this->getData(['theme','header','image'])
);
switch ($modele) {
case 'admin':
$zip->addFile(self::DATA_DIR.'admin.json',self::DATA_DIR.'admin.json');
$zip->addFile(self::DATA_DIR.'admin.css',self::DATA_DIR.'admin.css');
break;
case 'theme':
$zip->addFile(self::DATA_DIR.'theme.json',self::DATA_DIR.'theme.json');
$zip->addFile(self::DATA_DIR.'theme.css',self::DATA_DIR.'theme.css');
$zip->addFile(self::DATA_DIR.'custom.css',self::DATA_DIR.'custom.css');
if ($this->getData(['theme','body','image']) !== '' ) {
$zip->addFile(self::FILE_DIR.'source/'.$this->getData(['theme','body','image']),
self::FILE_DIR.'source/'.$this->getData(['theme','body','image'])
);
}
if ($this->getData(['theme','header','image']) !== '' ) {
$zip->addFile(self::FILE_DIR.'source/'.$this->getData(['theme','header','image']),
self::FILE_DIR.'source/'.$this->getData(['theme','header','image'])
);
}
break;
}
$ret = $zip->close();
}
return ($zipFilename);
}
}

View File

@ -0,0 +1,17 @@
/**
* 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 <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/

View File

@ -0,0 +1,48 @@
/**
* 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 Fred Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/**
* Aperçu en direct
*/
$("input, select").on("change", function() {
var titleFont = $("#adminFontTitle").val();
var textFont = $("#adminFontText").val();
var css = "@import url('https://fonts.googleapis.com/css?family=" + titleFont + "|" + textFont + "');";
var colors = core.colorVariants($("#adminBackgroundColor").val());
var css = "#site{background-color:" + colors.normal + ";}";
css += "body, .row > div {font:" + $("#adminFontTextSize").val() + " '" + textFont + "', sans-serif;}";
css += "body h1, h2, h3, h4, h5, h6 {font-family:'" + titleFont + "', sans-serif; color:" + $("#adminColorTitle").val() + ";}";
css += "body:not(.editorWysiwyg),span .zwiico-help {color:" + $("#adminColorText").val() + ";}";
var colors = core.colorVariants($("#adminColorButton").val());
css += "input[type='checkbox']:checked + label::before,.speechBubble{ background-color:" + colors.normal + "; color:" + $("#adminColorButtonText").val() + ";}";
css += ".speechBubble::before {border-color:" + colors.normal + " transparent transparent transparent;}";
css += ".button {background-color:" + colors.normal + ";color:" + colors.text + ";}.button:hover {background-color:" + colors.darken + ";color:" + colors.text + ";}.button:active {background-color:" + colors.veryDarken + ";color:" + colors.text + ";}";
var colors = core.colorVariants($("#adminColorGrey").val());
css += ".button.buttonGrey {background-color: " + colors.normal + ";color:" + colors.text + ";}.button.buttonGrey:hover {background-color:" + colors.darken + ";color:" + colors.text + "}.button.buttonGrey:active {background-color:" + colors.veryDarken + ";color:" + colors.text + ";}";
var colors = core.colorVariants($("#adminColorRed").val());
css += ".button.buttonRed {background-color: " + colors.normal + ";color:" + colors.text + ";}.button.buttonRed:hover {background-color:" + colors.darken + ";color:" + colors.text + "}.button.buttonRed:active {background-color:" + colors.veryDarken + ";color:" + colors.text + "}";
var colors = core.colorVariants($("#adminColorGreen").val());
css += "button[type=submit] {background-color: " + colors.normal + ";color: " + ";color:" + colors.text + "}button[type=submit]:hover {background-color: " + colors.darken + ";color:" + colors.text + ";}button[type=submit]:active {background-color:" + colors.veryDarken + ";color:" + colors.text + "}";
var colors = core.colorVariants($("#adminBackGroundBlockColor").val());
css += ".block {border: 1px solid " + $("#adminBorderBlockColor").val() + ";}.block h4 {background-color: " + colors.normal + ";color:" + colors.text + ";}";
css += "input[type=email],input[type=text],input[type=password],select:not(#barSelectPage),textarea:not(.editorWysiwyg),.inputFile{background-color: " + colors.normal + ";color:" + colors.text + ";border: 1px solid " + $("#adminBorderBlockColor").val() + ";}";
// Ajout du css au DOM
$("#themePreview").remove();
$("<style>")
.attr("type", "text/css")
.attr("id", "themePreview")
.text(css)
.appendTo("head");
});

View File

@ -0,0 +1,146 @@
<?php echo template::formOpen('configAdminForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configAdminBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'theme',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2 offset4">
<?php echo template::button('configAdminTest', [
'value' => 'Bouton Standard'
]); ?>
</div>
<div class="col2 offset">
<?php echo template::button('configAdminReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'theme/resetAdmin',
'value' => 'Réinitialiser',
'ico' => 'cancel'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('configAdminSubmit',[
'value' => 'Valider',
'ico' => 'check'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Couleurs</h4>
<div class="row">
<div class="col4">
<?php echo template::text('adminBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan',
'value' => $this->getData(['admin', 'backgroundColor'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('adminColorTitle', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Titres',
'value' => $this->getData(['admin', 'colorTitle'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('adminColorText', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['admin', 'colorText'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('adminBackGroundBlockColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.',
'label' => 'Arrière-plan des champs',
'value' => $this->getData(['admin', 'backgroundBlockColor'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('adminBorderBlockColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bordure des champs',
'value' => $this->getData(['admin', 'borderBlockColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::text('adminColorGrey', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton retour',
'value' => $this->getData(['admin', 'backgroundColorButtonGrey'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('adminColorButton', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton standard',
'value' => $this->getData(['admin', 'backgroundColorButton'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('adminColorRed', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton effacement',
'value' => $this->getData(['admin', 'backgroundColorButtonRed'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('adminColorGreen', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bouton validation',
'value' => $this->getData(['admin', 'backgroundColorButtonGreen'])
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Mise en forme du texte</h4>
<div class="row">
<div class="col4">
<?php echo template::select('adminFontText', $module::$fonts, [
'label' => 'Police du texte',
'selected' => $this->getData(['admin', 'fontText']),
'fonts' => true
]); ?>
</div>
<div class="col4">
<?php echo template::select('adminFontTextSize', $module::$siteFontSizes, [
'label' => 'Taille',
'selected' => $this->getData(['admin', 'fontSize'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('adminFontTitle', $module::$fonts, [
'label' => 'Police des titres',
'selected' => $this->getData(['admin', 'fontTitle']),
'fonts' => true
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

8
core/module/theme/view/advanced/advanced.css Normal file → Executable file
View File

@ -9,8 +9,10 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/* Thème administration */
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**

View File

@ -24,7 +24,7 @@
<div class="col12">
<?php echo template::textarea('themeAdvancedCss', [
'value' => file_get_contents(self::DATA_DIR.'custom.css'),
'class' => 'editorCss'
'class' => 'editor'
]); ?>
</div>
</div>

7
core/module/theme/view/body/body.css Normal file → Executable file
View File

@ -8,10 +8,13 @@
* @license GNU General Public License, version 3
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/
#backToTop {
display: block;

View File

@ -7,9 +7,16 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**
* Affichage de l'icone de remontée et permettre l'aperçu.
*/
$(document).ready(function(){
$("#backToTop").css("display","show");
});
/**
* Aperçu en direct
*/
@ -24,8 +31,8 @@ $("input, select").on("change", function() {
else {
css += "body{background-image:none}";
}
css += '#backToTop {background-color:' + $("#themeBodyToTopBackground").val() + ';color:' + $("#themeBodyToTopColor").val() + ';}';
css += '#backToTop {background-color:' + $("#themeBodyToTopBackground").val() + ';color:' + $("#themeBodyToTopColor").val() + ';}';
// Ajout du css au DOM
$("#themePreview").remove();
$("<style>")
@ -42,4 +49,5 @@ $("#themeBodyImage").on("change", function() {
else {
$("#themeBodyImageOptions").slideUp();
}
}).trigger("change");
}).trigger("change");

View File

@ -41,21 +41,26 @@
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Icône haut de page',
'value' => $this->getData(['theme', 'body', 'toTopColor'])
]); ?>
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="col6">
<div class="block">
<h4>Image</h4>
<?php
$imageFile = file_exists(self::FILE_DIR.'source/'.$this->getData(['theme', 'body', 'image'])) ? $this->getData(['theme', 'body', 'image']) : "";
echo template::file('themeBodyImage', [
'label' => 'Fond',
'type' => 1,
'value' => $imageFile
]); ?>
<div class="row">
<div class="col12">
<?php
$imageFile = file_exists(self::FILE_DIR.'source/'.$this->getData(['theme', 'body', 'image'])) ? $this->getData(['theme', 'body', 'image']) : "";
echo template::file('themeBodyImage', [
'help' => 'Sélectionner une image',
'label' => 'Fond',
'type' => 1,
'value' => $imageFile
]); ?>
</div>
</div>
<div id="themeBodyImageOptions" class="displayNone">
<div class="row">
<div class="col6">

8
core/module/theme/view/footer/footer.css Normal file → Executable file
View File

@ -9,8 +9,10 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/* Thème administration */
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/

View File

@ -9,7 +9,7 @@
* @license GNU General Public License, version 3
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**

View File

@ -13,11 +13,11 @@
</div>
</div>
<div class="row">
<div class="col6">
<div class="col4">
<div class="block">
<h4>Couleurs</h4>
<div class="row">
<div class="col6">
<div class="col12">
<?php echo template::text('themeFooterBackgroundColor', [
'class' => 'colorPicker',
'label' => 'Fond',
@ -25,7 +25,9 @@
'help' => 'Quand le pied de page est dans le site, l\'arrière plan transparent montre le fond de la page. Quand le pied de page est hors du site, l\'arrière plan transparent montre le fond du site.'
]); ?>
</div>
<div class="col6">
</div>
<div class="row">
<div class="col12">
<?php echo template::text('themeFooterTextColor', [
'class' => 'colorPicker',
'label' => 'Texte',
@ -35,49 +37,59 @@
</div>
</div>
</div>
<div class="col6">
<div class="col8">
<div class="block">
<h4>Informations</h4>
<h4>Paramètres du bloc Informations</h4>
<div class="row">
<div class="col6">
<div class="row">
<?php echo template::checkbox('themefooterDisplayCopyright', true, 'Motorisé par', [
'checked' => $this->getData(['theme', 'footer','displayCopyright'])
]); ?>
</div>
<div class="row">
<?php echo template::checkbox('themefooterDisplayVersion', true, 'Numéro de version', [
'checked' => $this->getData(['theme', 'footer','displayVersion'])
]); ?>
</div>
<div class="row">
<?php echo template::checkbox('themeFooterDisplayLegal', true, 'Mentions légales', [
'checked' => (bool) empty($this->getData(['config', 'legalPageId'])) ? false : $this->getData(['theme', 'footer', 'displayLegal']),
'disabled' => (bool) empty($this->getData(['config', 'legalPageId'])) ? true : false,
'help' => (bool) empty($this->getData(['config', 'legalPageId'])) ? 'Pour activer cette option, sélectionnez la page contenant les mentions légales dans la gestion du site' : ''
]); ?>
</div>
<?php echo template::checkbox('themefooterDisplayCopyright', true, 'Motorisé par', [
'checked' => $this->getData(['theme', 'footer','displayCopyright']),
'help' => 'Affiche cette mention devant ZwiiCMS'
]); ?>
</div>
<div class="col6">
<div class="row">
<?php echo template::checkbox('themefooterDisplaySiteMap', true, 'Plan du site', [
'checked' => $this->getData(['theme', 'footer', 'displaySiteMap']),
'help' => 'Un plan du site permet un meilleur référencement.'
]); ?>
</div>
<div class="row">
<?php echo template::checkbox('themeFooterLoginLink', true, 'Lien de connexion', [
'checked' => $this->getData(['theme', 'footer', 'loginLink'])
]); ?>
</div>
<div class="row">
<?php echo template::checkbox('themeFooterDisplaySearch', true, 'Rechercher', [
'checked' => $this->getData(['theme', 'footer', 'displaySearch']),
]); ?>
</div>
<?php echo template::checkbox('themefooterDisplayVersion', true, 'Numéro de version', [
'checked' => $this->getData(['theme', 'footer','displayVersion']),
'help' => 'Affiche le numéro de version après ZwiiCMS'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('themefooterDisplaySiteMap', true, 'Plan du site', [
'checked' => $this->getData(['theme', 'footer', 'displaySiteMap']),
'help' => 'Un plan du site permet un meilleur référencement.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('themeFooterLoginLink', true, 'Lien de connexion', [
'checked' => $this->getData(['theme', 'footer', 'loginLink']),
'help' => 'Pour éviter les tentatives de piratage, enregistrez la page de connexion en favori et désactivez cette option.'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<em>Le paramétrage des mentions légales s'effectue dans la configuration du site.</em>
<?php echo template::checkbox('themeFooterDisplayMemberBar', true, 'Barre du membre connecté', [
'checked' => $this->getData(['theme', 'footer', 'displayMemberBar']),
'help' => 'Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés, ne s\'applique pas aux éditeurs et administrateurs.'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('themeFooterDisplayLegal', true, 'Mentions légales', [
'checked' => $this->getData(['config', 'legalPageId']) === 'none' ? false : $this->getData(['theme', 'footer', 'displayLegal']),
'disabled' => $this->getData(['config', 'legalPageId']) === 'none' ? true : false,
'help' => $this->getData(['config', 'legalPageId']) === 'none' ? 'Pour activer cette option, sélectionnez la page contenant les mentions légales dans la configuration du site' : ''
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('themeFooterDisplaySearch', true, 'Rechercher dans le site', [
'checked' => $this->getData(['config', 'searchPageId']) === 'none' ? false : $this->getData(['theme', 'footer', 'displaySearch']),
'disabled' => $this->getData(['config', 'searchPageId']) === 'none' ? true : false,
'help' => $this->getData(['config', 'searchPageId']) === 'none' ? 'Pour activer cette option, sélectionnez la page contenant un module de recherche dans la configuration du site' : ''
]); ?>
</div>
</div>
</div>
@ -110,7 +122,7 @@
<div class="col3">
<?php echo template::select('themeFooterFontSize', $module::$footerFontSizes, [
'label' => 'Taille',
'help' => 'Proportionnelle à celle définie dans le site.',
'help' => 'Proportionnelle à celle définie dans le site.',
'selected' => $this->getData(['theme', 'footer', 'fontSize'])
]); ?>
</div>
@ -133,10 +145,9 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>Configuration</h4>
<h4>Configuration des blocs</h4>
<div class="row">
<div class="col4">
<?php $footerBlockPosition = is_null($this->getData(['theme', 'footer', 'template'])) ? $module::$footerblocks[3] : $module::$footerblocks [$this->getData(['theme', 'footer', 'template'])] ;?>
<?php echo template::select('themeFooterTemplate', $module::$footerTemplate, [
'label' => 'Disposition',
@ -159,39 +170,63 @@
<div class="row">
<div class="col4">
<p><strong>Contenu personnalisé</strong></p>
<?php echo template::select('themeFooterTextPosition', $footerBlockPosition, [
'label' => 'Emplacement',
'selected' => $this->getData(['theme', 'footer', 'textPosition']),
'class' => 'themeFooterContent'
]); ?>
<?php echo template::select('themeFooterTextAlign', $module::$aligns, [
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'textAlign'])
]); ?>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterTextPosition', $footerBlockPosition, [
'label' => 'Emplacement',
'selected' => $this->getData(['theme', 'footer', 'textPosition']),
'class' => 'themeFooterContent'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterTextAlign', $module::$aligns, [
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'textAlign'])
]); ?>
</div>
</div>
</div>
<div class="col4">
<p><strong>Réseaux sociaux</strong></p>
<?php echo template::select('themeFooterSocialsPosition', $footerBlockPosition, [
'label' => 'Emplacement',
'selected' => $this->getData(['theme', 'footer', 'socialsPosition']),
'class' => 'themeFooterContent'
]); ?>
<?php echo template::select('themeFooterSocialsAlign', $module::$aligns, [
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'socialsAlign'])
]); ?>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterSocialsPosition', $footerBlockPosition, [
'label' => 'Emplacement',
'selected' => $this->getData(['theme', 'footer', 'socialsPosition']),
'class' => 'themeFooterContent'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterSocialsAlign', $module::$aligns, [
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'socialsAlign'])
]); ?>
</div>
</div>
</div>
<div class="col4">
<p><strong>Informations</strong></p>
<?php echo template::select('themeFooterCopyrightPosition', $footerBlockPosition, [
'label' => 'Emplacement',
'selected' => $this->getData(['theme', 'footer', 'copyrightPosition']),
'class' => 'themeFooterContent'
]); ?>
<?php echo template::select('themeFooterCopyrightAlign', $module::$aligns, [
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'copyrightAlign'])
]); ?>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterCopyrightPosition', $footerBlockPosition, [
'label' => 'Emplacement',
'selected' => $this->getData(['theme', 'footer', 'copyrightPosition']),
'class' => 'themeFooterContent'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::select('themeFooterCopyrightAlign', $module::$aligns, [
'label' => 'Alignement',
'selected' => $this->getData(['theme', 'footer', 'copyrightAlign'])
]); ?>
</div>
</div>
</div>
<div class="col6">
<div id="themeFooterPositionOptions">
@ -199,13 +234,13 @@
'checked' => $this->getData(['theme', 'footer', 'margin'])
]); ?>
</div>
</div>
</div>
<div class="col6">
<div id="themeFooterPositionFixed" class="displayNone">
<?php echo template::checkbox('themeFooterFixed', true, 'Pied de page fixe', [
'checked' => $this->getData(['theme', 'footer', 'fixed'])
]); ?>
</div>
</div>
</div>
</div>
</div>

6
core/module/theme/view/header/header.css Normal file → Executable file
View File

@ -9,7 +9,9 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/

View File

@ -9,7 +9,7 @@
* @license GNU General Public License, version 3
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
$(document).ready(function(){
@ -25,11 +25,12 @@ $("input, select").on("change", function() {
// Récupérer la taille de l'image
var tmpImg = new Image();
tmpImg.onload = function() {
// Informations affichées
$("#themeHeaderImageHeight").html(tmpImg.height + "px");
$("#themeHeaderImageWidth").html(tmpImg.width + "px");
$("#themeHeaderImageRatio").html(tmpImg.width / tmpImg.height);
// Limiter la hauteur à 600 px
if (tmpImg.height > 600) {

View File

@ -13,24 +13,22 @@
</div>
</div>
<div class="row">
<div class="col4">
<div class="col6">
<div class="block">
<h4>Couleurs</h4>
<div class="row">
<div class="col12">
<div class="col6">
<?php echo template::text('themeHeaderBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond',
'value' => $this->getData(['theme', 'header', 'backgroundColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="col6">
<?php echo template::text('themeHeaderTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'header', 'textColor'])
]); ?>
@ -38,7 +36,7 @@
</div>
</div>
</div>
<div class="col8">
<div class="col6">
<div class="block">
<h4>Image</h4>
<div class="row">
@ -47,6 +45,7 @@
$imageFile = file_exists(self::FILE_DIR.'source/'.$this->getData(['theme', 'header', 'image'])) ?
$this->getData(['theme', 'header', 'image']) : "";
echo template::file('themeHeaderImage', [
'help' => 'Sélectionner une image aux dimensions recommandées ci-dessous :',
'label' => 'Fond',
'type' => 1,
'value' => $imageFile
@ -77,15 +76,15 @@
<div id="themeHeaderShow" class="col6">
<?php echo template::checkbox('themeHeaderlinkHomePage', true, 'Bannière cliquable', [
'checked' => $this->getData(['theme', 'header', 'linkHomePage'])
]); ?>
</div>
]); ?>
</div>
</div>
<div class="row">
<div class="col12 textAlignCenter">
<span id="themeHeaderImage">
Dimensions de l'image : largeur <span id="themeHeaderImageWidth"></span> - hauteur <span id="themeHeaderImageHeight"></span>
Largeur : <span id="themeHeaderImageWidth"></span> | Hauteur : <span id="themeHeaderImageHeight"></span> | ratio : <span id="themeHeaderImageRatio"></span>
</span>
</div>
</div>
</div>
</div>
</div>
@ -110,7 +109,7 @@
Cover pour une image plus grande que la bannière, Contain pour une image plus petite.
Les modes Auto et Etiré ne provoquent pas de modification de la hauteur de la bannière.'
]); ?>
</div>
</div>
<div class="col3">
<?php echo template::select('themeHeaderHeight', $module::$headerHeights, [
'label' => 'Hauteur maximale',

View File

@ -7,12 +7,13 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/* Thème administration */
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/
#bar,
#site,
@ -23,20 +24,25 @@ footer {
position: relative;
z-index: 10;
}
.footerbodyFixed {
position: relative;
z-index: 5;
}
}
nav li ul {
display: none;
}
#themeShowAll,
#themeBack,
#themeManage,
#themeAdmin,
#themeAdvanced {
position: relative;
z-index: 11;
}
.themeOverlay {
-webkit-transition: all .3s;
transition: all .3s;
@ -51,10 +57,13 @@ nav li ul {
display: block;
background: transparent;
}
.themeOverlay:not(.themeOverlayHideBackground):hover,
.themeOverlayTriggerHover {
background: rgba(39, 174, 96, .5);
}
#themeOverlayBody {
position: fixed; /* Sinon l'overlay s'arrête à la hauteur de la fenêtre et non de la page*/
}
position: fixed;
/* Sinon l'overlay s'arrête à la hauteur de la fenêtre et non de la page*/
}

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**

View File

@ -5,7 +5,7 @@
): ?>
<?php echo template::speech('Cliquez sur une zone afin d\'accéder à ses options de personnalisation. Vous pouvez également afficher les zones cachées à l\'aide du bouton ci-dessous.'); ?>
<div class="row">
<div class="col2 offset2">
<div class="col3 offset3">
<?php echo template::button('themeBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
@ -13,21 +13,32 @@
'value' => 'Accueil'
]); ?>
</div>
<div class="col2">
<?php echo template::button('themeManage', [
'ico' => 'upload',
'href' => helper::baseUrl() . $this->getUrl(0) . '/manage',
'value' => 'Thèmes'
<div class="col3">
<?php echo template::button('themeAdmin', [
'ico' => 'brush',
'href' => helper::baseUrl() . $this->getUrl(0) . '/admin',
'value' => 'Administration'
]); ?>
</div>
<div class="col2">
</div>
</div>
<div class="row">
<div class="col3 offset3">
<?php echo template::button('themeManage', [
'ico' => 'cogs',
'href' => helper::baseUrl() . $this->getUrl(0) . '/manage',
'value' => 'Gestion'
]); ?>
</div>
<div class="col3">
<?php echo template::button('themeAdvanced', [
'ico' => 'code',
'href' => helper::baseUrl() . $this->getUrl(0) . '/advanced',
'value' => 'Éditeur CSS'
]); ?>
</div>
<div class="col2">
</div>
<div class="row">
<div class="col4 offset4">
<?php echo template::button('themeShowAll', [
'ico' => 'eye',
'value' => 'Zones cachées'
@ -37,7 +48,7 @@
<?php else: ?>
<?php echo template::speech('Cliquez sur une zone afin d\'accéder à ses options de personnalisation.'); ?>
<div class="row">
<div class="col2 offset3">
<div class="col3 offset3">
<?php echo template::button('themeBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
@ -45,14 +56,23 @@
'value' => 'Accueil'
]); ?>
</div>
<div class="col2">
<?php echo template::button('themeManage', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/manage',
'ico' => 'upload',
'value' => 'Thèmes'
<div class="col3">
<?php echo template::button('themeAdmin', [
'ico' => 'brush',
'href' => helper::baseUrl() . $this->getUrl(0) . '/admin',
'value' => 'Administration'
]); ?>
</div>
<div class="col2">
</div>
<div class="row">
<div class="col3 offset3">
<?php echo template::button('themeManage', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/manage',
'ico' => 'cogs',
'value' => 'Gestion'
]); ?>
</div>
<div class="col3">
<?php echo template::button('themeAdvanced', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/advanced',
'value' => 'Éditeur CSS',

8
core/module/theme/view/manage/manage.css Normal file → Executable file
View File

@ -9,8 +9,10 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/* Thème administration */
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/

81
core/module/theme/view/manage/manage.php Normal file → Executable file
View File

@ -12,41 +12,68 @@
<div class="row">
<div class="col6">
<div class="block">
<h4>Appliquer un thème archivé</h4>
<div class="col10 offset1">
<?php echo template::file('themeManageImport', [
'label' => 'Archive ZIP :',
'type' => 2
]); ?>
<h4>Installer un thème archivé</h4>
<div class="row">
<div class="col12">
<?php echo template::file('themeManageImport', [
'label' => 'Archive ZIP :',
'type' => 2
]); ?>
</div>
</div>
<div class="row">
<div class="col5 offset3">
<?php echo template::submit('themeImportSubmit', [
'value' => 'Appliquer'
]); ?>
</div>
</div>
<div class="col5 offset3">
<?php echo template::submit('themeImportSubmit', [
'value' => 'Appliquer'
]); ?>
</div>
</div>
</div>
<div class="col6">
<div class="block">
<h4>Sauvegarder le thème</h4>
<div class="row">
<div class="col8 offset2">
<?php echo template::button('themeSave', [
'href' => helper::baseUrl() . 'theme/save',
'ico' => 'upload-cloud',
'value' => 'Sauvegarder dans les fichiers'
]); ?>
<div class="row">
<div class="col6">
<?php echo template::button('themeSave', [
'href' => helper::baseUrl() . 'theme/save/theme',
'ico' => 'download-cloud',
'value' => 'Thème site'
]); ?>
</div>
<div class="col6">
<?php echo template::button('themeSaveAdmin', [
'href' => helper::baseUrl() . 'theme/save/admin',
'ico' => 'download-cloud',
'value' => 'Thème administration'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<em>Le fichier de sauvegarde est généré dans <a href="<?php echo helper::baseUrl(false); ?>core/vendor/filemanager/dialog.php?fldr=theme&type=0&akey=<?php echo md5_file(self::DATA_DIR.'core.json'); ?>" data-lity>le dossier Thème</a> du gestionnaire de fichiers.</em>
</div>
</div>
</div>
<div class="row">
<div class="col8 offset2">
<?php echo template::button('themeExport', [
'href' => helper::baseUrl() . 'theme/export',
'ico' => 'download',
'value' => 'Télécharger'
]); ?>
</div>
<div class="block">
<h4>Télécharger le thème</h4>
<div class="row">
<div class="col6">
<?php echo template::button('themeExport', [
'href' => helper::baseUrl() . 'theme/export/theme',
'ico' => 'download',
'value' => 'Thème site'
]); ?>
</div>
<div class="col6">
<?php echo template::button('themeExport', [
'href' => helper::baseUrl() . 'theme/export/admin',
'ico' => 'download',
'value' => 'Thème administration'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

7
core/module/theme/view/menu/menu.css Normal file → Executable file
View File

@ -9,7 +9,10 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/

View File

@ -7,13 +7,13 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
$(document).ready(function(){
// Menu fixe à afficher
if($("#themeMenuPosition").val() === 'top') {
$("#themeMenuPositionFixed").slideDown();
$("#themeMenuPositionFixed").slideDown();
}
else {
$("#themeMenuPositionFixed").slideUp(function() {
@ -23,7 +23,7 @@ $(document).ready(function(){
// Option de menu à afficher
if($("#themeMenuPosition").val() === 'site-first' || $(this).val() === 'site-second') {
$("#themeMenuPositionOptions").slideDown();
$("#themeMenuPositionOptions").slideDown();
}
else {
$("#themeMenuPositionOptions").slideUp(function() {
@ -43,14 +43,17 @@ $("input, select").on("change", function() {
var css = "@import url('https://fonts.googleapis.com/css?family=" + menuFont + "');";
var colors = core.colorVariants($("#themeMenuBackgroundColor").val());
// Couleurs du menu
css += "nav,nav a{background-color:" + colors.normal + "}";
css += "nav,nav.navLevel1 a{background-color:" + colors.normal + "}";
css += "nav a,#toggle span,nav a:hover{color:" + $("#themeMenuTextColor").val() + "}";
css += "nav a:hover{background-color:" + colors.darken + "}";
if ($("#themeMenuActiveColorAuto").is(':checked')) {
css += "nav a.active{background-color:" + colors.veryDarken + "}";
css += "nav a:hover{background-color:" + colors.veryDarken + ";color:" + $('#themeMenuActiveTextColor').val() + ";}";
} else {
css += "nav a.active{background-color:" + $("#themeMenuActiveColor").val() + "}";
}
css += "nav a:hover{background-color:" + $("#themeMenuActiveColor").val() + ";color:" + $('#themeMenuActiveTextColor').val() + ";}";
}
// sous menu
var colors = core.colorVariants($("#themeMenuBackgroundColorSub").val());
css += 'nav .navSub a{background-color:' + colors.normal + '}';
// Taille, hauteur, épaisseur et capitalisation de caractères du menu
css += "#toggle span,#menu a{padding:" + $("#themeMenuHeight").val() + ";font-family:'" + menuFont.replace(/\+/g, " ") + "',sans-serif;font-weight:" + $("#themeMenuFontWeight").val() + ";font-size:" + $("#themeMenuFontSize").val() + ";text-transform:" + $("#themeMenuTextTransform").val() + "}";
// Alignement du menu
@ -105,7 +108,7 @@ $("input, select").on("change", function() {
$("#menu").removeClass('container-large');
$("nav").removeAttr('id');
$("#menu").addClass('container');
break;
break;
case 'body-second':
if(<?php echo json_encode($this->getData(['theme', 'header', 'position']) === 'body'); ?>) {
$("nav").show().insertAfter("header");
@ -123,7 +126,7 @@ $("input, select").on("change", function() {
break;
case 'site':
$("nav").show().prependTo("#site");
break;
break;
}
});
//
@ -139,9 +142,8 @@ $("#themeMenuLoginLink").on("change", function() {
// Affiche / Cache les options de la position
$("#themeMenuPosition").on("change", function() {
console.log($("#themeMenuPosition").val());
if($(this).val() === 'site-first' || $(this).val() === 'site-second') {
$("#themeMenuPositionOptions").slideDown();
$("#themeMenuPositionOptions").slideDown();
}
else {
$("#themeMenuPositionOptions").slideUp(function() {
@ -153,7 +155,7 @@ $("#themeMenuPosition").on("change", function() {
// Affiche / Cache les options du menu fixe
$("#themeMenuPosition").on("change", function() {
if($(this).val() === 'top') {
$("#themeMenuPositionFixed").slideDown();
$("#themeMenuPositionFixed").slideDown();
}
else {
$("#themeMenuPositionFixed").slideUp(function() {
@ -166,7 +168,7 @@ $("#themeMenuPosition").on("change", function() {
$("#themeMenuActiveColorAuto").on("change", function() {
if ($(this).is(':checked') ) {
$("#themeMenuActiveColorWrapper").slideUp();
} else {
} else {
$("#themeMenuActiveColorWrapper").slideDown();
}
}).trigger("change");

View File

@ -17,39 +17,62 @@
<div class="block">
<h4>Couleur</h4>
<div class="row">
<div class="col6">
<?php echo template::text('themeMenuBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond',
'value' => $this->getData(['theme', 'menu', 'backgroundColor'])
]); ?>
</div>
<div class="col6">
<div class="col4">
<?php echo template::text('themeMenuTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'menu', 'textColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php
echo template::checkbox('themeMenuActiveColorAuto', true, 'Page sélectionnée, couleur de fond automatique ', [
'checked' => is_null($this->getData(['theme', 'menu', 'activeColor'])) ? true : $this->getData(['theme', 'menu', 'activeColorAuto']),
'help' => 'La couleur de fond de la page active peut être définie automatique ou selon une couleur définie, comme par exemple celle de fond des pages.'
<div class="col4">
<?php echo template::text('themeMenuBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond',
'value' => $this->getData(['theme', 'menu', 'backgroundColor'])
]); ?>
</div>
<div class="col6">
</div>
<div class="col4">
<?php echo template::text('themeMenuBackgroundColorSub', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond du sous-menu',
'value' => $this->getData(['theme', 'menu', 'backgroundColorSub'])
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Page active</h4>
<div class="row">
<div class="col4">
<?php echo template::text('themeMenuActiveTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'menu', 'activeTextColor'])
]); ?>
</div>
<div class="col4 verticalAlignBottom">
<?php
echo template::checkbox('themeMenuActiveColorAuto', true, 'Couleur du fond automatique', [
'checked' => $this->getData(['theme', 'menu', 'activeColorAuto']),
'help' => 'La couleur de fond de la page active peut être définie automatique ou selon une couleur définie, comme par exemple celle de fond des pages.'
]); ?>
</div>
<div class="col4">
<?php echo template::text('themeMenuActiveColor', [
'class' => 'colorPicker',
'help' => 'Couleur de fond de la page sélectionnée dans le menu.<br>Le curseur horizontal règle le niveau de transparence.',
'help' => 'Couleur de fond de la page sélectionnée dans le menu.<br>Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond',
'value' => $this->getData(['theme', 'menu', 'activeColor'])
]); ?>
</div>
</div>
</div>
</div>
</div>
@ -69,7 +92,7 @@
<div class="col6">
<?php echo template::select('themeMenuFontSize', $module::$menuFontSizes, [
'label' => 'Taille',
'help' => 'Proportionnelle à celle définie dans le site',
'help' => 'Proportionnelle à celle définie dans le site',
'selected' => $this->getData(['theme', 'menu', 'fontSize'])
]); ?>
</div>
@ -153,18 +176,25 @@
<div class="block">
<h4>Contenus</h4>
<div class="row">
<div class="col6">
<div class="col4">
<?php echo template::checkbox('themeMenuLoginLink', true, 'Lien de connexion', [
'checked' => $this->getData(['theme', 'menu', 'loginLink'])
'checked' => $this->getData(['theme', 'menu', 'loginLink']),
'help' => 'L\'activation de cette option n\'est pas recommandée'
]); ?>
</div>
<div class="col6">
<div class="col4">
<?php echo template::checkbox('themeMenuMemberBar', true, 'Barre de membre', [
'checked' => $this->getData(['theme', 'menu', 'memberBar']),
'help' => 'Icônes de gestion de compte et de déconnexion. Uniquement pour les membres connectés'
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('themeMenuBurgerTitle', true, 'Titre du site dans le menu réduit', [
'checked' => $this->getData(['theme', 'menu', 'burgerTitle']),
'help' => 'Le menu burger remplace le menu complet lorsque la largeur de l\'écran n\'est pas suffisante.'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>

6
core/module/theme/view/site/site.css Normal file → Executable file
View File

@ -9,8 +9,10 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/

View File

@ -7,88 +7,110 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/*
* Chargement de l'aperçu
*/
$( document).ready(function() {
updateDOM();
$(document).ready(function() {
/**
* Option de marge si la taille n'est pas fluide
*/
if ($('#themeSiteWidth').val() === '100%') {
$("#themeSiteMargin").prop("checked", true);
$("#themeSiteMargin").addClass("disabled");
} else {
$("#themeSiteMargin").addClass("enabled");
}
// Charger l'aperçu initial
previewDOM();
});
/**
* Aperçu en direct
*/
$("input, select").on("change",function() {
updateDOM();
previewDOM();
});
function previewDOM() {
function updateDOM() {
/**
* Aperçu dans la boîte
*/
/**
* Aperçu dans la boîte
*/
// Import des polices de caractères
var titleFont = $("#themeTitleFont").val();
var textFont = $("#themeTextFont").val();
var css = "@import url('https://fonts.googleapis.com/css?family=" + titleFont + "|" + textFont + "');";
// Couleurs des boutons
var colors = core.colorVariants($("#themeButtonBackgroundColor").val());
css += ".button.buttonSubmitPreview{background-color:" + colors.normal + ";}";
css += ".button.buttonSubmitPreview:hover{background-color:" + colors.darken + "}";
css += ".button.buttonSubmitPreview{color:" + colors.text + ";}";
// Import des polices de caractères
var titleFont = $("#themeTitleFont").val();
var textFont = $("#themeTextFont").val();
var css = "@import url('https://fonts.googleapis.com/css?family=" + titleFont + "|" + textFont + "');";
// Couleurs des boutons
var colors = core.colorVariants($("#themeButtonBackgroundColor").val());
css += ".button.buttonSubmitPreview{background-color:" + colors.normal + ";}";
css += ".button.buttonSubmitPreview:hover{background-color:" + colors.darken + "}";
css += ".button.buttonSubmitPreview{color:" + colors.text + ";}";
// Couleurs des liens
var colors = core.colorVariants($("#themeTextLinkColor").val());
css += "a.urlPreview{color:" + colors.normal + "}";
css += "a.urlPreview:hover{color:" + colors.darken + "}";
// Couleur, polices, épaisseur et capitalisation de caractères des titres
css += ".headerPreview,.headerPreview{color:" + $("#themeTitleTextColor").val() + ";font-family:'" + titleFont.replace(/\+/g, " ") + "',sans-serif;font-weight:" + $("#themeTitleFontWeight").val() + ";text-transform:" + $("#themeTitleTextTransform").val() + "}";
// Police de caractères
// Police + couleur
css += ".textPreview,.urlPreview{color:" + $("#themeTextTextColor").val() + ";font-family:'" + textFont.replace(/\+/g, " ") + "',sans-serif; font-size:" + $("#themeTextFontSize").val() + ";}";
// Couleur des liens
//css += "a.preview,.buttonSubmitPreview{font-family:'" + textFont.replace(/\+/g, " ") + "',sans-serif}";
// Couleurs des liens
colors = core.colorVariants($("#themeLinkTextColor").val());
css += "a.urlPreview{color:" + colors.normal + "}";
css += "a.urlPreview:hover{color:" + colors.darken + "}";
// Couleur, polices, épaisseur et capitalisation de caractères des titres
css += ".headerPreview,.headerPreview{color:" + $("#themeTitleTextColor").val() + ";font-family:'" + titleFont.replace(/\+/g, " ") + "',sans-serif;font-weight:" + $("#themeTitleFontWeight").val() + ";text-transform:" + $("#themeTitleTextTransform").val() + "}";
// Police de caractères
// Police + couleur
css += ".textPreview,.urlPreview{color:" + $("#themeTextTextColor").val() + ";font-family:'" + textFont.replace(/\+/g, " ") + "',sans-serif; font-size:" + $("#themeTextFontSize").val() + ";}";
// Couleur des liens
//css += "a.preview,.buttonSubmitPreview{font-family:'" + textFont.replace(/\+/g, " ") + "',sans-serif}";
// Taille du texte
// Couleur du texte
css += "p.preview{color:" + $("#themeTextTextColor").val() + "}";
// Taille du texte
// Couleur du texte
css += "p.preview{color:" + $("#themeTextTextColor").val() + "}";
/**
* Aperçu réel
*/
/**
* Aperçu réel
*/
// Taille du site
if ($("#themeSiteWidth").val() === "750px") {
css += ".button, button{font-size:0.8em;}";
} else {
css += ".button, button{font-size:1em;}";
}
// Largeur du site
var margin = $("#themeSiteMargin").is(":checked") ? 0 : '20px' ;
css += ".container{max-width:" + $("#themeSiteWidth").val() + "}";
if ($("#themeSiteWidth").val() === "100%") {
css += "#site{margin: 0px auto;} body{margin:0 auto;} #bar{margin:0 auto;} body > header{margin:0 auto;} body > nav {margin: 0 auto;} body > footer {margin:0 auto;}";
} else {
css += "#site{margin: " + margin + " auto !important;} body{margin:0px 10px;} #bar{margin: 0 -10px;} body > header{margin: 0 -10px;} body > nav {margin: 0 -10px;} body > footer {margin: 0 -10px;} ";
}
// Couleur du site, arrondi sur les coins du site et ombre sur les bords du site
//css += "#site{background-color:" + $("#themeSiteBackgroundColor").val() + ";border-radius:" + $("#themeSiteRadius").val() + ";box-shadow:" + $("#themeSiteShadow").val() + " #212223}";
css += "#site{border-radius:" + $("#themeSiteRadius").val() + ";box-shadow:" + $("#themeSiteShadow").val() + " #212223}";
var backgroundImage = <?php echo json_encode(helper::baseUrl(false) . self::FILE_DIR . 'source/' . $this->getData(['theme','body','image'])); ?>;
var backgroundcolor = <?php echo json_encode($this->getdata(['theme','body','backgroundColor'])); ?>;
css += "div.bodybackground{background-color:" + backgroundcolor + "; background-image: url(" + backgroundImage + ");background-size:cover;}";
css += "div.bgPreview{padding: 5px;background-color:" + $("#themeSiteBackgroundColor").val() + ";}";
// Les blocs
// Taille du site
if ($("#themeSiteWidth").val() === "750px") {
css += ".button, button{font-size:0.8em;}";
} else {
css += ".button, button{font-size:1em;}";
}
// Largeur du site
css += ".container{max-width:" + $("#themeSiteWidth").val() + "}";
if ($("#themeSiteWidth").val() === "100%") {
css += "#site{margin:0 auto;} body{margin:0 auto;} #bar{margin:0 auto;} body > header{margin:0 auto;} body > nav {margin: 0 auto;} body > footer {margin:0 auto;}";
} else {
css += "#site{margin:20px auto !important;} body{margin:0px 10px;} #bar{margin: 0 -10px;} body > header{margin: 0 -10px;} body > nav {margin: 0 -10px;} body > footer {margin: 0 -10px;} ";
}
// Couleur du site, arrondi sur les coins du site et ombre sur les bords du site
//css += "#site{background-color:" + $("#themeSiteBackgroundColor").val() + ";border-radius:" + $("#themeSiteRadius").val() + ";box-shadow:" + $("#themeSiteShadow").val() + " #212223}";
css += "#site{border-radius:" + $("#themeSiteRadius").val() + ";box-shadow:" + $("#themeSiteShadow").val() + " #212223}";
css += "div.bgPreview{background-color:" + $("#themeSiteBackgroundColor").val() + ";}";
var colors = core.colorVariants($("#themeBlockBackgroundColor").val());
css += ".block.preview {padding: 20px 20px 10px;margin: 20px 0; word-wrap: break-word;border-radius: 2px;border: 1px solid " + $("#themeBlockBorderColor").val() + ";}.block.preview h4.preview {background: " + colors.normal + ";color:" + colors.text + ";margin: -20px -20px 10px -20px; padding: 10px;}";
/**
* Injection dans le DOM
*/
// Ajout du css au DOM
$("#themePreview").remove();
$("<style>")
.attr("type", "text/css")
.attr("id", "themePreview")
.text(css)
.appendTo("head");
/**
* Injection dans le DOM
*/
// Ajout du css au DOM
$("#themePreview").remove();
$("<style>")
.attr("type", "text/css")
.attr("id", "themePreview")
.text(css)
.appendTo("head");
}
};

View File

@ -22,7 +22,7 @@
<div class="col6">
<?php echo template::text('themeSiteBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Fond',
'value' => $this->getData(['theme', 'site', 'backgroundColor'])
]); ?>
@ -30,7 +30,7 @@
<div class="col6">
<?php echo template::text('themeTextTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Texte',
'value' => $this->getData(['theme', 'text', 'textColor'])
]); ?>
@ -40,46 +40,70 @@
<div class="col6">
<?php echo template::text('themeTitleTextColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Titres',
'value' => $this->getData(['theme', 'title', 'textColor'])
]); ?>
</div>
</div>
<div class="col6">
<?php echo template::text('themeLinkTextColor', [
<?php echo template::text('themeTextLinkColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Liens',
'value' => $this->getData(['theme', 'link', 'textColor'])
'value' => $this->getData(['theme', 'text', 'linkColor'])
]); ?>
</div>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::text('themeBlockBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Arrière-plan des blocs',
'value' => $this->getData(['theme', 'block', 'backgroundColor'])
]); ?>
</div>
<div class="col6">
<?php echo template::text('themeBlockBorderColor', [
'class' => 'colorPicker',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'label' => 'Bordure des blocs',
'value' => $this->getData(['theme', 'block', 'borderColor'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6 offset3">
<?php echo template::text('themeButtonBackgroundColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Boutons',
'value' => $this->getData(['theme', 'button', 'backgroundColor'])
]); ?>
</div>
</div>
</div>
<div class="col4 bgPreview">
<div class="row">
<div class="col12">
<h1 class="headerPreview">Titre </h1>
<h3 class="headerPreview">Sous-Titre </h3>
<p class="textPreview">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<p><a href="#" class="urlPreview">Lorem ipsum dolor sit amet.</a></p>
</div>
</div>
<div class="row">
<div class="col4 offset8">
<?php echo template::button('themeSiteSubmitButtonPreview', [
'class' => 'buttonSubmitPreview',
'value' => 'Valider'
]); ?>
</div>
<div class="col4 bodybackground">
<div class="bgPreview">
<div class="row">
<div class="col6">
<h1 class="headerPreview">Titre</h1>
<h2 class="headerPreview">Sous-titre </h2>
</div>
<div class="col6">
<?php echo template::button('themeSiteSubmitButtonPreview', [
'class' => 'buttonSubmitPreview',
'value' => 'Bouton'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block preview">
<h4 class="preview">Bloc</h4> <p class="textPreview">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
<p><a href="#" class="urlPreview">Lorem ipsum dolor sit amet.</a></p>
</div>
</div>
</div>
</div>
</div>
@ -98,7 +122,7 @@
'selected' => $this->getData(['theme', 'text', 'font']),
'fonts' => true
]); ?>
</div>
</div>
<div class="col6">
<?php echo template::select('themeTextFontSize', $module::$siteFontSizes, [
'label' => 'Taille',
@ -111,7 +135,7 @@
</div>
<div class="col6">
<div class="block">
<h4>Mise en forme des titres</h4>
<h4>Mise en forme des titres</h4>
<div class="row">
<div class="col4">
<?php echo template::select('themeTitleFont', $module::$fonts, [
@ -125,7 +149,7 @@
'label' => 'Style',
'selected' => $this->getData(['theme', 'title', 'fontWeight'])
]); ?>
</div>
</div>
<div class="col4">
<?php echo template::select('themeTitleTextTransform', $module::$textTransforms, [
'label' => 'Casse',
@ -149,7 +173,7 @@
</div>
<div class="col4">
<?php echo template::select('themeSiteRadius', $module::$radius, [
'label' => 'Bords arrondis',
'label' => 'Arrondi des angles',
'selected' => $this->getData(['theme', 'site', 'radius'])
]); ?>
</div>
@ -160,6 +184,13 @@
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('themeSiteMargin',true, 'Pas de marge au-dessus et en-dessous du site', [
'checked' => $this->getData(['theme', 'site', 'margin'])
]); ?>
</div>
</div>
</div>
</div>
</div>

View File

@ -9,7 +9,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
class user extends common {
@ -24,8 +24,13 @@ class user extends common {
'logout' => self::GROUP_MEMBER,
'reset' => self::GROUP_VISITOR
];
public static $users = [];
public static $userId = '';
public static $userLongtime = false;
/**
* Ajout
*/
@ -43,33 +48,26 @@ class user extends common {
if($this->getInput('userAddPassword', helper::FILTER_STRING_SHORT, true) !== $this->getInput('userAddConfirmPassword', helper::FILTER_STRING_SHORT, true)) {
self::$inputNotices['userAddConfirmPassword'] = 'Incorrect';
$check = false;
}
}
// Crée l'utilisateur
$userFirstname = $this->getInput('userAddFirstname', helper::FILTER_STRING_SHORT, true);
$userLastname = $this->getInput('userAddLastname', helper::FILTER_STRING_SHORT, true);
$userMail = $this->getInput('userAddMail', helper::FILTER_MAIL, true);
// Pas de nom saisi
if (empty($userFirstname) ||
empty($userLastname) ||
empty($this->getInput('userAddPassword', helper::FILTER_STRING_SHORT, true)) ||
empty($this->getInput('userAddConfirmPassword', helper::FILTER_STRING_SHORT, true))) {
$check=false;
}
// Si tout est ok création effective
if ($check === true) {
$this->setData([
'user',
$userId,
[
'firstname' => $userFirstname,
'forgot' => 0,
'group' => $this->getInput('userAddGroup', helper::FILTER_INT, true),
'lastname' => $userLastname,
'mail' => $userMail,
'password' => $this->getInput('userAddPassword', helper::FILTER_PASSWORD, true)
]
]);
}
// Stockage des données
$this->setData([
'user',
$userId,
[
'firstname' => $userFirstname,
'forgot' => 0,
'group' => $this->getInput('userAddGroup', helper::FILTER_INT, true),
'lastname' => $userLastname,
'mail' => $userMail,
'password' => $this->getInput('userAddPassword', helper::FILTER_PASSWORD, true),
]
]);
// Envoie le mail
$sent = true;
if($this->getInput('userAddSendMail', helper::FILTER_BOOLEAN) && $check === true) {
@ -80,7 +78,7 @@ class user extends common {
'Un administrateur vous a créé un compte sur le site ' . $this->getData(['config', 'title']) . '. Vous trouverez ci-dessous les détails de votre compte.<br><br>' .
'<strong>Identifiant du compte :</strong> ' . $this->getInput('userAddId') . '<br>' .
'<strong>Mot de passe du compte :</strong> ' . $this->getInput('userAddPassword') . '<br><br>' .
'<small>Nous ne conservons pas les mots de passe, par conséquence nous vous conseillons de garder ce mail tant que vous ne vous êtes pas connecté. Vous pourrez modifier votre mot de passe après votre première connexion.</small>',
'<small>Nous ne conservons pas les mots de passe, en conséquence nous vous conseillons de conserver ce message tant que vous ne vous êtes pas connecté. Vous pourrez modifier votre mot de passe après votre première connexion.</small>',
null
);
}
@ -121,7 +119,7 @@ class user extends common {
'redirect' => helper::baseUrl() . 'user',
'notification' => 'Action non autorisée'
]);
}
}
// Bloque la suppression de son propre compte
elseif($this->getUser('id') === $this->getUrl(2)) {
// Valeurs en sortie
@ -147,13 +145,13 @@ class user extends common {
*/
public function edit() {
if ($this->getUrl(3) !== $_SESSION['csrf'] &&
$this->getUrl(4) !== $_SESSION['csrf']) {
$this->getUrl(4) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'user',
'notification' => 'Action non autorisée'
]);
}
}
// Accès refusé
if(
// L'utilisateur n'existe pas
@ -220,7 +218,12 @@ class user extends common {
'group' => $newGroup,
'lastname' => $this->getInput('userEditLastname', helper::FILTER_STRING_SHORT, true),
'mail' => $this->getInput('userEditMail', helper::FILTER_MAIL, true),
'password' => $newPassword
'password' => $newPassword,
'connectFail' => $this->getData(['user',$this->getUrl(2),'connectFail']),
'connectTimeout' => $this->getData(['user',$this->getUrl(2),'connectTimeout']),
'accessUrl' => $this->getData(['user',$this->getUrl(2),'accessUrl']),
'accessTimer' => $this->getData(['user',$this->getUrl(2),'accessTimer']),
'accessCsrf' => $this->getData(['user',$this->getUrl(2),'accessCsrf'])
]
]);
// Redirection spécifique si l'utilisateur change son mot de passe
@ -331,42 +334,129 @@ class user extends common {
public function login() {
// Soumission du formulaire
if($this->isPost()) {
$userId = $this->getInput('userLoginId', helper::FILTER_ID, true);
// Connexion si les informations sont correctes
// Check la captcha
if(
password_verify($this->getInput('userLoginPassword', helper::FILTER_STRING_SHORT, true), $this->getData(['user', $userId, 'password']))
AND $this->getData(['user', $userId, 'group']) >= self::GROUP_MEMBER
) {
$expire = $this->getInput('userLoginLongTime') ? strtotime("+1 year") : 0;
setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false));
setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false));
// Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur
if(
$this->getData(['config', 'maintenance'])
AND $this->getData(['user', $userId, 'group']) < self::GROUP_ADMIN
) {
$this->addOutput([
'notification' => 'Seul un administrateur peur se connecter lors d\'une maintenance',
'redirect' => helper::baseUrl(),
'state' => false
]);
}
// Valeurs en sortie en cas de réussite
else {
$this->addOutput([
'notification' => 'Connexion réussie',
'redirect' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))),
'state' => true
$this->getData(['config','connect','captcha'])
AND password_verify($this->getInput('userLoginCaptcha', helper::FILTER_INT), $this->getInput('userLoginCaptchaResult') ) === false )
{
self::$inputNotices['userLoginCaptcha'] = 'Incorrect';
} else {
// Lire Id du compte
$userId = $this->getInput('userLoginId', helper::FILTER_ID, true);
/**
* Aucun compte existant
*/
if ( !$this->getData(['user', $userId])) {
//Stockage de l'IP
$this->setData([
'blacklist',
$userId,
[
'connectFail' => $this->getData(['blacklist',$userId,'connectFail']) + 1,
'lastFail' => time(),
'ip' => helper::getIp()
]
]);
// Verrouillage des IP
$ipBlackList = helper::arrayCollumn($this->getData(['blacklist']), 'ip');
if ( $this->getData(['blacklist',$userId,'connectFail']) >= $this->getData(['config', 'connect', 'attempt'])
AND in_array($this->getData(['blacklist',$userId,'ip']),$ipBlackList) ) {
// Valeurs en sortie
$this->addOutput([
'notification' => 'Trop de tentatives, compte verrouillé',
'redirect' => helper::baseUrl(),
'state' => false
]);
} else {
// Valeurs en sortie
$this->addOutput([
'notification' => 'Identifiant ou mot de passe incorrect'
]);
}
/**
* Le compte existe
*/
} else {
// Cas 4 : le délai de blocage est dépassé et le compte est au max - Réinitialiser
if ($this->getData(['user',$userId,'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time()
AND $this->getData(['user',$userId,'connectFail']) === $this->getData(['config', 'connect', 'attempt']) ) {
$this->setData(['user',$userId,'connectFail',0 ]);
$this->setData(['user',$userId,'connectTimeout',0 ]);
}
// Check la présence des variables et contrôle du blocage du compte si valeurs dépassées
// Vérification du mot de passe et du groupe
if (
( $this->getData(['user',$userId,'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) ) < time()
AND $this->getData(['user',$userId,'connectFail']) < $this->getData(['config', 'connect', 'attempt'])
AND password_verify($this->getInput('userLoginPassword', helper::FILTER_STRING_SHORT, true), $this->getData(['user', $userId, 'password']))
AND $this->getData(['user', $userId, 'group']) >= self::GROUP_MEMBER
) {
// Expiration
$expire = $this->getInput('userLoginLongTime') ? strtotime("+1 year") : 0;
$c = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN) === true ? 'true' : 'false';
setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false) , '', helper::isHttps(), true);
setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false), '', helper::isHttps(), true);
setcookie('ZWII_USER_LONGTIME', $c, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true);
// Accès multiples avec le même compte
$this->setData(['user',$userId,'accessCsrf',$_SESSION['csrf']]);
// Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur
if(
$this->getData(['config', 'maintenance'])
AND $this->getData(['user', $userId, 'group']) < self::GROUP_ADMIN
) {
$this->addOutput([
'notification' => 'Seul un administrateur peut se connecter lors d\'une maintenance',
'redirect' => helper::baseUrl(),
'state' => false
]);
} else {
// Valeurs en sortie
$this->addOutput([
'notification' => 'Connexion réussie',
'redirect' => helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))),
'state' => true
]);
}
// Sinon notification d'échec
} else {
$notification = 'Identifiant ou mot de passe incorrect';
// Cas 1 le nombre de connexions est inférieur aux tentatives autorisées : incrément compteur d'échec
if ($this->getData(['user',$userId,'connectFail']) < $this->getData(['config', 'connect', 'attempt'])) {
$this->setData(['user',$userId,'connectFail',$this->getdata(['user',$userId,'connectFail']) + 1 ]);
}
// Cas 2 la limite du nombre de connexion est atteinte : placer le timer
if ( $this->getdata(['user',$userId,'connectFail']) == $this->getData(['config', 'connect', 'attempt']) ) {
$this->setData(['user',$userId,'connectTimeout', time()]);
}
// Cas 3 le délai de bloquage court
if ($this->getData(['user',$userId,'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) > time() ) {
$notification = 'Trop de tentatives, accès bloqué durant ' . ($this->getData(['config', 'connect', 'timeout']) / 60) . ' minutes.';
}
// Journalisation
$dataLog = mb_detect_encoding(strftime('%d/%m/%y',time()), 'UTF-8', true)
? strftime('%d/%m/%y',time()) . ';' . strftime('%R',time()) . ';'
: utf8_encode(strftime('%d/%m/%y',time())) . ';' . utf8_encode(strftime('%R',time())) . ';' ;
$dataLog .= helper::getIp() . ';';
$dataLog .= $userId . ';' ;
$dataLog .= $this->getUrl() .';' ;
$dataLog .= 'échec de connexion' ;
$dataLog .= PHP_EOL;
if ($this->getData(['config','connect','log'])) {
file_put_contents(self::DATA_DIR . 'journal.log', $dataLog, FILE_APPEND);
}
// Valeurs en sortie
$this->addOutput([
'notification' => $notification
]);
}
}
}
// Sinon notification d'échec
else {
// Valeurs en sortie
$this->addOutput([
'notification' => 'Identifiant ou mot de passe incorrect'
]);
}
}
if (!empty($_COOKIE['ZWII_USER_ID'])) {
self::$userId = $_COOKIE['ZWII_USER_ID'];
}
if (!empty($_COOKIE['ZWII_USER_LONGTIME'])) {
self::$userLongtime = $_COOKIE['ZWII_USER_LONGTIME'] == 'true' ? true : false;
}
// Valeurs en sortie
$this->addOutput([
@ -380,7 +470,12 @@ class user extends common {
* Déconnexion
*/
public function logout() {
helper::deleteCookie('ZWII_USER_ID');
// Ne pas effacer l'identifiant mais seulement le mot de passe
if (array_key_exists('ZWII_USER_LONGTIME',$_COOKIE)
AND $_COOKIE['ZWII_USER_LONGTIME'] !== 'true' ) {
helper::deleteCookie('ZWII_USER_ID');
helper::deleteCookie('ZWII_USER_LONGTIME');
}
helper::deleteCookie('ZWII_USER_PASSWORD');
session_destroy();
// Valeurs en sortie
@ -427,16 +522,21 @@ class user extends common {
$this->setData(['user', $this->getUrl(2), 'password', $newPassword]);
// Réinitialise la date de la demande
$this->setData(['user', $this->getUrl(2), 'forgot', 0]);
// Réinitialise le blocage
$this->setData(['user', $this->getUrl(2),'connectFail',0 ]);
$this->setData(['user', $this->getUrl(2),'connectTimeout',0 ]);
// Valeurs en sortie
$this->addOutput([
'notification' => 'Nouveau mot de passe enregistré',
'redirect' => helper::baseUrl() . 'user/login/' . str_replace('/', '_', $this->getUrl()),
//'redirect' => helper::baseUrl() . 'user/login/' . str_replace('/', '_', $this->getUrl()),
'redirect' => helper::baseUrl(),
'state' => true
]);
}
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LIGHT,
'title' => 'Réinitialisation du mot de passe',
'view' => 'reset'
]);

8
core/module/user/view/add/add.css Normal file → Executable file
View File

@ -9,7 +9,11 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
@import url("core/layout/admin.css");
/** @import url("site/data/admin.css"); */
/** NE PAS EFFACER
* admin.css
*/

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**

6
core/module/user/view/edit/edit.css Normal file → Executable file
View File

@ -9,8 +9,10 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**
@ -16,4 +16,9 @@
$("#userEditGroup").on("change", function() {
$(".userEditGroupDescription").hide();
$("#userEditGroupDescription" + $(this).val()).show();
if ($("#userEditGroup option:selected").val() < 0) {
$("#userEditLabelAuth").css("display","none");
} else {
$("#userEditLabelAuth").css("display","inline-block");
}
}).trigger("change");

View File

@ -1,7 +1,7 @@
<?php echo template::formOpen('userEditForm'); ?>
<div class="row">
<div class="col2">
<?php if($this->getUrl(3)): ?>
<?php if($this->getUser('group') === self::GROUP_ADMIN): ?>
<?php echo template::button('userEditBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'user',
@ -53,7 +53,7 @@
'label' => 'Groupe',
'selected' => $this->getData(['user', $this->getUrl(2), 'group'])
]); ?>
Autorisations :
<div id="userEditLabelAuth">Autorisations :</div>
<ul id="userEditGroupDescription<?php echo self::GROUP_MEMBER; ?>" class="userEditGroupDescription displayNone">
<li>Accès aux pages privées membres</li>
</ul>
@ -84,7 +84,7 @@
'value' => $this->getUrl(2)
]); ?>
<?php echo template::password('userEditOldPassword', [
'autocomplete' => 'off',
'autocomplete' => 'new-password', // remplace 'off' pour éviter le pré remplissage auto
'label' => 'Ancien mot de passe'
]); ?>
<?php echo template::password('userEditNewPassword', [

View File

@ -0,0 +1 @@
/* Vide */

6
core/module/user/view/index/index.css Normal file → Executable file
View File

@ -9,8 +9,10 @@
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2020, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
@import url("core/layout/admin.css");
/** NE PAS EFFACER
* admin.css
*/

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license GNU General Public License, version 3
* @link http://zwiicms.com/
* @link http://zwiicms.fr/
*/
/**

Some files were not shown because too many files have changed in this diff Show More