Compare commits

..

No commits in common. "master" and "13.3.06" have entirely different histories.

64 changed files with 762 additions and 1278 deletions

View File

@ -1,44 +1,12 @@
# Notes de mises à jour # Notes de mises à jour
## Versions 13.5.00
**Améliorations :**
- Optimisation du chargement des variables de classe.
- Suppression de redondance de déclaration des charset.
**Corrections : **
- Corrige un bug de changement de mot de passe pour les comptes non admins.
- Blog 7.12, corrige un bug d'affichage des articles lorsque le thème Moderne est sélectionné.
- Corrige un dysfonctionnement de la fonction de tronquage subword qui perturbait l'affichage des articles de blog.
## Versions 13.4.00
** Améliorations :**
- Change le mode d'authentification, le hash du mot de passe n'est plus stocké dans un cookie.
- Améliore les performances des opérations d'écriture.
- Le sélecteur de fichier affiche le chemin d'accès du fichier présent dans le champ dans le gestionnaire de fichier.
- Connexion persistante renforcée.
- Script Datatables.net filtrage des éléments, nombre d'éléments et position sur l'écran.
- Slider 7.2, le dossier sélectionné est affiché par défaut dans la page update.
- Augmente la dimension des miniatures après le transfert dans RFM.
- Search 3.3 n'effectue qu'une seule lecture du fichier module.json en prévention des bots agressifs.
- Modification du contenu de robots.txt afin de n'autoriser que les moteurs de recherche et d'interdire les bots.
- Suppression des cookies mémorisant le dernier onglet affiché dans l'édition de la page et dans la configuration du site. Cette information est désormais stockée dans la fiche de l'utilisateur connecté.
**Corrections :**
- Change les paramètres du cookie de consentement.
- Isole la session dans l'onglet actif.
- Edition de page, delete et duplicate renvoyant vers une mauvaise page.
- Supprime un warning à la création d'une page.
- Bouton de génération du site inopérant.
- Affichage intempestif des boutons de navigation de pages dans les vues des modules.
## Versions 13.3.06 ## Versions 13.3.06
** Corrections : ** ** Corrections : **
- Corrige un bug de sécurité dans la gestion des profils. - Corrige un bug de sécurité dans la gestion des profils.
- Répare le bouton d'effacement en mode édition d'une page. - Répare le bouton d'effacement en mode édition d'une page.
- Corrige la feuille de style du slider les balises H1, H3 et A. - Corrige la feuille de style du slider les balises H1, H3 et A.
- Corrige l'absence de contenu de page lorsque le module est en position libre et que le mot clé [MODULE] n'a pas été inséré. - Corrige l'absence de contenu de page lorsque le module est en position libre et que le mot clé [MODULE] n'a pas été inséré.
- Corrige l'option "Rester connecter sur ce navigateur' dont la connexion est désormais réellement persistante. - Corrige l'option "REster connecter sur ce navigateur' dont la connexion est désormais réellement persistente.
- Supprime un slash à la fin de l'URL du catalogue. - Supprime un slash à la fin de l'URL du catalogue.
- Eviter un warning lors de la création d'une nouvelle page. - Eviter un warning lors de la création d'une nouvelle page.

View File

@ -1,4 +1,4 @@
# ZwiiCMS 13.5.00 # ZwiiCMS 13.3.05
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. 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.

View File

@ -1,4 +1,4 @@
# ZwiiCMS 13.5.00 # ZwiiCMS 13.3.05
Zwii is a database-less (flat-file) CMS that allows you to easily create and manage a web site without any programming knowledge. Zwii is a database-less (flat-file) CMS that allows you to easily create and manage a web site without any programming knowledge.

View File

