Compare commits

...

29 Commits

Author SHA1 Message Date
F Tempez 43da5f03db Appel automatique des initCSS lors de la mise à jour vers 10600 1 month ago
F Tempez 55c921025a News : initCss 1 month ago
F Tempez 3247e14a83 initCss variable d'instance 1 month ago
F Tempez e3744bf7d8 Bug module initcss manque style 1 month ago
F Tempez 695abf314a warning stristr deprecated 1 month ago
fredtempez fc2fbf2103 init 1 month ago
fredtempez 4c0e0bd4b6 i18n pour la v11 1 month ago
F Tempez 6f7efd7420 Bug variable non déclarée dans config 1 month ago
F Tempez 9de4b08d20 addon effacement des données 1 month ago
F Tempez 04fab0e06c Merge branch '10600' of https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS into 10600 1 month ago
F Tempez 6a9d194942 export nouveau datadirectory 1 month ago
SylvainLelievre 2ad1036a7f Mise à jour de 'core/class/helper.class.php' 1 month ago
fredtempez e90da78bad Modules : datadirectory type string 1 month ago
F Tempez ba1d5bbf1f Gallery datadirectory 1 month ago
fredtempez 03ae2b84f9 changes et readme 1 month ago
fredtempez 2510a1bc8d Search bouton loupe si pas de texte 1 month ago
fredtempez 687a98df15 Icône search 1 month ago
fredtempez 77fc370e28 Fonction initCss 1 month ago
fredtempez a1d934ad7b search initCSS 1 month ago
fredtempez 9a8592cb68 Search fonction initialisation 1 month ago
fredtempez cba87d3295 news Effet blur 1 month ago
fredtempez 374439755c Gallery correction init 1 month ago
fredtempez 89a5828d99 suprresion des options de langues commentées 1 month ago
fredtempez c45fdc4895 config advanced emplacements des sélecteurs 1 month ago
fredtempez df778fbee1 config objets par page 1 month ago
fredtempez 9630f093cd defaultdata de la v11 1 month ago
fredtempez c2c67b55ff Modules de v11 1 month ago
fredtempez fd8a15812b Style perso 1 month ago
fredtempez e2f1d5e0e3 gitignore 1 month ago
  1. 1
      .gitignore
  2. 7
      CHANGES.md
  3. 2
      README.md
  4. 7
      core/class/helper.class.php
  5. 38
      core/core.php
  6. 227
      core/module/addon/addon.php
  7. 14
      core/module/config/config.php
  8. 20
      core/module/config/view/advanced/advanced.php
  9. 108
      core/module/install/ressource/defaultdata.php
  10. 1
      core/vendor/zwiico/css/zwiico-codes.css
  11. 13
      core/vendor/zwiico/css/zwiico-embedded.css
  12. 1
      core/vendor/zwiico/css/zwiico-ie7-codes.css
  13. 1
      core/vendor/zwiico/css/zwiico-ie7.css
  14. 15
      core/vendor/zwiico/css/zwiico.css
  15. BIN
      core/vendor/zwiico/font/zwiico.eot
  16. 2
      core/vendor/zwiico/font/zwiico.svg
  17. BIN
      core/vendor/zwiico/font/zwiico.ttf
  18. BIN
      core/vendor/zwiico/font/zwiico.woff
  19. BIN
      core/vendor/zwiico/font/zwiico.woff2
  20. 49
      module/blog/blog.php
  21. 8
      module/blog/view/config/config.php
  22. 978
      module/download/download.php
  23. BIN
      module/download/ressource/feed-icon-16.gif
  24. 38
      module/download/vendor/FeedWriter/ATOM.php
  25. 1017
      module/download/vendor/FeedWriter/Feed.php
  26. 33
      module/download/vendor/FeedWriter/InvalidOperationException.php
  27. 413
      module/download/vendor/FeedWriter/Item.php
  28. 42
      module/download/vendor/FeedWriter/README.md
  29. 37
      module/download/vendor/FeedWriter/RSS1.php
  30. 37
      module/download/vendor/FeedWriter/RSS2.php
  31. 18
      module/download/view/add/add.css
  32. 54
      module/download/view/add/add.js.php
  33. 139
      module/download/view/add/add.php
  34. 18
      module/download/view/comment/comment.css
  35. 62
      module/download/view/comment/comment.js.php
  36. 22
      module/download/view/comment/comment.php
  37. 18
      module/download/view/config/config.css
  38. 21
      module/download/view/config/config.js.php
  39. 60
      module/download/view/config/config.php
  40. 18
      module/download/view/edit/edit.css
  41. 66
      module/download/view/edit/edit.js.php
  42. 159
      module/download/view/edit/edit.php
  43. 69
      module/download/view/index/index.css
  44. 63
      module/download/view/item/item.css
  45. 43
      module/download/view/item/item.js.php
  46. 1
      module/download/view/list/list.php
  47. 1
      module/download/view/rss/rss.php
  48. 18
      module/download/view/stats/stats.css
  49. 22
      module/download/view/stats/stats.js.php
  50. 36
      module/download/view/stats/stats.php
  51. 2
      module/form/form.php
  52. 188
      module/gallery/gallery.php
  53. 3
      module/gallery/ressource/defaultdata.php
  54. 8
      module/gallery/view/edit/edit.php
  55. 79
      module/gallery/view/gallery/gallery.css
  56. 2
      module/gallery/view/gallery/gallery.php
  57. 79
      module/gallery/view/index/index.css
  58. 28
      module/gallery/view/theme/theme.php
  59. 187
      module/news/news.php
  60. 20
      module/news/view/article/article.css
  61. 54
      module/news/view/config/config.php
  62. 39
      module/news/view/index/index.css
  63. 34
      module/news/view/index/index.php
  64. 2
      module/redirection/redirection.php
  65. 4
      module/search/ressource/defaultdata.php
  66. 174
      module/search/search.php
  67. 10
      module/search/view/config/config.php
  68. 8
      module/search/view/index/index.php

1
.gitignore

