Compare commits

...

153 Commits

Author SHA1 Message Date
Fred Tempez b0e8be710b news update simplifié 1 month ago
Fred Tempez 51b6f4b51d private update 1 month ago
Fred Tempez b9ca6e500f news v3 1 month ago
Fred Tempez 1ed2e8ec35 fonction update 1 month ago
fredtempez 541ab1728b Aide supprimée 1 month ago
fredtempez 9c9c95653c Merge branch '11000' into NewsColumn 1 month ago
fredtempez 05920a3171 Bug page de connexion 1 month ago
fredtempez 0b55bba9c6 Auto update en test 1 month ago
Fred Tempez b2969a748e Mise en forme de la config 1 month ago
Fred Tempez 92bbafdafd Nom de variables et alignements 1 month ago
Fred Tempez 08127b1fd5 Init 1 month ago
Fred Tempez 88b716a448 Lity suite et fin 1 month ago
SylvainLelievre cb254d9a31 Search maj copyright 1 month ago
SylvainLelievre bbab45758f Module search modification du placeholder 1 month ago
SylvainLelievre 9864d8120c Modification des conditions de traduction et longueur minimale des mots clefs 1 month ago
Fred Tempez 2d432a375a Lity page avec un module 1 month ago
fredtempez 27154982ec Lity bug galery + login 1 month ago
fredtempez 6a76673dd3 config bug aide page recherche 2 months ago
fredtempez 2f41223c29 affichage correct d'une page avec module dans un lity 2 months ago
fredtempez 40a770a1f6 Page lity dans le pied de page - à voir page avec module générée complète dans lity 2 months ago
fredtempez 57821752f4 Merge branch '10501' into 11000 2 months ago
fredtempez 993089841b Option de layout datality 2 months ago
fredtempez 02d3a41e26 LAYOUT LITY 2 months ago
fredtempez e5b0ff0311 Téléchargement depuis le store en attendant l'installation automatique 2 months ago
fredtempez 3fad88dcbc uploadItem WIP 2 months ago
fredtempez 66c4395069 installation d'un module ok 2 months ago
fredtempez 2f256c65f0 renommer fonction module Delete 2 months ago
fredtempez a4fe13124d Import remise en état 2 months ago
fredtempez 316faabcbc Détaile module à terminer 2 months ago
fredtempez 8923dd9a2d Download 1.1 2 months ago
fredtempez 125d3a2a5d Module pour modification 2 months ago
fredtempez 2b72cb419e URL du store 2 months ago
fredtempez f4bff1b460 Store installé ou pas code couleur 2 months ago
fredtempez dc3e7f8356 Calsse buttonBlue n'existe aps 2 months ago
fredtempez 7d84df4722 store install or update 2 months ago
Fred Tempez 39e6e38107 Store Fonction importModule pour le store et l'import de zip 2 months ago
Fred Tempez 8112e732d7 addon erreur d'adresse de store 2 months ago
Fred Tempez 812e7ca904 fix table lenght 2 months ago
Fred Tempez a233a1aa24 dossiers à supprimer 2 months ago
Fred Tempez 8de48859c2 Merge branch '10501' into 11000 2 months ago
Fred Tempez b5aa88483d Merge branch '10501' into 11000 2 months ago
Fred Tempez d89b1f40c0 drapeaux dans le site écrans plus petits que 1024px 2 months ago
Fred Tempez a62366d0a0 Merge branch '10501' into 11000 2 months ago
Fred Tempez 1bd5e0b17c Merge branch '10501' into 11000 2 months ago
fredtempez cd1f578011 update v11 2 months ago
fredtempez eee99d43f9 Merge branch 'master' into 11000 2 months ago
Fred Tempez f01e9d3899 Merge branch '10500' into 11000 2 months ago
Fred Tempez 5c07089123 Merge branch '10500' into 11000 2 months ago
Fred Tempez e2aa5d3e20 Merge branch '10500' into 11000 2 months ago
Fred Tempez ce0297251c Merge branch 'extensions' into 11000 2 months ago
fredtempez 4839b306d9 Merge branch '10500' into 11000 2 months ago
Fred Tempez 296d1593e6 Merge branch '10500' into 11000 2 months ago
Fred Tempez f60e1ab9e7 Merge branch '10500' into 11000 2 months ago
fredtempez de6a3fffdc Merge branch '10500' into 11000 2 months ago
fredtempez 2f332d2bc3 Revert "Merge branch '10500' into 11000" 2 months ago
fredtempez 6d576a16a6 Merge branch '10500' into 11000 2 months ago
Fred Tempez 7766c16ed9 Merge branch '10500' into 11000 2 months ago
Fred Tempez 30f72c6859 Module Install from store WIP 2 months ago
Fred Tempez a0a259f92f Détail brut d'un item du catalogue 2 months ago
fredtempez 33d47a7e5c Liste des objets du store et détail d'un objet WIP 2 months ago
fredtempez bb6750def5 Gestion des modules par catalogue 2 months ago
fredtempez f000db5746 Merge branch '10500' into 11000 2 months ago
fredtempez 101b8ac0f0 readme version 2 months ago
fredtempez 2951b2cb5f changes 2 months ago
fredtempez 5b895c8375 Merge branch '10500' into 11000 2 months ago
fredtempez 3def0e9b92 Merge branch '10500' into 11000 2 months ago
fredtempez a894628696 Merge branch '10500' into 11000 3 months ago
fredtempez 8a3d876e8f Merge branch '10500' into 11000 3 months ago
Prof Langues 0dc4420bff Merge branch '10401' into 11000 3 months ago
fredtempez 734d3e67fa Merge branch '10400' into 11000 3 months ago
fredtempez 24d9d08f96 Merge branch '11000' of https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS into 11000 3 months ago
fredtempez 1beb70a5c3 Merge branch '10400.15' into 11000 3 months ago
fredtempez 691eed8ba4 changelog 4 months ago
fredtempez 9de5d5975b Option de déconnecion automatique 4 months ago
fredtempez 37b3bdb14a double quote pour simple quote 4 months ago
fredtempez 271beb06e9 Trad auto langue du navigateur 4 months ago
fredtempez 34ef8d7237 Merge branch '10400' into 11000 4 months ago
fredtempez efc324c3db Modif cookies WIP 4 months ago
fredtempez 36e4cd8253 Pas de trad auto du login 4 months ago
fredtempez 7e43f3adf4 Bug effacement langue déjà installée 4 months ago
fredtempez 3e53df3e7f Langue du navigateur + désactivation de la langue sélectionnée. 4 months ago
fredtempez ff4f1489f2 Auto détermination de la langue du script google 4 months ago
fredtempez eea05bf358 faute de frappe 4 months ago
fredtempez d752d3b03b Susteme d'aide hover plustôt que click 4 months ago
fredtempez 8d1c68a2c6 Merge branch '10400' into 11000 4 months ago
fredtempez 82a42d8daf Sélecteur de copie de langues plus souple 4 months ago
fredtempez 606cd9de62 Merge branch '10400' into 11000 4 months ago
fredtempez 440fed288c Merge branch '10400' into 11000 4 months ago
fredtempez 019a774ddc del trailing spaces 4 months ago
fredtempez 5b2e349726 Merge branch '10400' into 11000 4 months ago
fredtempez 384ac6052f Bug sélection de langue 4 months ago
fredtempez babf10f4bf annulation dans getUrl 4 months ago
fredtempez d7f03521df Merge branch '10400' into 11000 4 months ago
fredtempez 1a5935815a Merge branch '10400' into 11000 4 months ago
fredtempez 52f59c1061 $i18nCurrent non déclarée ?! 4 months ago
fredtempez f1207551a5 Merge branch '10400' into 11000 4 months ago
fredtempez 76e7f45ac1 Merge branch '10400' into 11000 4 months ago
fredtempez a8eb0f39ad Merge branch '10400' into 11000 4 months ago
fredtempez 7c3c0c145c Merge branch '10400' into 11000 4 months ago
fredtempez 1beadf188b Merge branch '10400' into 11000 4 months ago
fredtempez 5d5b87d9e6 Merge branch '10400' into 11000 4 months ago
fredtempez 21fa4d242c Merge branch '10400' into 11000 4 months ago
fredtempez fc0cf37fc3 Merge branch '10400' into 11000 4 months ago
fredtempez 5ec18961de Merge branch '10400' into 11000 4 months ago
fredtempez 6e7de11d64 Merge branch '10400' into 11000 5 months ago
fredtempez 757ac6672f Merge branch '10400' into 11000 5 months ago
fredtempez 41408bc047 Merge branch '10313' into 11000 5 months ago
fredtempez 0ab9c3e309 Merge branch '10400' into 11000 5 months ago
fredtempez 49744a75b0 Merge branch '10400' into 11000 5 months ago
fredtempez 815be8cd3b Merge branch '10400' into 11000 5 months ago
fredtempez 4b53936fa8 Merge branch '10400' into 11000 5 months ago
fredtempez 9920be0b20 fix css 5 months ago
fredtempez 45c9788228 Merge branch '10400' into 11000 5 months ago
fredtempez 4c0811ccb6 Merge branch '10400' into 11000 5 months ago
fredtempez 8bbb19fb35 Numérotation 5 months ago
fredtempez 5bfceca3ec Erreur span + aide 5 months ago
fredtempez b91db6fbbc faute de frappe 5 months ago
fredtempez adaea91dbb i18n : 5 months ago
fredtempez 7b286c7940 petits correctifs 5 months ago
fredtempez 704930aa5d Merge branch 'i18n' of https://github.com/fredtempez/ZwiiCMS into i18n 5 months ago
fredtempez 1da895bda8 Merge branch 'master' into i18n 5 months ago
fredtempez d4ad266573 Merge branch 'master' into i18n_search 5 months ago
fredtempez e7b320e5ad Traduction de la recherche ok 5 months ago
fredtempez 7b4bfcc484 Merge branch 'i18n' into i18n_search 5 months ago
fredtempez cf7a0cf177 Merge branch '10400' into i18n 5 months ago
fredtempez 5bdd1b13cd Merge branch '10400' into i18n_search 5 months ago
fredtempez 30a3caf75e Merge branch '10400' into i18n 5 months ago
fredtempez 2ee8f59c89 Merge branch '10400' into i18n 5 months ago
fredtempez 0cd84b7f2e 012 UI des options de langue 5 months ago
fredtempez caca2507ca Merge branch '10400' into i18n 5 months ago
fredtempez 33d4c02bb2 Merge branch '10400' into i18n 5 months ago
fredtempez 184fb45b70 too many requests 5 months ago
fredtempez 06d379c747 en cours 5 months ago
fredtempez 5802814f15 Bug ACCEPT LANGUAGE 5 months ago
fredtempez 867b0d3d0b UI page de traduction 5 months ago
fredtempez 966e88abd0 bug installation version core 6 months ago
fredtempez 3287c300f5 bug installation vierge et réinstallation 6 months ago
fredtempez 36dddcf30b Bug fix 6 months ago
fredtempez 33e1ac75a6 Sécurisation du formulaire 6 months ago
fredtempez 2abcc365ae Bug autoDetect + Drapeau sélectionné 6 months ago
fredtempez 39f7421569 Données par défaut + update 6 months ago
fredtempez bafd6addbf Option du français 6 months ago
fredtempez 6c4aa26608 Libellé 6 months ago
fredtempez c39ae60a42 Position des options 6 months ago
fredtempez 2aa3e80e0a Langue du navigateur autodétectée 6 months ago
fredtempez 7245fb8804 Bloc de drapeaux dans le menu 6 months ago
fredtempez 88f50b825c trad auto ok 6 months ago
fredtempez de6c83380a Traduction rédigée ok 6 months ago
fredtempez 49e8603ff9 bug effacement langue installée 6 months ago
fredtempez 793860f7d1 Position des drapeaux dans content 6 months ago
fredtempez 1828d9c7a3 traduction manuelle ok 6 months ago
fredtempez fee358a385 Merge branch '10400' into i18n 6 months ago
fredtempez de1dc21f4e Activation 6 months ago
  1. 11
      CHANGES.md
  2. 3
      README.md
  3. 16
      core/core.js.php
  4. 213
      core/core.php
  5. 77
      core/layout/common.css
  6. 22
      core/layout/lity.css
  7. 27
      core/layout/lity.php
  8. 4
      core/layout/main.php
  9. 409
      core/module/addon/addon.php
  10. 63
      core/module/addon/view/index/index.php
  11. 14
      core/module/addon/view/item/item.css
  12. 41
      core/module/addon/view/item/item.php
  13. 18
      core/module/addon/view/store/store.css
  14. 15
      core/module/addon/view/store/store.php
  15. 18
      core/module/addon/view/upload/upload.css
  16. 41
      core/module/addon/view/upload/upload.php
  17. 6
      core/module/config/config.php
  18. 58
      core/module/config/view/advanced/advanced.php
  19. 2
      core/module/config/view/index/index.php
  20. 2
      core/module/install/install.php
  21. 29
      core/module/install/ressource/defaultdata.php
  22. 4
      core/module/page/page.php
  23. 13
      core/module/page/view/edit/edit.js.php
  24. 11
      core/module/page/view/edit/edit.php
  25. 163
      core/module/translate/translate.php
  26. 20
      core/module/translate/view/advanced/advanced.css
  27. 34
      core/module/translate/view/advanced/advanced.php
  28. 68
      core/module/translate/view/index/index.js.php
  29. 180
      core/module/translate/view/index/index.php
  30. 20
      core/module/user/user.php
  31. 951
      module/download/download.php
  32. BIN
      module/download/ressource/feed-icon-16.gif
  33. 38
      module/download/vendor/FeedWriter/ATOM.php
  34. 1017
      module/download/vendor/FeedWriter/Feed.php
  35. 33
      module/download/vendor/FeedWriter/InvalidOperationException.php
  36. 413
      module/download/vendor/FeedWriter/Item.php
  37. 42
      module/download/vendor/FeedWriter/README.md
  38. 37
      module/download/vendor/FeedWriter/RSS1.php
  39. 37
      module/download/vendor/FeedWriter/RSS2.php
  40. 18
      module/download/view/add/add.css
  41. 54
      module/download/view/add/add.js.php
  42. 139
      module/download/view/add/add.php
  43. 18
      module/download/view/comment/comment.css
  44. 62
      module/download/view/comment/comment.js.php
  45. 22
      module/download/view/comment/comment.php
  46. 18
      module/download/view/config/config.css
  47. 21
      module/download/view/config/config.js.php
  48. 52
      module/download/view/config/config.php
  49. 18
      module/download/view/edit/edit.css
  50. 66
      module/download/view/edit/edit.js.php
  51. 159
      module/download/view/edit/edit.php
  52. 69
      module/download/view/index/index.css
  53. 67
      module/download/view/index/index.php
  54. 63
      module/download/view/item/item.css
  55. 43
      module/download/view/item/item.js.php
  56. 211
      module/download/view/item/item.php
  57. 1
      module/download/view/list/list.php
  58. 1
      module/download/view/rss/rss.php
  59. 18
      module/download/view/stats/stats.css
  60. 22
      module/download/view/stats/stats.js.php
  61. 36
      module/download/view/stats/stats.php
  62. 54
      module/news/news.php
  63. 48
      module/news/view/config/config.php
  64. 23
      module/news/view/index/index.css
  65. 34
      module/news/view/index/index.php
  66. 69
      module/search/search.php
  67. 2
      module/search/view/index/index.php
  68. 34
      site/file/statislite/filtres_primaires/liste_bot.txt
  69. 1
      site/file/statislite/filtres_primaires/liste_querystring.txt
  70. 5
      site/file/statislite/filtres_primaires/liste_vos_ip.txt
  71. 10
      site/file/statislite/json/.htaccess
  72. 10
      site/file/statislite/json_sauve/.htaccess
  73. 59
      site/file/statislite/langages.txt
  74. 12
      site/file/statislite/navigateurs.txt
  75. 12
      site/file/statislite/systemes.txt