@ -673,35 +673,13 @@ class helper
public static function subword($text, $start, $length) public static function subword($text, $start, $length)
{ {
$text = trim($text); $text = trim($text);
if (strlen($text) > $length) {
// Vérifier si la longueur du texte sans les balises dépasse la longueur souhaitée
if (mb_strlen(strip_tags($text)) > $length) {
// Utiliser mb_substr pour couper le texte
$text = mb_substr($text, $start, $length); $text = mb_substr($text, $start, $length);
$text = mb_substr($text, 0, min(mb_strlen($text), mb_strrpos($text, ' ')));
// S'assurer que le texte ne se termine pas au milieu d'un mot
$lastSpace = mb_strrpos($text, ' ');
if ($lastSpace !== false) {
$text = mb_substr($text, 0, $lastSpace);
}
// Fermer les balises HTML ouvertes
$dom = new DOMDocument();
@$dom->loadHTML('<div>' . $text . '</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$text = $dom->saveHTML();
// Retirer la balise de conteneur ajoutée
$text = preg_replace('~^<div>(.*)</div>$~s', '$1', $text);
// Ajouter des points de suspension si le texte a été coupé
$text .= '...';
} }
return $text; return $text;
} }
/** /**
* Cryptage * Cryptage
* @param string $key la clé d'encryptage * @param string $key la clé d'encryptage

View File

@ -163,9 +163,6 @@ class JsonDb extends \Prowebcraft\Dot
// Essaye d'écrire les données encodées dans le fichier de base de données // Essaye d'écrire les données encodées dans le fichier de base de données
$write_result = file_put_contents($this->db, $encoded_data, LOCK_EX); // Les utilisateurs multiples obtiennent un verrou $write_result = file_put_contents($this->db, $encoded_data, LOCK_EX); // Les utilisateurs multiples obtiennent un verrou
//$now = \DateTime::createFromFormat('U.u', microtime(true));
//file_put_contents("tmplog.txt", '[JsonDb][' . $now->format('H:i:s.u') . ']--' . $this->db . "\r\n", FILE_APPEND);
// Vérifie si l'écriture a réussi // Vérifie si l'écriture a réussi
if ($write_result === $encoded_length) { if ($write_result === $encoded_length) {
// Sort de la boucle si l'écriture a réussi // Sort de la boucle si l'écriture a réussi

View File

@ -82,25 +82,17 @@ class layout extends common
$content = 'col' . $blocks[1]; $content = 'col' . $blocks[1];
$blockright = 'col' . $blocks[2]; $blockright = 'col' . $blocks[2];
} }
// Toujours en pleine page pour la configuration des modules et l'édition des pages sauf l'affichage d'un article de blog // Page pleine pour la configuration des modules et l'édition des pages sauf l'affichage d'un article de blog
$pattern = ['config', 'edit', 'add', 'comment', 'data', 'option', 'theme', 'comment', 'article', 'data', 'gallery', 'update', 'users', 'validate']; $pattern = ['config', 'edit', 'add', 'comment', 'data'];
if ( if (
(sizeof($blocks) === 1 || (sizeof($blocks) === 1 ||
in_array($this->getUrl(1), $pattern)) in_array($this->getUrl(1), $pattern))
) { // Pleine page en mode configuration ) { // Pleine page en mode configuration
if ( if ($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'top' || $this->getData(['page', $this->getUrl(0), 'navRight']) === 'top') {
($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'top'
|| $this->getData(['page', $this->getUrl(0), 'navRight']) === 'top')
&& in_array($this->getUrl(1), $pattern) === false
) {
$this->showNavButtons('top'); $this->showNavButtons('top');
} }
$this->showContent(); $this->showContent();
if ( if ($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'bottom' || $this->getData(['page', $this->getUrl(0), 'navRight']) === 'bottom') {
($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'bottom'
|| $this->getData(['page', $this->getUrl(0), 'navRight']) === 'bottom')
&& in_array($this->getUrl(1), $pattern) === false
) {
$this->showNavButtons('bottom'); $this->showNavButtons('bottom');
} }
} else { } else {
@ -338,7 +330,7 @@ class layout extends common
// Affichage du lien de connexion // Affichage du lien de connexion
if ( if (
($this->getData(['theme', 'footer', 'loginLink']) ($this->getData(['theme', 'footer', 'loginLink'])
and $this->isConnected() === false and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
) )
or $this->getUrl(0) === 'theme' or $this->getUrl(0) === 'theme'
) { ) {
@ -501,7 +493,7 @@ class layout extends common
// Lien de connexion // Lien de connexion
if ( if (
($this->getData(['theme', 'menu', 'loginLink']) ($this->getData(['theme', 'menu', 'loginLink'])
and $this->isConnected() === false and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
) )
or $this->getUrl(0) === 'theme' or $this->getUrl(0) === 'theme'
) { ) {
@ -588,9 +580,9 @@ class layout extends common
if ( if (
($this->getData(['page', $parentPageId, 'disable']) === true ($this->getData(['page', $parentPageId, 'disable']) === true
and $this->isConnected() === false and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
) or ($this->getData(['page', $parentPageId, 'disable']) === true ) or ($this->getData(['page', $parentPageId, 'disable']) === true
and $this->isConnected() === true and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') < self::GROUP_EDITOR and $this->getUser('group') < self::GROUP_EDITOR
) )
) { ) {
@ -654,9 +646,9 @@ class layout extends common
$items .= '<li id=' . $childKey . '>'; $items .= '<li id=' . $childKey . '>';
if ( if (
($this->getData(['page', $childKey, 'disable']) === true ($this->getData(['page', $childKey, 'disable']) === true
and $this->isConnected() === false and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
) or ($this->getData(['page', $childKey, 'disable']) === true ) or ($this->getData(['page', $childKey, 'disable']) === true
and $this->isConnected() === true and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') < self::GROUP_EDITOR and $this->getUser('group') < self::GROUP_EDITOR
) )
) { ) {
@ -750,7 +742,7 @@ class layout extends common
$items .= '<li class="menuSideChild">'; $items .= '<li class="menuSideChild">';
if ( if (
$this->getData(['page', $parentPageId, 'disable']) === true $this->getData(['page', $parentPageId, 'disable']) === true
and $this->isConnected() === false and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
) { ) {
$items .= '<a href="' . $this->getUrl(1) . '">'; $items .= '<a href="' . $this->getUrl(1) . '">';
} else { } else {
@ -774,7 +766,7 @@ class layout extends common
if ( if (
$this->getData(['page', $childKey, 'disable']) === true $this->getData(['page', $childKey, 'disable']) === true
and $this->isConnected() === false and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
) { ) {
$itemsChildren .= '<a href="' . $this->getUrl(1) . '">'; $itemsChildren .= '<a href="' . $this->getUrl(1) . '">';
} else { } else {
@ -910,7 +902,7 @@ class layout extends common
*/ */
public function showBar() public function showBar()
{ {
if ($this->isConnected() === true) { if ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')) {
// Items de gauche // Items de gauche
$leftItems = ''; $leftItems = '';
// Sélecteur de langues // Sélecteur de langues
@ -1071,14 +1063,18 @@ class layout extends common
'help' => 'Thème', 'help' => 'Thème',
'href' => helper::baseUrl() . 'theme' 'href' => helper::baseUrl() . 'theme'
]) . '</li>'; ]) . '</li>';
$rightItems .= '<li>' . template::ico('users', [ $rightItems .= '<li>' . template::ico('puzzle', [
'help' => 'Utilisateurs', 'help' => 'Modules',
'href' => helper::baseUrl() . 'user' 'href' => helper::baseUrl() . 'plugin'
]) . '</li>'; ]) . '</li>';
$rightItems .= '<li>' . template::ico('cog-alt', [ $rightItems .= '<li>' . template::ico('cog-alt', [
'help' => 'Configuration', 'help' => 'Configuration',
'href' => helper::baseUrl() . 'config' 'href' => helper::baseUrl() . 'config'
]) . '</li>'; ]) . '</li>';
$rightItems .= '<li>' . template::ico('users', [
'help' => 'Utilisateurs',
'href' => helper::baseUrl() . 'user'
]) . '</li>';
// Mise à jour automatique // Mise à jour automatique
$today = mktime(0, 0, 0); $today = mktime(0, 0, 0);
$checkUpdate = $this->getData(['core', 'lastAutoUpdate']); $checkUpdate = $this->getData(['core', 'lastAutoUpdate']);
@ -1090,55 +1086,21 @@ class layout extends common
$today > $checkUpdate + $this->getData(['config', 'autoUpdateDelay', 86400]) $today > $checkUpdate + $this->getData(['config', 'autoUpdateDelay', 86400])
) { ) {
// Dernier auto controle // Dernier auto controle
$this->setData(['core', 'lastAutoUpdate', $today], false); $this->setData(['core', 'lastAutoUpdate', $today]);
if ( if (
helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL) helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)
) { ) {
$this->setData(['core', 'updateAvailable', true], false); $this->setData(['core', 'updateAvailable', true]);
} }
// Modules installés
$infoModules = helper::getModules();
// Recherche de mise à jour des modules
$store = plugin::getStore();
if (is_array($store)) {
// Parcourir les données des modules du store
foreach ($store as $key => $value) {
if (empty($key)) {
continue;
}
// Mise à jour d'un module
// Le module est installé et une mise à jour est en ligne
if (
isset($infoModules[$key])
&&
version_compare($infoModules[$key]['version'], $value['version'], '<')
) {
$this->setData(['core', 'updateModuleAvailable', true], false);
}
}
}
// Sauvegarde la base manuellement
$this->saveDB('core');
} }
} }
// Afficher le bouton : Mise à jour détectée + activée // Afficher le bouton : Mise à jour détectée + activée
if ($this->getData(['core', 'updateAvailable'])) { if ($this->getData(['core', 'updateAvailable'])) {
$rightItems .= '<li><a href="' . helper::baseUrl() . 'install/update" data-tippy-content="Mettre à jour Zwii ' . common::ZWII_VERSION . ' vers ' . helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL) . '">' . template::ico('update colorRed') . '</a></li>'; $rightItems .= '<li><a href="' . helper::baseUrl() . 'install/update" data-tippy-content="Mettre à jour Zwii ' . common::ZWII_VERSION . ' vers ' . helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL) . '">' . template::ico('update colorRed') . '</a></li>';
} }
} }
if ($this->getData(['core', 'updateModuleAvailable'])) {
$rightItems .= '<li>' . template::ico('puzzle colorRed', [
'help' => 'Modules',
'href' => helper::baseUrl() . 'plugin'
]) . '</li>';
} else {
$rightItems .= '<li>' . template::ico('puzzle', [
'help' => 'Modules',
'href' => helper::baseUrl() . 'plugin'
]) . '</li>';
}
// Boutons depuis le groupe éditeur
if ( if (
$this->getUser('group') >= self::GROUP_EDITOR $this->getUser('group') >= self::GROUP_EDITOR
&& $this->getUser('permission', 'user', 'edit') && $this->getUser('permission', 'user', 'edit')
@ -1213,7 +1175,7 @@ class layout extends common
{ {
// Import des fontes liées au thème // Import des fontes liées au thème
if (file_exists(self::DATA_DIR . 'font/font.html')) { if (file_exists(self::DATA_DIR . 'font/font.html')) {
include_once(self::DATA_DIR . 'font/font.html'); include_once (self::DATA_DIR . 'font/font.html');
} }
} }
@ -1226,7 +1188,7 @@ class layout extends common
$vars = 'var baseUrl = ' . json_encode(helper::baseUrl(false)) . ';'; $vars = 'var baseUrl = ' . json_encode(helper::baseUrl(false)) . ';';
$vars .= 'var baseUrlQs = ' . json_encode(helper::baseUrl()) . ';'; $vars .= 'var baseUrlQs = ' . json_encode(helper::baseUrl()) . ';';
if ( if (
$this->isConnected() === true $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') >= self::GROUP_EDITOR and $this->getUser('group') >= self::GROUP_EDITOR
) { ) {
$vars .= 'var privateKey = ' . json_encode(md5_file(self::DATA_DIR . 'core.json')) . ';'; $vars .= 'var privateKey = ' . json_encode(md5_file(self::DATA_DIR . 'core.json')) . ';';

View File

@ -11,7 +11,7 @@ class core extends common
parent::__construct(); parent::__construct();
// Token CSRF // Token CSRF
if (empty($_SESSION['csrf'])) { if (empty($_SESSION['csrf'])) {
$_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(64)); $_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(128));
} }
// Fuseau horaire // Fuseau horaire
@ -32,6 +32,8 @@ class core extends common
} }
// Date de la dernière suppression // Date de la dernière suppression
$this->setData(['core', 'lastClearTmp', $lastClearTmp]); $this->setData(['core', 'lastClearTmp', $lastClearTmp]);
// Enregistre les données
//$this->SaveData();
} }
// Backup automatique des données // Backup automatique des données
$lastBackup = mktime(0, 0, 0); $lastBackup = mktime(0, 0, 0);
@ -413,7 +415,7 @@ class core extends common
// Force la déconnexion des membres bannis ou d'une seconde session // Force la déconnexion des membres bannis ou d'une seconde session
if ( if (
$this->isConnected() === true $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and ($this->getUser('group') === common::GROUP_BANNED and ($this->getUser('group') === common::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', 'connect', 'autoDisconnect']) === true) and $this->getData(['config', 'connect', 'autoDisconnect']) === true)
@ -427,8 +429,8 @@ class core extends common
$this->getData(['config', 'maintenance']) $this->getData(['config', 'maintenance'])
and in_array($this->getUrl(0), ['maintenance', 'user']) === false and in_array($this->getUrl(0), ['maintenance', 'user']) === false
and $this->getUrl(1) !== 'login' and $this->getUrl(1) !== 'login'
and ($this->isConnected() === false and ($this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
or ($this->isConnected() === true or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') < common::GROUP_ADMIN and $this->getUser('group') < common::GROUP_ADMIN
) )
) )
@ -447,7 +449,7 @@ class core extends common
if ($this->getData(['page', $this->getUrl(0)]) !== null) { if ($this->getData(['page', $this->getUrl(0)]) !== null) {
if ( if (
$this->getData(['page', $this->getUrl(0), 'group']) === common::GROUP_VISITOR $this->getData(['page', $this->getUrl(0), 'group']) === common::GROUP_VISITOR
or ($this->isConnected() === true or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
// and $this->getUser('group') >= $this->getData(['page', $this->getUrl(0), 'group']) // and $this->getUser('group') >= $this->getData(['page', $this->getUrl(0), 'group'])
// Modification qui tient compte du profil de la page // Modification qui tient compte du profil de la page
and ($this->getUser('group') * 10 + $this->getUser('profil')) >= ($this->getData(['page', $this->getUrl(0), 'group']) * 10 + $this->getData(['page', $this->getUrl(0), 'profil'])) and ($this->getUser('group') * 10 + $this->getUser('profil')) >= ($this->getData(['page', $this->getUrl(0), 'group']) * 10 + $this->getData(['page', $this->getUrl(0), 'profil']))
@ -464,9 +466,9 @@ class core extends common
// Empêcher l'accès aux pages désactivées par URL directe // Empêcher l'accès aux pages désactivées par URL directe
if ( if (
($this->getData(['page', $this->getUrl(0), 'disable']) === true ($this->getData(['page', $this->getUrl(0), 'disable']) === true
and $this->isConnected() === false and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
) or ($this->getData(['page', $this->getUrl(0), 'disable']) === true ) or ($this->getData(['page', $this->getUrl(0), 'disable']) === true
and $this->isConnected() === true and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') < common::GROUP_EDITOR and $this->getUser('group') < common::GROUP_EDITOR
) )
) { ) {
@ -513,11 +515,10 @@ class core extends common
} }
// Accès concurrent stocke la page visitée // Accès concurrent stocke la page visitée
if ( if (
$this->isConnected() === true $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
&& $this->getUser('id') && $this->getUser('id')
&& !$this->isPost()
) { ) {
$this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()], false); $this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()]);
$this->setData(['user', $this->getUser('id'), 'accessTimer', time()]); $this->setData(['user', $this->getUser('id'), 'accessTimer', time()]);
} }
// Breadcrumb // Breadcrumb
@ -634,7 +635,7 @@ class core extends common
// Check le groupe de l'utilisateur // Check le groupe de l'utilisateur
if ( if (
($module::$actions[$action] === common::GROUP_VISITOR ($module::$actions[$action] === common::GROUP_VISITOR
or ($this->isConnected() === true or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') >= $module::$actions[$action] and $this->getUser('group') >= $module::$actions[$action]
and $this->getUser('permission', $moduleId, $action) and $this->getUser('permission', $moduleId, $action)
) )

View File

@ -128,17 +128,7 @@ class SitemapGenerator
*/ */
private $sampleRobotsLines = [ private $sampleRobotsLines = [
"User-agent: *", "User-agent: *",
"Disallow: /",
"User-agent: Googlebot",
"Allow: /", "Allow: /",
"User-agent: bingbot",
"Allow: /",
"User-agent: Slurp",
"Allow: /",
"User-agent: DuckDuckBot",
"Allow: /",
"User-agent: Baiduspider",
"Allow: /"
]; ];
/** /**
* @var array list of valid changefreq values according to the spec * @var array list of valid changefreq values according to the spec

View File

@ -325,7 +325,6 @@ class template
'name' => $nameId, 'name' => $nameId,
'type' => 2, 'type' => 2,
'value' => '', 'value' => '',
'folder' => '',
'language' => 'fr_FR' 'language' => 'fr_FR'
], $attributes); ], $attributes);
// Traduction de l'aide et de l'étiquette // Traduction de l'aide et de l'étiquette
@ -368,8 +367,6 @@ class template
'&field_id=' . $attributes['id'] . '&field_id=' . $attributes['id'] .
'&type=' . $attributes['type'] . '&type=' . $attributes['type'] .
'&akey=' . md5_file(core::DATA_DIR . 'core.json') . '&akey=' . md5_file(core::DATA_DIR . 'core.json') .
// Ajoute le nom du dossier si la variable est passée
(!empty($attributes['folder']) ? '&fldr=' . $attributes['folder'] : '') .
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '') ($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '')
. '" . '"
class="inputFile %s %s" class="inputFile %s %s"

View File

@ -216,14 +216,12 @@ core.start = function () {
// Variables des cookies // Variables des cookies
var getUrl = window.location; var getUrl = window.location;
var domain = "domain=" + getUrl.hostname + ";"; var domain = "domain=" + getUrl.hostname + ";";
var basePath = getUrl.pathname.substring(0, getUrl.pathname.lastIndexOf('/') + 1);
var path = "path=" + basePath + ";";
var e = new Date(); var e = new Date();
e.setFullYear(e.getFullYear() + 1); e.setFullYear(e.getFullYear() + 1);
var expires = "expires=" + e.toUTCString() + ";"; var expires = "expires=" + e.toUTCString();
// Stocke le cookie d'acceptation // Stocke le cookie d'acceptation
document.cookie = "ZWII_COOKIE_CONSENT=true; samesite=lax; " + domain + path + expires; document.cookie = "ZWII_COOKIE_CONSENT=true;samesite=strict;" + domain + expires;
}); });

View File

@ -51,18 +51,11 @@ class common
const ACCESS_TIMER = 1800; const ACCESS_TIMER = 1800;
// Numéro de version // Numéro de version
const ZWII_VERSION = '13.5.00'; const ZWII_VERSION = '13.3.06';
// URL autoupdate // URL autoupdate
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/cms-update/raw/branch/master/'; const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/cms-update/raw/branch/master/';
const ZWII_UPDATE_CHANNEL = 'v13';
/**
* Branche de base pour la mise à jour
* Pour les versions supérieures à 13.4 et inférieure à 14, la branche reste sur v134
* La branche v13 est maintenue afin de télécharger un correctif permettant d'installer
* les version supérieures.
*/
const ZWII_UPDATE_CHANNEL = 'v134';
// Valeurs possibles multiple de 10, 10 autorise 9 profils, 100 autorise 99 profils // Valeurs possibles multiple de 10, 10 autorise 9 profils, 100 autorise 99 profils
const MAX_PROFILS = 10; const MAX_PROFILS = 10;
@ -338,19 +331,6 @@ class common
*/ */
public function __construct() public function __construct()
{ {
// Récupération du cache des propriétés
if(isset($GLOBALS['common_cache'])) {
$this->input['_POST'] = $GLOBALS['common_cache']['input']['_POST'];
$this->input['_COOKIE'] = $GLOBALS['common_cache']['input']['_COOKIE'];
self::$siteContent = $GLOBALS['common_cache']['siteContent'];
$this->dataFiles = $GLOBALS['common_cache']['dataFiles'];
$this->user = $GLOBALS['common_cache']['user'];
self::$i18nUI = $GLOBALS['common_cache']['i18nUI'];
$this->hierarchy = $GLOBALS['common_cache']['hierarchy'];
$this->url = $GLOBALS['common_cache']['url'];
self::$dialog = $GLOBALS['common_cache']['dialog'];
return;
}
// Extraction des données http // Extraction des données http
if (isset($_POST)) { if (isset($_POST)) {
@ -374,13 +354,12 @@ class common
} }
} }
} }
// Localisation
\setlocale(LC_ALL, self::$siteContent . '.UTF8'); \setlocale(LC_ALL, self::$siteContent . '.UTF8');
// Instanciation de la classe des entrées / sorties // Instanciation de la classe des entrées / sorties
$this->jsonDB(self::$siteContent); $this->jsonDB(self::$siteContent);
// Installation fraîche, initialisation des modules // Installation fraîche, initialisation des modules
if ($this->user === []) { if ($this->user === []) {
foreach ($this->dataFiles as $stageId => $item) { foreach ($this->dataFiles as $stageId => $item) {
@ -453,9 +432,6 @@ class common
} }
} }
// Cache
$GLOBALS['common_construct']['dialog'] = self::$dialog;
// Données de proxy // Données de proxy
$proxy = $this->getData(['config', 'proxyType']) . $this->getData(['config', 'proxyUrl']) . ':' . $this->getData(['config', 'proxyPort']); $proxy = $this->getData(['config', 'proxyType']) . $this->getData(['config', 'proxyUrl']) . ':' . $this->getData(['config', 'proxyPort']);
if ( if (
@ -477,21 +453,6 @@ class common
stream_context_set_default($context); stream_context_set_default($context);
} }
// Mise en cache des propriétés
$GLOBALS['common_cache'] = [
'input' => [
'_POST' => $this->input['_POST'],
'_COOKIE' => $this->input['_COOKIE'],
],
'siteContent' => self::$siteContent,
'dataFiles' => $this->dataFiles,
'user' => $this->user,
'i18nUI' => self::$i18nUI,
'hierarchy' => $this->hierarchy,
'url' => $this->url,
'dialog' => self::$dialog,
];
// Mise à jour des données core // Mise à jour des données core
include('core/include/update.inc.php'); include('core/include/update.inc.php');
@ -559,7 +520,7 @@ class common
* Sauvegarde des données * Sauvegarde des données
* @param array $keys Clé(s) des données * @param array $keys Clé(s) des données
*/ */
public function setData($keys = [], $save = true) public function setData($keys = [])
{ {
// Pas d'enregistrement lorsqu'une notice est présente ou tableau transmis vide // Pas d'enregistrement lorsqu'une notice est présente ou tableau transmis vide
if ( if (
@ -587,7 +548,7 @@ class common
$query .= '.' . $keys[$i]; $query .= '.' . $keys[$i];
} }
// Appliquer la modification, le dernier élément étant la donnée à sauvegarder // Appliquer la modification, le dernier élément étant la donnée à sauvegarder
$success = is_object($db->set($query, $keys[count($keys) - 1], $save)); $success = is_object($db->set($query, $keys[count($keys) - 1], true));
} }
return $success; return $success;
} }
@ -658,35 +619,32 @@ class common
// Initialise le compteur de tentatives // Initialise le compteur de tentatives
$attempts = 0; $attempts = 0;
// Convertit les données en chaîne de caractères
$serialized_data = serialize($data);
// Vérifie la longueur des données // Vérifie la longueur des données
$data_length = strlen($data); $data_length = strlen($serialized_data);
// Effectue jusqu'à 5 tentatives d'écriture // Effectue jusqu'à 5 tentatives d'écriture
while ($attempts < 5) { while ($attempts < 5) {
// Essaye d'écrire les données dans le fichier avec verrouillage exclusif // Essaye d'écrire les données dans le fichier avec verrouillage exclusif
$write_result = file_put_contents($filename, $data, LOCK_EX | $flags); $write_result = file_put_contents($filename, $data, LOCK_EX | $flags);
//$now = \DateTime::createFromFormat('U.u', microtime(true));
//file_put_contents("tmplog.txt", '[SecurePut][' . $now->format('H:i:s.u') . ']--' . $filename . "\r\n", FILE_APPEND);
// Vérifie si l'écriture a réussi // Vérifie si l'écriture a réussi
if ($write_result !== false && $write_result === $data_length) { if ($write_result !== false && $write_result === $data_length) {
// Sort de la boucle si l'écriture a réussi // Sort de la boucle si l'écriture a réussi
break; return true;
} }
// Incrémente le compteur de tentatives // Incrémente le compteur de tentatives
$attempts++; $attempts++;
sleep(1);
} }
// Échec de l'écriture après plusieurs tentatives // Échec de l'écriture après plusieurs tentatives
// Etat de l'écriture return false;
return ($attempts < 5);
} }
/** /**
* Effacer les données de la page * Effacer les données de la page
* @param string pageId * @param string pageId
@ -743,11 +701,11 @@ class common
mkdir(self::DATA_DIR . $lang . '/content', 0755); mkdir(self::DATA_DIR . $lang . '/content', 0755);
} }
// Site en français avec site exemple // Site en français avec site exemple
if ($lang == 'fr_FR' && $sampleSite === true && $module === 'page') { if ($lang == 'fr_FR' && $sampleSite === true) {
$this->setData([$module, init::$siteTemplate[$module]]); $this->setData([$module, init::$siteTemplate[$module]]);
// Création des pages // Création des pages
foreach (init::$siteContent as $key => $value) { foreach (init::$siteContent as $key => $value) {
$this->setPage($key, $value['content'], 'fr_FR'); $this->setPage($key, $value, 'fr_FR');
} }
// Version en langue étrangère ou fr_FR sans site de test // Version en langue étrangère ou fr_FR sans site de test
} else { } else {
@ -768,17 +726,6 @@ class common
} }
/**
* Forçage de l'enregistrement
* @param mixed $module
* @return void
*/
public function saveDB($module): void
{
$db = $this->dataFiles[$module];
$db->save();
}
/** /**
* Accède à la liste des pages parents et de leurs enfants * Accède à la liste des pages parents et de leurs enfants
@ -821,7 +768,7 @@ class common
$this->getData(['page', $pageId, 'parentPageId']) === "" $this->getData(['page', $pageId, 'parentPageId']) === ""
// Ignore les pages dont l'utilisateur n'a pas accès // Ignore les pages dont l'utilisateur n'a pas accès
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
or ($this->isConnected() === true or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
//and $this->getUser('group') >= $this->getData(['page', $pageId, 'group']) //and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
// Modification qui tient compte du profil de la page // Modification qui tient compte du profil de la page
and ($this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil'])) and ($this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil']))
@ -852,7 +799,7 @@ class common
$this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR $this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR
) )
or ( or (
$this->isConnected() === true $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and and
$this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil']) $this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil'])
@ -1081,16 +1028,6 @@ class common
} }
/**
* @return bool l'utilisateur est connecté true sinon false
*/
public function isConnected() {
return (
!empty($this->getUser('authKey'))
&&
$this->getUser('authKey') === $this->getInput('ZWII_AUTH_KEY'));
}
/** /**
* Check qu'une valeur est transmise par la méthode _POST * Check qu'une valeur est transmise par la méthode _POST
* @return bool * @return bool

View File

@ -2,7 +2,7 @@
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>"> <html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html;"> <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<?php $layout->showMetaTitle(); ?> <?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?> <?php $layout->showMetaDescription(); ?>

View File

@ -2,7 +2,7 @@
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>"> <html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html;"> <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<?php $layout->showMetaTitle(); ?> <?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?> <?php $layout->showMetaDescription(); ?>

View File

@ -2,7 +2,7 @@
<html xmlns="http://www.w3.org/1999/xhtml" lang="<?php echo substr(self::$siteContent, 0, 2);?>"> <html xmlns="http://www.w3.org/1999/xhtml" lang="<?php echo substr(self::$siteContent, 0, 2);?>">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html;"> <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="x-apple-disable-message-reformatting"> <meta name="x-apple-disable-message-reformatting">

View File

@ -3,7 +3,7 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html;"> <meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta meta="description=" content="ZwiiCMS le CMS multilingue sans base de données"> <meta meta="description=" content="ZwiiCMS le CMS multilingue sans base de données">
<meta name="generator" content="ZiiCMS https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS"> <meta name="generator" content="ZiiCMS https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
@ -54,7 +54,7 @@
if ( if (
$this->getData(['theme', 'menu', 'position']) === 'top' $this->getData(['theme', 'menu', 'position']) === 'top'
and $this->getData(['theme', 'menu', 'fixed']) === true and $this->getData(['theme', 'menu', 'fixed']) === true
and $this->isConnected() === true and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') > self::GROUP_MEMBER and $this->getUser('group') > self::GROUP_MEMBER
) { ) {
echo '<nav id="navfixedconnected" >'; echo '<nav id="navfixedconnected" >';

View File

@ -22,7 +22,7 @@ class config extends common
'copyBackups' => self::GROUP_ADMIN, 'copyBackups' => self::GROUP_ADMIN,
'delBackups' => self::GROUP_ADMIN, 'delBackups' => self::GROUP_ADMIN,
'configMetaImage' => self::GROUP_ADMIN, 'configMetaImage' => self::GROUP_ADMIN,
'sitemap' => self::GROUP_ADMIN, 'siteMap' => self::GROUP_ADMIN,
'index' => self::GROUP_ADMIN, 'index' => self::GROUP_ADMIN,
'restore' => self::GROUP_ADMIN, 'restore' => self::GROUP_ADMIN,
'updateBaseUrl' => self::GROUP_ADMIN, 'updateBaseUrl' => self::GROUP_ADMIN,
@ -30,8 +30,7 @@ class config extends common
'logReset' => self::GROUP_ADMIN, 'logReset' => self::GROUP_ADMIN,
'logDownload' => self::GROUP_ADMIN, 'logDownload' => self::GROUP_ADMIN,
'blacklistReset' => self::GROUP_ADMIN, 'blacklistReset' => self::GROUP_ADMIN,
'blacklistDownload' => self::GROUP_ADMIN, 'blacklistDownload' => self::GROUP_ADMIN
'register' => self::GROUP_ADMIN,
]; ];
public static $timezones = [ public static $timezones = [
@ -212,7 +211,7 @@ class config extends common
* Sitemap compressé et non compressé * Sitemap compressé et non compressé
* Robots.txt * Robots.txt
*/ */
public function sitemap() public function siteMap()
{ {
// La page n'existe pas // La page n'existe pas
if ( if (
@ -908,8 +907,7 @@ class config extends common
* Fonction pour vérifier la présence du module de réécriture * Fonction pour vérifier la présence du module de réécriture
* @return bool * @return bool
*/ */
public function isModRewriteEnabled() public function isModRewriteEnabled() {
{
// Check if Apache and mod_rewrite is loaded // Check if Apache and mod_rewrite is loaded
if (function_exists('apache_get_modules')) { if (function_exists('apache_get_modules')) {
$modules = apache_get_modules(); $modules = apache_get_modules();
@ -919,25 +917,4 @@ class config extends common
return getenv('HTTP_MOD_REWRITE') == 'On' || getenv('REDIRECT_STATUS') == '200'; return getenv('HTTP_MOD_REWRITE') == 'On' || getenv('REDIRECT_STATUS') == '200';
} }
} }
/**
* Stocke la variable dans les paramètres de l'utilisateur pour activer la tab à sa prochaine visite
* @return never
*/
public function register(): void
{
$this->setData([
'user',
$this->getUser('id'),
'view',
[
'config' => $this->getUrl(2),
'page' => $this->getData(['user', $this->getUser('id'), 'view', 'page']),
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config/' . $this->getUrl(2),
]);
}
} }

View File

@ -66,11 +66,11 @@ $(document).ready(function () {
$("#connectCaptchaStrong").prop("checked", false); $("#connectCaptchaStrong").prop("checked", false);
} }
var configLayout = "<?php echo $this->getData(['user', $this->getUser('id'), 'view', 'config']);?>"; var configLayout = getCookie("configLayout");
// Non défini, valeur par défaut if (configLayout == null) {
if (configLayout == "") {
configLayout = "setup"; configLayout = "setup";
} setCookie("configLayout", "setup");
}
$("#socialContainer").hide(); $("#socialContainer").hide();
$("#connectContainer").hide(); $("#connectContainer").hide();
@ -166,6 +166,7 @@ $(document).ready(function () {
$("#configSocialButton").removeClass("activeButton"); $("#configSocialButton").removeClass("activeButton");
$("#configConnectButton").removeClass("activeButton"); $("#configConnectButton").removeClass("activeButton");
$("#configNetworkButton").removeClass("activeButton"); $("#configNetworkButton").removeClass("activeButton");
setCookie("configLayout", "setup");
}); });
$("#configSocialButton").on("click", function () { $("#configSocialButton").on("click", function () {
$("#connectContainer").hide(); $("#connectContainer").hide();
@ -176,6 +177,7 @@ $(document).ready(function () {
$("#configSocialButton").addClass("activeButton"); $("#configSocialButton").addClass("activeButton");
$("#configConnectButton").removeClass("activeButton"); $("#configConnectButton").removeClass("activeButton");
$("#configNetworkButton").removeClass("activeButton"); $("#configNetworkButton").removeClass("activeButton");
setCookie("configLayout", "social");
}); });
$("#configConnectButton").on("click", function () { $("#configConnectButton").on("click", function () {
$("#setupContainer").hide(); $("#setupContainer").hide();
@ -186,6 +188,7 @@ $(document).ready(function () {
$("#configSocialButton").removeClass("activeButton"); $("#configSocialButton").removeClass("activeButton");
$("#configConnectButton").addClass("activeButton"); $("#configConnectButton").addClass("activeButton");
$("#configNetworkButton").removeClass("activeButton"); $("#configNetworkButton").removeClass("activeButton");
setCookie("configLayout", "connect");
}); });
$("#configNetworkButton").on("click", function () { $("#configNetworkButton").on("click", function () {
$("#setupContainer").hide(); $("#setupContainer").hide();
@ -196,6 +199,7 @@ $(document).ready(function () {
$("#configSocialButton").removeClass("activeButton"); $("#configSocialButton").removeClass("activeButton");
$("#configConnectButton").removeClass("activeButton"); $("#configConnectButton").removeClass("activeButton");
$("#configNetworkButton").addClass("activeButton"); $("#configNetworkButton").addClass("activeButton");
setCookie("configLayout", "network");
}); });
@ -261,6 +265,7 @@ $(document).ready(function () {
$('span#screenWeight').each(function(index){ $('span#screenWeight').each(function(index){
var weight = parseFloat($(this).text()); var weight = parseFloat($(this).text());
var fileType = $('span#screenType').eq(index).text(); var fileType = $('span#screenType').eq(index).text();
console.log(weight);
if ((fileType === "jpg" || fileType === "jpeg") && weight < 5000000) { if ((fileType === "jpg" || fileType === "jpeg") && weight < 5000000) {
$(this).css("color", "green"); $(this).css("color", "green");
} else { } else {
@ -281,6 +286,28 @@ $(document).ready(function () {
}); });
function setCookie(name, value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/; samesite=lax";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
// Define function to capitalize the first letter of a string // Define function to capitalize the first letter of a string
function capitalizeFirstLetter(string) { function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1); return string.charAt(0).toUpperCase() + string.slice(1);

View File

@ -7,7 +7,16 @@
'value' => template::ico('home') 'value' => template::ico('home')
]); ?> ]); ?>
</div> </div>
<div class="col2 offset7"> <div class="col1">
<?php /**echo template::button('configHelp', [
'class' => 'buttonHelp',
'href' => 'https://doc.zwiicms.fr/configuration-du-site',
'target' => '_blank',
'value' => template::ico('help'),
'help' => 'Consulter l\'aide en ligne'
]); */?>
</div>
<div class="col2 offset6">
<?php echo template::button('configLocaleButton', [ <?php echo template::button('configLocaleButton', [
'value' => 'Identité', 'value' => 'Identité',
'href' => helper::baseUrl() . 'language/site' 'href' => helper::baseUrl() . 'language/site'
@ -21,24 +30,20 @@
<div class="tab"> <div class="tab">
<?php echo template::button('configSetupButton', [ <?php echo template::button('configSetupButton', [
'value' => 'Configuration', 'value' => 'Configuration',
'class' => 'buttonTab', 'class' => 'buttonTab'
//'href' => helper::baseUrl() . 'config/register/setup'
]); ?> ]); ?>
<?php echo template::button('configSocialButton', [ <?php echo template::button('configSocialButton', [
'value' => 'Référencement', 'value' => 'Référencement',
'class' => 'buttonTab', 'class' => 'buttonTab'
//'href' => helper::baseUrl() . 'config/register/social'
]); ?> ]); ?>
<?php echo template::button('configConnectButton', [ <?php echo template::button('configConnectButton', [
'value' => 'Connexion', 'value' => 'Connexion',
'class' => 'buttonTab', 'class' => 'buttonTab'
//'href' => helper::baseUrl() . 'config/register/connect'
]); ?> ]); ?>
<?php echo template::button('configNetworkButton', [ <?php echo template::button('configNetworkButton', [
'value' => 'Réseau', 'value' => 'Réseau',
'class' => 'buttonTab', 'class' => 'buttonTab'
//'href' => helper::baseUrl() . 'config/register/network'
]); ?> ]); ?>
</div> </div>

View File

@ -3,6 +3,12 @@
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Paramètres'); ?> <h4><?php echo helper::translate('Paramètres'); ?>
<!--<span id="setupHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/parametres" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']);
?>
</a>-->
</span>
</h4> </h4>
<div class="row"> <div class="row">
<div class="col4"> <div class="col4">
@ -11,8 +17,7 @@
'language' => $this->getData(['user', $this->getUser('id'), 'language']), 'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'help' => 'Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.', 'help' => 'Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
'label' => 'Favicon', 'label' => 'Favicon',
'value' => $this->getData(['config', 'favicon']), 'value' => $this->getData(['config', 'favicon'])
'folder' => $this->getData(['config', 'favicon']) ? dirname($this->getData(['config', 'favicon'])) : ''
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
@ -21,8 +26,7 @@
'language' => $this->getData(['user', $this->getUser('id'), 'language']), 'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'help' => 'Sélectionnez une icône adaptée à un thème sombre.<br>Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.', 'help' => 'Sélectionnez une icône adaptée à un thème sombre.<br>Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
'label' => 'Favicon thème sombre', 'label' => 'Favicon thème sombre',
'value' => $this->getData(['config', 'faviconDark']), 'value' => $this->getData(['config', 'faviconDark'])
'folder' => $this->getData(['config', 'faviconDark']) ? dirname($this->getData(['config', 'faviconDark'])) : ''
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
@ -43,8 +47,8 @@
<div class="col6"> <div class="col6">
<?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [ <?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [
'checked' => helper::checkRewrite(), 'checked' => helper::checkRewrite(),
'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web', 'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web',
'disabled' => stripos($_SERVER["SERVER_SOFTWARE"], 'Apache') === false and $module->isModRewriteEnabled() 'disabled' => stripos($_SERVER["SERVER_SOFTWARE"], 'Apache') === false and $module->isModRewriteEnabled()
]); ?> ]); ?>
</div> </div>
</div> </div>
@ -55,6 +59,12 @@
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Mise à jour automatisée'); ?> <h4><?php echo helper::translate('Mise à jour automatisée'); ?>
<!--<span id="updateHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/mise-a-jour" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']);
?>
</a>
</span>-->
</h4> </h4>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
@ -80,8 +90,8 @@
]); ?> ]); ?>
</div> </div>
<div class="col3 offset1 verticalAlignBottom"> <div class="col3 offset1 verticalAlignBottom">
<pre>Version installée : <strong><?php echo common::ZWII_VERSION; ?></strong></pre> <pre>Version installée : <strong><?php echo common::ZWII_VERSION ; ?></strong></pre>
<pre>Version en ligne : <strong><?php echo helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL); ?></strong></pre> <pre>Version en ligne : <strong><?php echo helper::getOnlineVersion(common::ZWII_UPDATE_CHANNEL) ; ?></strong></pre>
</div> </div>
<div class="col3 offset2 verticalAlignBottom"> <div class="col3 offset2 verticalAlignBottom">
<?php echo template::button('configUpdateForced', [ <?php echo template::button('configUpdateForced', [
@ -99,6 +109,12 @@
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Maintenance'); ?> <h4><?php echo helper::translate('Maintenance'); ?>
<!--<span id="maintenanceHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/mode-maintenance" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']);
?>
</a>
</span>-->
</h4> </h4>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
@ -153,6 +169,12 @@
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Scripts externes'); ?> <h4><?php echo helper::translate('Scripts externes'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/scripts-externes" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']);
?>
</a>
</span>-->
</h4> </h4>
<div class="row"> <div class="row">
<div class="col4 offset1 verticalAlignBottom"> <div class="col4 offset1 verticalAlignBottom">
@ -176,21 +198,13 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4>ZwiiCMS <a href="https://zwiicms.fr" target="_blank">Site Web</a> - <a <h4>ZwiiCMS <a href="https://zwiicms.fr" target="_blank">Site Web</a> - <a href="https://forum.zwiicms.fr" target="_blank">Forum</a>
href="https://forum.zwiicms.fr" target="_blank">Forum</a>
</h4> </h4>
<div class="row textAlignCenter"> <div class="row textAlignCenter">
<div class="col12"> <div class="col12">
<a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/"><img <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/"><img alt="Licence Creative Commons" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png" /></a>
alt="Licence Creative Commons" style="border-width:0" <p>Cette œuvre est mise à disposition selon les termes de la <a rel="license" href="http://creativecommons.org/licenses/by-nc-nd/4.0/">Licence Creative Commons Attribution - Pas d&#39;Utilisation Commerciale - Pas de Modification 4.0 International.</a></p>
src="https://i.creativecommons.org/l/by-nc-nd/4.0/88x31.png" /></a> <p>Pour voir une copie de cette licence, visitez http://creativecommons.org/licenses/by-nc-nd/4.0/ ou écrivez à Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.</p>
<p>Cette œuvre est mise à disposition selon les termes de la <a rel="license"
href="http://creativecommons.org/licenses/by-nc-nd/4.0/">Licence Creative Commons
Attribution - Pas d&#39;Utilisation Commerciale - Pas de Modification 4.0
International.</a></p>
<p>Pour voir une copie de cette licence, visitez
http://creativecommons.org/licenses/by-nc-nd/4.0/ ou écrivez à Creative Commons, PO Box
1866, Mountain View, CA 94042, USA.</p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -4,6 +4,11 @@
<div class="block"> <div class="block">
<h4> <h4>
<?php echo helper::translate('Capture d\'écran Open Graph'); ?> <?php echo helper::translate('Capture d\'écran Open Graph'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4> </h4>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
@ -13,30 +18,29 @@
'language' => $this->getData(['user', $this->getUser('id'), 'language']), 'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Image Open Graph', 'label' => 'Image Open Graph',
'value' => $this->getData(['config', 'seo', 'openGraphImage']), 'value' => $this->getData(['config', 'seo', 'openGraphImage']),
'folder' => $this->getData(['config', 'seo', 'openGraphImage']) ? dirname($this->getData(['config', 'seo', 'openGraphImage'])) : '',
'type' => 1, 'type' => 1,
'help' => sprintf('%s : JPG - PNG<br />', helper::translate('Format')) . 'help' => sprintf('%s : JPG - PNG<br />', helper::translate('Format')) .
sprintf('%s : 1200 x 630 pixels<br />', helper::translate('Dimensions minimales')) . sprintf('%s : 1200 x 630 pixels<br />', helper::translate('Dimensions minimales')) .
sprintf('%s : 1.91:1<br />', helper::translate('Ratio')) . sprintf('%s : 1.91:1<br />', helper::translate('Ratio')) .
sprintf('%s : %s, %s<br />', helper::translate('Taille maximale du fichier'), helper::translate('5 Mo pour les images JPEG'), helper::translate('1 Mo pour les images PNG')) sprintf('%s : %s, %s<br />', helper::translate('Taille maximale du fichier'), helper::translate('5 Mo pour les images JPEG'), helper::translate('1 Mo pour les images PNG'))
]); ?> ]); ?>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col10 textAlignCenter"> <div class="col10 textAlignCenter">
<?php if( !empty($module::$imageOpenGraph['type']) ): ?> <?php if( !empty($module::$imageOpenGraph['type']) ): ?>
<p> <p>
<?php echo sprintf('%s : <span id="screenType">%s</span>', helper::translate('Format'), $module::$imageOpenGraph['type']); ?> <?php echo sprintf('%s : <span id="screenType">%s</span>', helper::translate('Format'), $module::$imageOpenGraph['type']); ?>
</p> </p>
<p> <p>
<?php echo sprintf('%s : <span id="screenWide">%s</span> x <span id="screenHeight">%s</span> pixels', helper::translate('Dimensions minimales'), $module::$imageOpenGraph['wide'], $module::$imageOpenGraph['height'] ); ?> <?php echo sprintf('%s : <span id="screenWide">%s</span> x <span id="screenHeight">%s</span> pixels', helper::translate('Dimensions minimales'), $module::$imageOpenGraph['wide'], $module::$imageOpenGraph['height'] ); ?>
</p> </p>
<p> <p>
<?php echo sprintf('%s : <span id="screenRatio">%s</span><span id="screenFract">:1</span>' , helper::translate('Ratio'), round($module::$imageOpenGraph['ratio'], 2)); ?> <?php echo sprintf('%s : <span id="screenRatio">%s</span><span id="screenFract">:1</span>' , helper::translate('Ratio'), round($module::$imageOpenGraph['ratio'], 2)); ?>
</p> </p>
<p> <p>
<?php echo sprintf('%s : <span id="screenWeight">%s</span>', helper::translate('Poids'), $module::$imageOpenGraph['size']); ?> <?php echo sprintf('%s : <span id="screenWeight">%s</span>', helper::translate('Poids'), $module::$imageOpenGraph['size']); ?>
</p> </p>
<?php endif; ?> <?php endif; ?>
</div> </div>
</div> </div>
@ -80,6 +84,12 @@
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4> <h4>
<?php echo helper::translate('Réseaux sociaux'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/reseaux-sociaux" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4> </h4>
<div class="row"> <div class="row">
<div class="col3"> <div class="col3">

View File

@ -179,9 +179,9 @@ class install extends common
} }
// Sauvegarder la configuration du Proxy // Sauvegarder la configuration du Proxy
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')], false); $this->setData(['config', 'proxyType', $this->getInput('installProxyType')]);
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')], false); $this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')]);
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)], false); $this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)]);
// Images exemples livrées dans tous les cas // Images exemples livrées dans tous les cas
try { try {
@ -219,7 +219,7 @@ class install extends common
$this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR); $this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR);
// Fixe l'adresse from pour les envois d'email // Fixe l'adresse from pour les envois d'email
$this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])], false); $this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])]);
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -228,8 +228,6 @@ class install extends common
'state' => true 'state' => true
]); ]);
} }
// Force la sauvegarde
$this->saveDB('config');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -286,7 +284,7 @@ class install extends common
'display' => self::DISPLAY_JSON, 'display' => self::DISPLAY_JSON,
'content' => [ 'content' => [
'success' => $success, 'success' => $success,
'data' => $message 'data' => $success ? null : json_encode($message, JSON_UNESCAPED_UNICODE)
] ]
]); ]);
break; break;
@ -319,7 +317,7 @@ class install extends common
'display' => self::DISPLAY_JSON, 'display' => self::DISPLAY_JSON,
'content' => [ 'content' => [
'success' => $success, 'success' => $success,
'data' => $message 'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
] ]
]); ]);
break; break;
@ -362,7 +360,7 @@ class install extends common
'display' => self::DISPLAY_JSON, 'display' => self::DISPLAY_JSON,
'content' => [ 'content' => [
'success' => $success, 'success' => $success,
'data' => $message, 'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
] ]
]); ]);
break; break;
@ -434,13 +432,12 @@ class install extends common
if (!empty($message)) { if (!empty($message)) {
$this->saveLog($message); $this->saveLog($message);
} }
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'display' => self::DISPLAY_JSON, 'display' => self::DISPLAY_JSON,
'content' => [ 'content' => [
'success' => $success, 'success' => $success,
'data' => $message 'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
] ]
]); ]);
} }