@ -47,3 +47,4 @@ site/data/en/page.json
site/data/de/locale.json
site/data/de/module.json
site/data/de/page.json
site/data/modules/*

7
CHANGES.md

@ -1,5 +1,12 @@
# Changelog
## version 10.6.00
Cette version apporte aux modules une autonomie complète par rapport au noyau.
- mise à jour interne (fonction update)
- feuille de style propres aux instances (fonction initCss)
- Modifications :
- Module Search : en l'absence de texte dans le bouton Rechercher, une loupe est affichée.
## version 10.5.02
- Corrections :
- Erreur de positionnement de marge dans le thème du site.

2
README.md

@ -1,5 +1,5 @@
# ZwiiCMS 10.5.02
# ZwiiCMS 10.6.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.

7
core/class/helper.class.php

@ -177,13 +177,10 @@ class helper {
$delete = true;
}
// Constante DATADIRECTORY
if ( array_key_exists('DATADIRECTORY', $class_constants)
&& $class_constants['DATADIRECTORY'] !== []
&& is_array($class_constants['DATADIRECTORY'])
) {
if ( array_key_exists('DATADIRECTORY', $class_constants)) {
$dataDirectory = $value::DATADIRECTORY;
} else {
$dataDirectory = [];
$dataDirectory = '';
}
// Affection
$modules [$value] = [

38
core/core.php

@ -44,7 +44,7 @@ class common {
const ACCESS_TIMER = 1800;
// Numéro de version
const ZWII_VERSION = '10.5.02';
const ZWII_VERSION = '10.6.00';
const ZWII_UPDATE_CHANNEL = "v10";
public static $actions = [];
@ -1585,6 +1585,36 @@ class common {
}
$this->setData(['core', 'dataVersion', 10502]);
}
// Version 10.6.00
if ($this->getData(['core', 'dataVersion']) < 10600) {
// Mise à jour des données des modules autonomes
// Liste des pages dans pageList
$pageList = array();
foreach ($this->getHierarchy(null,null,null) as $parentKey=>$parentValue) {
$pageList [] = $parentKey;
foreach ($parentValue as $childKey) {
$pageList [] = $childKey;
}
}
// Parcourir pageList et rechercher les modules au CSS autonomes
foreach ($pageList as $parentKey => $parent) {
if (
$this->getData(['page',$parent,'moduleId']) === 'search'
|| $this->getData(['page',$parent,'moduleId']) === 'gallery'
|| $this->getData(['page',$parent,'moduleId']) === 'news'
){
if(class_exists($parent)) {
$module = new $moduleId;
$module->initCSS($parent);
}
}
}
}
$this->setData(['core', 'dataVersion', 10600]);
}
}
@ -2134,6 +2164,11 @@ class core extends common {
'style' => file_get_contents($stylePath)
]);
}
if ($output['style']) {
$this->addOutput([
'style' => $this->output['style'] . file_get_contents($output['style'])
]);
}
// JS
$scriptPath = $modulePath . 'module/' . $moduleId . '/view/' . $output['view'] . '/' . $output['view'] . '.js.php';
if(file_exists($scriptPath)) {
@ -2928,7 +2963,6 @@ 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() . '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

227
core/module/addon/addon.php

@ -50,19 +50,13 @@ class addon extends common {
$infoModules = helper::getModules();
$module = $this->getUrl(2);
//Liste des dossiers associés au module non effacés
$list = '';
foreach( $infoModules[$module]['dataDirectory'] as $moduleId){
if (strpos($moduleId,'module.json') === false && strpos($moduleId,'page.json') === false) {
$list === '' ? $list = self::DATA_DIR.$moduleId : $list .= ', '.self::DATA_DIR. $moduleId;
}
}
if( $this->removeDir('./module/'.$module ) === true){
if( $this->removeDir('./module/'.$module ) === true ){
$success = true;
if( $list === ''){
$notification = 'Module '.$module .' désinstallé';
}
else{
$notification = 'Module '.$module .' désinstallé, il reste des données dans '.$list;
$notification = 'Module '. $module .' désinstallé';
if(($infoModules[$this->getUrl(2)]['dataDirectory']) ) {
if (!$this->removeDir($infoModules[$this->getUrl(2)]['dataDirectory'])){
$notification = 'Module '.$module .' désinstallé, il reste des données dans ' . $infoModules[$this->getUrl(2)]['dataDirectory'];
}
}
}
else{
@ -110,16 +104,16 @@ class addon extends common {
'value' => template::ico('cancel')
])
: '',
is_array($infoModules[$key]['dataDirectory']) && implode(', ',array_keys($inPages,$key)) !== ''
implode(', ',array_keys($inPages,$key)) !== ''
? template::button('moduleExport' . $key, [
'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key,// appel de fonction vaut exécution, utiliser un paramètre
'href' => helper::baseUrl(). $this->getUrl(0) . '/export/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('download')
])
: '',
'',
is_array($infoModules[$key]['dataDirectory']) && implode(', ',array_keys($inPages,$key)) === ''
implode(', ',array_keys($inPages,$key)) === ''
? template::button('moduleExport' . $key, [
'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key.'/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
'href' => helper::baseUrl(). $this->getUrl(0) . '/import/' . $key . '/' . $_SESSION['csrf'],// appel de fonction vaut exécution, utiliser un paramètre
'value' => template::ico('upload')
])
: ''
@ -251,108 +245,97 @@ class addon extends common {
]);
}
/*
* Copie récursive de dossiers
*
*/
private function custom_copy($src, $dst) {
// open the source directory
$dir = opendir($src);
// Make the destination directory if not exist
if (!is_dir($dst)) {
mkdir($dst);
}
// Loop through the files in source directory
while( $file = readdir($dir) ) {
if (( $file != '.' ) && ( $file != '..' )) {
if ( is_dir($src . '/' . $file) ){
// Recursively calling custom copy function
// for sub directory
$this -> custom_copy($src . '/' . $file, $dst . '/' . $file);
}
else {
copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
}
/*
* Export des données d'un module externes ou interne à module.json
*/
public function export(){
// Lire les données du module
$infoModules = helper::getModules();
// Créer un dossier par défaut
$tmpFolder = self::TEMP_DIR . uniqid();
//$tmpFolder = self::TEMP_DIR . 'test';
if (!is_dir($tmpFolder)) {
mkdir($tmpFolder);
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'addon',
'state' => false,
'notification' => 'Action non autorisée'
]);
}
// Clés moduleIds dans les pages
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
// Parcourir les pages utilisant le module
foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) {
// Export des pages hébergeant le module
$pageContent[$pageId] = $this->getData(['page',$pageId]);
// Export de fr/module.json
$moduleId = 'fr/module.json';
// Création de l'arborescence des langues
// Pas de nom dossier de langue - dossier par défaut
$t = explode ('/',$moduleId);
if ( is_array($t)) {
$lang = 'fr';
} else {
$lang = $t[0];
else {
// Lire les données du module
$infoModules = helper::getModules();
// Créer un dossier par défaut
$tmpFolder = self::TEMP_DIR . uniqid();
//$tmpFolder = self::TEMP_DIR . 'test';
if (!is_dir($tmpFolder)) {
mkdir($tmpFolder);
}
// Créer le dossier si inexistant
if (!is_dir($tmpFolder . '/' . $lang)) {
mkdir ($tmpFolder . '/' . $lang);
// Clés moduleIds dans les pages
$inPages = helper::arrayCollumn($this->getData(['page']),'moduleId', 'SORT_DESC');
// Parcourir les pages utilisant le module
foreach (array_keys($inPages,$this->getUrl(2)) as $pageId) {
// Export des pages hébergeant le module
$pageContent[$pageId] = $this->getData(['page',$pageId]);
// Export de fr/module.json
$moduleId = 'fr/module.json';
$moduleDir = str_replace('site/data/','',$infoModules[$this->getUrl(2)]['dataDirectory']);
// Création de l'arborescence des langues
// Pas de nom dossier de langue - dossier par défaut
$t = explode ('/',$moduleId);
if ( is_array($t)) {
$lang = 'fr';
} else {
$lang = $t[0];
}
// Créer le dossier temporaire si inexistant sinon le nettoie et le créer
if (!is_dir($tmpFolder . '/' . $lang)) {
mkdir ($tmpFolder . '/' . $lang, 0777, true);
} else {
$this->removeDir($tmpFolder . '/' . $lang);
mkdir ($tmpFolder . '/' . $lang, 0777, true);
}
// Créer le dossier temporaire des données du module
if ($infoModules[$this->getUrl(2)]['dataDirectory']) {
if (!is_dir($tmpFolder . '/' . $moduleDir)) {
mkdir ($tmpFolder . '/' . $moduleDir, 0777, true) ;
}
}
// Sauvegarde si données non vides
$tmpData [$pageId] = $this->getData(['module',$pageId ]);
if ($tmpData [$pageId] !== null) {
file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData));
}
// Export des données localisées dans le dossier de données du module
if ($infoModules[$this->getUrl(2)]['dataDirectory'] &&
is_dir($infoModules[$this->getUrl(2)]['dataDirectory'])) {
$this->custom_copy ($infoModules[$this->getUrl(2)]['dataDirectory'], $tmpFolder . '/' . $moduleDir);
}
}
// Sauvegarde si données non vides
$tmpData [$pageId] = $this->getData(['module',$pageId ]);
if ($tmpData [$pageId] !== null) {
file_put_contents($tmpFolder . '/' . $moduleId, json_encode($tmpData));
// Enregistrement des pages dans le dossier de langue identique à module
if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) {
file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageContent));
}
// Export des données localisées dans des dossiers
foreach ($infoModules[$this->getUrl(2)]['dataDirectory'] as $dirId) {
if ( file_exists(self::DATA_DIR . '/' . $dirId)
&& !file_exists($tmpFolder . '/' . $dirId ) ) {
$this->custom_copy ( self::DATA_DIR . '/' . $dirId, $tmpFolder . '/' . $dirId );
}
// création du zip
$fileName = $this->getUrl(2) . '.zip';
$this->makeZip ($fileName, $tmpFolder, []);
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
]);
unlink($fileName);
$this->removeDir($tmpFolder);
exit();
} else {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'addon',
'notification' => 'Quelque chose s\'est mal passé',
'state' => false
]);
}
}
// Enregistrement des pages dans le dossier de langue identique à module
if (!file_exists($tmpFolder . '/' . $lang . '/page.json')) {
file_put_contents($tmpFolder . '/' . $lang . '/page.json', json_encode($pageContent));
}
// création du zip
$fileName = $this->getUrl(2) . '.zip';
$this->makeZip ($fileName, $tmpFolder, []);
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
]);
unlink($fileName);
$this->removeDir($tmpFolder);
exit();
} else {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'addon',
'notification' => 'Quelque chose s\'est mal passé',
'state' => false
]);
}
}
/*
@ -441,4 +424,32 @@ class addon extends common {
]);
}
}
/*
* Copie récursive de dossiers
*
*/
private function custom_copy($src, $dst) {
// open the source directory
$dir = opendir($src);
// Make the destination directory if not exist
if (!is_dir($dst)) {
mkdir($dst);
}
// Loop through the files in source directory
while( $file = readdir($dir) ) {
if (( $file != '.' ) && ( $file != '..' )) {
if ( is_dir($src . '/' . $file) ){
// Recursively calling custom copy function
// for sub directory
$this -> custom_copy($src . '/' . $file, $dst . '/' . $file);
}
else {
copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
}
}

14
core/module/config/config.php

@ -146,13 +146,6 @@ class config extends common {
'Pacific/Fiji' => '(GMT+12:00) Fiji',
'Asia/Kamchatka' => '(GMT+12:00) Kamchatka'
];
// Nombre d'objets par page
public static $ItemsList = [
5 => '5 articles',
10 => '10 articles',
15 => '15 articles',
20 => '20 articles'
];
// Type de proxy
public static $proxyType = [
'tcp://' => 'TCP',
@ -429,7 +422,6 @@ class config extends common {
public function advanced() {
// Soumission du formulaire
if($this->isPost()) {
$success = true;
// Basculement en mise à jour auto
// Remise à 0 du compteur
if ($this->getData(['config','autoUpdate']) === false &&
@ -457,7 +449,6 @@ class config extends common {
'githubId' => $this->getInput('configAdvancedSocialGithubId')
],
'timezone' => $this->getInput('configAdvancedTimezone', helper::FILTER_STRING_SHORT, true),
'itemsperPage' => $this->getInput('configAdvancedItemsperPage', helper::FILTER_INT,true),
'autoUpdate' => $this->getInput('configAdvancedAutoUpdate', helper::FILTER_BOOLEAN),
'autoUpdateHtaccess' => $this->getInput('configAdvancedAutoUpdateHtaccess', helper::FILTER_BOOLEAN),
'proxyType' => $this->getInput('configAdvancedProxyType'),
@ -536,11 +527,10 @@ class config extends common {
// Générer robots.txt et sitemap
$this->generateFiles();
// Valeurs en sortie
$notification = $notification . 'Modifications enregistrées';
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => $notification,
'state' => $success
'notification' => 'Modifications enregistrées',
'state' => true
]);
}
// Valeurs en sortie

20
core/module/config/view/advanced/advanced.php

@ -60,15 +60,6 @@
'value' => $this->getData(['config', 'faviconDark'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('configAdvancedItemsperPage', $module::$ItemsList, [
'label' => 'Articles par page',
'selected' => $this->getData(['config', 'itemsperPage']),
'help' => 'Modules Blog et News'
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::select('configAdvancedTimezone', $module::$timezones, [
'label' => 'Fuseau horaire',
@ -76,25 +67,28 @@
'help' => 'Le fuseau horaire est utile au bon référencement'
]); ?>
</div>
<div class="col4 verticalAlignBottom">
</div>
<div class="row">
<div class="col4">
<?php echo template::checkbox('configAdvancedCookieConsent', true, 'Consentement aux cookies', [
'checked' => $this->getData(['config', 'cookieConsent'])
]); ?>
</div>
<div class="col4 verticalAlignBottom">
<div class="col4">
<?php echo template::checkbox('configAdvancedCaptchaStrong', true, 'Captcha renforcé', [
'checked' => $this->getData(['config','captchaStrong']),
'help' => 'Option recommandée pour sécuriser la connexion. S\'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha renforcé utilise quatre opérations de nombres de 0 à 20.'
]); ?>
</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 class="row">
<div class="col4">
<?php echo template::checkbox('configAdvancedAutoBackup', true, 'Sauvegarde quotidienne', [
'checked' => $this->getData(['config', 'autoBackup']),

108
core/module/install/ressource/defaultdata.php

@ -21,7 +21,6 @@ class init extends common {
'githubId' => ''
],
'timezone' => 'Europe/Paris',
'itemsperPage' => 10,
'proxyUrl' => '',
'proxyPort' => '',
'proxyType' => 'tcp://',
@ -33,10 +32,10 @@ class init extends common {
'attempt' => 3,
'log' => false,
'captcha' => true
],
]
],
'core' => [
'dataVersion' => 10400,
'dataVersion' => 11000,
'lastBackup' => 0,
'lastClearTmp' => 0,
'lastAutoUpdate' => 0,
@ -84,6 +83,19 @@ class init extends common {
],
'module' => [],
'user' => [],
'translate' => [
'scriptGoogle' => false,
'showCredits' => false,
'autoDetect' => false,
'admin' => false,
'fr' => 'none',
'de' => 'none',
'en' => 'none',
'es' => 'none',
'it' => 'none',
'nl' => 'none',
'pt' => 'none'
],
'theme' => [
'body' => [
'backgroundColor' => 'rgba(236, 239, 241, 1)',
@ -724,44 +736,64 @@ class init extends common {
],
],
'galeries' => [
'beaux-paysages' => [
'config' => [
'name' => 'Beaux paysages',
'directory' => self::FILE_DIR.'source/galerie/landscape',
'homePicture' => 'iceberg.jpg',
'sort' => 'SORT_ASC',
'position' => 1
'content' => [
'beaux-paysages' => [
'config' => [
'name' => 'Beaux paysages',
'directory' => self::FILE_DIR.'source/galerie/landscape',
'homePicture' => 'iceberg.jpg',
'sort' => 'SORT_ASC',
'position' => 1
],
'legend' => [
'desertjpg' => 'Un désert',
'icebergjpg' => 'Un iceberg',
'meadowjpg' => 'Une prairie'
],
'positions' => [
'desertjpg' => 3,
'icebergjpg' => 1,
'meadowjpg' => 2
]
],
'legend' => [
'desertjpg' => 'Un désert',
'icebergjpg' => 'Un iceberg',
'meadowjpg' => 'Une prairie'
'espace' => [
'config' => [
'name' => 'Espace',
'directory' => self::FILE_DIR.'source/galerie/space',
'homePicture' => 'nebula.jpg',
'sort' => 'SORT_ASC',
'position' => 2
],
'legend' => [
'earthjpg' => 'La Terre et la Lune',
'cosmosjpg' => 'Le cosmos',
'nebulajpg' => 'Une nébuleuse'
],
'positions' => [
'earthjpg' => 1,
'cosmosjpg' => 3,
'nebulajpg' => 2
]
],
'positions' => [
'desertjpg' => 3,
'icebergjpg' => 1,
'meadowjpg' => 2
]
],
'espace' => [
'config' => [
'name' => 'Espace',
'directory' => self::FILE_DIR.'source/galerie/space',
'homePicture' => 'nebula.jpg',
'sort' => 'SORT_ASC',
'position' => 2
],
'legend' => [
'earthjpg' => 'La Terre et la Lune',
'cosmosjpg' => 'Le cosmos',
'nebulajpg' => 'Une nébuleuse'
],
'positions' => [
'earthjpg' => 1,
'cosmosjpg' => 3,
'nebulajpg' => 2
]
]
'config' => [
'thumbAlign' => 'center',
'thumbWidth' => '18em',
'thumbHeight' => '15em',
'thumbMargin' => '.5em',
'thumbBorder' => '.1em',
'thumbOpacity' => '.7',
'thumbBorderColor' => 'rgba(221, 221, 221, 1)',
'thumbRadius' => '.3em',
'thumbShadows' => '1px 1px 10px',
'thumbShadowsColor'=> 'rgba(125, 125, 125, 1)',
'legendHeight' => '.375em',
'legendAlign' => 'center',
'legendTextColor' => 'rgba(255, 255, 255, 1)',
'legendBgColor' => 'rgba(0, 0, 0, .6)',
'versionData' => '3.0',
'style' => 'site/data/modules/gallery/galeries.css'
],
],
'site-de-zwii' => [
'url' => 'https://zwiicms.fr/',

1
core/vendor/zwiico/css/zwiico-codes.css

@ -38,6 +38,7 @@
.zwiico-mimi:before { content: '\e823'; } /* '' */
.zwiico-divide:before { content: '\e824'; } /* '' */
.zwiico-flag:before { content: '\e825'; } /* '' */
.zwiico-search:before { content: '\e826'; } /* '' */
.zwiico-spin:before { content: '\e831'; } /* '' */
.zwiico-twitter:before { content: '\f099'; } /* '' */
.zwiico-facebook:before { content: '\f09a'; } /* '' */

13
core/vendor/zwiico/css/zwiico-embedded.css
File diff suppressed because it is too large
View File

1
core/vendor/zwiico/css/zwiico-ie7-codes.css

@ -38,6 +38,7 @@
.zwiico-mimi { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe823;&nbsp;'); }
.zwiico-divide { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe824;&nbsp;'); }
.zwiico-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe825;&nbsp;'); }
.zwiico-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe826;&nbsp;'); }
.zwiico-spin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe831;&nbsp;'); }
.zwiico-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf099;&nbsp;'); }
.zwiico-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;&nbsp;'); }

1
core/vendor/zwiico/css/zwiico-ie7.css

@ -49,6 +49,7 @@
.zwiico-mimi { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe823;&nbsp;'); }
.zwiico-divide { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe824;&nbsp;'); }
.zwiico-flag { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe825;&nbsp;'); }
.zwiico-search { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe826;&nbsp;'); }
.zwiico-spin { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe831;&nbsp;'); }
.zwiico-twitter { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf099;&nbsp;'); }
.zwiico-facebook { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;&nbsp;'); }

15
core/vendor/zwiico/css/zwiico.css

@ -1,11 +1,11 @@
@font-face {
font-family: 'zwiico';
src: url('../font/zwiico.eot?44489499');
src: url('../font/zwiico.eot?44489499#iefix') format('embedded-opentype'),
url('../font/zwiico.woff2?44489499') format('woff2'),
url('../font/zwiico.woff?44489499') format('woff'),
url('../font/zwiico.ttf?44489499') format('truetype'),
url('../font/zwiico.svg?44489499#zwiico') format('svg');
src: url('../font/zwiico.eot?32340763');
src: url('../font/zwiico.eot?32340763#iefix') format('embedded-opentype'),
url('../font/zwiico.woff2?32340763') format('woff2'),
url('../font/zwiico.woff?32340763') format('woff'),
url('../font/zwiico.ttf?32340763') format('truetype'),
url('../font/zwiico.svg?32340763#zwiico') format('svg');
font-weight: normal;
font-style: normal;
}
@ -15,7 +15,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face {
font-family: 'zwiico';
src: url('../font/zwiico.svg?44489499#zwiico') format('svg');
src: url('../font/zwiico.svg?32340763#zwiico') format('svg');
}
}
*/
@ -94,6 +94,7 @@
.zwiico-mimi:before { content: '\e823'; } /* '' */
.zwiico-divide:before { content: '\e824'; } /* '' */
.zwiico-flag:before { content: '\e825'; } /* '' */
.zwiico-search:before { content: '\e826'; } /* '' */
.zwiico-spin:before { content: '\e831'; } /* '' */
.zwiico-twitter:before { content: '\f099'; } /* '' */
.zwiico-facebook:before { content: '\f09a'; } /* '' */

BIN
core/vendor/zwiico/font/zwiico.eot

2
core/vendor/zwiico/font/zwiico.svg

@ -84,6 +84,8 @@
<glyph glyph-name="flag" unicode="&#xe825;" d="M179 707q0-40-36-61v-707q0-7-5-12t-13-6h-36q-7 0-12 6t-6 12v707q-35 21-35 61 0 30 21 51t50 21 51-21 21-51z m821-36v-425q0-14-7-22t-22-15q-120-65-206-65-34 0-69 12t-60 27-65 27-79 12q-107 0-259-81-10-5-19-5-14 0-25 10t-10 25v415q0 17 17 30 12 8 44 24 132 67 235 67 60 0 112-16t122-49q21-11 49-11 30 0 65 12t62 26 49 26 30 12q15 0 25-10t11-26z" horiz-adv-x="1000" />
<glyph glyph-name="search" unicode="&#xe826;" d="M643 386q0 103-73 176t-177 74-177-74-73-176 73-177 177-73 177 73 73 177z m286-465q0-29-22-50t-50-21q-30 0-50 21l-191 191q-100-69-223-69-80 0-153 31t-125 84-84 125-31 153 31 152 84 126 125 84 153 31 153-31 125-84 84-126 31-152q0-123-69-223l191-191q21-21 21-51z" horiz-adv-x="928.6" />
<glyph glyph-name="spin" unicode="&#xe831;" d="M46 144l0 0c0 0-1 0-1 0-8 18-15 37-21 55-6 19-11 38-15 58-19 99-8 203 35 298 3 6 10 8 15 5 1 0 2 0 2-1l0 0 80-59c5-3 6-9 4-14-5-12-9-25-12-37-4-13-7-26-9-40-11-67-3-137 23-201 2-5 0-10-4-13l0 0-80-56c-5-4-12-2-16 3-1 0-1 1-1 2l0 0z m120 574l0 0c0 1 0 1 0 1 15 13 30 25 46 37 16 11 33 22 51 31 89 50 192 72 297 60 6-1 10-6 10-13 0-1-1-1-1-2l0 0-31-94c-2-5-8-8-13-7-13 0-27 0-40 0-14-1-27-2-40-4-68-11-133-40-186-84-4-3-10-3-14 0l0 0-79 58c-5 3-6 11-2 16 0 0 1 1 2 1l0 0z m588 65l0 0c0 0 1 0 1 0 17-10 34-21 50-32 16-12 31-25 46-38 74-69 127-160 148-262 2-6-2-12-9-13-1 0-1 0-2 0l0 0-100 1c-5 0-10 4-11 9-3 13-8 26-12 38-5 12-10 25-17 36-31 61-78 113-137 150-5 3-6 8-5 13l0 0 31 92c2 6 9 9 15 7 1 0 2-1 2-1l0 0z m244-535l0 0c0 0 0 0 0 0-4-20-9-39-15-57-7-19-14-37-22-55-44-92-114-170-205-221-6-3-13-1-16 4 0 1-1 2-1 2l0 0-30 94c-2 6 1 12 6 14 11 7 22 15 32 23 11 9 21 18 30 27 49 48 84 109 101 176 2 5 6 8 11 8l0 0 98-1c6 0 11-5 11-11 0-1 0-2 0-3l0 0z m-438-395l0 0c0 0 0 0 0 0-20-2-40-3-60-3-20 0-40 1-59 4-102 12-198 54-276 125-5 4-5 11 0 16 0 0 1 1 1 1l0 0 81 58c5 3 12 2 16-2 10-8 20-16 32-23 11-7 22-14 34-20 62-31 131-45 200-41 6 0 10-3 12-8l0 0 29-92c2-6-1-12-7-14-1-1-2-1-3-1l0 0z" horiz-adv-x="1000" />
<glyph glyph-name="twitter" unicode="&#xf099;" d="M904 622q-37-54-90-93 0-8 0-23 0-73-21-145t-64-139-103-117-144-82-181-30q-151 0-276 81 19-2 43-2 126 0 224 77-59 1-105 36t-64 89q19-3 34-3 24 0 48 6-63 13-104 62t-41 115v2q38-21 82-23-37 25-59 64t-22 86q0 49 25 91 68-83 164-133t208-55q-5 21-5 41 0 75 53 127t127 53q79 0 132-57 61 12 115 44-21-64-80-100 52 6 104 28z" horiz-adv-x="928.6" />

BIN
core/vendor/zwiico/font/zwiico.ttf

BIN
core/vendor/zwiico/font/zwiico.woff

BIN
core/vendor/zwiico/font/zwiico.woff2

49
module/blog/blog.php

@ -15,11 +15,11 @@
class blog extends common {
const VERSION = '4.5';
const VERSION = '5.0';
const REALNAME = 'Blog';
const DELETE = true;
const UPDATE = '0.0';
const DATADIRECTORY = []; // Contenu localisé inclus par défaut (page.json et module.json)
const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json)
const EDIT_OWNER = 'owner';
const EDIT_GROUP = 'group';
@ -75,6 +75,15 @@ class blog extends common {
'right' => 'À droite ',
];
// Nombre d'objets par page
public static $ItemsList = [
4 => '4 articles',
8 => '8 articles',
12 => '12 articles',
16 => '16 articles',
22 => '22 articles'
];
//Paramètre longueur maximale des commentaires en nb de caractères
public static $commentLength = [
'500' => '500',
@ -94,7 +103,23 @@ class blog extends common {
public static $users = [];
/**
/**
* Mise à jour du module
* Appelée par les fonctions index et config
*/
private function update() {
// Version 5.0
if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '5.0', '<') ) {
$this->setData(['module', $this->getUrl(0), 'config', 'itemsperPage', 6]);
$this->setData(['module', $this->getUrl(0), 'config', 'versionData','5.0']);
}
}
/**
* Flux RSS
*/
public function rss() {
@ -192,7 +217,7 @@ class blog extends common {
'commentApproved' => $this->getInput('blogAddCommentApproved', helper::FILTER_BOOLEAN),
'commentClose' => $this->getInput('blogAddCommentClose', helper::FILTER_BOOLEAN),
'commentNotification' => $this->getInput('blogAddCommentNotification', helper::FILTER_BOOLEAN),
'commentGroupNotification' => $this->getInput('blogAddCommentGroupNotification', helper::FILTER_INT)
'commentGroupNotification' => $this->getInput('blogAddCommentGroupNotification', helper::FILTER_INT),
]
]);
// Valeurs en sortie
@ -234,7 +259,7 @@ class blog extends common {
// Ids des commentaires par ordre de création
$commentIds = array_keys(helper::arrayCollumn($comments, 'createdOn', 'SORT_DESC'));
// Pagination
$pagination = helper::pagination($commentIds, $this->getUrl(),$this->getData(['config','itemsperPage']));
$pagination = helper::pagination($commentIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']) );
// Liste des pages
self::$pages = $pagination['pages'];
// Commentaires en fonction de la pagination
@ -371,11 +396,15 @@ class blog extends common {
* Configuration
*/
public function config() {
// Mise à jour des données de module
$this->update();
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['module', $this->getUrl(0), 'config',[
'feeds' => $this->getInput('blogConfigShowFeeds',helper::FILTER_BOOLEAN),
'feedsLabel' => $this->getInput('blogConfigFeedslabel',helper::FILTER_STRING_SHORT)
'feedsLabel' => $this->getInput('blogConfigFeedslabel',helper::FILTER_STRING_SHORT),
'itemsperPage' => $this->getInput('blogConfigItemsperPage', helper::FILTER_INT,true),
'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData'])
]]);
// Valeurs en sortie
$this->addOutput([
@ -411,7 +440,7 @@ class blog extends common {
}
$articleIds = $filterData;
// Pagination
$pagination = helper::pagination($articleIds, $this->getUrl(),$this->getData(['config','itemsperPage']));
$pagination = helper::pagination($articleIds, $this->getUrl(),$this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']));
// Liste des pages
self::$pages = $pagination['pages'];
// Articles en fonction de la pagination
@ -590,6 +619,8 @@ class blog extends common {
* Accueil (deux affichages en un pour éviter une url à rallonge)
*/
public function index() {
// Mise à jour des données de module
$this->update();
// Affichage d'un article
if(
$this->getUrl(1)
@ -678,7 +709,7 @@ class blog extends common {
}
$commentIds = array_keys(helper::arrayCollumn($commentsApproved, 'createdOn', 'SORT_DESC'));
// Pagination
$pagination = helper::pagination($commentIds, $this->getUrl(),$this->getData(['config','itemsperPage']),'#comment');
$pagination = helper::pagination($commentIds, $this->getUrl(), $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']),'#comment');
// Liste des pages
self::$pages = $pagination['pages'];
// Signature de l'article
@ -725,7 +756,7 @@ class blog extends common {
}
}
// Pagination
$pagination = helper::pagination($articleIds, $this->getUrl(),$this->getData(['config','itemsperPage']));
$pagination = helper::pagination($articleIds, $this->getUrl(), $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']));
// Liste des pages
self::$pages = $pagination['pages'];
// Articles en fonction de la pagination

8
module/blog/view/config/config.php

@ -36,6 +36,14 @@
]); ?>
</div>
</div>
<div class="row">
<div class="col6 offset6">
<?php echo template::select('blogConfigItemsperPage', $module::$ItemsList, [
'label' => 'Articles par page',
'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage'])
]); ?>
</div>
</div>
</div>
</div>
</div>

978
module/download/download.php

@ -0,0 +1,978 @@
<?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.fr/
*/
class download extends common {
const VERSION = '1.2';
const REALNAME = 'Téléchargement';
const DELETE = true;
const UPDATE = '0.0';
const DATADIRECTORY = ''; // Contenu localisé inclus par défaut (page.json et module.json)
// Constantes du module
const EDIT_OWNER = 'owner';
const EDIT_GROUP = 'group';
const EDIT_ALL = 'all';
public static $actions = [
'add' => self::GROUP_MODERATOR,
'comment' => self::GROUP_MODERATOR,
'commentApprove' => self::GROUP_MODERATOR,
'commentDelete' => self::GROUP_MODERATOR,
'commentDeleteAll' => self::GROUP_MODERATOR,
'config' => self::GROUP_MODERATOR,
'delete' => self::GROUP_MODERATOR,
'edit' => self::GROUP_MODERATOR,
'stats' => self::GROUP_MODERATOR,
'statsDeleteAll' => self::GROUP_MODERATOR,
'index' => self::GROUP_VISITOR,
'rss' => self::GROUP_VISITOR,
'downloadFile' => self::GROUP_VISITOR,
'list' =>self::GROUP_VISITOR
];
public static $items = [];
// Signature de l'item
public static $itemSignature = '';
// Signature du commentaire
public static $editCommentSignature = '';
public static $comments = [];
public static $nbCommentsApproved = 0;
public static $commentsDelete;
// Signatures des commentaires déjà saisis
public static $commentsSignature = [];
public static $pages;
// Nombre de téléchargements
public static $statSum = 0;
public static $states = [
false => 'Brouillon',
true => 'Publié'
];
public static $pictureSizes = [
'20' => 'Très petite',
'30' => 'Petite',
'40' => 'Grande',
'50' => 'Très Grande',
'100' => 'Pleine largeur',
];
public static $picturePositions = [
'left' => 'À gauche',
'right' => 'À droite ',
];
//Paramètre longueur maximale des commentaires en nb de caractères
public static $commentLength = [
'500' => '500',
'1000' => '1000',
'2000' => '2000',
'5000' => '5000',
'10000' => '10000'
];
// Nombre d'objets par page
public static $ItemsList = [
4 => '4 articles',
8 => '8 articles',
12 => '12 articles',
16 => '16 articles',
22 => '22 articles'
];
// Permissions d'un item
public static $itemConsent = [
self::EDIT_ALL => 'Tous les groupes',
self::EDIT_GROUP => 'Groupe du propriétaire',
self::EDIT_OWNER => 'Propriétaire'
];
public static $itemLicense = [
'none'=> 'Non définie',
'cc' => 'Licence libre Creative Common, partage autorisé',
'gnu' => 'Licence libre GNU, partage autorisé',
'mit' => 'Licence libre MIT, partage autorisé',
'owner' => 'Licence Propriétaire'
];
public static $users = [];
/**
* Mise à jour du module
* Appelée par les fonctions index et config
*/
private function update() {
// Version 5.0
if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '1.1', '<') ) {
$this->setData(['module', $this->getUrl(0), 'config', 'itemsperPage', 6]);
$this->setData(['module', $this->getUrl(0), 'config', 'versionData','1.2']);
}
}
/**
* Flux RSS
*/
public function rss() {
// Inclure les classes
include_once 'module/news/vendor/FeedWriter/Item.php';
include_once 'module/news/vendor/FeedWriter/Feed.php';
include_once 'module/news/vendor/FeedWriter/RSS2.php';
include_once 'module/news/vendor/FeedWriter/InvalidOperationException.php';
date_default_timezone_set('UTC');
$feeds = new \FeedWriter\RSS2();
// En-tête
$feeds->setTitle($this->getData (['page', $this->getUrl(0), 'title']));
$feeds->setLink(helper::baseUrl() . $this->getUrl(0));
$feeds->setDescription($this->getData (['page', $this->getUrl(0), 'metaDescription']));
$feeds->setChannelElement('language', 'fr-FR');
$feeds->setDate(date('r',time()));
$feeds->addGenerator();
// Corps des items
$itemIdsPublishedOns = helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'items']), 'publishedOn', 'SORT_DESC');
$itemIdsStates = helper::arrayCollumn($this->getData(['module', $this->getUrl(0),'items']), 'state', 'SORT_DESC');
foreach($itemIdsPublishedOns as $itemId => $itemPublishedOn) {
if($itemPublishedOn <= time() AND $itemIdsStates[$itemId]) {
// Miniature
$parts = explode('/',$this->getData(['module', $this->getUrl(0), 'items', $itemId, 'picture']));
$thumb = str_replace ($parts[(count($parts)-1)],'mini_' . $parts[(count($parts)-1)], $this->getData(['module', $this->getUrl(0), 'items', $itemId, 'picture']));
// Créer les items du flux
$newsitem = $feeds->createNewItem();
// Signature de l'item
$author = $this->signature($this->getData(['module', $this->getUrl(0), 'items', $itemId, 'userId']));
$newsitem->addElementArray([
'title' => $this->getData(['module', $this->getUrl(0), 'items', $itemId, 'title']),
'link' => helper::baseUrl() .$this->getUrl(0) . '/' . $itemId,
'description' => '<img src="' . helper::baseUrl() . self::FILE_DIR . $thumb
. '" alt="' . $this->getData(['module', $this->getUrl(0), 'items', $itemId, 'title'])
. '" title="' . $this->getData(['module', $this->getUrl(0), 'items', $itemId, 'title'])
. '" />' .
$this->getData(['module', $this->getUrl(0), 'items', $itemId, 'content']),
]);
$newsitem->setAuthor($author,'no@mail.com');
$newsitem->setId(helper::baseUrl() .$this->getUrl(0) . '/' . $itemId);
$newsitem->setDate(date('r', $this->getData(['module', $this->getUrl(0), 'items', $itemId, 'publishedOn'])));
$imageData = getimagesize(helper::baseUrl(false) . self::FILE_DIR . 'thumb/' . $thumb);
$newsitem->addEnclosure( helper::baseUrl(false) . self::FILE_DIR . 'thumb/' . $thumb,
$imageData[0] * $imageData[1],
$imageData['mime']
);
$feeds->addItem($newsitem);
}
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_RSS,
'content' => $feeds->generateFeed(),
'view' => 'rss'
]);
}
/**
* Édition
*/
public function add() {
// Soumission du formulaire
if($this->isPost()) {
// Modification de l'userId
if($this->getUser('group') === self::GROUP_ADMIN){
$newuserid = $this->getInput('downloadAddUserId', helper::FILTER_STRING_SHORT, true);
}
else{
$newuserid = $this->getUser('id');
}
// Incrémente l'id de l'item
$itemId = helper::increment($this->getInput('downloadAddTitle', helper::FILTER_ID), $this->getData(['page']));
$itemId = helper::increment($itemId, (array) $this->getData(['module', $this->getUrl(0)]));
$itemId = helper::increment($itemId, array_keys(self::$actions));
// Crée l'item
$this->setData(['module',
$this->getUrl(0),
'items',
$itemId, [
'comment' => $this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment']),
'content' => $this->getInput('downloadAddContent', null),
'picture' => $this->getInput('downloadAddPicture', helper::FILTER_STRING_SHORT, true),
'file' => $this->getInput('downloadAddFile', helper::FILTER_STRING_SHORT, true),
'fileVersion' => $this->getInput('downloadAddFileVersion', helper::FILTER_STRING_SHORT, true),
'fileDate' => $this->getInput('downloadAddFileDate', helper::FILTER_DATETIME, true),
'fileLicense' => $this->getInput('downloadAddFileLicense', helper::FILTER_STRING_SHORT, true),
'fileAuthor' => $this->getInput('downloadAddFileAuthor', helper::FILTER_STRING_SHORT, true),
'fileStats' => [],
'publishedOn' => $this->getInput('downloadAddPublishedOn', helper::FILTER_DATETIME, true),
'state' => $this->getInput('downloadAddState', helper::FILTER_BOOLEAN),
'title' => $this->getInput('downloadAddTitle', helper::FILTER_STRING_SHORT, true),
'userId' => $newuserid,
'editConsent' => $this->getInput('downloadAddConsent') === self::EDIT_GROUP ? $this->getUser('group') : $this->getInput('downloadAddConsent'),
'commentMaxlength' => $this->getInput('downloadAddCommentMaxlength'),
'commentApproved' => $this->getInput('downloadAddCommentApproved', helper::FILTER_BOOLEAN),
'commentClose' => $this->getInput('downloadAddCommentClose', helper::FILTER_BOOLEAN),
'commentNotification' => $this->getInput('downloadAddCommentNotification', helper::FILTER_BOOLEAN),
'commentGroupNotification' => $this->getInput('downloadAddCommentGroupNotification', helper::FILTER_INT)
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => 'Nouvel item créé',
'state' => true
]);
}
// Liste des utilisateurs
self::$users = helper::arrayCollumn($this->getData(['user']), 'firstname');
ksort(self::$users);
foreach(self::$users as $userId => &$userFirstname) {
$userFirstname = $userFirstname . ' ' . $this->getData(['user', $userId, 'lastname']);
}
unset($userFirstname);
// Valeurs en sortie
$this->addOutput([
'title' => 'Nouvel item',
'vendor' => [
'flatpickr',
'tinymce'
],
'view' => 'add'
]);
}
/**
* Liste des commentaires
*/
public function comment() {
$comments = $this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2),'comment']);
self::$commentsDelete = template::button('downloadCommentDeleteAll', [
'class' => 'downloadCommentDeleteAll buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/commentDeleteAll/' . $this->getUrl(2).'/' . $_SESSION['csrf'] ,
'ico' => 'cancel',
'value' => 'Tout effacer'
]);
// Ids des commentaires par ordre de création
$commentIds = array_keys(helper::arrayCollumn($comments, 'createdOn', 'SORT_DESC'));
// Pagination
$pagination = helper::pagination($commentIds, $this->getUrl(), $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage']));
// Liste des pages
self::$pages = $pagination['pages'];
// Commentaires en fonction de la pagination
for($i = $pagination['first']; $i < $pagination['last']; $i++) {
// Met en forme le tableau
$comment = $comments[$commentIds[$i]];
// Bouton d'approbation
$buttonApproval = '';
// Compatibilité avec les commentaires des versions précédentes, les valider
$comment['approval'] = array_key_exists('approval', $comment) === false ? true : $comment['approval'] ;
if ( $this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2),'commentApproved']) === true) {
$buttonApproval = template::button('downloadCommentApproved' . $commentIds[$i], [
'class' => $comment['approval'] === true ? 'downloadCommentRejected buttonGreen' : 'downloadCommentApproved buttonRed' ,
'href' => helper::baseUrl() . $this->getUrl(0) . '/commentApprove/' . $this->getUrl(2) . '/' . $commentIds[$i] . '/' . $_SESSION['csrf'] ,
'value' => $comment['approval'] === true ? 'A' : 'R'
]);
}
self::$comments[] = [
mb_detect_encoding(strftime('%d %B %Y - %H:%M', $comment['createdOn']), 'UTF-8', true)
? strftime('%d %B %Y - %H:%M', $comment['createdOn'])
: utf8_encode(strftime('%d %B %Y - %H:%M', $comment['createdOn'])),
$comment['content'],
$comment['userId'] ? $this->getData(['user', $comment['userId'], 'firstname']) . ' ' . $this->getData(['user', $comment['userId'], 'lastname']) : $comment['author'],
$buttonApproval,
template::button('downloadCommentDelete' . $commentIds[$i], [
'class' => 'downloadCommentDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/commentDelete/' . $this->getUrl(2) . '/' . $commentIds[$i] . '/' . $_SESSION['csrf'] ,
'value' => template::ico('cancel')
])
];
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Gestion des commentaires : '. $this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'title']),
'view' => 'comment'
]);
}
/**
* Suppression de commentaire
*/
public function commentDelete() {
// Le commentaire n'existe pas
if($this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment', $this->getUrl(3)]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
}
// Jeton incorrect
elseif ($this->getUrl(4) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => 'Action non autorisée'
]);
}
// Suppression
else {
$this->deleteData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment', $this->getUrl(3)]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/comment/'.$this->getUrl(2),
'notification' => 'Commentaire supprimé',
'state' => true
]);
}
}
/**
* Suppression de tous les commentaires de l'item $this->getUrl(2)
*/
public function commentDeleteAll() {
// Jeton incorrect
if ($this->getUrl(3) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => 'Action non autorisée'
]);
}
// Suppression
else {
$this->setData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment',[] ]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/comment',
'notification' => 'Commentaires supprimés',
'state' => true
]);
}
}
/**
* Approbation oou désapprobation de commentaire
*/
public function commentApprove() {
// Le commentaire n'existe pas
if($this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment', $this->getUrl(3)]) === null) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
}
// Jeton incorrect
elseif ($this->getUrl(4) !== $_SESSION['csrf']) {
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => 'Action non autorisée'
]);
}
// Inversion du statut
else {
$approved = !$this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment', $this->getUrl(3), 'approval']) ;
$this->setData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment', $this->getUrl(3), [
'author' => $this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment', $this->getUrl(3), 'author']),
'content' => $this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment', $this->getUrl(3), 'content']),
'createdOn' => $this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment', $this->getUrl(3), 'createdOn']),
'userId' => $this->getData(['module', $this->getUrl(0), 'items', $this->getUrl(2), 'comment', $this->getUrl(3), 'userId']),
'approval' => $approved
]]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/comment/'.$this->getUrl(2),
'notification' => $approved ? 'Commentaire approuvé' : 'Commentaire rejeté',
'state' => $approved
]);
}
}
/**
* Configuration
*/
public function config() {
// Mise à jour des données de module
$this->update();
// Soumission du formulaire
if($this->isPost()) {
$this->setData(['module', $this->getUrl(0), 'config',[
'feeds' => $this->getInput('downloadConfigShowFeeds',helper::FILTER_BOOLEAN),
'feedsLabel' => $this->getInput('downloadConfigFeedslabel',helper::FILTER_STRING_SHORT),
'itemsperPage' => $this->getInput('blogConfigItemsperPage', helper::FILTER_INT,true),
'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData'])
]]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => 'Modifications enregistrées',
'state' => true
]);
} else {
// Ids des items par ordre de publication
$itemIds = array_keys(helper::arrayCollumn($this->getData(['module', $this->getUrl(0), 'items']), 'publishedOn', 'SORT_DESC'));
// Gestion des droits d'accès
$filterData=[];
foreach ($itemIds as $key => $value) {
if (
( // Propriétaire
$this->getData(['module', $this->getUrl(0), 'items', $value,'editConsent']) === self::EDIT_OWNER
AND ( $this->getData(['module', $this->getUrl(0), 'items', $value,'userId']) === $this->getUser('id')
OR $this->getUser('group') === self::GROUP_ADMIN )
)