11
CHANGES.md

@ -1,5 +1,16 @@
# Changelog
## Version 11.0.00
- Modifications :
- Gestion multi-langues
- Traduction rédigée dans une langue européenne
- Traduction automatique dans une langue européenne
- Traduction selon la langue navigateur
- Configuration du site :
- Activation et désactivation de la déconnexion automatique empêchant plusieurs sessions avec le même compte.
- Pages : option d'affichage dans une fenêtre superposée (Lity).
## version 10.5.01
- Modifications :
- Rechargement du fichier de style common.css et du jeu d'icônes du système après une mise à jour.

3
README.md

@ -1,5 +1,6 @@
# ZwiiCMS 10.5.01
# ZwiiCMS 11.0.00
Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.

16
core/core.js.php

@ -489,7 +489,21 @@ $(document).ready(function(){
});
/**
* Remove ID Facebook from URL
* Active le système d'aide interne
*
*/
$(".helpDisplayButton").on({
mouseenter: function () {
$(".helpDisplayContent").slideDown();
},
mouseleave: function () {
$(".helpDisplayContent").slideUp();
}
});
/**
* Remove ID Facebook from URL
*/
if(/^\?fbclid=/.test(location.search))
location.replace(location.href.replace(/\?fbclid.+/, ""));

213
core/core.php