View File

@ -1,12 +1,6 @@
function step(i, data) { function step(i, data) {
var errors = [ var errors = ["<?php echo helper::translate('Préparation de la mise à jour'); ?>", "<?php echo helper::translate('Téléchargement et validation de l\'archive'); ?>", "<?php echo helper::translate('Installation'); ?>", "<?php echo helper::translate('Configuration'); ?>"];
"<?php echo helper::translate('Préparation de la mise à jour'); ?>", $(".installUpdateProgressText").hide(), $(".installUpdateProgressText[data-id=" + i + "]").show();
"<?php echo helper::translate('Téléchargement et validation de l\'archive'); ?>",
"<?php echo helper::translate('Installation'); ?>",
"<?php echo helper::translate('Configuration'); ?>"
];
$(".installUpdateProgressText").hide();
$(".installUpdateProgressText[data-id=" + i + "]").show();
$("body").css("cursor", "wait"); $("body").css("cursor", "wait");
@ -18,7 +12,7 @@ function step(i, data) {
data: data data: data
}, },
success: function (result) { success: function (result) {
setTimeout(function () { setTimeout((function () {
if (4 === i) { if (4 === i) {
$("#installUpdateSuccess").show(); $("#installUpdateSuccess").show();
$("body").css("cursor", "default"); $("body").css("cursor", "default");
@ -27,21 +21,15 @@ function step(i, data) {
} else { } else {
step(i + 1, result.data); step(i + 1, result.data);
} }
}, 2000); }), 2e3)
}, },
error: function (xhr) { error: function (xhr) {
// Balance tout dans la console
console.log(i); console.log(i);
console.log(xhr.responseText); console.log(xhr.responseText);
console.log(errors); console.log(errors);
// Appel de la fonction de gestion d'erreur
// Vérification du code d'erreur HTTP pour gérer la déconnexion showError(i, xhr.responseText, errors);
if (xhr.status === 401 || xhr.status === 403) {
alert("Votre session a expiré. Veuillez vous reconnecter.");
window.location.href = "?user/login"; // Redirige vers la page de connexion
} else {
// Appel de la fonction de gestion d'erreur
showError(i, xhr.responseText, errors);
}
} }
}); });
} }
@ -59,33 +47,23 @@ function showError(step, message, errors) {
// Trouver la position du premier "{" pour repérer le début du tableau // Trouver la position du premier "{" pour repérer le début du tableau
const startOfArray = message.indexOf('{'); const startOfArray = message.indexOf('{');
if (startOfArray !== -1 && startOfArray > 0) { // Extraire le message du warning jusqu'au début du tableau
// Extraire le message du warning jusqu'au début du tableau const warningMessage = message.substring(0, startOfArray).trim();
const warningMessage = message.substring(0, startOfArray).trim();
// Extraire le tableau JSON entre les accolades // Extraire le tableau JSON entre les accolades
const jsonString = message.substring(startOfArray); const jsonString = message.substring(startOfArray);
const jsonData = JSON.parse(jsonString);
try { // Afficher les résultats
const jsonData = JSON.parse(jsonString); if (jsonData) {
$("#installUpdateErrorMessage").html("<strong>Détails de l'erreur :</strong><br> " +
// Afficher les résultats si le parsing JSON est réussi jsonData.data.replace(/^"(.*)"$/, '$1') +
if (jsonData) { "<br>" +
$("#installUpdateErrorMessage").html("<strong>Détails de l'erreur :</strong><br> " + warningMessage.replace(/<[^p].*?>/g, ""));
jsonData.data.replace(/^"(.*)"$/, '$1') +
"<br>" +
warningMessage.replace(/<[^p].*?>/g, ""));
}
} catch (e) {
// Afficher un message générique en cas d'erreur de parsing
console.error("Erreur de parsing JSON : ", e);
$("#installUpdateErrorMessage").html("Une erreur inattendue est survenue lors du traitement des détails de l'erreur.");
}
} else {
// Si pas de JSON détecté, afficher le message brut
$("#installUpdateErrorMessage").html("Message d'erreur : " + message);
} }
} else { } else {
// Vous pouvez également faire quelque chose d'autre ici, par exemple, afficher un message à l'utilisateur, etc.
$("#installUpdateErrorMessage").html(message); $("#installUpdateErrorMessage").html(message);
} }
} }

View File

@ -23,8 +23,7 @@ class page extends common
'edit' => self::GROUP_EDITOR, 'edit' => self::GROUP_EDITOR,
'duplicate' => self::GROUP_EDITOR, 'duplicate' => self::GROUP_EDITOR,
'jsEditor' => self::GROUP_EDITOR, 'jsEditor' => self::GROUP_EDITOR,
'cssEditor' => self::GROUP_EDITOR, 'cssEditor' => self::GROUP_EDITOR
'register' => self::GROUP_EDITOR,
]; ];
public static $pagesNoParentId = [ public static $pagesNoParentId = [
'' => 'Aucune' '' => 'Aucune'
@ -119,16 +118,14 @@ class page extends common
$page $page
]); ]);
// Ecriture // Ecriture
$this->setData(['page', $pageId, $data], false); $this->setData(['page', $pageId, $data]);
$notification = helper::translate('Page dupliquée'); $notification = helper::translate('Page dupliquée');
// Duplication du module présent // Duplication du module présent
if ($this->getData(['page', $page, 'moduleId'])) { if ($this->getData(['page', $page, 'moduleId'])) {
$data = $this->getData(['module', $page]); $data = $this->getData(['module', $page]);
$this->setData(['module', $pageId, $data], false); $this->setData(['module', $pageId, $data]);
$notification = helper::translate('Page et module dupliqués'); $notification = helper::translate('Page et module dupliqués');
} }
// Force la sauvegarde
$this->saveDB('page');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -384,13 +381,11 @@ class page extends common
$pageId = helper::increment($pageId, self::$moduleIds); $pageId = helper::increment($pageId, self::$moduleIds);
// Met à jour les enfants // Met à jour les enfants
foreach ($this->getHierarchy($this->getUrl(2), null) as $childrenPageId) { foreach ($this->getHierarchy($this->getUrl(2), null) as $childrenPageId) {
$this->setData(['page', $childrenPageId, 'parentPageId', $pageId], false); $this->setData(['page', $childrenPageId, 'parentPageId', $pageId]);
} }
// Force la sauvegarde
$this->saveDB('page');
// Change l'id de page dans les données des modules // Change l'id de page dans les données des modules
if ($this->getData(['module', $this->getUrl(2)]) !== null) { if ($this->getData(['module', $this->getUrl(2)]) !== null) {
$this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])], false); $this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])]);
$this->deleteData(['module', $this->getUrl(2)]); $this->deleteData(['module', $this->getUrl(2)]);
// Renommer le dossier du module // Renommer le dossier du module
$moduleId = $this->getData(['page', $this->getUrl(2), 'moduleId']); $moduleId = $this->getData(['page', $this->getUrl(2), 'moduleId']);
@ -401,10 +396,8 @@ class page extends common
copy($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2), $modulesData[$moduleId]['dataDirectory'] . $pageId); copy($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2), $modulesData[$moduleId]['dataDirectory'] . $pageId);
$this->deleteDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2)); $this->deleteDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2));
// Mettre à jour le nom de la feuille de style // Mettre à jour le nom de la feuille de style
$this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId], false); $this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId]);
} }
// Force la sauvegarde
$this->saveDB('module');
} }
// Si la page correspond à la page d'accueil, change l'id dans la configuration du site // Si la page correspond à la page d'accueil, change l'id dans la configuration du site
if ($this->getData(['locale', 'homePageId']) === $this->getUrl(2)) { if ($this->getData(['locale', 'homePageId']) === $this->getUrl(2)) {
@ -424,22 +417,20 @@ class page extends common
} }
// Traitement des pages spéciales affectées dans la config : // Traitement des pages spéciales affectées dans la config :
if ($this->getUrl(2) === $this->getData(['locale', 'legalPageId'])) { if ($this->getUrl(2) === $this->getData(['locale', 'legalPageId'])) {
$this->setData(['locale', 'legalPageId', $pageId], false); $this->setData(['locale', 'legalPageId', $pageId]);
} }
if ($this->getUrl(2) === $this->getData(['locale', 'searchPageId'])) { if ($this->getUrl(2) === $this->getData(['locale', 'searchPageId'])) {
$this->setData(['locale', 'searchPageId', $pageId], false); $this->setData(['locale', 'searchPageId', $pageId]);
} }
if ($this->getUrl(2) === $this->getData(['locale', 'page404'])) { if ($this->getUrl(2) === $this->getData(['locale', 'page404'])) {
$this->setData(['locale', 'page404', $pageId], false); $this->setData(['locale', 'page404', $pageId]);
} }
if ($this->getUrl(2) === $this->getData(['locale', 'page403'])) { if ($this->getUrl(2) === $this->getData(['locale', 'page403'])) {
$this->setData(['locale', 'page403', $pageId], false); $this->setData(['locale', 'page403', $pageId]);
} }
if ($this->getUrl(2) === $this->getData(['locale', 'page302'])) { if ($this->getUrl(2) === $this->getData(['locale', 'page302'])) {
$this->setData(['locale', 'page302', $pageId], false); $this->setData(['locale', 'page302', $pageId]);
} }
// Force la sauvegarde
$this->saveDB('locale');
// Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents // Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents
$lastPosition = 1; $lastPosition = 1;
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy()); $hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
@ -458,7 +449,7 @@ class page extends common
$lastPosition++; $lastPosition++;
} }
// Change la position // Change la position
$this->setData(['page', $hierarchyPageId, 'position', $lastPosition], false); $this->setData(['page', $hierarchyPageId, 'position', $lastPosition]);
// Incrémente pour la prochaine position // Incrémente pour la prochaine position
$lastPosition++; $lastPosition++;
} }
@ -483,28 +474,26 @@ class page extends common
) { ) {
foreach ($this->getHierarchy($pageId) as $parentId => $childId) { foreach ($this->getHierarchy($pageId) as $parentId => $childId) {
if ($this->getData(['page', $childId, 'parentPageId']) === $pageId) { if ($this->getData(['page', $childId, 'parentPageId']) === $pageId) {
$this->setData(['page', $childId, 'position', 0], false); $this->setData(['page', $childId, 'position', 0]);
} }
} }
// Force la sauvegarde
$this->saveDB('page');
} }
// La page est une barre latérale qui a été renommée : changer le nom de la barre dans les pages qui l'utilisent // La page est une barre latérale qui a été renommée : changer le nom de la barre dans les pages qui l'utilisent
if ($this->getinput('pageEditBlock') === 'bar') { if ($this->getinput('pageEditBlock') === 'bar') {
foreach ($this->getHierarchy() as $eachPageId => $parentId) { foreach ($this->getHierarchy() as $eachPageId => $parentId) {
if ($this->getData(['page', $eachPageId, 'barRight']) === $this->getUrl(2)) { if ($this->getData(['page', $eachPageId, 'barRight']) === $this->getUrl(2)) {
$this->setData(['page', $eachPageId, 'barRight', $pageId], false); $this->setData(['page', $eachPageId, 'barRight', $pageId]);
} }
if ($this->getData(['page', $eachPageId, 'barLeft']) === $this->getUrl(2)) { if ($this->getData(['page', $eachPageId, 'barLeft']) === $this->getUrl(2)) {
$this->setData(['page', $eachPageId, 'barLeft', $pageId], false); $this->setData(['page', $eachPageId, 'barLeft', $pageId]);
} }
foreach ($parentId as $childId) { foreach ($parentId as $childId) {
if ($this->getData(['page', $childId, 'barRight']) === $this->getUrl(2)) { if ($this->getData(['page', $childId, 'barRight']) === $this->getUrl(2)) {
$this->setData(['page', $childId, 'barRight', $pageId], false); $this->setData(['page', $childId, 'barRight', $pageId]);
} }
if ($this->getData(['page', $childId, 'barLeft']) === $this->getUrl(2)) { if ($this->getData(['page', $childId, 'barLeft']) === $this->getUrl(2)) {
$this->setData(['page', $childId, 'barLeft', $pageId], false); $this->setData(['page', $childId, 'barLeft', $pageId]);
} }
} }
} }
@ -720,30 +709,9 @@ class page extends common
{ {
$p = $this->getData(['page']); $p = $this->getData(['page']);
$d = array_map(function ($d) { $d = array_map(function ($d) {
unset($d["css"], $d["js"]); unset ($d["css"], $d["js"]);
return $d; return $d;
}, $p); }, $p);
return json_encode($d); return json_encode($d);
} }
/**
* Stocke la variable dans les paramètres de l'utilisateur pour activer la tab à sa prochaine visite
* @return never
*/
public function register(): void
{
$this->setData([
'user',
$this->getUser('id'),
'view',
[
'page' => $this->getUrl(2),
'config' => $this->getData(['user', $this->getUser('id'), 'view', 'config']),
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(3) . '/' . self::$siteContent,
]);
}
} }

View File

@ -15,7 +15,7 @@
/** /**
* Confirmation de suppression * Confirmation de suppression
*/ */
$("#pageEditDelete").on("click", function() { $("#pageEditDelete").on("click", function() {
var _this = $(this); var _this = $(this);
var message_delete = "<?php echo helper::translate('Confirmer la suppression de la page'); ?>"; var message_delete = "<?php echo helper::translate('Confirmer la suppression de la page'); ?>";
return core.confirm(message_delete, function() { return core.confirm(message_delete, function() {
@ -67,19 +67,16 @@ $( document ).ready(function() {
/** /**
* Sélection des onglets * Sélection des onglets
*/ */
var pageLayout = "<?php echo $this->getData(['user', $this->getUser('id'), 'view', 'page']);?>"; var pageLayout = getCookie("pageLayout");
if (pageLayout == null) {
// Non défini, valeur par défaut
if (pageLayout == "") {
pageLayout = "content"; pageLayout = "content";
setCookie("pageLayout", "content");
} }
// Tout cacher
$("#pageEditContentContainer").hide(); $("#pageEditContentContainer").hide();
$("#pageEditExtensionContainer").hide(); $("#pageEditExtensionContainer").hide();
$("#pageEditPositionContainer").hide(); $("#pageEditPositionContainer").hide();
$("#pageEditLayoutContainer").hide(); $("#pageEditLayoutContainer").hide();
$("#pageEditPermissionContainer").hide(); $("#pageEditPermissionContainer").hide();
// Afficher la bonne tab
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Container").show(); $("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Container").show();
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Button").addClass("activeButton"); $("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Button").addClass("activeButton");
@ -298,6 +295,7 @@ $( document ).ready(function() {
$("#PageEditPositionButton").removeClass("activeButton"); $("#PageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton"); $("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton"); $("#pageEditPermissionButton").removeClass("activeButton");
setCookie("pageLayout", "content");
}); });
$("#pageEditExtensionButton").on("click", function () { $("#pageEditExtensionButton").on("click", function () {
$("#pageEditContentContainer").hide(); $("#pageEditContentContainer").hide();
@ -310,6 +308,7 @@ $( document ).ready(function() {
$("#PageEditPositionButton").removeClass("activeButton"); $("#PageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton"); $("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton"); $("#pageEditPermissionButton").removeClass("activeButton");
setCookie("pageLayout", "extension");
}); });
$("#PageEditPositionButton").on("click", function () { $("#PageEditPositionButton").on("click", function () {
$("#pageEditContentContainer").hide(); $("#pageEditContentContainer").hide();
@ -322,6 +321,7 @@ $( document ).ready(function() {
$("#PageEditPositionButton").addClass("activeButton"); $("#PageEditPositionButton").addClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton"); $("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton"); $("#pageEditPermissionButton").removeClass("activeButton");
setCookie("pageLayout", "position");
}); });
$("#pageEditLayoutButton").on("click", function () { $("#pageEditLayoutButton").on("click", function () {
$("#pageEditContentContainer").hide(); $("#pageEditContentContainer").hide();
@ -334,6 +334,7 @@ $( document ).ready(function() {
$("#PageEditPositionButton").removeClass("activeButton"); $("#PageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").addClass("activeButton"); $("#pageEditLayoutButton").addClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton"); $("#pageEditPermissionButton").removeClass("activeButton");
setCookie("pageLayout", "layout");
}); });
$("#pageEditPermissionButton").on("click", function () { $("#pageEditPermissionButton").on("click", function () {
$("#pageEditContentContainer").hide(); $("#pageEditContentContainer").hide();
@ -346,6 +347,7 @@ $( document ).ready(function() {
$("#pageEditPositionButton").removeClass("activeButton"); $("#pageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton"); $("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").addClass("activeButton"); $("#pageEditPermissionButton").addClass("activeButton");
setCookie("pageLayout", "permission");
}); });
/** /**
@ -720,6 +722,30 @@ function buildPagesList(extraPosition) {
positionDOM.val(positionSelected); positionDOM.val(positionSelected);
}; };
/**
* Cookies
*/
function setCookie(name, value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/; samesite=lax";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
// Define function to capitalize the first letter of a string // Define function to capitalize the first letter of a string
function capitalizeFirstLetter(string) { function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1); return string.charAt(0).toUpperCase() + string.slice(1);

View File

@ -7,7 +7,16 @@
'value' => template::ico('left') 'value' => template::ico('left')
]); ?> ]); ?>
</div> </div>
<div class="col1 offset7"> <div class="col1">
<?php /**echo template::button('pageEditHelp', [
'href' => 'https://doc.zwiicms.fr/edition-des-pages',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp',
'help' => 'Consulter l\'aide en ligne'
]); */?>
</div>
<div class="col1 offset6">
<?php echo template::button('pageEditDelete', [ <?php echo template::button('pageEditDelete', [
'class' => 'buttonRed', 'class' => 'buttonRed',
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '/' . self::$siteContent, 'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '/' . self::$siteContent,
@ -17,7 +26,7 @@
</div> </div>
<div class="col1"> <div class="col1">
<?php echo template::button('pageEditDuplicate', [ <?php echo template::button('pageEditDuplicate', [
'href' => helper::baseUrl() . 'page/duplicate/' . $this->getUrl(2) . '/' . self::$siteContent, 'href' => helper::baseUrl() . 'page/edit/' . $this->getUrl(2) . '/' . self::$siteContent,
'value' => template::ico('clone'), 'value' => template::ico('clone'),
'help' => 'Dupliquer la page' 'help' => 'Dupliquer la page'
]); ?> ]); ?>
@ -28,31 +37,27 @@
]); ?> ]); ?>
</div> </div>
</div> </div>
<div class="tab"> <div class="tab">
<?php echo template::button('pageEditContentButton', [ <?php echo template::button('pageEditContentButton', [
'value' => 'Contenu', 'value' => 'Contenu',
'class' => 'buttonTab', 'class' => 'buttonTab'
'href' => helper::baseUrl() . 'page/register/content/' . $this->geturl(2)
]); ?> ]); ?>
<?php echo template::button('pageEditPositionButton', [ <?php echo template::button('PageEditPositionButton', [
'value' => 'Menu', 'value' => 'Menu',
'class' => 'buttonTab', 'class' => 'buttonTab'
'href' => helper::baseUrl() . 'page/register/position/' . $this->geturl(2)
]); ?> ]); ?>
<?php echo template::button('pageEditExtensionButton', [ <?php echo template::button('pageEditExtensionButton', [
'value' => 'Extension', 'value' => 'Extension',
'class' => 'buttonTab', 'class' => 'buttonTab'
'href' => helper::baseUrl() . 'page/register/extension/' . $this->geturl(2)
]); ?> ]); ?>
<?php echo template::button('pageEditLayoutButton', [ <?php echo template::button('pageEditLayoutButton', [
'value' => 'Mise en page', 'value' => 'Mise en page',
'class' => 'buttonTab', 'class' => 'buttonTab'
'href' => helper::baseUrl() . 'page/register/layout/' . $this->geturl(2)
]); ?> ]); ?>
<?php echo template::button('pageEditPermissionButton', [ <?php echo template::button('pageEditPermissionButton', [
'value' => 'Permission', 'value' => 'Permission',
'class' => 'buttonTab', 'class' => 'buttonTab'
'href' => helper::baseUrl() . 'page/register/permission/' . $this->geturl(2)
]); ?> ]); ?>
</div> </div>
@ -62,6 +67,11 @@
<div class="block"> <div class="block">
<h4> <h4>
<?php echo helper::translate('Titres'); ?> <?php echo helper::translate('Titres'); ?>
<!--<span id="infoHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/informations-generales" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4> </h4>
<div class="row"> <div class="row">
<div class="col8"> <div class="col8">
@ -110,6 +120,11 @@
<div class="block"> <div class="block">
<h4> <h4>
<?php echo helper::translate('Emplacement dans le menu'); ?> <?php echo helper::translate('Emplacement dans le menu'); ?>
<!--<span id="positionHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/emplacement-dans-le-menu" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4> </h4>
<div class="blockContainer"> <div class="blockContainer">
<div class="row"> <div class="row">
@ -161,6 +176,11 @@
<div class="block"> <div class="block">
<h4> <h4>
<?php echo helper::translate('Options avancées'); ?> <?php echo helper::translate('Options avancées'); ?>
<!--<span id="advancedHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/options-d-emplacement-avancee" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4> </h4>
<div class="blockContainer"> <div class="blockContainer">
<div class="row"> <div class="row">
@ -175,8 +195,7 @@
'help' => 'Sélectionnez une image ou une icône de petite dimension', 'help' => 'Sélectionnez une image ou une icône de petite dimension',
'language' => $this->getData(['user', $this->getUser('id'), 'language']), 'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Icône', 'label' => 'Icône',
'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl']), 'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl'])
'folder' => $this->getData(['page', $this->getUrl(2), 'iconUrl']) ? dirname($this->getData(['page', $this->getUrl(2), 'iconUrl'])) : '',
]); ?> ]); ?>
</div> </div>
</div> </div>
@ -273,6 +292,11 @@
<div class="block"> <div class="block">
<h4> <h4>
<?php echo helper::translate('Mise en page'); ?> <?php echo helper::translate('Mise en page'); ?>
<!--<span id="layoutHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/mise-en-page-2" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4> </h4>
<div class="blockContainer"> <div class="blockContainer">
<div class="row"> <div class="row">
@ -348,6 +372,11 @@
<div class="block"> <div class="block">
<h4> <h4>
<?php echo helper::translate('Permission et référencement'); ?> <?php echo helper::translate('Permission et référencement'); ?>
<!--<span id="seoHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/permission-et-referencement" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4> </h4>
<div class="blockContainer"> <div class="blockContainer">
<div class="row"> <div class="row">
@ -395,4 +424,5 @@
</div> </div>
</div> </div>
</div> </div>
<?php echo template::formClose(); ?> <?php echo template::formClose(); ?>

View File

@ -22,7 +22,7 @@ class plugin extends common
'delete' => self::GROUP_ADMIN, 'delete' => self::GROUP_ADMIN,
'save' => self::GROUP_ADMIN, 'save' => self::GROUP_ADMIN,
'store' => self::GROUP_ADMIN, 'store' => self::GROUP_ADMIN,
//'item' => self::GROUP_ADMIN, 'item' => self::GROUP_ADMIN,
// détail d'un objet // détail d'un objet
'upload' => self::GROUP_ADMIN, 'upload' => self::GROUP_ADMIN,
// Téléverser catalogue // Téléverser catalogue
@ -330,7 +330,6 @@ class plugin extends common
'state' => $r['success'] 'state' => $r['success']
]); ]);
} }
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => helper::translate('Catalogue de modules'), 'title' => helper::translate('Catalogue de modules'),
@ -412,15 +411,6 @@ class plugin extends common
]); ]);
} }
/**
* Retourne le contenu du store en ligne
* @return mixed
*/
public static function getStore() {
$store = json_decode(helper::getUrlContents(self::BASEURL_STORE . self::MODULE_STORE . 'list'), true);
return $store;
}
/** /**
* Gestion des modules * Gestion des modules
*/ */
@ -566,9 +556,6 @@ class plugin extends common
} }
} }
// Désactive l'icône rouge
$this->setData(['core', 'updateModuleAvailable', false]);
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'title' => helper::translate('Gestion des modules'), 'title' => helper::translate('Gestion des modules'),

View File