@ -21,6 +21,7 @@ class common {
const DISPLAY_LAYOUT_BLANK = 3;
const DISPLAY_LAYOUT_MAIN = 4;
const DISPLAY_LAYOUT_LIGHT = 5;
const DISPLAY_LAYOUT_LITY = 6;
const GROUP_BANNED = -1;
const GROUP_VISITOR = 0;
const GROUP_MEMBER = 1;
@ -44,8 +45,8 @@ class common {
const ACCESS_TIMER = 1800;
// Numéro de version
const ZWII_VERSION = '10.5.01';
const ZWII_UPDATE_CHANNEL = "v10";
const ZWII_VERSION = '11.0.000';
const ZWII_UPDATE_CHANNEL = "v11";
public static $actions = [];
public static $coreModuleIds = [
@ -154,7 +155,7 @@ class common {
'pt' => 'Portugais (pt)',
];
// Langue courante
public static $i18nCurrent = 'fr';
public static $i18n;
public static $timezone;
private $url = '';
// Données de site
@ -193,6 +194,16 @@ class common {
$this->input['_COOKIE'] = $_COOKIE;
}
// Déterminer la langue sélectionnée pour le chargement des fichiers de données
if (isset($this->input['_COOKIE']['ZWII_I18N_SITE'])
) {
self::$i18n = $this->input['_COOKIE']['ZWII_I18N_SITE'];
setlocale (LC_TIME, self::$i18n . '_' . strtoupper (self::$i18n) );
} else {
//setcookie('ZWII_I18N_SITE' , 'fr', time() + 3600, helper::baseUrl(false, false) , '', helper::isHttps(), true);
self::$i18n = 'fr';
}
// Instanciation de la classe des entrées / sorties
// Récupère les descripteurs
@ -200,7 +211,7 @@ class common {
// Constructeur JsonDB
$this->dataFiles[$keys] = new \Prowebcraft\JsonDb([
'name' => $keys . '.json',
'dir' => $this->dataPath ($keys,self::$i18nCurrent),
'dir' => $this->dataPath ($keys,self::$i18n),
'backup' => file_exists('site/data/.backup')
]);;
}
@ -221,9 +232,9 @@ class common {
// Installation fraîche, initialisation des modules manquants
// La langue d'installation par défaut est fr
foreach ($this->dataFiles as $stageId => $item) {
$folder = $this->dataPath ($stageId, self::$i18nCurrent);
$folder = $this->dataPath ($stageId, self::$i18n);
if (file_exists($folder . $stageId .'.json') === false) {
$this->initData($stageId,self::$i18nCurrent);
$this->initData($stageId,self::$i18n);
common::$coreNotices [] = $stageId ;
}
}
@ -233,6 +244,29 @@ class common {
$this->user = $this->getData(['user', $this->getInput('ZWII_USER_ID')]);
}
/**
* Traduction du site par script
* Traduction par clic sur le drapeau OU
* Traduction automatisée
* - Exclure la traduction manuelle
* - La mangue du navigateur est lisible
* - L'auto-détection est active
*/
if ( $this->getData(['config','translate','scriptGoogle']) === true
AND $this->getData(['config','translate','autoDetect']) === true
AND $this->getInput('ZWII_I18N_SITE') !== ''
AND !empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) )
{
/**
* Le cookie est prioritaire sur le navigateur
* la traduction est celle de la langue du drapeau
* */
if ( $this->getInput('ZWII_I18N_SCRIPT') !== substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2 ) ) {
setrawcookie('googtrans', '/fr/'.substr( $_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2 ), time() + 3600, helper::baseUrl());
}
}
// Construit la liste des pages parents/enfants
if($this->hierarchy['all'] === []) {
$pages = helper::arrayCollumn($this->getData(['page']), 'position', 'SORT_ASC');
@ -496,7 +530,7 @@ class common {
}
}
}
// La clef est une chaine
// La clef est une chaîne
else {
foreach($this->input as $type => $values) {
// Champ obligatoire
@ -1577,10 +1611,35 @@ class common {
$this->setData(['core', 'dataVersion', 10400]);
}
// Version 10.4.05
if ($this->getData(['core', 'dataVersion']) < 10405) {
$this->setData(['core', 'dataVersion', 10405]);
}
// Version 11.0.00
if ($this->getData(['core', 'dataVersion']) < 11000) {
// Option de déconnexion auto activée
$this->setData(['config','autoDisconnect',true]);
// Mettre à jour les données de langue
$this->setData(['config','translate','scriptGoogle', false ]);
$this->setData(['config','translate','showCredits', false ]);
$this->setData(['config','translate','autoDetect', false ]);
$this->setData(['config','translate','admin', false ]);
$this->setData(['config','translate','fr', false ]);
$this->setData(['config','translate','de', false ]);
$this->setData(['config','translate','en', false ]);
$this->setData(['config','translate','es', false ]);
$this->setData(['config','translate','it', false ]);
$this->setData(['config','translate','nl', false ]);
$this->setData(['config','translate','pt', false ]);
$this->setData(['core', 'dataVersion', 11000]);
}
}
}
@ -1896,7 +1955,9 @@ class core extends common {
if (
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
AND ( $this->getUser('group') === self::GROUP_BANNED
OR $_SESSION['csrf'] !== $this->getData(['user',$this->getUser('id'),'accessCsrf']) )
OR ( $_SESSION['csrf'] !== $this->getData(['user',$this->getUser('id'),'accessCsrf'])
AND $this->getData(['config','autoDisconnect']) === true)
)
) {
$user = new user;
$user->logout();
@ -1996,7 +2057,6 @@ class core extends common {
'</a> &#8250; '.
$this->getData(['page', $this->getUrl(0), 'title']);
}
// Importe la page
if(
$this->getData(['page', $this->getUrl(0)]) !== null
@ -2035,6 +2095,7 @@ class core extends common {
'contentLeft' => $this->getData(['page',$this->getData(['page',$this->getUrl(0),'barLeft']),'content'])
]);
$pageContent = $this->getData(['page', $this->getUrl(0), 'content']);
//echo $this->output['display'];
}
else {
$moduleId = $this->getUrl(0);
@ -2044,6 +2105,7 @@ class core extends common {
if(class_exists($moduleId)) {
/** @var common $module */
$module = new $moduleId;
// Check l'existence de l'action
$action = '';
$ignore = true;
@ -2195,6 +2257,34 @@ class core extends common {
}
}
// Chargement de la bibliothèque googtrans
// Le script de traduction est sélectionné
if ( $this->getData(['config','translate','scriptGoogle']) === true
AND
// et la traduction de la langue courante est automatique
( $this->getInput('ZWII_I18N_SCRIPT') !== ''
// Ou traduction automatique
OR $this->getData(['config','translate','autoDetect']) === true
)
// Cas des pages d'administration
// Pas connecté
AND $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
AND $this->getUrl(1) !== 'login'
// Ou connecté avec option active
OR ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
AND $this->getData(['config','translate','admin']) === true
)
) {
// Paramètre du script
setrawcookie("googtrans", '/fr/'. $this->getInput('ZWII_I18N_SCRIPT') , time() + 3600, helper::baseUrl());
// Chargement de la librairie
$this->addOutput([
'vendor' => array_merge($this->output['vendor'], ['i18n'])
]);
}
// Erreurs
if($access === 'login') {
http_response_code(302);
@ -2251,8 +2341,24 @@ class core extends common {
'metaDescription' => $this->getData(['locale', 'metaDescription'])
]);
}
// Layout Lity lorsque l'option est active.
if ( $this->getData(['page', $this->getUrl(0), 'lity']) === true ) {
// Mode connecté pas de menu en mode connecté
if ( $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') ) {
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_MAIN
]);
} else {
$this->addOutput([
'display' => self::DISPLAY_LAYOUT_LITY
]);
}
}
switch($this->output['display']) {
// Layout brut
case self::DISPLAY_RAW:
echo $this->output['content'];
break;
// Layout vide
case self::DISPLAY_LAYOUT_BLANK:
require 'core/layout/blank.php';
@ -2275,9 +2381,9 @@ class core extends common {
case self::DISPLAY_LAYOUT_MAIN:
require 'core/layout/main.php';
break;
// Layout brut
case self::DISPLAY_RAW:
echo $this->output['content'];
// Layout Lity
case self::DISPLAY_LAYOUT_LITY:
require 'core/layout/lity.php';
break;
}
}
@ -2318,6 +2424,7 @@ class layout extends common {
* @param Page par défaut
*/
public function showContent() {
echo $this->showi18n('Site');
if(
$this->core->output['title']
AND (
@ -2331,6 +2438,22 @@ class layout extends common {
echo $this->core->output['content'];
/**
* Affiche les crédits, conditions requis :
* La traduction est active et le site n'est pas en français.
* La fonction est activée.
*/
if ( $this->getData(['config','translate','scriptGoogle']) === true
AND $this->getData(['config','translate','showCredits']) === true
AND
// et la traduction n'est pas manuelle
( $this->getInput('ZWII_I18N_SCRIPT')
AND $this->getData(['config','translate', $this->getInput('ZWII_I18N_SCRIPT')]) === 'script'
)
)
{
echo '<div id="googTransLogo"><a href="//policies.google.com/terms#toc-content" data-lity><img src="core/module/translate/ressource/googtrans.png" /></a></div>';
}
}
@ -2414,16 +2537,19 @@ class layout extends common {
$items .= '</span>';
// Affichage du module de recherche
$items .= '<span id="footerDisplaySearch"';
$targetLity = $this->getData(['page',$this->getData(['locale','searchPageId']), 'lity']) && $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') ? ' rel="data-lity" ' : "";
$items .= $this->getData(['theme','footer','displaySearch']) === false ? ' class="displayNone" >' : '>';
if ($this->getData(['locale','searchPageId']) !== 'none') {
$items .= '<wbr>&nbsp;|&nbsp;<a href="' . helper::baseUrl() . $this->getData(['locale','searchPageId']) . '" data-tippy-content="Rechercher dans le site" >Recherche</a>';
$items .= '<wbr>&nbsp;|&nbsp;<a href="' . helper::baseUrl() . $this->getData(['locale','searchPageId']) . '" data-tippy-content="Rechercher dans le site"' . $targetLity . '>Recherche</a>';
}
$items .= '</span>';
// Affichage des mentions légales
$items .= '<span id="footerDisplayLegal"';
$items .= $this->getData(['theme','footer','displayLegal']) === false ? ' class="displayNone" >' : '>';
// Affichage lity
$targetLity = $this->getData(['page',$this->getData(['locale','legalPageId']), 'lity']) && $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') ? ' rel="data-lity" ' : "";
if ($this->getData(['locale','legalPageId']) !== 'none') {
$items .= '<wbr>&nbsp;|&nbsp;<a href="' . helper::baseUrl() . $this->getData(['locale','legalPageId']) . '" data-tippy-content="Mentions légales">Mentions légales</a>';
$items .= '<wbr>&nbsp;|&nbsp;<a href="' . helper::baseUrl() . $this->getData(['locale','legalPageId']) .'" data-tippy-content="Mentions légales"' . $targetLity .' >Mentions légales</a>';
}
$items .= '</span>';
// Affichage du lien de connexion
@ -2546,6 +2672,9 @@ class layout extends common {
// Propriétés de l'item
$active = ($parentPageId === $currentPageId OR in_array($currentPageId, $childrenPageIds)) ? 'active ' : '';
$targetBlank = $this->getData(['page', $parentPageId, 'targetBlank']) ? ' target="_blank"' : '';
$targetLity = $this->getData(['page', $parentPageId, 'lity'])
&& $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
? ' rel="data-lity" ' : '';
// Mise en page de l'item
$itemsLeft .= '<li>';
@ -2559,7 +2688,7 @@ class layout extends common {
){
$itemsLeft .= '<a class="' . $parentPageId . '" href="'. helper::baseUrl() . $this->getUrl(0).'">';
} else {
$itemsLeft .= '<a class="' . $active . $parentPageId . '" href="' . helper::baseUrl() . $parentPageId . '"' . $targetBlank . '>';
$itemsLeft .= '<a class="' . $active . $parentPageId . '" href="' . helper::baseUrl() . $parentPageId . '"' . $targetBlank . $targetLity . '>';
}
switch ($this->getData(['page', $parentPageId, 'typeMenu'])) {
@ -2607,6 +2736,9 @@ class layout extends common {
// Propriétés de l'item
$active = ($childKey === $currentPageId) ? 'active ' : '';
$targetBlank = $this->getData(['page', $childKey, 'targetBlank']) ? ' target="_blank"' : '';
$targetLity = $this->getData(['page', $childKey, 'lity'])
&& $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
? ' rel="data-lity" ' : '';
// Mise en page du sous-item
$itemsLeft .= '<li>';
if ( ( $this->getData(['page',$childKey,'disable']) === true
@ -2619,7 +2751,7 @@ class layout extends common {
){
$itemsLeft .= '<a class="' . $parentPageId . '" href="'.helper::baseUrl() . $this->getUrl(0).'">';
} else {
$itemsLeft .= '<a class="' . $active . $parentPageId . '" href="' . helper::baseUrl() . $childKey . '"' . $targetBlank . '>';
$itemsLeft .= '<a class="' . $active . $parentPageId . '" href="' . helper::baseUrl() . $childKey . '"' . $targetBlank . $targetLity . '>';
}
switch ($this->getData(['page', $childKey, 'typeMenu'])) {
@ -2683,6 +2815,7 @@ class layout extends common {
}
// Retourne les items du menu
echo '<ul class="navMain" id="menuLeft">' . $itemsLeft . '</ul><ul class="navMain" id="menuRight">' . $itemsRight . '</ul>';
echo $this->showi18n('Nav');
}
/**
@ -2721,7 +2854,10 @@ class layout extends common {
}
// Propriétés de l'item
$active = ($parentPageId === $currentPageId OR in_array($currentPageId, $childrenPageIds)) ? ' class="active"' : '';
$targetBlank = $this->getData(['page', $parentPageId, 'targetBlank']) ? ' target="_blank"' : '';
$targetBlank = $this->getData(['page', $parentPageId, 'targetBlank']) ? ' target="_blank" ' : '';
$targetLity = $this->getData(['page', $parentPageId, 'lity'])
&& $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
? ' rel="data-lity" ' : '';
// Mise en page de l'item;
// Ne pas afficher le parent d'une sous-page quand l'option est sélectionnée.
if ($onlyChildren === false) {
@ -2730,7 +2866,7 @@ class layout extends common {
AND $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') ) {
$items .= '<a href="'.$this->getUrl(1).'">';
} else {
$items .= '<a href="'. helper::baseUrl() . $parentPageId . '"' . $targetBlank . $active .'>';
$items .= '<a href="'. helper::baseUrl() . $parentPageId . '"' . $targetBlank . $targetLity . $active .'>';
}
$items .= $this->getData(['page', $parentPageId, 'title']);
$items .= '</a>';
@ -2745,6 +2881,9 @@ class layout extends common {
// Propriétés de l'item
$active = ($childKey === $currentPageId) ? ' class="active"' : '';
$targetBlank = $this->getData(['page', $childKey, 'targetBlank']) ? ' target="_blank"' : '';
$targetLity = $this->getData(['page', $childKey, 'lity'])
&& $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
? ' rel="data-lity" ' : '';
// Mise en page du sous-item
$itemsChildren .= '<li class="menuSideChild">';
@ -2752,7 +2891,7 @@ class layout extends common {
AND $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') ) {
$itemsChildren .= '<a href="'.$this->getUrl(1).'">';
} else {
$itemsChildren .= '<a href="' . helper::baseUrl() . $childKey . '"' . $targetBlank . $active . '>';
$itemsChildren .= '<a href="' . helper::baseUrl() . $childKey . '"' . $targetBlank . $targetLity . $active . '>';
}
$itemsChildren .= $this->getData(['page', $childKey, 'title']);
@ -2924,7 +3063,7 @@ class layout extends common {
if($this->getUser('group') >= self::GROUP_ADMIN) {
$rightItems .= '<li><a href="' . helper::baseUrl() . 'user" data-tippy-content="Configurer les utilisateurs">' . template::ico('users') . '</a></li>';
$rightItems .= '<li><a href="' . helper::baseUrl() . 'theme" data-tippy-content="Personnaliser les thèmes">' . template::ico('brush') . '</a></li>';
//$rightItems .= '<li><a href="' . helper::baseUrl() . 'translate" data-tippy-content="Gestion des langues">' . template::ico('flag') . '</a></li>';
$rightItems .= '<li><a href="' . helper::baseUrl() . 'translate" data-tippy-content="Gestion des langues">' . template::ico('flag') . '</a></li>';
$rightItems .= '<li><a href="' . helper::baseUrl() . 'addon" data-tippy-content="Gérer les modules">' . template::ico('puzzle') . '</a></li>';
$rightItems .= '<li><a href="' . helper::baseUrl() . 'config" data-tippy-content="Configurer le site">' . template::ico('cog-alt') . '</a></li>';
// Mise à jour automatique
@ -3024,4 +3163,36 @@ class layout extends common {
}
}
}
/**
* Affiche le cadre avec les drapeaux sélectionnés
*/
public function showi18n($id) {
echo '<div id="i18nContainer' . $id . '"><ul>';
foreach (self::$i18nList as $key => $value) {
if ($this->getData(['config','translate',$key]) === 'site'
OR (
$this->getData(['config','translate','scriptGoogle']) === true
AND $this->getData(['config','translate',$key]) === 'script'
)
) {
if (
(isset($_COOKIE['ZWII_I18N_SITE'] )
AND $_COOKIE['ZWII_I18N_SITE'] === $key
)
OR
( isset($_COOKIE['ZWII_I18N_SCRIPT'])
AND $_COOKIE['ZWII_I18N_SCRIPT'] === $key
) ) {
$select = ' id="i18nFlagSelected" ';
} else {
$select = ' id="i18nFlag" ';
}
echo '<li>';
echo '<a href="' . helper::baseUrl() . 'translate/language/' . $key . '/' . $this->getData(['config','translate',$key]) . '"><img ' . $select . ' class="flag" src="' . helper::baseUrl(false) . 'core/vendor/i18n/png/' . $key . '.png" /></a>';
echo '</li>';
}
}
echo '</ul></div>';
}
}

77
core/layout/common.css

@ -29,7 +29,7 @@ body {
}
@media (min-width: 769px) {
@media screen and (min-width: 769px) {
body {
/*margin:0px 10px;*/
margin: 0;
@ -41,7 +41,7 @@ body {
/**
* Petits écrans inférieurs à 768px de largeur, on supprime les marges
*/
@media (max-width: 768px) {
@media screen and (max-width: 768px) {
body {
margin: 0px;
}
@ -65,7 +65,7 @@ body {
@media (max-width: 768px) {
@media screen and (max-width: 768px) {
.siteContainer {
display: flex;
flex-direction: column;
@ -237,12 +237,12 @@ td>.col12 {
}
/* Tableau sur les écrans de petites tailles */
@media (max-width: 768px) {
@media screen and (max-width: 768px) {
.table thead {
font-size: 0.8em;
}
}
@media (max-width: 668px) {
@media screen and (max-width: 668px) {
.table thead {
display:none;
}
@ -408,7 +408,7 @@ td>.col12 {
background-color: rgba(255, 255, 255, 1);
}
@media (min-width: 769px) {
@media screen and (min-width: 769px) {
#bar #barLeft {
float: left;
}
@ -419,7 +419,7 @@ td>.col12 {
}
}
@media (max-width: 768px) {
@media screen and (max-width: 768px) {
#bar {
text-align: center;
padding: 0 1;
@ -455,7 +455,7 @@ td>.col12 {
overflow: hidden;
}
/* Dans theme.css
@media (min-width:768px) {
@media screen and (min-width:768px) {
#site {
margin: 20px auto;
}
@ -464,7 +464,7 @@ td>.col12 {
/* Bannière */
@media (min-width:768px) {
@media screen and (min-width:768px) {
body>header {
margin: 0;
/*-10px;*/
@ -598,13 +598,13 @@ nav::before {
display: flex;
}
@media (min-width: 769px) {
@media screen and (min-width: 769px) {
nav #menu {
display: block;
}
}
@media (max-width: 768px) {
@media screen and (max-width: 768px) {
body>nav {
margin: 0;
}
@ -691,41 +691,66 @@ li .menuSideChild {
/* Container des drapeaux */
#i18nContainer {
z-index: 100;
#i18nContainerNav, #i18nContainerSite {
position: relative ;
float: right;
width: auto;
height: auto;
margin-top: -25px;
}
#i18nContainer ul {
#i18nContainerNav ul, #i18nContainerSite ul {
list-style: none;
}
#i18nContainer li {
#i18nContainerNav li, #i18nContainerSite li {
display: inline-block;
position: relative;
}
#i18nContainer img {
width: 80%;
#i18nFlag {
width: 70%;
}
#i18nFlagSelected {
width: 100%;
}
/*
* Position du bloc dans le site sur les petits écrans
*/
#i18nContainer img {
margin: 2px;
#i18nContainerNav {
display: block;
}
#i18nContainerSite {
display: none;
}
@media screen and (max-width:1024px){
#i18nContainerNav {
display: none;
}
#i18nContainerSite {
display: block;
margin-top: -10px;
}
#i18nFlag {
width: 100%;
padding: 5px;
}
#i18nFlagSelected {
width: 130%;
padding: 5px;
}
}
/* Corps */
@media (min-width:768px) {
@media screen and (min-width:768px) {
section {
padding: 20px;
}
@ -822,7 +847,7 @@ footer #footerbody>div {
}
/* Conserve le pied de page sur une ligne */
@media (max-width: 768px) {
@media screen and (max-width: 768px) {
body>footer {
margin: 0;
}
@ -1367,7 +1392,7 @@ input[type='checkbox']:disabled+label:before {
display: inline-block;
}
@media (min-width: 769px) {
@media screen and (min-width: 769px) {
.col1 {
width: 8.33333333%;
}
@ -1556,7 +1581,7 @@ th.col12 {
}
/* Tableau sur les écrans de très petites tailles */
@media (max-width: 480px){
@media screen and (max-width: 480px){
.table tr{
display: block;
margin-bottom: 10px;

22
core/layout/lity.css

@ -0,0 +1,22 @@
/**
* 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-2021, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/**
* Éléments spécifiques
*/
/* Site */
section {
min-height: 0px;
}

27
core/layout/lity.php

@ -0,0 +1,27 @@
<?php $layout = new layout($this);
$lan = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); ?>
<!DOCTYPE html>
<html prefix="og: http://ogp.me/ns#" lang="<?php echo $lan;?>">
<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->showStyle(); ?>
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/common.css">
<link rel="stylesheet" href="<?php echo helper::baseUrl(false); ?>core/layout/lity.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'); ?>">
</head>
<body>
<?php $layout->showNotification(); ?>
<div id="site" class="container">
<section><?php $layout->showContent(); ?></section>
</div>
<?php $layout->showScript(); ?>
</body>
</html>

4
core/layout/main.php

@ -36,7 +36,7 @@
<?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('password') === $this->getInput('ZWII_USER_PASSWORD',true)
AND $this->getUser('group') > self::GROUP_MEMBER) {
echo '<nav id="navfixedconnected" >';
} else {
@ -59,7 +59,6 @@
<?php if($this->getData(['theme', 'header', 'position']) === 'body'): ?>
<!-- Bannière dans le fond du site -->
<header>
<?php //$layout->showi18n();?>
<?php
if ($this->getData(['theme','header','linkHomePage'])){
echo "<a href='" . helper::baseUrl(false) . "'>" ;} ?>
@ -153,7 +152,6 @@
<?php endif; ?>
<!-- Corps de page -->
<section>
<?php //$layout->showi18n();?>
<?php
// Gabarit :
// Récupérer la config de la page courante

409
core/module/addon/addon.php

@ -20,21 +20,33 @@ class addon extends common {
public static $actions = [
'index' => self::GROUP_ADMIN,
'moduleDelete' => self::GROUP_ADMIN,
'delete' => self::GROUP_ADMIN,
'export' => self::GROUP_ADMIN,
'import' => self::GROUP_ADMIN
'import' => self::GROUP_ADMIN,
'store' => self::GROUP_ADMIN,
'item' => self::GROUP_ADMIN,
'upload' => self::GROUP_ADMIN,
'uploadItem'=> self::GROUP_ADMIN
];
const URL_STORE = 'http://zwiicms.fr/?modules/list';
const BASEURL_STORE = 'http://zwiicms.fr/';
// Gestion des modules
public static $modInstal = [];
// pour tests
public static $valeur = [];
// le catalogue
public static $storeList = [];
public static $storeItem = [];
/*
* Effacement d'un module installé et non utilisé
*/
public function moduleDelete() {
public function delete() {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
@ -78,6 +90,270 @@ class addon extends common {
}
}
/***
* Installation d'un module
* Fonction utilisée par upload et storeUpload
*/
private function install ($moduleName, $checkValid){
$tempFolder = 'datamodules';//uniqid();
$zip = new ZipArchive();
if ($zip->open($moduleName) === TRUE) {
$notification = 'Archive ouverte';
mkdir (self::TEMP_DIR . $tempFolder);
$zip->extractTo(self::TEMP_DIR . $tempFolder );
// Archive de module ?
$success = false;
$notification = 'Ce n\'est pas l\'archive d\'un module !';
$moduleDir = self::TEMP_DIR . $tempFolder . '/module';
$moduleName = '';
if ( is_dir( $moduleDir )) {
// Lire le nom du module
if ($dh = opendir( $moduleDir )) {
while ( false !== ($file = readdir($dh)) ) {
if ($file != "." && $file != "..") {
$moduleName = $file;
}
}
closedir($dh);
}
// Module normalisé ?
if( is_file( $moduleDir.'/'.$moduleName.'/'.$moduleName.'.php' ) AND is_file( $moduleDir.'/'.$moduleName.'/view/index/index.php' ) ){
// Lecture de la version et de la validation d'update du module pour validation de la mise à jour
// Pour une version <= version installée l'utilisateur doit cocher 'Mise à jour forcée'
$version = '0.0';
$update = '0.0';
$valUpdate = false;
$file = file_get_contents( $moduleDir.'/'.$moduleName.'/'.$moduleName.'.php');
$file = str_replace(' ','',$file);
$file = str_replace("\t",'',$file);
$pos1 = strpos($file, 'constVERSION');
if( $pos1 !== false){
$posdeb = strpos($file, "'", $pos1);
$posend = strpos($file, "'", $posdeb + 1);
$version = substr($file, $posdeb + 1, $posend - $posdeb - 1);
}
$pos1 = strpos($file, 'constUPDATE');
if( $pos1 !== false){
$posdeb = strpos($file, "'", $pos1);
$posend = strpos($file, "'", $posdeb + 1);
$update = substr($file, $posdeb + 1, $posend - $posdeb - 1);
}
// Si version actuelle >= version indiquée dans UPDATE la mise à jour est validée
if( $infoModules[$moduleName]['update'] >= $update ) $valUpdate = true;
// Module déjà installé ?
$moduleInstal = false;
foreach( self::$modInstal as $key=>$value){
if($moduleName === $value[0]){
$moduleInstal = true;
}
}
// Validation de la maj si autorisation du concepteur du module ET
// ( Version plus récente OU Check de forçage )
$valNewVersion = floatval($version);
$valInstalVersion = floatval( $infoModules[$moduleName]['version'] );
$newVersion = false;
if( $valNewVersion > $valInstalVersion ) $newVersion = true;
$validMaj = $valUpdate && ( $newVersion || $checkValid);
// Nouvelle installation ou mise à jour du module
if( ! $moduleInstal || $validMaj ){
// Copie récursive des dossiers
$this -> custom_copy( self::TEMP_DIR . $tempFolder, './' );
$success = true;
if( ! $moduleInstal ){
$notification = 'Module '.$moduleName.' installé';
}
else{
$notification = 'Module '.$moduleName.' mis à jour';
}
}
else{
$success = false;
if( $valNewVersion == $valInstalVersion){
$notification = ' Version détectée '.$version.' = à celle installée '.$infoModules[$moduleName]['version'];
}
else{
$notification = ' Version détectée '.$version.' < à celle installée '.$infoModules[$moduleName]['version'];
}
if( $valUpdate === false){
if( $infoModules[$moduleName]['update'] === $update ){
$notification = ' Mise à jour par ce procédé interdite par le concepteur du module';
}
else{
$notification = ' Mise à jour par ce procédé interdite, votre version est trop ancienne';
}
}
}
}
}
// Supprimer le dossier temporaire même si le module est invalide
$this->removeDir(self::TEMP_DIR . $tempFolder);
$zip->close();
} else {
// erreur à l'ouverture
$success = false;
$notification = 'Impossible d\'ouvrir l\'archive';
}
return(['success' => $success,
'notification'=> $notification
]);
}
/***
* Installation d'un module à partir du gestionnaire de fichier
*/
public function upload() {
// Soumission du formulaire
if($this->isPost()) {
// Installation d'un module
$checkValidMaj = $this->getInput('configModulesCheck', helper::FILTER_BOOLEAN);
$zipFilename = $this->getInput('configModulesInstallation', helper::FILTER_STRING_SHORT);
if( $zipFilename !== ''){
$success = [
'success' => false,
'notification'=> ''
];
$state = $this->install(self::FILE_DIR.'source/'.$zipFilename, $checkValidMaj);
}
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => $state['notification'],
'state' => $state['success']
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Téléverser un module',
'view' => 'upload'
]);
}
/***
* Installation d'un module par le catalogue
*/
public function uploadItem() {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'store',
'state' => false,
'notification' => 'Action non autorisée'
]);
} else {
// Récupérer le module en ligne
$moduleName = $this->getUrl(2);
// Informations sur les module en ligne
$store = json_decode(helper::urlGetContents(self::URL_STORE), true);
// Url du module à télécharger
$moduleFilePath = $store[$moduleName]['file'];
// Télécharger le fichier
$moduleData = helper::urlGetContents(self::BASEURL_STORE . self::FILE_DIR . 'source/' . $moduleFilePath);
// Extraire de l'arborescence
$d = explode('/',$moduleFilePath);
$moduleFile = $d[count($d)-1];
// Créer le dossier modules
if (!is_dir(self::FILE_DIR . 'source/modules')) {
mkdir (self::FILE_DIR . 'source/modules');
}
// Sauver les données du fichiers
file_put_contents(self::FILE_DIR . 'source/modules/' . $moduleFile, $moduleData);
/**
* $if( $moduleFile !== ''){
* $success = [
* 'success' => false,
* 'notification'=> ''
* ];
* $state = $this->install(self::FILE_DIR.'source/modules/'.$moduleFile, false);
*}
*/
$this->addOutput([
'redirect' => helper::baseUrl() . 'addon/store',
'notification' => $moduleFile . ' téléchargé dans le dossier modules du gestionnaire de fichiers',
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Catalogue de modules',
'view' => 'store'
]);
}
/**
* Catalogue des modules sur le site ZwiiCMS.fr
*/
public function store() {
$store = json_decode(helper::urlGetContents(self::URL_STORE), true);
if ($store) {
// Modules installés
$infoModules = helper::getModules();
// Clés moduleIds dans les pages
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
foreach( $inPages as $key=>$value){
$inPagesTitle[ $this->getData(['page', $key, 'title' ]) ] = $value;
}
// Parcourir les données des modules
foreach ($store as $key=>$value) {
// Module non installé
$ico = template::ico('download');
$class = '';
// Le module est installé
if (array_key_exists($key,$infoModules) === true) {
$class = 'buttonGreen';
$ico = template::ico('update');
}
// Le module est installé et utilisé
if (in_array($key,$inPages) === true) {
$class = 'buttonRed';
$ico = template::ico('update');
}
self::$storeList [] = [
'<a href="' . helper::baseurl() . $this->getUrl(0) . '/item/' . $key . '" rel="data-lity">'.$store[$key]['title'].'</a>',
$store[$key]['fileVersion'],
mb_detect_encoding(strftime('%d %B %Y', $store[$key]['fileDate']), 'UTF-8', true)
? strftime('%d %B %Y', $store[$key]['fileDate'])
: utf8_encode(strftime('%d %B %Y', $store[$key]['fileDate'])),
implode(', ', array_keys($inPagesTitle,$key)),
template::button('moduleExport' . $key, [
'class' => $class,
'href' => helper::baseUrl(). $this->getUrl(0) . '/uploadItem/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
'value' => $ico
])
];
}
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Catalogue de modules',
'view' => 'store'
]);
}
/**
* Détail d'un objet du catalogue
*/
public function item() {
$store = json_decode(helper::urlGetContents(self::URL_STORE), true);
self::$storeItem = $store [$this->getUrl(2)] ;
self::$storeItem ['fileDate'] = mb_detect_encoding(strftime('%d %B %Y',self::$storeItem ['fileDate']), 'UTF-8', true)
? strftime('%d %B %Y', self::$storeItem ['fileDate'])
: utf8_encode(strftime('%d %B %Y', self::$storeItem ['fileDate']));
// Valeurs en sortie
$this->addOutput([
'title' =>'Module ' . self::$storeItem['title'],
'view' => 'item',
'display' => self::DISPLAY_LAYOUT_LITY
]);
}
/**
* Gestion des modules
@ -102,11 +378,11 @@ class addon extends common {
$infoModules[$key]['realName'],
$infoModules[$key]['version'],
implode(', ', array_keys($inPagesTitle,$key)),
//array_key_exists('delete',$infoModules[$key]) && $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === ''
//|| ('delete',$infoModules[$key]) && $infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === ''
$infoModules[$key]['delete'] === true && implode(', ',array_keys($inPages,$key)) === ''
? template::button('moduleDelete' . $key, [
'class' => 'moduleDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/moduleDelete/' . $key . '/' . $_SESSION['csrf'],
'href' => helper::baseUrl