@ -419,7 +419,7 @@ class theme extends common
]); ]);
// Sauvegarder la configuration localisée // Sauvegarder la configuration localisée
$this->setData(['locale', 'legalPageId', $this->getInput('configLegalPageId')], false); $this->setData(['locale', 'legalPageId', $this->getInput('configLegalPageId')]);
$this->setData(['locale', 'searchPageId', $this->getInput('configSearchPageId')]); $this->setData(['locale', 'searchPageId', $this->getInput('configSearchPageId')]);
// Valeurs en sortie // Valeurs en sortie
@ -507,23 +507,21 @@ class theme extends common
'featureContent' => $featureContent, 'featureContent' => $featureContent,
'featureFiles' => $files 'featureFiles' => $files
] ]
], false); ]);
// Modification de la position du menu selon la position de la bannière // Modification de la position du menu selon la position de la bannière
if ($this->getData(['theme', 'header', 'position']) == 'site') { if ($this->getData(['theme', 'header', 'position']) == 'site') {
$this->setData(['theme', 'menu', 'position', str_replace('body-', 'site-', $this->getData(['theme', 'menu', 'position']))], false); $this->setData(['theme', 'menu', 'position', str_replace('body-', 'site-', $this->getData(['theme', 'menu', 'position']))]);
} }
if ($this->getData(['theme', 'header', 'position']) == 'body') { if ($this->getData(['theme', 'header', 'position']) == 'body') {
$this->setData(['theme', 'menu', 'position', str_replace('site-', 'body-', $this->getData(['theme', 'menu', 'position']))], false); $this->setData(['theme', 'menu', 'position', str_replace('site-', 'body-', $this->getData(['theme', 'menu', 'position']))]);
} }
// Menu accroché à la bannière qui devient cachée // Menu accroché à la bannière qui devient cachée
if ( if (
$this->getData(['theme', 'header', 'position']) == 'hide' && $this->getData(['theme', 'header', 'position']) == 'hide' &&
in_array($this->getData(['theme', 'menu', 'position']), ['body-first', 'site-first', 'body-first', 'site-second']) in_array($this->getData(['theme', 'menu', 'position']), ['body-first', 'site-first', 'body-first', 'site-second'])
) { ) {
$this->setData(['theme', 'menu', 'position', 'site'], false); $this->setData(['theme', 'menu', 'position', 'site']);
} }
// Force la sauvegarde
$this->saveDB('theme');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'notification' => helper::translate('Modifications enregistrées'), 'notification' => helper::translate('Modifications enregistrées'),
@ -652,7 +650,7 @@ class theme extends common
if (is_array($typeValue)) { if (is_array($typeValue)) {
foreach ($typeValue as $fontId => $fontValue) { foreach ($typeValue as $fontId => $fontValue) {
// Recherche les correspondances // Recherche les correspondances
$result = array_filter($fonts, function ($value) use ($fontId) { $result = array_filter($fonts, function($value) use ($fontId) {
return $value == $fontId; return $value == $fontId;
}); });
$keyResults = array_keys($result); $keyResults = array_keys($result);
@ -848,7 +846,7 @@ class theme extends common
file_exists($this->getData(['font', 'files', $this->getUrl(3), 'resource'])) file_exists($this->getData(['font', 'files', $this->getUrl(3), 'resource']))
) { ) {
unlink($this->getData(['font', 'files', $this->getUrl(3), 'resource'])); unlink($this->getData(['font', 'files', $this->getUrl(3), 'resource']));
} }
// Valeurs en sortie // Valeurs en sortie
@ -923,7 +921,7 @@ class theme extends common
'fontWeight' => $this->getInput('themeTitleFontWeight'), 'fontWeight' => $this->getInput('themeTitleFontWeight'),
'textTransform' => $this->getInput('themeTitleTextTransform') 'textTransform' => $this->getInput('themeTitleTextTransform')
] ]
], false); ]);
$this->setData([ $this->setData([
'theme', 'theme',
'text', 'text',
@ -933,7 +931,7 @@ class theme extends common
'textColor' => $this->getInput('themeTextTextColor'), 'textColor' => $this->getInput('themeTextTextColor'),
'linkColor' => $this->getInput('themeTextLinkColor') 'linkColor' => $this->getInput('themeTextLinkColor')
] ]
], false); ]);
$this->setData([ $this->setData([
'theme', 'theme',
'site', 'site',
@ -944,14 +942,14 @@ class theme extends common
'width' => $this->getInput('themeSiteWidth'), 'width' => $this->getInput('themeSiteWidth'),
'margin' => $this->getInput('themeSiteMargin', helper::FILTER_BOOLEAN) 'margin' => $this->getInput('themeSiteMargin', helper::FILTER_BOOLEAN)
] ]
], false); ]);
$this->setData([ $this->setData([
'theme', 'theme',
'button', 'button',
[ [
'backgroundColor' => $this->getInput('themeButtonBackgroundColor') 'backgroundColor' => $this->getInput('themeButtonBackgroundColor')
] ]
], false); ]);
$this->setData([ $this->setData([
'theme', 'theme',
'block', 'block',
@ -959,9 +957,7 @@ class theme extends common
'backgroundColor' => $this->getInput('themeBlockBackgroundColor'), 'backgroundColor' => $this->getInput('themeBlockBackgroundColor'),
'borderColor' => $this->getInput('themeBlockBorderColor') 'borderColor' => $this->getInput('themeBlockBorderColor')
] ]
], false); ]);
// Force la sauvegarde
$this->saveDB('theme');
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'notification' => helper::translate('Modifications enregistrées'), 'notification' => helper::translate('Modifications enregistrées'),

View File

@ -7,7 +7,15 @@
'value' => template::ico('left') 'value' => template::ico('left')
]); ?> ]); ?>
</div> </div>
<div class="col2 offset9"> <div class="col1">
<?php /* echo template::button('themeBodyHelp', [
'href' => 'https://doc.zwiicms.fr/arriere-plan',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); */ ?>
</div>
<div class="col2 offset8">
<?php echo template::submit('themeBodySubmit'); ?> <?php echo template::submit('themeBodySubmit'); ?>
</div> </div>
</div> </div>
@ -27,7 +35,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
<?php echo template::text('themeBodyToTopColor', [ <?php echo template::text('themeBodyToTopColor', [
'class' => 'colorPicker', 'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.', 'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Couleur icône haut de page', 'label' => 'Couleur icône haut de page',
@ -60,8 +68,7 @@
'language' => $this->getData(['user', $this->getUser('id'), 'language']), 'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Arrière plan', 'label' => 'Arrière plan',
'type' => 1, 'type' => 1,
'value' => $imageFile, 'value' => $imageFile
'folder' => $imageFile ? dirname($imageFile) : ''
]); ?> ]); ?>
</div> </div>
</div> </div>

View File

@ -20,7 +20,6 @@ $('#dataTables').DataTable({
}, },
locale: 'fr', locale: 'fr',
stateSave: true, stateSave: true,
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "Tout"]],
"columnDefs": [{ "columnDefs": [{
target: 5, target: 5,
orderable: false, orderable: false,

View File

@ -7,7 +7,15 @@
'value' => template::ico('left') 'value' => template::ico('left')
]); ?> ]); ?>
</div> </div>
<div class="col2 offset9"> <div class="col1">
<?php /* echo template::button('themeHeaderHelp', [
'href' => 'https://doc.zwiicms.fr/banniere',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); */?>
</div>
<div class="col2 offset8">
<?php echo template::submit('themeHeaderSubmit'); ?> <?php echo template::submit('themeHeaderSubmit'); ?>
</div> </div>
</div> </div>
@ -150,17 +158,13 @@
'label' => 'Image', 'label' => 'Image',
'language' => $this->getData(['user', $this->getUser('id'), 'language']), 'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'type' => 1, 'type' => 1,
'value' => $imageFile, 'value' => $imageFile
'folder' => $imageFile ? dirname($imageFile) : ''
]); ]);
?> ?>
<span class="themeHeaderImageOptions displayNone" id="themeHeaderImageInfo"> <span class="themeHeaderImageOptions displayNone" id="themeHeaderImageInfo">
<?php echo helper::translate('Largeur de l\'image'); ?> <span id="themeHeaderImageWidth"></span> <?php echo helper::translate('Largeur de l\'image'); ?> <span id="themeHeaderImageWidth"></span> ; <?php echo helper::translate('Largeur du site :'); ?> <?php echo $this->getData(['theme', 'site', 'width']); ?>
; <?php echo helper::translate('Largeur du site :'); ?>
<?php echo $this->getData(['theme', 'site', 'width']); ?>
| |
<?php echo helper::translate('Hauteur de l\'image'); ?> <span <?php echo helper::translate('Hauteur de l\'image'); ?> <span id="themeHeaderImageHeight"></span>
id="themeHeaderImageHeight"></span>
| |
<?php echo helper::translate('Ratio'); ?> <span id="themeHeaderImageRatio"></span> <?php echo helper::translate('Ratio'); ?> <span id="themeHeaderImageRatio"></span>
</span> </span>

View File

@ -7,15 +7,22 @@
'value' => template::ico('left') 'value' => template::ico('left')
]); ?> ]); ?>
</div> </div>
<div class="col2 offset9"> <div class="col1">
<?php /* echo template::button('themeMenuHelp', [
'href' => 'https://doc.zwiicms.fr/menu',
'target' => '_blank',
'value' => template::ico('help'),
'class' => 'buttonHelp'
]); */?>
</div>
<div class="col2 offset8">
<?php echo template::submit('themeMenuSubmit'); ?> <?php echo template::submit('themeMenuSubmit'); ?>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4> <h4><?php echo helper::translate('Paramètres'); ?>
<?php echo helper::translate('Paramètres'); ?>
</h4> </h4>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
@ -77,8 +84,7 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4> <h4><?php echo helper::translate('Contenu'); ?>
<?php echo helper::translate('Contenu'); ?>
</h4> </h4>
<div class="row"> <div class="row">
<div class="col3"> <div class="col3">
@ -106,8 +112,7 @@
'language' => $this->getData(['user', $this->getUser('id'), 'language']), 'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Logo du menu burger', 'label' => 'Logo du menu burger',
'type' => 1, 'type' => 1,
'value' => $imageFile, 'value' => $imageFile
'folder' => $imageFile ? dirname($imageFile) : ''
]); ]);
?> ?>
</div> </div>
@ -118,8 +123,7 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4> <h4><?php echo helper::translate('Couleurs'); ?>
<?php echo helper::translate('Couleurs'); ?>
</h4> </h4>
<div class="row"> <div class="row">
<div class="col4"> <div class="col4">
@ -160,7 +164,7 @@
<?php <?php
echo template::checkbox('themeMenuActiveColorAuto', true, 'Couleur de fond automatique', [ echo template::checkbox('themeMenuActiveColorAuto', true, 'Couleur de fond automatique', [
'checked' => $this->getData(['theme', 'menu', 'activeColorAuto']), 'checked' => $this->getData(['theme', 'menu', 'activeColorAuto']),
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
<?php echo template::text('themeMenuActiveColor', [ <?php echo template::text('themeMenuActiveColor', [
@ -177,8 +181,7 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4> <h4><?php echo helper::translate('Mise en forme du texte'); ?>
<?php echo helper::translate('Mise en forme du texte'); ?>
</h4> </h4>
<div class="row"> <div class="row">
<div class="col3"> <div class="col3">

View File

@ -345,7 +345,6 @@ class user extends common
'files' => $this->getInput('userEditFiles', helper::FILTER_BOOLEAN), 'files' => $this->getInput('userEditFiles', helper::FILTER_BOOLEAN),
'language' => $this->getInput('userEditLanguage', helper::FILTER_STRING_SHORT), 'language' => $this->getInput('userEditLanguage', helper::FILTER_STRING_SHORT),
'tags' => $this->getInput('userEditTags', helper::FILTER_STRING_SHORT), 'tags' => $this->getInput('userEditTags', helper::FILTER_STRING_SHORT),
'authKey' => $this->getData(['user', $this->getUrl(2), 'authKey']),
] ]
]); ]);
// Redirection spécifique si l'utilisateur change son mot de passe // Redirection spécifique si l'utilisateur change son mot de passe
@ -416,7 +415,7 @@ class user extends common
// Enregistre la date de la demande dans le compte utilisateur // Enregistre la date de la demande dans le compte utilisateur
$this->setData(['user', $userId, 'forgot', time()]); $this->setData(['user', $userId, 'forgot', time()]);
// Crée un id unique pour la réinitialisation // Crée un id unique pour la réinitialisation
$uniqId = md5(json_encode($this->getData(['user', $userId, 'forgot']))); $uniqId = md5(json_encode($this->getData(['user', $userId])));
// Envoi le mail // Envoi le mail
$sent = $this->sendMail( $sent = $this->sendMail(
$this->getData(['user', $userId, 'mail']), $this->getData(['user', $userId, 'mail']),
@ -1031,8 +1030,8 @@ class user extends common
$this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time() $this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time()
and $this->getData(['user', $userId, 'connectFail']) === $this->getData(['config', 'connect', 'attempt']) and $this->getData(['user', $userId, 'connectFail']) === $this->getData(['config', 'connect', 'attempt'])
) { ) {
$this->setData(['user', $userId, 'connectFail', 0], false); $this->setData(['user', $userId, 'connectFail', 0]);
$this->setData(['user', $userId, 'connectTimeout', 0], false); $this->setData(['user', $userId, 'connectTimeout', 0]);
} }
// Check la présence des variables et contrôle du blocage du compte si valeurs dépassées // Check la présence des variables et contrôle du blocage du compte si valeurs dépassées
// Vérification du mot de passe et du groupe // Vérification du mot de passe et du groupe
@ -1044,12 +1043,8 @@ class user extends common
and $captcha === true and $captcha === true
) { ) {
// RAZ // RAZ
$this->setData(['user', $userId, 'connectFail', 0], false); $this->setData(['user', $userId, 'connectFail', 0]);
$this->setData(['user', $userId, 'connectTimeout', 0], false); $this->setData(['user', $userId, 'connectTimeout', 0]);
// Clé d'authenfication
$authKey = uniqid('', true) . bin2hex(random_bytes(8));
$this->setData(['user', $userId, 'authKey', $authKey]);
// Validité du cookie // Validité du cookie
$expire = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN) === true ? strtotime("+1 year") : 0; $expire = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN) === true ? strtotime("+1 year") : 0;
@ -1057,23 +1052,17 @@ class user extends common
case false: case false:
// Cookie de session // Cookie de session
setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true);
//setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false), '', helper::isHttps(), true);
// Connexion par clé
setcookie('ZWII_AUTH_KEY', $authKey, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true);
break; break;
default: default:
// Cookie persistant // Cookie persistant
setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false)); setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false));
//setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false)); setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false));
// Connexion par clé
setcookie('ZWII_AUTH_KEY', $authKey, $expire, helper::baseUrl(false, false));
break; break;
} }
// Accès multiples avec le même compte // Accès multiples avec le même compte
$this->setData(['user', $userId, 'accessCsrf', $_SESSION['csrf']], false); $this->setData(['user', $userId, 'accessCsrf', $_SESSION['csrf']]);
// Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur // Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur
if ( if (
$this->getData(['config', 'maintenance']) $this->getData(['config', 'maintenance'])
@ -1106,12 +1095,12 @@ class user extends common
$notification = helper::translate('Captcha, identifiant ou mot de passe incorrects'); $notification = helper::translate('Captcha, identifiant ou mot de passe incorrects');
$logStatus = $captcha === true ? 'Erreur de mot de passe' : 'Erreur de captcha'; $logStatus = $captcha === true ? 'Erreur de mot de passe' : 'Erreur de captcha';
// Cas 1 le nombre de connexions est inférieur aux tentatives autorisées : incrément compteur d'échec // Cas 1 le nombre de connexions est inférieur aux tentatives autorisées : incrément compteur d'échec
if ($this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt'], false)) { if ($this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt'])) {
$this->setData(['user', $userId, 'connectFail', $this->getdata(['user', $userId, 'connectFail']) + 1], false); $this->setData(['user', $userId, 'connectFail', $this->getdata(['user', $userId, 'connectFail']) + 1]);
} }
// Cas 2 la limite du nombre de connexion est atteinte : placer le timer // Cas 2 la limite du nombre de connexion est atteinte : placer le timer
if ($this->getdata(['user', $userId, 'connectFail']) == $this->getData(['config', 'connect', 'attempt'])) { if ($this->getdata(['user', $userId, 'connectFail']) == $this->getData(['config', 'connect', 'attempt'])) {
$this->setData(['user', $userId, 'connectTimeout', time()], false); $this->setData(['user', $userId, 'connectTimeout', time()]);
} }
// Cas 3 le délai de bloquage court // Cas 3 le délai de bloquage court
if ($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) > time()) { if ($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) > time()) {
@ -1124,8 +1113,6 @@ class user extends common
]); ]);
} }
} }
// Force la sauvegarde
$this->saveDB('user');
} }
// Journalisation // Journalisation
$this->saveLog($logStatus); $this->saveLog($logStatus);
@ -1149,8 +1136,7 @@ class user extends common
public function logout() public function logout()
{ {
helper::deleteCookie('ZWII_USER_ID'); helper::deleteCookie('ZWII_USER_ID');
//helper::deleteCookie('ZWII_USER_PASSWORD'); helper::deleteCookie('ZWII_USER_PASSWORD');
helper::deleteCookie('ZWII_AUTH_KEY');
// Détruit la session // Détruit la session
session_destroy(); session_destroy();
@ -1204,11 +1190,11 @@ class user extends common
$newPassword = $this->getInput('userResetNewPassword', helper::FILTER_PASSWORD, true); $newPassword = $this->getInput('userResetNewPassword', helper::FILTER_PASSWORD, true);
} }
// Modifie le mot de passe // Modifie le mot de passe
$this->setData(['user', $this->getUrl(2), 'password', $newPassword], false); $this->setData(['user', $this->getUrl(2), 'password', $newPassword]);
// Réinitialise la date de la demande // Réinitialise la date de la demande
$this->setData(['user', $this->getUrl(2), 'forgot', 0], false); $this->setData(['user', $this->getUrl(2), 'forgot', 0]);
// Réinitialise le blocage // Réinitialise le blocage
$this->setData(['user', $this->getUrl(2), 'connectFail', 0], false); $this->setData(['user', $this->getUrl(2), 'connectFail', 0]);
$this->setData(['user', $this->getUrl(2), 'connectTimeout', 0]); $this->setData(['user', $this->getUrl(2), 'connectTimeout', 0]);
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -1323,7 +1309,7 @@ class user extends common
"accessCsrf" => null, "accessCsrf" => null,
'tags' => $item['tags'] 'tags' => $item['tags']
] ]
], false); ]);
// Icône de notification // Icône de notification
$item['notification'] = $create ? template::ico('check') : template::ico('cancel'); $item['notification'] = $create ? template::ico('check') : template::ico('cancel');
// Envoi du mail // Envoi du mail
@ -1364,8 +1350,6 @@ class user extends common
} }
} }
// Force la sauvegarde
$this->saveDB('user');
if (empty(self::$users)) { if (empty(self::$users)) {
$notification = helper::translate('Rien à importer, erreur de format ou fichier incorrect'); $notification = helper::translate('Rien à importer, erreur de format ou fichier incorrect');
$success = false; $success = false;

View File

@ -16,4 +16,3 @@
/** NE PAS EFFACER /** NE PAS EFFACER
* admin.css * admin.css
*/ */

View File

@ -29,7 +29,6 @@ $(document).ready((function () {
}, },
locale: 'fr', locale: 'fr',
stateSave: true, stateSave: true,
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "Tout"]],
"columnDefs": [ "columnDefs": [
{ {
target: 5, target: 5,

View File

@ -1,13 +0,0 @@
.dataTables_length {
margin-bottom: 10px;
width: 250px;
}
.dataTables_length label {
float: left;
}
.dataTables_length select {
margin-left: 5px;
width: 80px;
}

View File

@ -1,7 +1,7 @@
{ {
"processing": "Traitement en cours...", "processing": "Traitement en cours...",
"search": "Rechercher&nbsp;:", "search": "Rechercher&nbsp;:",
"lengthMenu": "&Eacute;l&eacute;ments par page&nbsp;:&nbsp;_MENU_", "lengthMenu": "&Eacute;l&eacute;ments par page _MENU_",
"info": "Affichage de l'&eacute;lement _START_ &agrave; _END_ sur _TOTAL_ &eacute;l&eacute;ments", "info": "Affichage de l'&eacute;lement _START_ &agrave; _END_ sur _TOTAL_ &eacute;l&eacute;ments",
"infoEmpty": "Affichage de l'&eacute;lement 0 &agrave; 0 sur 0 &eacute;l&eacute;ments", "infoEmpty": "Affichage de l'&eacute;lement 0 &agrave; 0 sur 0 &eacute;l&eacute;ments",
"infoFiltered": "(filtr&eacute; de _MAX_ &eacute;l&eacute;ments au total)", "infoFiltered": "(filtr&eacute; de _MAX_ &eacute;l&eacute;ments au total)",

View File

@ -1,5 +1,4 @@
[ [
"datatables.min.js", "datatables.min.js",
"datatables.min.css", "datatables.min.css"
"datatables.custom.css"
] ]

View File

@ -1505,9 +1505,9 @@ class UploadHandler
$magicianObj -> saveImage($targetFile); $magicianObj -> saveImage($targetFile);
} }
$newWidth = 640;
$newHeight = 480;
$thumbResult = create_img($targetFile, $targetFileThumb, $newWidth, $newHeight); $thumbResult = create_img($targetFile, $targetFileThumb, 122, 91);
if ( $thumbResult!==true) if ( $thumbResult!==true)
{ {

View File

@ -591,7 +591,7 @@ $config = array(
// path_from_filemanager/test/test1/ // path_from_filemanager/test/test1/
// PS if there isn't write permission in your destination folder you must set it // PS if there isn't write permission in your destination folder you must set it
// //
'fixed_image_creation' => false, 'fixed_image_creation' => true,
//activate or not the creation of one or more image resized with fixed path from filemanager folder //activate or not the creation of one or more image resized with fixed path from filemanager folder
'fixed_path_from_filemanager' => array('../../../site/file/thumb/'), 'fixed_path_from_filemanager' => array('../../../site/file/thumb/'),
//fixed path of the image folder from the current position on upload folder //fixed path of the image folder from the current position on upload folder

View File

@ -59,12 +59,12 @@ if (checkRelativePath($subdir_path)) {
} }
if ($subdir == "") { if ($subdir == "") {
if (!empty($_COOKIE['ZWII_RFM_FOLDER']) && strpos($_COOKIE['ZWII_RFM_FOLDER'], '.') === false) { if (!empty($_COOKIE['last_position']) && strpos($_COOKIE['last_position'], '.') === false) {
$subdir = trim($_COOKIE['ZWII_RFM_FOLDER']); $subdir = trim($_COOKIE['last_position']);
} }
} }
//remember last position //remember last position
setcookie('ZWII_RFM_FOLDER', $subdir, time() + (86400 * 7)); setcookie('last_position', $subdir, time() + (86400 * 7));
if ($subdir == "/") { if ($subdir == "/") {
$subdir = ""; $subdir = "";

View File

@ -19,31 +19,6 @@
*/ */
// Remplace la directive htaccess // Remplace la directive htaccess
ini_set('session.use_trans_sid', FALSE); ini_set('session.use_trans_sid', FALSE);
// Crée un identifiant unique pour chaque site en fonction du nom de domaine ou autre
$siteId = md5($_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_FILENAME']); // Ou utilise un autre identifiant unique pour chaque site
// Change le nom de la session en fonction de cet identifiant
session_name('zwii_session_' . $siteId);
// Récupère dynamiquement le chemin du dossier dans lequel le script est exécuté
$scriptPath = dirname($_SERVER['SCRIPT_NAME']);
// Si le chemin est vide (ce qui peut arriver si le site est à la racine), définis-le comme '/'
if ($scriptPath === '/' || $scriptPath === '\\' || $scriptPath === '.') {
$scriptPath = '/';
}
// Définissez le chemin du cookie de session dynamiquement
session_set_cookie_params([
'lifetime' => 0,
'path' => $scriptPath, // Utilise le chemin du script pour restreindre la session à ce répertoire
'domain' => $_SERVER['SERVER_NAME'], // Domaine par défaut
'secure' => isset($_SERVER['HTTPS']), // Pour HTTPS, si nécessaire
'httponly' => true,
'samesite' => 'Lax' // Ou 'Strict' ou 'None' selon tes besoins
]);
// Démarre la session // Démarre la session
session_start(); session_start();

View File

@ -16,7 +16,7 @@
class blog extends common class blog extends common
{ {
const VERSION = '8.0'; const VERSION = '7.10';
const REALNAME = 'Blog'; const REALNAME = 'Blog';
const DELETE = true; const DELETE = true;
const UPDATE = '0.0'; const UPDATE = '0.0';
@ -42,6 +42,9 @@ class blog extends common
public static $articles = []; public static $articles = [];
// Signature de l'article
public static $articleSignature = '';
// Signature du commentaire // Signature du commentaire
public static $editCommentSignature = ''; public static $editCommentSignature = '';
@ -171,13 +174,10 @@ class blog extends common
$this->setData(['module', $this->getUrl(0), 'config', 'timeFormat', '%H:%M']); $this->setData(['module', $this->getUrl(0), 'config', 'timeFormat', '%H:%M']);
$this->setData(['module', $this->getUrl(0), 'config', 'versionData', '6.5']); $this->setData(['module', $this->getUrl(0), 'config', 'versionData', '6.5']);
} }
// Version 8.0 // Version 7.4
if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '8.0', '<')) { if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '7.4', '<')) {
$this->setData(['module', $this->getUrl(0), 'config', 'buttonBack', true]); $this->setData(['module', $this->getUrl(0), 'config', 'buttonBack', true]);
$this->setData(['module', $this->getUrl(0), 'config', 'showTime', true]); $this->setData(['module', $this->getUrl(0), 'config', 'versionData', '7.4']);
$this->setData(['module', $this->getUrl(0), 'config', 'showDate', true]);
$this->setData(['module', $this->getUrl(0), 'config', 'showPseudo', true]);
$this->setData(['module', $this->getUrl(0), 'config', 'versionData', '8.0']);
} }
} }
@ -578,10 +578,7 @@ class blog extends common
'itemsperPage' => $this->getInput('blogOptionItemsperPage', helper::FILTER_INT, true), 'itemsperPage' => $this->getInput('blogOptionItemsperPage', helper::FILTER_INT, true),
'dateFormat' => $this->getInput('blogOptionDateFormat'), 'dateFormat' => $this->getInput('blogOptionDateFormat'),
'timeFormat' => $this->getInput('blogOptionTimeFormat'), 'timeFormat' => $this->getInput('blogOptionTimeFormat'),
'buttonBack' => $this->getInput('blogOptionButtonBack', helper::FILTER_BOOLEAN), 'buttonBack' => $this->getInput('newsOptionButtonBack'),
'showDate' => $this->getInput('blogOptionShowDate', helper::FILTER_BOOLEAN),
'showTime' => $this->getInput('blogOptionShowTime', helper::FILTER_BOOLEAN),
'showPseudo' => $this->getInput('blogOptionShowPseudo', helper::FILTER_BOOLEAN),
'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']),
] ]
]); ]);
@ -599,6 +596,7 @@ class blog extends common
]); ]);
} }
/** /**
* Suppression * Suppression
*/ */
@ -751,7 +749,7 @@ class blog extends common
) { ) {
// Check la captcha // Check la captcha
if ( if (
$this->isConnected() === false $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
//AND $this->getInput('blogArticlecaptcha', helper::FILTER_INT) !== $this->getInput('blogArticlecaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('blogArticlecaptchaSecondNumber', helper::FILTER_INT)) //AND $this->getInput('blogArticlecaptcha', helper::FILTER_INT) !== $this->getInput('blogArticlecaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('blogArticlecaptchaSecondNumber', helper::FILTER_INT))
and password_verify($this->getInput('blogArticleCaptcha', helper::FILTER_INT), $this->getInput('blogArticleCaptchaResult')) === false and password_verify($this->getInput('blogArticleCaptcha', helper::FILTER_INT), $this->getInput('blogArticleCaptchaResult')) === false
) { ) {
@ -830,8 +828,10 @@ class blog extends common
$pagination = helper::pagination($commentIds, $this->getUrl(), $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']), '#comment'); $pagination = helper::pagination($commentIds, $this->getUrl(), $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage']), '#comment');
// Liste des pages // Liste des pages
self::$pages = $pagination['pages']; self::$pages = $pagination['pages'];
// Signature de l'article
self::$articleSignature = $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'userId']));
// Signature du commentaire édité // Signature du commentaire édité
if ($this->isConnected() === true) { if ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')) {
self::$editCommentSignature = $this->signature($this->getUser('id')); self::$editCommentSignature = $this->signature($this->getUser('id'));
} }
// Commentaires en fonction de la pagination // Commentaires en fonction de la pagination

View File

@ -1,11 +1,5 @@
# Version 8.00
- Ajoute trois nouvelles options pour afficher ou masquer le pseudo, la date et l'heure de l'article. # Versions 7.10
- Corrige un bug d'affichage des articles lorsque le thème Moderne est sélectionné.
- Corrige un bug dans la méthode de tronquage de l'article, nécessite Zwii 13.5
- Corrige un mauvais format de la propriété buttonBack non stockée au type booléen.
# Version 7.11
- Le sélecteur de fichier affiche par défaut le chemin vers le fichier présent dans le champ.
# Version 7.10
- Empêche la validation d'un commentaire lorsque le contenu est vide. - Empêche la validation d'un commentaire lorsque le contenu est vide.
# Versions 7.8 - 7.9 # Versions 7.8 - 7.9
- Le flux RSS ne fonctionne pas si les méta de la page sont vides. - Le flux RSS ne fonctionne pas si les méta de la page sont vides.

View File

@ -1 +1 @@
{"name":"blog","realName":"Blog","version":"7.12","update":"0.0","delete":true,"dataDirectory":""} {"name":"blog","realName":"Blog","version":"7.10","update":"0.0","delete":true,"dataDirectory":""}

View File

@ -18,36 +18,14 @@
<?php endif; ?> <?php endif; ?>
</div> </div>
<div class="col6 newsDate textAlignRight"> <div class="col6 newsDate textAlignRight">
<!-- bloc signature --> <!-- bloc signature et date -->
<?php if ( <?php echo template::ico('user'); ?>
$this->getData(['module', $this->getUrl(0), 'config', 'showPseudo']) === true <?php echo $module::$articleSignature; ?>
): ?> <?php echo template::ico('calendar-empty'); ?>
<?php echo template::ico('user'); ?> <?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI) . ' ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
<?php echo $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'userId'])) ?>
<?php endif; ?>
<!-- bloc date -->
<?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
): ?>
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?>
<?php endif; ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?>
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
<?php endif; ?>
<?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
): ?>
<?php echo '&nbsp;-&nbsp;'; ?>
<?php endif; ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
<?php endif; ?>
<!-- Bloc edition --> <!-- Bloc edition -->
<?php if ( <?php if (
$this->isConnected() === true $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and and
( // Propriétaire ( // Propriétaire
($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === $module::EDIT_OWNER ($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'editConsent']) === $module::EDIT_OWNER
@ -110,7 +88,7 @@
'readonly' => true 'readonly' => true
]); ?> ]); ?>
<div id="blogArticleCommentWrapper" class="displayNone"> <div id="blogArticleCommentWrapper" class="displayNone">
<?php if ($this->isConnected() === true): ?> <?php if ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')): ?>
<?php echo template::text('blogArticleUserName', [ <?php echo template::text('blogArticleUserName', [
'label' => 'Nom', 'label' => 'Nom',
'readonly' => true, 'readonly' => true,
@ -144,7 +122,7 @@
'maxlength' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentMaxlength']) 'maxlength' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'commentMaxlength'])
]); ?> ]); ?>
<div id="blogArticleContentAlarm"> </div> <div id="blogArticleContentAlarm"> </div>
<?php if ($this->isConnected() === false): ?> <?php if ($this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')): ?>
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<?php echo template::captcha('blogArticleCaptcha', [ <?php echo template::captcha('blogArticleCaptcha', [

View File

@ -1,154 +1,153 @@
<?php echo template::formOpen('blogEditForm'); ?> <?php echo template::formOpen('blogEditForm'); ?>
<div class="row"> <div class="row">
<div class="col1"> <div class="col1">
<?php echo template::button('blogEditBack', [ <?php echo template::button('blogEditBack', [
'class' => 'buttonGrey', 'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
'value' => template::ico('left') 'value' => template::ico('left')
]); ?> ]); ?>
</div>
<div class="col3 offset6">
<?php echo template::button('blogEditDraft', [
'uniqueSubmission' => true,
'value' => 'Brouillon'
]); ?>
<?php echo template::hidden('blogEditState', [
'value' => true
]); ?>
</div>
<div class="col2">
<?php echo template::submit('blogEditSubmit', [
'value' => 'Publier',
'uniqueSubmission' => true
]); ?>
</div>
</div> </div>
<div class="col3 offset6"> <div class="row">
<?php echo template::button('blogEditDraft', [ <div class="col12">
'uniqueSubmission' => true, <div class="block">
'value' => 'Brouillon' <h4><?php echo helper::translate('Paramètres');?></h4>
]); ?> <div class="row">
<?php echo template::hidden('blogEditState', [ <div class="col6">
'value' => true <?php echo template::text('blogEditTitle', [
]); ?> 'label' => 'Titre',
</div> 'value' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'title'])
<div class="col2"> ]); ?>
<?php echo template::submit('blogEditSubmit', [ </div>
'value' => 'Publier', <div class="col6">
'uniqueSubmission' => true <?php echo template::text('blogEditPermalink', [
]); ?> 'label' => 'Permalink',
</div> 'value' => $this->getUrl(2)
</div> ]); ?>
<div class="row"> </div>
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Paramètres'); ?></h4>
<div class="row">
<div class="col6">
<?php echo template::text('blogEditTitle', [
'label' => 'Titre',
'value' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'title'])
]); ?>
</div> </div>
<div class="col6"> <div class="row">
<?php echo template::text('blogEditPermalink', [ <div class="col6">
'label' => 'Permalink', <?php echo template::file('blogEditPicture', [
'value' => $this->getUrl(2) 'language' => $this->getData(['user', $this->getUser('id'), 'language']),
]); ?> 'help' => $this->getData(['theme', 'site', 'width']) !== '100%' ? 'Taille optimale de l\'image de couverture : ' . ((int) substr($this->getData(['theme', 'site', 'width']), 0, -2) - (20 * 2)) . ' x 350 pixels.' : '',
'label' => 'Image de couverture',
'type' => 1,
'value' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'picture'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('blogEditPictureSize', $module::$pictureSizes, [
'label' => 'Largeur de l\'image',
'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'pictureSize'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('blogEditPicturePosition', $module::$picturePositions, [
'label' => 'Position',
'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'picturePosition']),
'help' => 'Le texte de l\'article est adapté autour de l\'image'
]); ?>
</div>
</div> </div>
</div> <div class="row">
<div class="row"> <div class="col6">
<div class="col6"> <?php echo template::checkbox('blogEditHidePicture', true, 'Masquer l\'image de couverture dans l\'article', [
<?php echo template::file('blogEditPicture', [ 'checked' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'hidePicture'])
'language' => $this->getData(['user', $this->getUser('id'), 'language']), ]); ?>
'help' => $this->getData(['theme', 'site', 'width']) !== '100%' ? 'Taille optimale de l\'image de couverture : ' . ((int) substr($this->getData(['theme', 'site', 'width']), 0, -2) - (20 * 2)) . ' x 350 pixels.' : '', </div>
'label' => 'Image de couverture',
'type' => 1,
'value' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'picture']),
'folder' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'picture']) ? dirname($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'picture'])) : ''
]); ?>
</div>
<div class="col3">
<?php echo template::select('blogEditPictureSize', $module::$pictureSizes, [
'label' => 'Largeur de l\'image',
'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'pictureSize'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('blogEditPicturePosition', $module::$picturePositions, [
'label' => 'Position',
'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'picturePosition']),
'help' => 'Le texte de l\'article est adapté autour de l\'image'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('blogEditHidePicture', true, 'Masquer l\'image de couverture dans l\'article', [
'checked' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'hidePicture'])
]); ?>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> <?php echo template::textarea('blogEditContent', [
<?php echo template::textarea('blogEditContent', [ 'class' => 'editorWysiwyg',
'class' => 'editorWysiwyg', 'value' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'content'])
'value' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'content']) ]); ?>
]); ?> <div class="row">
<div class="row"> <div class="col12">
<div class="col12"> <div class="block">
<div class="block"> <h4><?php echo helper::translate('Options de publication');?></h4>
<h4><?php echo helper::translate('Options de publication'); ?></h4> <div class="row">
<div class="row"> <div class="col4">
<div class="col4"> <?php echo template::select('blogEditUserId', $module::$users, [
<?php echo template::select('blogEditUserId', $module::$users, [ 'label' => 'Auteur',
'label' => 'Auteur', 'selected' => $this->getUser('id'),
'selected' => $this->getUser('id'), 'disabled' => $this->getUser('group') !== self::GROUP_ADMIN ? true : false
'disabled' => $this->getUser('group') !== self::GROUP_ADMIN ? true : false ]); ?>
]); ?> </div>
</div> <div class="col4">
<div class="col4"> <?php echo template::date('blogEditPublishedOn', [
<?php echo template::date('blogEditPublishedOn', [ 'help' => 'L\'article n\'est visible qu\'après la date de publication prévue.',
'help' => 'L\'article n\'est visible qu\'après la date de publication prévue.', 'type' => 'datetime-local',
'type' => 'datetime-local', 'label' => 'Publication',
'label' => 'Publication', 'value' => floor($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'publishedOn']) / 60) * 60
'value' => floor($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'publishedOn']) / 60) * 60 ]); ?>
]); ?> </div>
</div> <div class="col4">
<div class="col4"> <?php echo template::select('blogEditConsent', $module::$articleConsent , [
<?php echo template::select('blogEditConsent', $module::$articleConsent, [ 'label' => 'Édition - Suppression',
'label' => 'Édition - Suppression', 'selected' => is_numeric($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'editConsent'])) ? $module::EDIT_GROUP : $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'editConsent']),
'selected' => is_numeric($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'editConsent'])) ? $module::EDIT_GROUP : $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'editConsent']), 'help' => 'Les utilisateurs des groupes supérieurs accèdent à l\'article sans restriction'
'help' => 'Les utilisateurs des groupes supérieurs accèdent à l\'article sans restriction' ]); ?>
]); ?> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="row">
<div class="row"> <div class="col12">
<div class="col12"> <div class="block">
<div class="block"> <h4><?php echo helper::translate('Commentaires');?></h4>
<h4><?php echo helper::translate('Commentaires'); ?></h4> <div class="row">
<div class="row"> <div class="col4 ">
<div class="col4 "> <?php echo template::checkbox('blogEditCommentClose', true, 'Fermer les commentaires', [
<?php echo template::checkbox('blogEditCommentClose', true, 'Fermer les commentaires', [ 'checked' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentClose'])
'checked' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentClose']) ]); ?>
]); ?> </div>
</div> <div class="col4 commentOptionsWrapper ">
<div class="col4 commentOptionsWrapper "> <?php echo template::checkbox('blogEditCommentApproved', true, 'Approbation par un modérateur', [
<?php echo template::checkbox('blogEditCommentApproved', true, 'Approbation par un modérateur', [ 'checked' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentApproved']),
'checked' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentApproved']), ''
'' ]); ?>
]); ?> </div>
</div> <div class="col4 commentOptionsWrapper">
<div class="col4 commentOptionsWrapper"> <?php echo template::select('blogEditCommentMaxlength', $module::$commentsLength,[
<?php echo template::select('blogEditCommentMaxlength', $module::$commentsLength, [ 'help' => 'Choix du nombre maximum de caractères pour chaque commentaire de l\'article, mise en forme html comprise.',
'help' => 'Choix du nombre maximum de caractères pour chaque commentaire de l\'article, mise en forme html comprise.', 'label' => 'Caractères par commentaire',
'label' => 'Caractères par commentaire', 'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentMaxlength'])
'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentMaxlength']) ]); ?>
]); ?> </div>
</div>
</div>
<div class="row">
<div class="col3 commentOptionsWrapper offset2">
<?php echo template::checkbox('blogEditCommentNotification', true, 'Notification par email', [
'checked' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentNotification']),
]); ?>
</div> </div>
<div class="col4 commentOptionsWrapper"> <div class="row">
<?php echo template::select('blogEditCommentGroupNotification', $module::$groupNews, [ <div class="col3 commentOptionsWrapper offset2">
'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentGroupNotification']), <?php echo template::checkbox('blogEditCommentNotification', true, 'Notification par email', [
]); ?> 'checked' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentNotification']),
]); ?>
</div>
<div class="col4 commentOptionsWrapper">
<?php echo template::select('blogEditCommentGroupNotification', $module::$groupNews, [
'selected' => $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(2), 'commentGroupNotification']),
]); ?>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<?php echo template::formClose(); ?> <?php echo template::formClose(); ?>

View File

@ -24,32 +24,11 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col6 blogEdit"> <div class="col6 blogEdit">
<!-- bloc signature --> <!-- bloc signature et date -->
<?php if ( <?php echo template::ico('user'); ?>
$this->getData(['module', $this->getUrl(0), 'config', 'showPseudo']) === true <?php echo $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?>
): ?> <?php echo template::ico('calendar-empty'); ?>
<?php echo template::ico('user'); ?> <?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI) . '&nbsp;' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
<?php echo $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?>
<?php endif; ?>
<!-- bloc Date -->
<?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
): ?>
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?>
<?php endif; ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?>
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
<?php endif; ?>
<?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
): ?>
<?php echo '&nbsp;-&nbsp;'; ?>
<?php endif; ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
<?php endif; ?>
</div> </div>
</div> </div>
<div class="row"> <div class="row">
@ -72,7 +51,7 @@
<div class="col6 blogEdit"> <div class="col6 blogEdit">
<!-- Bloc edition --> <!-- Bloc edition -->
<?php if ( <?php if (
$this->isConnected() === true $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and and
( // Propriétaire ( // Propriétaire
($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_OWNER ($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'editConsent']) === $module::EDIT_OWNER
@ -124,19 +103,18 @@
file_exists(self::FILE_DIR . 'source/' . $article['picture']) file_exists(self::FILE_DIR . 'source/' . $article['picture'])
): ?> ): ?>
<div class="col3"> <div class="col3">
<?php <?php // Déterminer le nom de la miniature
// Déterminer le nom de la miniature $parts = pathinfo($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']));
$parts = pathinfo($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture'])); $thumb = 'mini_' . $parts['basename'];
$thumb = 'mini_' . $parts['basename']; // Créer la miniature si manquante
// Créer la miniature si manquante if (!file_exists(self::FILE_DIR . 'thumb/' . $thumb)) {
if (!file_exists(self::FILE_DIR . 'thumb/' . $thumb)) { $this->makeThumb(
$this->makeThumb( self::FILE_DIR . 'source/' . $article['picture'],
self::FILE_DIR . 'source/' . $article['picture'], self::FILE_DIR . 'thumb/' . $thumb,
self::FILE_DIR . 'thumb/' . $thumb, self::THUMBS_WIDTH
self::THUMBS_WIDTH );
); }
} ?>
?>
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>" class="blogPicture"> <a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>" class="blogPicture">
<img src="<?php echo helper::baseUrl(false) . self::FILE_DIR . 'thumb/' . $thumb; ?>" <img src="<?php echo helper::baseUrl(false) . self::FILE_DIR . 'thumb/' . $thumb; ?>"
alt="<?php echo $article['picture']; ?>"> alt="<?php echo $article['picture']; ?>">
@ -160,46 +138,21 @@
</a> </a>
</div> </div>
<div class="blogDate"> <div class="blogDate">
<!-- bloc signature --> <!-- bloc signature et date -->
<?php if ( <?php echo template::ico('user'); ?>
$this->getData(['module', $this->getUrl(0), 'config', 'showPseudo']) === true <?php echo $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?>
): ?> <?php echo template::ico('calendar-empty'); ?>
<?php echo template::ico('user'); ?> <?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI) . '&nbsp;' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
<?php echo $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?> </div>
<?php endif; ?> <!-- bloc date --> <div class="blogContent">
<?php if ( <?php $lenght = $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) !== 0 ? $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) : 500 ?>
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true <?php echo helper::subword(strip_tags($article['content'], '<br><p>'), 0, $lenght); ?>...
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true <div class="readMoreContainer">
): ?> <a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>">
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?> <button class="readMoreButton">
<?php endif; ?> <?php echo helper::translate('Lire la suite'); ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?> </button>
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?> </a>
<?php endif; ?>
<?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
): ?>
<?php echo '&nbsp;-&nbsp;'; ?>
<?php endif; ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
<?php endif; ?>
<div class="blogContent">
<?php $lenght = $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']); ?>
<?php if ($lenght > 0): ?>
<?php ?>
<?php echo helper::subword($article['content'], 0, $lenght); ?>...
<div class="readMoreContainer">
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>">
<button class="readMoreButton">
<?php echo helper::translate('Lire la suite'); ?>
</button>
</a>
</div>
<?php else: ?>
<?php echo $article['content']; ?>
<?php endif; ?>
</div> </div>
</div> </div>
</div> </div>

View File

@ -1,40 +0,0 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
$(document).ready(function() {
// Gestion du changement de la case "Afficher la date"
$('#blogOptionShowDate').change(function() {
var showDateChecked = $(this).is(':checked');
// Afficher ou masquer le wrapper de l'heure selon l'état de la date
if (showDateChecked) {
$('.timeWrapper').show();
} else {
$('.timeWrapper').hide();
// Désactiver l'option "Afficher l'heure" lorsque la date est désactivée
$('#blogOptionShowTime').prop('checked', false).trigger('change');
}
// Afficher ou masquer le format de la date
$('#blogOptionDateFormatWrapper').toggle(showDateChecked);
}).trigger('change'); // Déclenchement au chargement de la page
// Gestion du changement de la case "Afficher l'heure"
$('#blogOptionShowTime').change(function() {
var showTimeChecked = $(this).is(':checked');
// Afficher ou masquer le format de l'heure
$('#blogOptionTimeFormatWrapper').toggle(showTimeChecked);
}).trigger('change'); // Déclenchement au chargement de la page
});

View File

@ -17,36 +17,32 @@
<h4> <h4>
<?php echo helper::translate('Paramètres'); ?> <?php echo helper::translate('Paramètres'); ?>
</h4> </h4>
<div class="row">
<div class="col6">
<?php echo template::checkbox('blogOptionButtonBack', true, 'Bouton de retour', [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'buttonBack'])
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('blogOptionShowPseudo', true, 'Signature', [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showPseudo'])
]); ?>
</div>
</div>
<div class="row"> <div class="row">
<div class="col3"> <div class="col3">
<?php echo template::checkbox('blogOptionShowDate', true, 'Afficher la date', [ <?php echo template::select('blogOptionArticlesLayout', $module::$articlesLayout, [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showDate']), 'label' => 'Disposition',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'layout'])
]); ?> ]); ?>
</div> </div>
<div class="col3"> <div class="col3">
<?php echo template::select('blogOptionArticlesLenght', $module::$articlesLenght, [
'label' => 'Aperçus',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('blogOptionItemsperPage', $module::$ArticlesListed, [
'label' => 'Articles par page',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('blogOptionDateFormat', $module::$dateFormats, [ <?php echo template::select('blogOptionDateFormat', $module::$dateFormats, [
'label' => 'Format des dates', 'label' => 'Format des dates',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat']) 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat'])
]); ?> ]); ?>
</div> </div>
<div class="col3 timeWrapper"> <div class="col2">
<?php echo template::checkbox('blogOptionShowTime', true, 'Afficher l\'heure', [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showTime']),
]); ?>
</div>
<div class="col3 timeWrapper">
<?php echo template::select('blogOptionTimeFormat', $module::$timeFormats, [ <?php echo template::select('blogOptionTimeFormat', $module::$timeFormats, [
'label' => 'Format des heures', 'label' => 'Format des heures',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat']) 'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat'])
@ -54,34 +50,19 @@
</div> </div>
</div> </div>
<div class="row"> <div class="row">
<div class="col4"> <div class="col3">
<?php echo template::select('blogOptionArticlesLayout', $module::$articlesLayout, [
'label' => 'Disposition',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'layout'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('blogOptionArticlesLenght', $module::$articlesLenght, [
'label' => 'Aperçus',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('blogOptionItemsperPage', $module::$ArticlesListed, [
'label' => 'Articles par page',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('blogOptionShowFeeds', true, 'Lien du flux RSS', [ <?php echo template::checkbox('blogOptionShowFeeds', true, 'Lien du flux RSS', [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'feeds']), 'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'feeds']),
]); ?> ]); ?>
</div> </div>
<div class="col3">
<?php echo template::checkbox('newsOptionButtonBack', true, 'Bouton de retour', [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'buttonBack'])
]); ?>
</div>
<div class="col6"> <div class="col6">
<?php echo template::text('blogOptionFeedslabel', [ <?php echo template::text('blogOptionFeedslabel', [
'label' => 'Texte de l\'étiquette RSS', 'label' => 'Texte de l\'étiquette',
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel'])
]); ?> ]); ?>
</div> </div>

View File

@ -1,5 +1,3 @@
# Versions 4.4
- Le sélecteur de fichier affiche par défaut le chemin vers le fichier présent dans le champ.
# Version 4.3 # Version 4.3
- Contrôle de la variable de session liée au contenu. Evite des erreurs lorsque plusieurs onglets sont ouverts. - Contrôle de la variable de session liée au contenu. Evite des erreurs lorsque plusieurs onglets sont ouverts.
# Version 4.2 # Version 4.2

View File

@ -17,7 +17,7 @@
class form extends common class form extends common
{ {
const VERSION = '4.4'; const VERSION = '4.3';
const REALNAME = 'Formulaire'; const REALNAME = 'Formulaire';
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)

View File

@ -14,7 +14,7 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Validation du formulaire'); ?></h4> <h4><?php echo helper::translate('Validation du formulaire');?></h4>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
<?php echo template::checkbox('formOptionCaptcha', true, 'Captcha', [ <?php echo template::checkbox('formOptionCaptcha', true, 'Captcha', [
@ -49,7 +49,7 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Gabarit'); ?></h4> <h4><?php echo helper::translate('Gabarit');?></h4>
<div class="row"> <div class="row">
<div class="col6"> <div class="col6">
<?php echo template::select('formOptionAlign', $module::$optionAlign, [ <?php echo template::select('formOptionAlign', $module::$optionAlign, [
@ -78,7 +78,7 @@
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <div class="block">
<h4><?php echo helper::translate('Courriel'); ?></h4> <h4><?php echo helper::translate('Courriel');?></h4>
<?php echo template::checkbox('formOptionMailOptionsToggle', true, 'Envoyer par mail les données saisies :', [ <?php echo template::checkbox('formOptionMailOptionsToggle', true, 'Envoyer par mail les données saisies :', [
'checked' => (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) || 'checked' => (bool) $this->getData(['module', $this->getUrl(0), 'config', 'group']) ||
!empty($this->getData(['module', $this->getUrl(0), 'config', 'user'])) || !empty($this->getData(['module', $this->getUrl(0), 'config', 'user'])) ||
@ -128,10 +128,10 @@
</div> </div>
<div class="col4"> <div class="col4">
<?php echo template::file('formOptionLogo', [ <?php echo template::file('formOptionLogo', [
'language' => $this->getData(['user', $this->getUser('id'), 'language']), 'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Logo du site', 'label' => 'Logo du site',
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']), 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl'])
'folder' => $this->getData(['module', $this->getUrl(0), 'config', 'logoUrl']) ? dirname($this->getData(['module', $this->getUrl(0), 'config', 'logoUrl'])) : ''
]); ?> ]); ?>
</div> </div>
<div class="col4"> <div class="col4">
@ -153,3 +153,4 @@
</div> </div>
</div> </div>
</div> </div>
</div>

View File

@ -27,6 +27,8 @@ $( document ).ready(function() {
serializeRegexp: "" serializeRegexp: ""
}); });
console.log($("#galleryEditSort").val());
if ($("#galleryEditSort").val() !== "SORT_HAND") { if ($("#galleryEditSort").val() !== "SORT_HAND") {
$("#galleryTable tr").addClass("nodrag nodrop"); $("#galleryTable tr").addClass("nodrag nodrop");
$(".zwiico-sort").hide(); $(".zwiico-sort").hide();

View File

@ -1,6 +1,3 @@
# Versions 6.0
- Ajoute trois nouvelles options pour afficher ou masquer la signature, la date et l'heure de l'article.
- Corrige un mauvais format de la propriété buttonBack non stockée au type booléen.
# Versions 5.9 # Versions 5.9
- Largeur d'un bouton de retour. - Largeur d'un bouton de retour.
# Versions 5.7 - 5.8 # Versions 5.7 - 5.8

View File

@ -16,7 +16,7 @@
class news extends common class news extends common
{ {
const VERSION = '6.0'; const VERSION = '5.9';
const REALNAME = 'News'; const REALNAME = 'News';
const DATADIRECTORY = self::DATA_DIR . 'news/'; const DATADIRECTORY = self::DATA_DIR . 'news/';
@ -124,12 +124,11 @@ class news extends common
$feeds = new \FeedWriter\RSS2(); $feeds = new \FeedWriter\RSS2();
// En-tête // En-tête
$feeds->setTitle($this->getData(['page', $this->getUrl(0), 'title']) ? $this->getData(['page', $this->getUrl(0), 'title']) : ''); $feeds->setTitle($this->getData(['page', $this->getUrl(0), 'title']) ? $this->getData(['page', $this->getUrl(0), 'title']): '');
$feeds->setLink(helper::baseUrl() . $this->getUrl(0)); $feeds->setLink(helper::baseUrl() . $this->getUrl(0));
if ($this->getData(['page', $this->getUrl(0), 'metaDescription'])) { if ($this->getData(['page', $this->getUrl(0), 'metaDescription'])) {
$feeds->setDescription($this->getData(['page', $this->getUrl(0), 'metaDescription'])); $feeds->setDescription($this->getData(['page', $this->getUrl(0), 'metaDescription']));
} };
;
$feeds->setChannelElement('language', 'fr-FR'); $feeds->setChannelElement('language', 'fr-FR');
$feeds->setDate(date('r', time())); $feeds->setDate(date('r', time()));
$feeds->addGenerator(); $feeds->addGenerator();
@ -175,8 +174,7 @@ class news extends common
$publishedOn = $this->getInput('newsAddPublishedOn', helper::FILTER_DATETIME, true); $publishedOn = $this->getInput('newsAddPublishedOn', helper::FILTER_DATETIME, true);
$publishedOff = $this->getInput('newsAddPublishedOff') ? $this->getInput('newsAddPublishedOff', helper::FILTER_DATETIME) : ''; $publishedOff = $this->getInput('newsAddPublishedOff') ? $this->getInput('newsAddPublishedOff', helper::FILTER_DATETIME) : '';
$this->setData([ $this->setData([
'module', 'module', $this->getUrl(0),
$this->getUrl(0),
'posts', 'posts',
$newsId, $newsId,
[ [
@ -290,8 +288,7 @@ class news extends common
// Fin feuille de style // Fin feuille de style
$this->setData([ $this->setData([
'module', 'module', $this->getUrl(0),
$this->getUrl(0),
'theme', 'theme',
[ [
'style' => $success ? self::DATADIRECTORY . $this->getUrl(0) . '/theme.css' : '', 'style' => $success ? self::DATADIRECTORY . $this->getUrl(0) . '/theme.css' : '',
@ -303,8 +300,7 @@ class news extends common
]); ]);
$this->setData([ $this->setData([
'module', 'module', $this->getUrl(0),
$this->getUrl(0),
'config', 'config',
[ [
'feeds' => $this->getInput('newsOptionShowFeeds', helper::FILTER_BOOLEAN), 'feeds' => $this->getInput('newsOptionShowFeeds', helper::FILTER_BOOLEAN),
@ -314,10 +310,7 @@ class news extends common
'height' => $this->getInput('newsOptionHeight', helper::FILTER_INT, true), 'height' => $this->getInput('newsOptionHeight', helper::FILTER_INT, true),
'dateFormat' => $this->getInput('newsOptionDateFormat'), 'dateFormat' => $this->getInput('newsOptionDateFormat'),
'timeFormat' => $this->getInput('newsOptionTimeFormat'), 'timeFormat' => $this->getInput('newsOptionTimeFormat'),
'buttonBack' => $this->getInput('newsOptionButtonBack', helper::FILTER_BOOLEAN), 'buttonBack' => $this->getInput('newsOptionButtonBack'),
'showDate' => $this->getInput('newsOptionShowDate', helper::FILTER_BOOLEAN),
'showTime' => $this->getInput('newsOptionShowTime', helper::FILTER_BOOLEAN),
'showPseudo' => $this->getInput('newsOptionShowPseudo', helper::FILTER_BOOLEAN),
'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']), 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']),
] ]
]); ]);
@ -325,7 +318,7 @@ class news extends common
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config', 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/option',
'notification' => helper::translate('Modifications enregistrées'), 'notification' => helper::translate('Modifications enregistrées'),
'state' => true 'state' => true
]); ]);
@ -435,8 +428,7 @@ class news extends common
$publishedOn = $this->getInput('newsEditPublishedOn', helper::FILTER_DATETIME, true); $publishedOn = $this->getInput('newsEditPublishedOn', helper::FILTER_DATETIME, true);
$publishedOff = $this->getInput('newsEditPublishedOff') ? $this->getInput('newsEditPublishedOff', helper::FILTER_DATETIME) : ''; $publishedOff = $this->getInput('newsEditPublishedOff') ? $this->getInput('newsEditPublishedOff', helper::FILTER_DATETIME) : '';
$this->setData([ $this->setData([
'module', 'module', $this->getUrl(0),
$this->getUrl(0),
'posts', 'posts',
$newsId, $newsId,
[ [
@ -498,8 +490,6 @@ class news extends common
} }
// L'article existe // L'article existe
else { else {
self::$dateFormat = $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat']);
self::$timeFormat = $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat']);
self::$articleSignature = $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'userId'])); self::$articleSignature = $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'userId']));
// Valeurs en sortie // Valeurs en sortie
$this->addOutput([ $this->addOutput([
@ -619,15 +609,6 @@ class news extends common
// Mettre à jour la version // Mettre à jour la version
$this->setData(['module', $this->getUrl(0), 'config', 'versionData', '5.3']); $this->setData(['module', $this->getUrl(0), 'config', 'versionData', '5.3']);
} }
// Mise à jour 6.0
if (version_compare($versionData, '6.0', '<')) {
$this->setData(['module', $this->getUrl(0), 'config', 'buttonBack', true]);
$this->setData(['module', $this->getUrl(0), 'config', 'showTime', true]);
$this->setData(['module', $this->getUrl(0), 'config', 'showDate', true]);
$this->setData(['module', $this->getUrl(0), 'config', 'showPseudo', true]);
// Mettre à jour la version
$this->setData(['module', $this->getUrl(0), 'config', 'versionData', '6.0']);
}
} }

View File

@ -12,50 +12,32 @@
<?php endif; ?> <?php endif; ?>
</div> </div>
<div class="col6 newsDate textAlignRight"> <div class="col6 newsDate textAlignRight">
<!-- bloc signature --> <!-- bloc signature et date -->
<?php echo template::ico('user'); ?>
<?php echo $module::$articleSignature . ' - '; ?>
<?php echo template::ico('calendar-empty'); ?>
<?php echo helper::dateUTF8('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI) . '&nbsp' . helper::dateUTF8('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
<!-- Bloc edition -->
<?php if ( <?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showPseudo']) === true $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
): ?>
<?php echo template::ico('user'); ?>
<?php echo $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'userId'])); ?>
<?php endif; ?>
<!-- bloc date -->
<?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
): ?>
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?>
<?php endif; ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?>
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
<?php endif; ?>
<?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
): ?>
<?php echo '&nbsp;-&nbsp;'; ?>
<?php endif; ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
<?php endif; ?> <!-- Bloc edition -->
<?php if (
$this->isConnected() === true
and and
( // Propriétaire ( // Propriétaire
($this->getUser('group') === self::GROUP_ADMIN) ($this->getUser('group') === self::GROUP_ADMIN)
) )
): ?> ): ?>
&nbsp;-&nbsp;
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1); ?>"> <a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1); ?>">
<?php echo template::ico('pencil', ['margin' => 'left']); ?> <?php echo template::ico('pencil'); ?>
<?php echo helper::translate('Éditer'); ?> <?php echo helper::translate('Éditer'); ?>
</a> </a>
<?php endif; ?> <?php endif; ?>
<!-- Bloc RSS--> <!-- Bloc RSS-->
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'feeds'])): ?> <?php if ($this->getData(['module', $this->getUrl(0), 'config', 'feeds'])): ?>
&nbsp;-&nbsp;
<div id="rssFeed"> <div id="rssFeed">
<a type="application/rss+xml" href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" <a type="application/rss+xml" href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>"
target="_blank"> target="_blank">
&nbsp;<img src='module/news/ressource/feed-icon-16.gif' /> <img src='module/news/ressource/feed-icon-16.gif' />
<?php <?php
echo '<p>' . $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) . '</p>'; echo '<p>' . $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel']) . '</p>';
?> ?>

View File

@ -1,6 +1,5 @@
<?php if ($module::$news): ?> <?php if ($module::$news): ?>
<link rel="stylesheet" type="text/css" <link rel="stylesheet" type="text/css" href="<?php echo helper::baseUrl(false) . $this->getData(['module', $this->getUrl(0), 'theme', 'style']);?> "/>
href="<?php echo helper::baseUrl(false) . $this->getData(['module', $this->getUrl(0), 'theme', 'style']); ?> " />
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'feeds'])): ?> <?php if ($this->getData(['module', $this->getUrl(0), 'config', 'feeds'])): ?>
<div id="rssFeed"> <div id="rssFeed">
<a type="application/rss+xml" href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" target="_blank"> <a type="application/rss+xml" href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" target="_blank">
@ -21,42 +20,22 @@
<?php echo '<a href="' . helper::baseUrl(true) . $this->getUrl(0) . '/' . $newsId . '">' . $news['title'] . '</a>'; ?> <?php echo '<a href="' . helper::baseUrl(true) . $this->getUrl(0) . '/' . $newsId . '">' . $news['title'] . '</a>'; ?>
</h2> </h2>
<div class="newsSignature"> <div class="newsSignature">
<!-- bloc signature --> <?php echo template::ico('user'); ?>
<?php if ( <?php echo $news['userId'] . ' - '; ?>
$this->getData(['module', $this->getUrl(0), 'config', 'showPseudo']) === true <?php echo template::ico('calendar-empty'); ?>
): ?> <?php echo helper::dateUTF8($module::$dateFormat, $news['publishedOn'], self::$i18nUI) . '&nbsp;' . helper::dateUTF8($module::$timeFormat, $news['publishedOn'], self::$i18nUI); ?>
<?php echo template::ico('user'); ?>
<?php echo $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $newsId, 'userId'])); ?>
<?php endif; ?>
<!-- bloc Date -->
<?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
): ?>
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?>
<?php endif; ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?>
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $newsId, 'publishedOn']), self::$i18nUI); ?>
<?php endif; ?>
<?php if (
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
): ?>
<?php echo '&nbsp;-&nbsp;'; ?>
<?php endif; ?>
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $newsId, 'publishedOn']), self::$i18nUI); ?>
<?php endif; ?>
<!-- Bloc edition --> <!-- Bloc edition -->
<?php if ( <?php if (
$this->isConnected() === true $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and and
( // Propriétaire ( // Propriétaire
($this->getUser('group') === self::GROUP_ADMIN) ($this->getUser('group') === self::GROUP_ADMIN)
) )
): ?> ): ?>
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsId; ?>"> &nbsp;-&nbsp;
<?php echo template::ico('pencil', ['margin' => 'left']); ?> Éditer <a
href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsId; ?>">
<?php echo template::ico('pencil'); ?> Éditer
</a> </a>
<?php endif; ?> <?php endif; ?>
</div> </div>
@ -72,6 +51,7 @@
</div> </div>
</div> </div>
<?php endforeach; ?> <?php endforeach; ?>
</div> </div>
</article> </article>
<?php echo $module::$pages; ?> <?php echo $module::$pages; ?>

View File

@ -1,40 +0,0 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
$(document).ready(function() {
// Gestion du changement de la case "Afficher la date"
$('#newsOptionShowDate').change(function() {
var showDateChecked = $(this).is(':checked');
// Afficher ou masquer le wrapper de l'heure selon l'état de la date
if (showDateChecked) {
$('.timeWrapper').show();
} else {
$('.timeWrapper').hide();
// Désactiver l'option "Afficher l'heure" lorsque la date est désactivée
$('#newsOptionShowTime').prop('checked', false).trigger('change');
}
// Afficher ou masquer le format de la date
$('#newsOptionDateFormatWrapper').toggle(showDateChecked);
}).trigger('change'); // Déclenchement au chargement de la page
// Gestion du changement de la case "Afficher l'heure"
$('#newsOptionShowTime').change(function() {
var showTimeChecked = $(this).is(':checked');
// Afficher ou masquer le format de l'heure
$('#newsOptionTimeFormatWrapper').toggle(showTimeChecked);
}).trigger('change'); // Déclenchement au chargement de la page
});

View File

@ -1,130 +1,111 @@
<?php echo template::formOpen('newsOption'); ?> <?php echo template::formOpen('newsOption'); ?>
<div class="row"> <div class="row">
<div class="col1"> <div class="col1">
<?php echo template::button('newsOptionBack', [ <?php echo template::button('newsOptionBack', [
'class' => 'buttonGrey', 'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
'value' => template::ico('left') 'value' => template::ico('left')
]); ?> ]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('newsOptionSubmit'); ?>
</div>
</div> </div>
<div class="col2 offset9"> <div class="row">
<?php echo template::submit('newsOptionSubmit'); ?> <div class="col12">
</div> <div class="block">
</div> <h4><?php echo helper::translate('Paramètres'); ?></h4>
<div class="row"> <div class="row">
<div class="col12"> <div class="col2">
<div class="block"> <?php echo template::select('newsOptionItemsperCol', $module::$columns, [
<h4><?php echo helper::translate('Paramètres'); ?></h4> 'label' => 'Nombre de colonnes',
<div class="row"> 'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol'])
<div class="col6"> ]); ?>
<?php echo template::checkbox('newsOptionButtonBack', true, 'Bouton de retour', [ </div>
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'buttonBack']) <div class="col2">
]); ?> <?php echo template::select('newsOptionItemsperPage', $module::$itemsList, [
'label' => 'Articles par page',
'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('newsOptionHeight', $module::$height, [
'label' => 'Abrégé de l\'article',
'selected' => $this->getData(['module', $this->getUrl(0),'config', 'height'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('newsOptionDateFormat', $module::$dateFormats, [
'label' => 'Format des dates',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('newsOptionTimeFormat', $module::$timeFormats, [
'label' => 'Format des heures',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat'])
]); ?>
</div>
</div> </div>
<div class="col6"> <div class="row">
<?php echo template::checkbox('newsOptionShowPseudo', true, 'Signature', [ <div class="col3">
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showPseudo']) <?php echo template::checkbox('newsOptionShowFeeds', true, 'Lien du flux RSS', [
]); ?> 'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'feeds']),
</div> 'help' => 'Flux limité aux articles de la première page.'
</div> ]); ?>
<div class="row"> </div>
<div class="col3"> <div class="col3">
<?php echo template::checkbox('newsOptionShowDate', true, 'Afficher la date', [ <?php echo template::checkbox('newsOptionButtonBack', true, 'Bouton de retour', [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showDate']), 'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'buttonBack'])
]); ?> ]); ?>
</div> </div>
<div class="col3"> <div class="col6">
<?php echo template::select('newsOptionDateFormat', $module::$dateFormats, [ <?php echo template::text('newsOptionFeedslabel', [
'label' => 'Format des dates', 'label' => 'Étiquette RSS',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat']) 'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel'])
]); ?> ]); ?>
</div> </div>
<div class="col3 timeWrapper">
<?php echo template::checkbox('newsOptionShowTime', true, 'Afficher l\'heure', [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showTime']),
]); ?>
</div>
<div class="col3 timeWrapper">
<?php echo template::select('newsOptionTimeFormat', $module::$timeFormats, [
'label' => 'Format des heures',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat'])
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::select('newsOptionItemsperCol', $module::$columns, [
'label' => 'Nombre de colonnes',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperCol'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('newsOptionItemsperPage', $module::$itemsList, [
'label' => 'Articles par page',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('newsOptionHeight', $module::$height, [
'label' => 'Abrégé de l\'article',
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'height'])
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('newsOptionShowFeeds', true, 'Lien du flux RSS', [
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'feeds']),
'help' => 'Flux limité aux articles de la première page.'
]); ?>
</div>
<div class="col6">
<?php echo template::text('newsOptionFeedslabel', [
'label' => 'Texte de l\'étiquette RSS',
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel'])
]); ?>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> <div class="row">
<div class="row"> <div class="col12">
<div class="col12"> <div class="block">
<div class="block"> <h4><?php echo helper::translate('Thème');?></h4>
<h4><?php echo helper::translate('Thème'); ?></h4> <div class="row">
<div class="row"> <div class="col3">
<div class="col3"> <?php echo template::select('newsThemeBorderStyle', $module::$borderStyle, [
<?php echo template::select('newsThemeBorderStyle', $module::$borderStyle, [ 'label' => 'Bordure',
'label' => 'Bordure', 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderStyle'])
'selected' => $this->getData(['module', $this->getUrl(0), 'theme', 'borderStyle']) ]); ?>
]); ?> </div>
</div> <div class="col3">
<div class="col3"> <?php echo template::select('newsThemeBorderWidth', $module::$borderWidth, [
<?php echo template::select('newsThemeBorderWidth', $module::$borderWidth, [ 'label' => 'Épaisseur',
'label' => 'Épaisseur', 'selected' => $this->getData(['module', $this->getUrl(0),'theme', 'borderWidth'])
'selected' => $this->getData(['module', $this->getUrl(0), 'theme', 'borderWidth']) ]); ?>
]); ?> </div>
</div> <div class="col3">
<div class="col3"> <?php echo template::text('newsThemeBorderColor', [
<?php echo template::text('newsThemeBorderColor', [ 'class' => 'colorPicker',
'class' => 'colorPicker', 'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.', 'label' => 'Couleur de la bordure',
'label' => 'Couleur de la bordure', 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'borderColor'])
'value' => $this->getData(['module', $this->getUrl(0), 'theme', 'borderColor']) ]); ?>
]); ?> </div>
</div> <div class="col3">
<div class="col3"> <?php echo template::text('newsThemeBackgroundColor', [
<?php echo template::text('newsThemeBackgroundColor', [ 'class' => 'colorPicker',
'class' => 'colorPicker', 'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.',
'help' => 'Couleur visible en l\'absence d\'une image.<br />Le curseur horizontal règle le niveau de transparence.', 'label' => 'Couleur du fond',
'label' => 'Couleur du fond', 'value' => $this->getData(['module', $this->getUrl(0),'theme', 'backgroundColor'])
'value' => $this->getData(['module', $this->getUrl(0), 'theme', 'backgroundColor']) ]); ?>
]); ?> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<?php echo template::formClose(); ?> <?php echo template::formClose(); ?>
<div class="moduleVersion">Version <div class="moduleVersion">Version
<?php echo $module::VERSION; ?> <?php echo $module::VERSION; ?>

View File

@ -58,7 +58,7 @@ class redirection extends common
{ {
// Message si l'utilisateur peut éditer la page // Message si l'utilisateur peut éditer la page
if ( if (
$this->isConnected() === true $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
&& $this->getUser('group') >= self::GROUP_EDITOR && $this->getUser('group') >= self::GROUP_EDITOR
&& $this->getUrl(1) !== 'force' && $this->getUrl(1) !== 'force'
) { ) {

View File

@ -1,7 +1,5 @@
# Version 7.2
- Le dossier sélectionné est affiché par défaut dans la page update.
# Version 7.1 # Version 7.1
- Améliore le desgin du module
# Version 7.0 # Version 7.0
- Ajoute un affichage de la légende sous l'image - Ajoute un affichage de la légende sous l'image
- Corrige un tri inversé - Corrige un tri inversé

View File

@ -27,7 +27,7 @@ class slider extends common
'index' => self::GROUP_VISITOR 'index' => self::GROUP_VISITOR
]; ];
const VERSION = '7.2'; const VERSION = '7.1';
const REALNAME = 'Carrousel'; const REALNAME = 'Carrousel';
const DELETE = true; const DELETE = true;
const UPDATE = '0.0'; const UPDATE = '0.0';

View File

@ -1,35 +1,35 @@
<?php echo template::formOpen('galleryUpdateForm'); ?> <?php echo template::formOpen('galleryUpdateForm'); ?>
<div class="row"> <div class="row">
<div class="col1"> <div class="col1">
<?php echo template::button('galleryUpdateBack', [ <?php echo template::button('galleryUpdateBack', [
'class' => 'buttonGrey', 'class' => 'buttonGrey',
'href' => helper::baseUrl() . $this->getUrl(0) . '/config', 'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
'value' => template::ico('left') 'value' => template::ico('left')
]); ?> ]); ?>
</div>
<div class="col2 offset9">
<?php echo template::submit('galleryUpdateSubmit'); ?>
</div>
</div> </div>
<div class="col2 offset9"> <div class="row">
<?php echo template::submit('galleryUpdateSubmit'); ?> <div class="col12">
</div> <div class="block">
</div> <h4>Dossier de la galerie</h4>
<div class="row"> <div class="row">
<div class="col12"> <div class="col12">
<div class="block"> <?php echo template::hidden('galleryUpdateDirectoryOld', [
<h4>Dossier de la galerie</h4> 'noDirty' => true, // Désactivé à cause des modifications en ajax
<div class="row"> ]); ?>
<div class="col12"> <?php echo template::select('galleryUpdateDirectory', [], [
<?php echo template::hidden('galleryUpdateDirectoryOld', [ 'label' => 'Dossier cible',
'noDirty' => true, // Désactivé à cause des modifications en ajax 'noDirty' => true, // Désactivé à cause des modifications en ajax,
'value' => $this->getData(['module', $this->getUrl(0), 'directory']), ]); ?>
]); ?> </div>
<?php echo template::select('galleryUpdateDirectory', [], [
'label' => 'Dossier cible',
'noDirty' => true, // Désactivé à cause des modifications en ajax,
]); ?>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
<?php echo template::formClose(); ?> <?php echo template::formClose(); ?>
<div class="moduleVersion">Module Slider version <div class="moduleVersion">Module Slider version
<?php echo $module::VERSION; ?> <?php echo $module::VERSION; ?>

View File

@ -1,60 +0,0 @@
[JsonDb][17:33:28.696300]--site/data/user.json
[JsonDb][17:33:30.923100]--site/data/config.json
[JsonDb][17:33:39.929400]--site/data/fr_FR/page.json
[SecurePut][17:33:39.932300]--site/data/fr_FR/content/accueil.html
[SecurePut][17:33:39.935700]--site/data/fr_FR/content/enfant.html
[SecurePut][17:33:39.938700]--site/data/fr_FR/content/privee.html
[SecurePut][17:33:39.940500]--site/data/fr_FR/content/mise-en-page.html
[SecurePut][17:33:39.942300]--site/data/fr_FR/content/menu-lateral.html
[SecurePut][17:33:39.944900]--site/data/fr_FR/content/blog.html
[SecurePut][17:33:39.947400]--site/data/fr_FR/content/galeries.html
[SecurePut][17:33:39.949500]--site/data/fr_FR/content/site-de-zwii.html
[SecurePut][17:33:39.952400]--site/data/fr_FR/content/contact.html
[SecurePut][17:33:39.954800]--site/data/fr_FR/content/barre.html
[SecurePut][17:33:39.957200]--site/data/fr_FR/content/barrelateraleavecmenu.html
[SecurePut][17:33:39.960100]--site/data/fr_FR/content/mentions-legales.html
[SecurePut][17:33:39.962300]--site/data/fr_FR/content/erreur302.html
[SecurePut][17:33:39.964600]--site/data/fr_FR/content/erreur403.html
[SecurePut][17:33:39.967200]--site/data/fr_FR/content/erreur404.html
[SecurePut][17:33:39.969200]--site/data/fr_FR/content/recherche.html
[JsonDb][17:33:39.971800]--site/data/fr_FR/module.json
[SecurePut][17:33:39.975600]--site/data/fr_FR/content/accueil.html
[JsonDb][17:33:39.979800]--site/data/fr_FR/locale.json
[SecurePut][17:33:39.982100]--site/data/fr_FR/content/accueil.html
[JsonDb][17:33:40.236800]--site/data/user.json
[JsonDb][17:33:41.108200]--site/data/config.json
[JsonDb][16:39:49.897300]--site/data/user.json
[JsonDb][16:40:24.088000]--site/data/user.json
[JsonDb][16:40:25.205100]--site/data/user.json
[JsonDb][16:40:25.222500]--site/data/fr_FR/module.json
[JsonDb][16:40:25.225500]--site/data/fr_FR/module.json
[JsonDb][16:40:25.228800]--site/data/fr_FR/module.json
[JsonDb][16:40:25.232500]--site/data/fr_FR/module.json
[JsonDb][16:40:25.272700]--site/data/fr_FR/module.json
[JsonDb][16:40:25.305900]--site/data/fr_FR/module.json
[JsonDb][16:40:25.309400]--site/data/fr_FR/module.json
[JsonDb][16:40:25.347700]--site/data/fr_FR/module.json
[JsonDb][16:40:25.380400]--site/data/fr_FR/module.json
[JsonDb][16:40:25.425500]--site/data/fr_FR/module.json
[JsonDb][16:40:25.467600]--site/data/fr_FR/module.json
[JsonDb][16:40:25.508100]--site/data/fr_FR/module.json
[JsonDb][16:40:26.909300]--site/data/user.json
[JsonDb][16:40:28.342200]--site/data/user.json
[JsonDb][16:40:35.539700]--site/data/user.json
[JsonDb][16:46:38.876100]--site/data/user.json
[JsonDb][17:00:43.742000]--site/data/user.json
[SecurePut][17:00:43.757100]--site/data/font/font.html
[SecurePut][17:00:43.759700]--site/data/font/font.css
[JsonDb][17:00:45.950500]--site/data/user.json
[SecurePut][17:00:45.982300]--site/data/font/font.html
[SecurePut][17:00:45.984900]--site/data/font/font.css
[JsonDb][17:00:50.370800]--site/data/user.json
[SecurePut][17:00:50.386000]--site/data/font/font.html
[SecurePut][17:00:50.388700]--site/data/font/font.css
[JsonDb][17:00:51.923600]--site/data/user.json
[SecurePut][17:00:51.932700]--site/data/font/font.html
[SecurePut][17:00:51.935700]--site/data/font/font.css
[JsonDb][17:00:54.354900]--site/data/user.json
[JsonDb][17:00:57.097400]--site/data/user.json
[JsonDb][17:00:59.142200]--site/data/user.json
[JsonDb][17:01:01.703400]--site/data/user.json