Compare commits

..

2 Commits

Author SHA1 Message Date
b45b107a9f 13308 2024-09-30 14:52:01 +02:00
ff225fa321 Erreur HTTP 401 et 403 2024-09-30 14:47:42 +02:00
189 changed files with 1261 additions and 2797 deletions

2
.gitignore vendored
View File

@ -4,10 +4,10 @@ site/data/*
site/tmp/*
site/backup/*
site/file/*
site/i18n/*.json
.DS_Store
core/vendor/tinymce/link_list.json
robots.txt
sitemap.xml
.gitignore
core/module/config/tool/data.key
site/i18n/*.json

View File

@ -1,58 +1,7 @@
# Notes de mises à jour
## Version 13.5.03
**Corrections**
- Mauvaise récupération du groupe de l'utilisateur, module de gestion des utilisateurs.
- Petites corrections.
## Version 13.5.02
**Correction**
- La réinitialisation du mot de passe ne fonctionnait pas. L'échec du changement de mot de passe est enregistré dans le journal de Zwii.
## Version 13.5.01
**Correction**
- Configuration du site, le message de formulaire non soumis non affiché.
## Version 13.5.00
**Améliorations :**
- Après un changement d'onglet dans la page de configuration, la page ne se recharge plus. Le dernier onglet affiché avant un submit est mémorisé dans les vues de l'utilisateur.
- Réactivation de l'édition des dialogues des langues.
- Nouveau bouton de test de bon fonctionnement du serveur SMTP afin de valider la double authentification.
- Validation de la connexion au site avec un code adressé par email. L'option est disponible depuis la configuration du site, onglet connexion. Elle s'active par groupe montant, exemple "éditeur" pour éditeurs et administrateurs.
- Optimisation du chargement des variables de classe.
- Suppression de redondance de déclaration des charset.
- Méthode de backup optimisée.
**Corrections :**
- Corrige un défaut d'affichage du bouton d'édition d'une page contenant un module ayant été supprimé sans passer par l'interface de gestion (FTP).
- Corrige un bug de changement de mot de passe pour les comptes non administrateurs.
- 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 qui perturbait l'affichage des articles de blog.
- Activation de la mémorisation de l'onglet actif dans la configuration après validation du formulaire ou visite d'une autre page du site.
- À l'installation, le bouton back mémorise la langue sélectionnée à la première étape.
- Corrige un bug de mise à jour en ligne du fichier des langues.
## 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.
## Version 13.3.07
- Anticipe la déconnexion de la version 13.4
## Versions 13.3.06
** Corrections : **
@ -60,7 +9,7 @@
- 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 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 persistante.
- Supprime un slash à la fin de l'URL du catalogue.
- Eviter un warning lors de la création d'une nouvelle page.

View File

@ -1,4 +1,4 @@
# ZwiiCMS 13.5.03
# ZwiiCMS 13.3.07
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.03
# ZwiiCMS 13.3.07
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

@ -197,20 +197,14 @@ class helper
public static function autoBackup($folder, $filter = ['backup', 'tmp'])
{
// Création du nom de fichier ZIP
// Creation du ZIP
$baseName = str_replace('/', '', helper::baseUrl(false, false));
$baseName = empty($baseName) ? 'ZwiiCMS' : $baseName;
$fileName = $baseName . '-backup-' . date('Y-m-d-H-i-s') . '.zip';
// Initialisation de l'archive ZIP
$fileName = $baseName . '-backup-' . date('Y-m-d-H-i-s', time()) . '.zip';
$zip = new ZipArchive();
if ($zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
return false; // Retourne false si l'ouverture échoue
}
$zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
$directory = 'site/';
// Récupération des fichiers et des dossiers
//$filter = array('backup','tmp','file');
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator(
@ -218,30 +212,23 @@ class helper
RecursiveDirectoryIterator::SKIP_DOTS
),
function ($fileInfo, $key, $iterator) use ($filter) {
// Inclure les fichiers ou les répertoires non filtrés
return $fileInfo->isFile() || ($fileInfo->isDir() && !in_array($fileInfo->getBaseName(), $filter));
return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter);
}
)
);
// Ajout des fichiers à l'archive
foreach ($files as $file) {
foreach ($files as $name => $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = str_replace(DIRECTORY_SEPARATOR, '/', substr($filePath, strlen(realpath($directory)) + 1));
$relativePath = substr($filePath, strlen(realpath($directory)) + 1);
$zip->addFile($filePath, $relativePath);
}
}
// Fermeture de l'archive ZIP
$zip->close();
return $fileName;
return ($fileName);
}
/**
* Retourne la liste des modules installés dans un tableau composé
* du nom réel
@ -356,7 +343,7 @@ class helper
public static function checkRewrite()
{
// N'interroge que le serveur Apache
if ((helper::checkServerSoftware() === false)) {
if (strpos($_SERVER["SERVER_SOFTWARE"], 'Apache') > 0) {
self::$rewriteStatus = false;
} else {
// Ouvre et scinde le fichier .htaccess
@ -367,14 +354,6 @@ class helper
return self::$rewriteStatus;
}
/**
* Retourne vrai ou faux selon que le serveur est comptatible avec htaccess
* @return bool
*/
public static function checkServerSoftware() {
return (stripos($_SERVER['SERVER_SOFTWARE'], 'Apache') !== false || stripos($_SERVER['SERVER_SOFTWARE'], 'LiteSpeed') !== false);
}
/**
* Renvoie le numéro de version de Zwii est en ligne
* @return string
@ -694,35 +673,13 @@ class helper
public static function subword($text, $start, $length)
{
$text = trim($text);
// 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
if (strlen($text) > $length) {
$text = mb_substr($text, $start, $length);
// 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 .= '...';
$text = mb_substr($text, 0, min(mb_strlen($text), mb_strrpos($text, ' ')));
}
return $text;
}
/**
* Cryptage
* @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
$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
if ($write_result === $encoded_length) {
// Sort de la boucle si l'écriture a réussi

View File

@ -82,25 +82,17 @@ class layout extends common
$content = 'col' . $blocks[1];
$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
$pattern = ['config', 'edit', 'add', 'comment', 'data', 'option', 'theme', 'comment', 'article', 'data', 'gallery', 'update', 'users', 'validate'];
// Page pleine pour la configuration des modules et l'édition des pages sauf l'affichage d'un article de blog
$pattern = ['config', 'edit', 'add', 'comment', 'data'];
if (
(sizeof($blocks) === 1 ||
in_array($this->getUrl(1), $pattern))
) { // Pleine page en mode configuration
if (
($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'top'
|| $this->getData(['page', $this->getUrl(0), 'navRight']) === 'top')
&& in_array($this->getUrl(1), $pattern) === false
) {
if ($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'top' || $this->getData(['page', $this->getUrl(0), 'navRight']) === 'top') {
$this->showNavButtons('top');
}
$this->showContent();
if (
($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'bottom'
|| $this->getData(['page', $this->getUrl(0), 'navRight']) === 'bottom')
&& in_array($this->getUrl(1), $pattern) === false
) {
if ($this->getData(['page', $this->getUrl(0), 'navLeft']) === 'bottom' || $this->getData(['page', $this->getUrl(0), 'navRight']) === 'bottom') {
$this->showNavButtons('bottom');
}
} else {
@ -338,7 +330,7 @@ class layout extends common
// Affichage du lien de connexion
if (
($this->getData(['theme', 'footer', 'loginLink'])
and $this->isConnected() === false
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
)
or $this->getUrl(0) === 'theme'
) {
@ -501,7 +493,7 @@ class layout extends common
// Lien de connexion
if (
($this->getData(['theme', 'menu', 'loginLink'])
and $this->isConnected() === false
and $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
)
or $this->getUrl(0) === 'theme'
) {
@ -588,9 +580,9 @@ class layout extends common
if (
($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
and $this->isConnected() === true
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') < self::GROUP_EDITOR
)
) {
@ -654,9 +646,9 @@ class layout extends common
$items .= '<li id=' . $childKey . '>';
if (
($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
and $this->isConnected() === true
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') < self::GROUP_EDITOR
)
) {
@ -750,7 +742,7 @@ class layout extends common
$items .= '<li class="menuSideChild">';
if (
$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) . '">';
} else {
@ -774,7 +766,7 @@ class layout extends common
if (
$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) . '">';
} else {
@ -910,7 +902,7 @@ class layout extends common
*/
public function showBar()
{
if ($this->isConnected() === true) {
if ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')) {
// Items de gauche
$leftItems = '';
// Sélecteur de langues
@ -998,8 +990,8 @@ class layout extends common
// Sur une page sans module
or $this->getData(['page', $this->getUrl(0), 'moduleId']) === ''
// Sur une page avec un module invalide
or (empty($this->getData(['page', $this->getUrl(0), 'moduleId'])) === false
and class_exists($this->getData(['page', $this->getUrl(0), 'moduleId'])) === false
or (!is_null($this->getData(['page', $this->getUrl(2), 'moduleId'])) and
!class_exists($this->getData(['page', $this->getUrl(2), 'moduleId']))
)
// Sur une page d'accueil
or $this->getUrl(0) === ''
@ -1019,7 +1011,6 @@ class layout extends common
$this->getUser('permission', 'page', 'module')
and $this->geturl(1) !== 'edit'
and $this->getData(['page', $this->getUrl(0), 'moduleId'])
and class_exists($this->getData(['page', $this->getUrl(0), 'moduleId'])) === true
) {
$leftItems .= '<li>' . template::ico('gear', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
@ -1072,14 +1063,18 @@ class layout extends common
'help' => 'Thème',
'href' => helper::baseUrl() . 'theme'
]) . '</li>';
$rightItems .= '<li>' . template::ico('users', [
'help' => 'Utilisateurs',
'href' => helper::baseUrl() . 'user'
$rightItems .= '<li>' . template::ico('puzzle', [
'help' => 'Modules',
'href' => helper::baseUrl() . 'plugin'
]) . '</li>';
$rightItems .= '<li>' . template::ico('cog-alt', [
'help' => 'Configuration',
'href' => helper::baseUrl() . 'config'
]) . '</li>';
$rightItems .= '<li>' . template::ico('users', [
'help' => 'Utilisateurs',
'href' => helper::baseUrl() . 'user'
]) . '</li>';
// Mise à jour automatique
$today = mktime(0, 0, 0);
$checkUpdate = $this->getData(['core', 'lastAutoUpdate']);
@ -1091,55 +1086,21 @@ class layout extends common
$today > $checkUpdate + $this->getData(['config', 'autoUpdateDelay', 86400])
) {
// Dernier auto controle
$this->setData(['core', 'lastAutoUpdate', $today], false);
$this->setData(['core', 'lastAutoUpdate', $today]);
if (
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
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>';
}
}
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 (
$this->getUser('group') >= self::GROUP_EDITOR
&& $this->getUser('permission', 'user', 'edit')
@ -1214,7 +1175,7 @@ class layout extends common
{
// Import des fontes liées au thème
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');
}
}
@ -1227,7 +1188,7 @@ class layout extends common
$vars = 'var baseUrl = ' . json_encode(helper::baseUrl(false)) . ';';
$vars .= 'var baseUrlQs = ' . json_encode(helper::baseUrl()) . ';';
if (
$this->isConnected() === true
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') >= self::GROUP_EDITOR
) {
$vars .= 'var privateKey = ' . json_encode(md5_file(self::DATA_DIR . 'core.json')) . ';';

View File

@ -11,7 +11,7 @@ class core extends common
parent::__construct();
// Token CSRF
if (empty($_SESSION['csrf'])) {
$_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(64));
$_SESSION['csrf'] = bin2hex(openssl_random_pseudo_bytes(128));
}
// Fuseau horaire
@ -32,6 +32,8 @@ class core extends common
}
// Date de la dernière suppression
$this->setData(['core', 'lastClearTmp', $lastClearTmp]);
// Enregistre les données
//$this->SaveData();
}
// Backup automatique des données
$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
if (
$this->isConnected() === true
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and ($this->getUser('group') === common::GROUP_BANNED
or ($_SESSION['csrf'] !== $this->getData(['user', $this->getUser('id'), 'accessCsrf'])
and $this->getData(['config', 'connect', 'autoDisconnect']) === true)
@ -427,8 +429,8 @@ class core extends common
$this->getData(['config', 'maintenance'])
and in_array($this->getUrl(0), ['maintenance', 'user']) === false
and $this->getUrl(1) !== 'login'
and ($this->isConnected() === false
or ($this->isConnected() === true
and ($this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
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), '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'])
// 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']))
@ -464,9 +466,9 @@ class core extends common
// Empêcher l'accès aux pages désactivées par URL directe
if (
($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
and $this->isConnected() === true
and $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and $this->getUser('group') < common::GROUP_EDITOR
)
) {
@ -513,11 +515,10 @@ class core extends common
}
// Accès concurrent stocke la page visitée
if (
$this->isConnected() === true
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
&& $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()]);
}
// Breadcrumb
@ -634,7 +635,7 @@ class core extends common
// Check le groupe de l'utilisateur
if (
($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('permission', $moduleId, $action)
)

View File

@ -128,17 +128,7 @@ class SitemapGenerator
*/
private $sampleRobotsLines = [
"User-agent: *",
"Disallow: /",
"User-agent: Googlebot",
"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

View File

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

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -216,14 +216,12 @@ core.start = function () {
// Variables des cookies
var getUrl = window.location;
var domain = "domain=" + getUrl.hostname + ";";
var basePath = getUrl.pathname.substring(0, getUrl.pathname.lastIndexOf('/') + 1);
var path = "path=" + basePath + ";";
var e = new Date();
e.setFullYear(e.getFullYear() + 1);
var expires = "expires=" + e.toUTCString() + ";";
var expires = "expires=" + e.toUTCString();
// 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

@ -8,7 +8,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -51,18 +51,11 @@ class common
const ACCESS_TIMER = 1800;
// Numéro de version
const ZWII_VERSION = '13.5.03';
const ZWII_VERSION = '13.3.08';
// URL autoupdate
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/cms-update/raw/branch/master/';
/**
* 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 = 'v13';
const ZWII_UPDATE_CHANNEL = 'v134';
// Valeurs possibles multiple de 10, 10 autorise 9 profils, 100 autorise 99 profils
const MAX_PROFILS = 10;
@ -102,13 +95,13 @@ class common
"user"
];
/*
Cette variable est supprimée du test dans le routeur.
public static $accessExclude = [
'login',
'logout',
"maintenance",
];
*/
Cette variable est supprimée du test dans le routeur.
public static $accessExclude = [
'login',
'logout',
"maintenance",
];
*/
private $data = [];
private $hierarchy = [
'all' => [],
@ -319,38 +312,25 @@ class common
// Boutons de navigation dans la page
public static $navIconTemplate = [
'open' => [
'left' => 'left-open',
'right' => 'right-open',
],
'dir' => [
'left' => 'left',
'right' => 'right-dir',
],
'big' => [
'left' => 'left-big',
'right' => 'right-big',
],
];
'open' => [
'left' => 'left-open',
'right' => 'right-open',
],
'dir' => [
'left' => 'left',
'right' => 'right-dir',
],
'big' => [
'left' => 'left-big',
'right' => 'right-big',
],
];
/**
* Constructeur commun
*/
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
if (isset($_POST)) {
@ -374,13 +354,12 @@ class common
}
}
}
// Localisation
\setlocale(LC_ALL, self::$siteContent . '.UTF8');
// Instanciation de la classe des entrées / sorties
$this->jsonDB(self::$siteContent);
// Installation fraîche, initialisation des modules
if ($this->user === []) {
foreach ($this->dataFiles as $stageId => $item) {
@ -408,13 +387,14 @@ class common
? self::$i18nUI
: 'fr_FR';
} else {
// Par défaut la langue définie par défaut à l'installation
if ($this->getData(['config','defaultLanguageUI'])) {
self::$i18nUI = $this->getData(['config','defaultLanguageUI']);
if (isset($_SESSION['ZWII_UI'])) {
self::$i18nUI = $_SESSION['ZWII_UI'];
} elseif (isset($_COOKIE['ZWII_UI'])) {
self::$i18nUI = $_COOKIE['ZWII_UI'];
} else {
self::$i18nUI = 'fr_FR';
$this->setData(['config','defaultLanguageUI', 'fr_FR']);
}
$_SESSION['ZWII_UI'] = self::$i18nUI;
}
// Stocker le cookie de langue pour l'éditeur de texte
setcookie('ZWII_UI', self::$i18nUI, time() + 3600, helper::baseUrl(false, false), '', false, false);
@ -452,9 +432,6 @@ class common
}
}
// Cache
$GLOBALS['common_construct']['dialog'] = self::$dialog;
// Données de proxy
$proxy = $this->getData(['config', 'proxyType']) . $this->getData(['config', 'proxyUrl']) . ':' . $this->getData(['config', 'proxyPort']);
if (
@ -476,21 +453,6 @@ class common
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
include('core/include/update.inc.php');
@ -558,7 +520,7 @@ class common
* Sauvegarde 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
if (
@ -586,7 +548,7 @@ class common
$query .= '.' . $keys[$i];
}
// 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;
}
@ -657,35 +619,32 @@ class common
// Initialise le compteur de tentatives
$attempts = 0;
// Convertit les données en chaîne de caractères
$serialized_data = serialize($data);
// Vérifie la longueur des données
$data_length = strlen($data);
$data_length = strlen($serialized_data);
// Effectue jusqu'à 5 tentatives d'écriture
while ($attempts < 5) {
// Essaye d'écrire les données dans le fichier avec verrouillage exclusif
$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
if ($write_result !== false && $write_result === $data_length) {
// Sort de la boucle si l'écriture a réussi
break;
return true;
}
// Incrémente le compteur de tentatives
$attempts++;
sleep(1);
}
// Échec de l'écriture après plusieurs tentatives
// Etat de l'écriture
return ($attempts < 5);
return false;
}
/**
* Effacer les données de la page
* @param string pageId
@ -728,56 +687,45 @@ class common
mkdir(self::DATA_DIR . $lang, 0755);
}
switch ($module) {
case 'page':
case 'module':
case 'locale':
// Création des sous-dossiers localisés
if (!file_exists(self::DATA_DIR . $lang)) {
mkdir(self::DATA_DIR . $lang, 0755);
// Localisation
if (
$module === 'page' ||
$module === 'module' ||
$module === 'locale'
) {
// Création des sous-dossiers localisés
if (!file_exists(self::DATA_DIR . $lang)) {
mkdir(self::DATA_DIR . $lang, 0755);
}
if (!file_exists(self::DATA_DIR . $lang . '/content')) {
mkdir(self::DATA_DIR . $lang . '/content', 0755);
}
// Site en français avec site exemple
if ($lang == 'fr_FR' && $sampleSite === true) {
$this->setData([$module, init::$siteTemplate[$module]]);
// Création des pages
foreach (init::$siteContent as $key => $value) {
$this->setPage($key, $value, 'fr_FR');
}
if (!file_exists(self::DATA_DIR . $lang . '/content')) {
mkdir(self::DATA_DIR . $lang . '/content', 0755);
}
// Site en français avec site exemple
if ($lang == 'fr_FR' && $sampleSite === true && $module !== 'locale') {
$this->setData([$module, init::$siteTemplate[$module]]);
// Création des pages
foreach (init::$siteContent as $key => $value) {
$this->setPage($key, $value['content'], 'fr_FR');
}
// Version en langue étrangère ou fr_FR sans site de test
} else {
// En_EN par défaut si le contenu localisé n'est pas traduit
$langDefault = array_key_exists($lang, init::$defaultDataI18n) === true ? $lang : 'default';
// Charger les données de cette langue
$this->setData([$module, init::$defaultDataI18n[$langDefault][$module]]);
// Créer la page d'accueil, une seule page dans cette configuration
$pageId = init::$defaultDataI18n[$langDefault]['locale']['homePageId'];
$content = init::$defaultDataI18n[$langDefault]['html'];
$this->setPage($pageId, $content, $lang);
}
break;
default:
// Installation des données des autres modules cad theme profil font config, admin et core
$this->setData([$module, init::$defaultData[$module]]);
break;
// Version en langue étrangère ou fr_FR sans site de test
} else {
// En_EN par défaut si le contenu localisé n'est pas traduit
$langDefault = array_key_exists($lang, init::$defaultDataI18n) === true ? $lang : 'default';
// Charger les données de cette langue
$this->setData([$module, init::$defaultDataI18n[$langDefault][$module]]);
// Créer la page d'accueil, une seule page dans cette configuration
$pageId = init::$defaultDataI18n[$langDefault]['locale']['homePageId'];
$content = init::$defaultDataI18n[$langDefault]['html'];
$this->setPage($pageId, $content, $lang);
//file_put_contents(self::DATA_DIR . $lang . '/content/' . init::$defaultDataI18n[$langDefault]['page'][$pageId]['content'], $content);
}
} else {
// Installation des données des autres modules cad theme profil font config, admin et core
$this->setData([$module, init::$defaultData[$module]]);
}
}
/**
* 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
@ -809,65 +757,65 @@ class common
* Appelée par le core uniquement
*/
private function buildHierarchy()
{
private function buildHierarchy()
{
$pages = helper::arrayColumn($this->getData(['page']), 'position', 'SORT_ASC');
// Parents
foreach ($pages as $pageId => $pagePosition) {
if (
// Page parent
$this->getData(['page', $pageId, 'parentPageId']) === ""
// Ignore les pages dont l'utilisateur n'a pas accès
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
or ($this->isConnected() === true
//and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
// 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']))
$pages = helper::arrayColumn($this->getData(['page']), 'position', 'SORT_ASC');
// Parents
foreach ($pages as $pageId => $pagePosition) {
if (
// Page parent
$this->getData(['page', $pageId, 'parentPageId']) === ""
// Ignore les pages dont l'utilisateur n'a pas accès
and ($this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
or ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
//and $this->getUser('group') >= $this->getData(['page', $pageId, 'group'])
// 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']))
)
)
) {
if ($pagePosition !== 0) {
$this->hierarchy['visible'][$pageId] = [];
}
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
$this->hierarchy['bar'][$pageId] = [];
}
$this->hierarchy['all'][$pageId] = [];
}
}
// Enfants
foreach ($pages as $pageId => $pagePosition) {
)
)
) {
if ($pagePosition !== 0) {
$this->hierarchy['visible'][$pageId] = [];
}
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
$this->hierarchy['bar'][$pageId] = [];
}
$this->hierarchy['all'][$pageId] = [];
}
}
// Enfants
foreach ($pages as $pageId => $pagePosition) {
if (
// Page parent
$parentId = $this->getData(['page', $pageId, 'parentPageId'])
// Ignore les pages dont l'utilisateur n'a pas accès
and (
(
$this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
and
$this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR
)
or (
$this->isConnected() === true
and
$this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil'])
if (
// Page parent
$parentId = $this->getData(['page', $pageId, 'parentPageId'])
// Ignore les pages dont l'utilisateur n'a pas accès
and (
(
$this->getData(['page', $pageId, 'group']) === self::GROUP_VISITOR
and
$this->getData(['page', $parentId, 'group']) === self::GROUP_VISITOR
)
or (
$this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
and
$this->getUser('group') * self::MAX_PROFILS + $this->getUser('profil')) >= ($this->getData(['page', $pageId, 'group']) * self::MAX_PROFILS + $this->getData(['page', $pageId, 'profil'])
)
)
) {
if ($pagePosition !== 0) {
$this->hierarchy['visible'][$parentId][] = $pageId;
}
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
$this->hierarchy['bar'][$pageId] = [];
}
$this->hierarchy['all'][$parentId][] = $pageId;
}
}
}
)
)
) {
if ($pagePosition !== 0) {
$this->hierarchy['visible'][$parentId][] = $pageId;
}
if ($this->getData(['page', $pageId, 'block']) === 'bar') {
$this->hierarchy['bar'][$pageId] = [];
}
$this->hierarchy['all'][$parentId][] = $pageId;
}
}
}
/**
* Génère un fichier json avec la liste des pages
@ -1080,17 +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
* @return bool
@ -1280,7 +1217,7 @@ class common
$source_image = imagecreatefromwebp($src);
break;
case 'avif':
$source_image = imagecreatefromavif($src);
$source_image = imagecreatefromavif($src);
}
// Image valide
if (is_object($source_image)) {
@ -1506,7 +1443,7 @@ class common
public function saveLog($message = '')
{
// Journalisation
$dataLog = helper::dateUTF8('%Y%m%d', time(), self::$i18nUI) . ';' . helper::dateUTF8('%H:%M', time(), self::$i18nUI) . ';';
$dataLog = helper::dateUTF8('%Y%m%d', time(), self::$i18nUI) . ';' . helper::dateUTF8('%H:%M', time(), self::$i18nUI). ';';
$dataLog .= helper::getIp($this->getData(['config', 'connect', 'anonymousIp'])) . ';';
$dataLog .= empty($this->getUser('id')) ? 'visitor;' : $this->getUser('id') . ';';
$dataLog .= $message ? $this->getUrl() . ';' . $message : $this->getUrl();

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -2,7 +2,7 @@
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
<head>
<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">
<?php $layout->showMetaTitle(); ?>
<?php $layout->showMetaDescription(); ?>

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -2,7 +2,7 @@
<html prefix="og: http://ogp.me/ns#" lang="<?php echo substr(self::$siteContent, 0, 2); ?>">
<head>
<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">
<?php $layout->showMetaTitle(); ?>
<?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);?>">
<head>
<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 http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="x-apple-disable-message-reformatting">

View File

@ -3,7 +3,7 @@
<head>
<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 name="generator" content="ZiiCMS https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS">
<meta name="viewport" content="width=device-width, initial-scale=1">
@ -54,7 +54,7 @@
if (
$this->getData(['theme', 'menu', 'position']) === 'top'
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
) {
echo '<nav id="navfixedconnected" >';

View File

@ -9,7 +9,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -22,7 +22,7 @@ class config extends common
'copyBackups' => self::GROUP_ADMIN,
'delBackups' => self::GROUP_ADMIN,
'configMetaImage' => self::GROUP_ADMIN,
'sitemap' => self::GROUP_ADMIN,
'siteMap' => self::GROUP_ADMIN,
'index' => self::GROUP_ADMIN,
'restore' => self::GROUP_ADMIN,
'updateBaseUrl' => self::GROUP_ADMIN,
@ -30,8 +30,7 @@ class config extends common
'logReset' => self::GROUP_ADMIN,
'logDownload' => self::GROUP_ADMIN,
'blacklistReset' => self::GROUP_ADMIN,
'blacklistDownload' => self::GROUP_ADMIN,
'testmail' => self::GROUP_ADMIN,
'blacklistDownload' => self::GROUP_ADMIN
];
public static $timezones = [
@ -212,7 +211,7 @@ class config extends common
* Sitemap compressé et non compressé
* Robots.txt
*/
public function sitemap()
public function siteMap()
{
// La page n'existe pas
if (
@ -496,23 +495,11 @@ class config extends common
'autoDisconnect' => $this->getInput('connectAutoDisconnect', helper::FILTER_BOOLEAN),
'captchaType' => $this->getInput('connectCaptchaType'),
'showPassword' => $this->getInput('connectShowPassword', helper::FILTER_BOOLEAN),
'redirectLogin' => $this->getInput('connectRedirectLogin', helper::FILTER_BOOLEAN),
'mailAuth' => $this->getInput('connectAuthMail', helper::FILTER_INT),
'redirectLogin' => $this->getInput('connectRedirectLogin', helper::FILTER_BOOLEAN)
]
]
]);
// Sauvegarde la position des onglets de la vue de l'utilisateur courant
$this->setData([
'user',
$this->getUser('id'),
'view',
[
'config' => $this->getInput('containerSelected'),
'page' => $this->getData(['user', $this->getUser('id'), 'view', 'page']),
]
]);
// Efface les fichiers de backup lorsque l'option est désactivée
if ($this->getInput('configFileBackup', helper::FILTER_BOOLEAN) === false) {
$path = realpath('site/data');
@ -920,8 +907,7 @@ class config extends common
* Fonction pour vérifier la présence du module de réécriture
* @return bool
*/
public function isModRewriteEnabled()
{
public function isModRewriteEnabled() {
// Check if Apache and mod_rewrite is loaded
if (function_exists('apache_get_modules')) {
$modules = apache_get_modules();
@ -931,34 +917,4 @@ class config extends common
return getenv('HTTP_MOD_REWRITE') == 'On' || getenv('REDIRECT_STATUS') == '200';
}
}
/**
* Envoi un message de test
* @return void
*/
public function testmail()
{
$sent = $this->sendMail(
$this->getUser('mail'),
helper::translate('Test de la messagerie du site'),
'<strong>' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') . '</strong>,<br><br>' .
'<h4>' . helper::translate('Il semblerait que votre messagerie fonctionne correctement !') . '</h4>',
null,
'no-reply@localhost'
);
if ($sent !== true) {
// Désactivation de l'authentification par email
$this->setData(['config', 'connect', 'mailAuth', 0]);
// Journalisation
$this->saveLog($sent);
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config/' . $this->getUrl(2),
'state' => $sent === true ? true : false,
'notification' => $sent === true ? helper::translate('Message de test envoyé avec succès') : helper::translate('Message non envoyé')
]);
}
}

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -5,7 +5,7 @@
* file that was distributed with this source code.
*
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -3,7 +3,13 @@
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Sécurité de la connexion'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/connexion" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php // echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4>
<div class="row">
<div class="col4">
<?php echo template::checkbox('connectShowPassword', true, 'Dévoiler le mot de passe', [
@ -37,32 +43,32 @@
'selected' => $this->getData(['config', 'connect', 'timeout'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('connectAuthMail', array_merge([0 => 'Aucune'], self::$groupNews), [
'label' => 'Validation par clé ⚠️',
'selected' => $this->getData(['config', 'connect', 'mailAuth']),
'help' => 'La connexion est confirmée à l\'aide d\'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.'
<div class="col3 verticalAlignBottom">
<label id="helpBlacklist"><?php echo helper::translate('Liste noire'); ?>
<?php echo template::help(
'La liste noire énumère les tentatives de connexion à partir de comptes inexistants. Sont stockés : la date, l\'heure, le nom du compte et l\'IP.
Après le nombre de tentatives autorisées, l\'IP et le compte sont bloqués.'
);
?>
</label>
<?php echo template::button('ConnectBlackListDownload', [
'href' => helper::baseUrl() . 'config/blacklistDownload',
'value' => 'Télécharger la liste',
'ico' => 'download'
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('ConfigSendMail', [
'href' => helper::baseUrl() . 'config/testmail',
'value' => 'Message de test',
'ico' => 'mail'
<?php echo template::button('CnnectBlackListReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/blacklistReset',
'value' => 'Réinitialiser la liste',
'ico' => 'trash'
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Captcha à la connexion'); ?>
</h4>
<div class="row">
<div class="col3">
<?php echo template::checkbox('connectCaptcha', true, 'Activer', [
<?php echo template::checkbox('connectCaptcha', true, 'Captcha à la connexion', [
'checked' => $this->getData(['config', 'connect', 'captcha'])
]); ?>
</div>
@ -86,66 +92,40 @@
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Journalisation'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/journalisation" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php // echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>
-->
</h4>
<div class="row">
<div class="col6">
<div class="row">
<div class="col6">
<?php echo template::checkbox('connectLog', true, 'Activer la journalisation', [
'checked' => $this->getData(['config', 'connect', 'log'])
]); ?>
</div>
<div class="col6">
<?php echo template::select('connectAnonymousIp', $module::$anonIP, [
'label' => 'Anonymat des adresses IP',
'selected' => $this->getData(['config', 'connect', 'anonymousIp']),
'help' => 'La règlementation française impose un anonymat de niveau 2'
]); ?>
</div>
</div>
<div class="row">
<div class="col6 ">
<?php echo template::button('ConfigLogDownload', [
'href' => helper::baseUrl() . 'config/logDownload',
'value' => 'Télécharger le journal',
'ico' => 'download'
]); ?>
</div>
<div class="col6">
<?php echo template::button('ConnectLogReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/logReset',
'value' => 'Réinitialiser le journal',
'ico' => 'trash'
]); ?>
</div>
</div>
<div class="col3">
<?php echo template::checkbox('connectLog', true, 'Activer la journalisation', [
'checked' => $this->getData(['config', 'connect', 'log'])
]); ?>
</div>
<div class="col6 verticalAlignBottom">
<div class="row">
<div class="col6 verticalAlignBottom">
<label id="helpBlacklist"><?php echo helper::translate('Liste noire'); ?>
<?php echo template::help(
'La liste noire énumère les tentatives de connexion à partir de comptes inexistants. Sont stockés : la date, l\'heure, le nom du compte et l\'IP.
Après le nombre de tentatives autorisées, l\'IP et le compte sont bloqués.'
);
?>
</label>
<?php echo template::button('ConnectBlackListDownload', [
'href' => helper::baseUrl() . 'config/blacklistDownload',
'value' => 'Télécharger la liste',
'ico' => 'download'
]); ?>
</div>
<div class="col6 verticalAlignBottom">
<?php echo template::button('ConnectBlackListReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/blacklistReset',
'value' => 'Réinitialiser la liste',
'ico' => 'trash'
]); ?>
</div>
</div>
<div class="col3">
<?php echo template::select('connectAnonymousIp', $module::$anonIP, [
'label' => 'Anonymat des adresses IP',
'selected' => $this->getData(['config', 'connect', 'anonymousIp']),
'help' => 'La règlementation française impose un anonymat de niveau 2'
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('ConfigLogDownload', [
'href' => helper::baseUrl() . 'config/logDownload',
'value' => 'Télécharger le journal',
'ico' => 'download'
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('ConnectLogReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/logReset',
'value' => 'Réinitialiser le journal',
'ico' => 'trash'
]); ?>
</div>
</div>
</div>

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -5,7 +5,7 @@
* file that was distributed with this source code.
*
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -66,11 +66,11 @@ $(document).ready(function () {
$("#connectCaptchaStrong").prop("checked", false);
}
let configLayout = "<?php echo $this->getData(['user', $this->getUser('id'), 'view', 'config']);?>";
// Non défini, valeur par défaut
if (configLayout == "") {
var configLayout = getCookie("configLayout");
if (configLayout == null) {
configLayout = "setup";
}
setCookie("configLayout", "setup");
}
$("#socialContainer").hide();
$("#connectContainer").hide();
@ -83,17 +83,6 @@ $(document).ready(function () {
// Gestion des événements
//---------------------------------------------------------------------------------------------------------------------
/**
* Transmet le bouton de l'onglet sélectionné avant la soumission
*/
// Mettre à jour le champ caché avant la soumission
$('#configForm').on('submit', function () {
$('#containerSelected').val(configLayout);
});
/**
* Afficher et masquer options smtp
*/
@ -173,44 +162,44 @@ $(document).ready(function () {
$("#connectContainer").hide();
$("#networkContainer").hide();
$("#setupContainer").show();
configLayout = "setup";
$("#configSetupButton").addClass("activeButton");
$("#configSocialButton").removeClass("activeButton");
$("#configConnectButton").removeClass("activeButton");
$("#configNetworkButton").removeClass("activeButton");
setCookie("configLayout", "setup");
});
$("#configSocialButton").on("click", function () {
$("#connectContainer").hide();
$("#setupContainer").hide();
$("#networkContainer").hide();
$("#socialContainer").show();
configLayout = "social";
$("#configSetupButton").removeClass("activeButton");
$("#configSocialButton").addClass("activeButton");
$("#configConnectButton").removeClass("activeButton");
$("#configNetworkButton").removeClass("activeButton");
setCookie("configLayout", "social");
});
$("#configConnectButton").on("click", function () {
$("#setupContainer").hide();
$("#socialContainer").hide();
$("#networkContainer").hide();
$("#connectContainer").show();
configLayout = "connect";
$("#configSetupButton").removeClass("activeButton");
$("#configSocialButton").removeClass("activeButton");
$("#configConnectButton").addClass("activeButton");
$("#configNetworkButton").removeClass("activeButton");
setCookie("configLayout", "connect");
});
$("#configNetworkButton").on("click", function () {
$("#setupContainer").hide();
$("#socialContainer").hide();
$("#connectContainer").hide();
$("#networkContainer").show();
configLayout = "network";
$("#configSetupButton").removeClass("activeButton");
$("#configSocialButton").removeClass("activeButton");
$("#configConnectButton").removeClass("activeButton");
$("#configNetworkButton").addClass("activeButton");
setCookie("configLayout", "network");
});
@ -276,6 +265,7 @@ $(document).ready(function () {
$('span#screenWeight').each(function(index){
var weight = parseFloat($(this).text());
var fileType = $('span#screenType').eq(index).text();
console.log(weight);
if ((fileType === "jpg" || fileType === "jpeg") && weight < 5000000) {
$(this).css("color", "green");
} else {
@ -296,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
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);

View File

@ -7,7 +7,16 @@
'value' => template::ico('home')
]); ?>
</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', [
'value' => 'Identité',
'href' => helper::baseUrl() . 'language/site'
@ -21,26 +30,23 @@
<div class="tab">
<?php echo template::button('configSetupButton', [
'value' => 'Configuration',
'class' => 'buttonTab',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('configSocialButton', [
'value' => 'Référencement',
'class' => 'buttonTab',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('configConnectButton', [
'value' => 'Connexion',
'class' => 'buttonTab',
'class' => 'buttonTab'
]); ?>
<?php echo template::button('configNetworkButton', [
'value' => 'Réseau',
'class' => 'buttonTab',
'class' => 'buttonTab'
]); ?>
</div>
<!-- Champ caché pour transmettre l'onglet-->
<?php echo template::hidden('containerSelected'); ?>
<!-- Pages de formulaires -->
<?php include('core/module/config/view/setup/setup.php') ?>
<?php include('core/module/config/view/social/social.php') ?>
<?php include('core/module/config/view/connect/connect.php') ?>

View File

@ -4,6 +4,11 @@
<div class="block">
<h4>
<?php echo helper::translate('Paramètres'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/reseau" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4>
<div class="row">
<div class="col2">
@ -35,6 +40,11 @@
<div class="block">
<h4>
<?php echo helper::translate('SMTP'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/smtp" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4>
<div class="row">
<div class="col6">
@ -87,7 +97,7 @@
<?php echo template::password('smtpPassword', [
'label' => 'Mot de passe',
'autocomplete' => 'off',
'value' => $this->getData(['config', 'smtp', 'password'])
'value' => $this->getData(['config', 'smtp', 'password'])
]); ?>
</div>
<div class="col2">
@ -103,4 +113,3 @@
</div>
</div>
</div>
</div>

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -5,7 +5,7 @@
* file that was distributed with this source code.
*
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -3,6 +3,12 @@
<div class="col12">
<div class="block">
<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>
<div class="row">
<div class="col4">
@ -11,8 +17,7 @@
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'help' => 'Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
'label' => 'Favicon',
'value' => $this->getData(['config', 'favicon']),
'folder' => $this->getData(['config', 'favicon']) ? dirname($this->getData(['config', 'favicon'])) : ''
'value' => $this->getData(['config', 'favicon'])
]); ?>
</div>
<div class="col4">
@ -21,8 +26,7 @@
'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.',
'label' => 'Favicon thème sombre',
'value' => $this->getData(['config', 'faviconDark']),
'folder' => $this->getData(['config', 'faviconDark']) ? dirname($this->getData(['config', 'faviconDark'])) : ''
'value' => $this->getData(['config', 'faviconDark'])
]); ?>
</div>
<div class="col4">
@ -43,8 +47,8 @@
<div class="col6">
<?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [
'checked' => helper::checkRewrite(),
'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web',
'disabled' => helper::checkServerSoftware() === false and $module->isModRewriteEnabled()
'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()
]); ?>
</div>
</div>
@ -55,6 +59,12 @@
<div class="col12">
<div class="block">
<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>
<div class="row">
<div class="col6">
@ -80,8 +90,8 @@
]); ?>
</div>
<div class="col3 offset1 verticalAlignBottom">
<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 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>
</div>
<div class="col3 offset2 verticalAlignBottom">
<?php echo template::button('configUpdateForced', [
@ -99,6 +109,12 @@
<div class="col12">
<div class="block">
<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>
<div class="row">
<div class="col6">
@ -153,6 +169,12 @@
<div class="col12">
<div class="block">
<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>
<div class="row">
<div class="col4 offset1 verticalAlignBottom">
@ -176,21 +198,13 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>ZwiiCMS <a href="https://zwiicms.fr" target="_blank">Site Web</a> - <a
href="https://forum.zwiicms.fr" target="_blank">Forum</a>
<h4>ZwiiCMS <a href="https://zwiicms.fr" target="_blank">Site Web</a> - <a href="https://forum.zwiicms.fr" target="_blank">Forum</a>
</h4>
<div class="row textAlignCenter">
<div class="col12">
<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>
<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>
<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>
<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>

View File

@ -4,6 +4,11 @@
<div class="block">
<h4>
<?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>
<div class="row">
<div class="col6">
@ -13,30 +18,29 @@
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Image Open Graph',
'value' => $this->getData(['config', 'seo', 'openGraphImage']),
'folder' => $this->getData(['config', 'seo', 'openGraphImage']) ? dirname($this->getData(['config', 'seo', 'openGraphImage'])) : '',
'type' => 1,
'help' => sprintf('%s : JPG - PNG<br />', helper::translate('Format')) .
sprintf('%s : 1200 x 630 pixels<br />', helper::translate('Dimensions minimales')) .
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'))
'help' => sprintf('%s : JPG - PNG<br />', helper::translate('Format')) .
sprintf('%s : 1200 x 630 pixels<br />', helper::translate('Dimensions minimales')) .
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'))
]); ?>
</div>
</div>
<div class="row">
<div class="col10 textAlignCenter">
<?php if (!empty($module::$imageOpenGraph['type'])): ?>
<p>
<?php echo sprintf('%s : <span id="screenType">%s</span>', helper::translate('Format'), $module::$imageOpenGraph['type']); ?>
</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']); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenRatio">%s</span><span id="screenFract">:1</span>', helper::translate('Ratio'), round($module::$imageOpenGraph['ratio'], 2)); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenWeight">%s</span>', helper::translate('Poids'), $module::$imageOpenGraph['size']); ?>
</p>
<?php if( !empty($module::$imageOpenGraph['type']) ): ?>
<p>
<?php echo sprintf('%s : <span id="screenType">%s</span>', helper::translate('Format'), $module::$imageOpenGraph['type']); ?>
</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'] ); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenRatio">%s</span><span id="screenFract">:1</span>' , helper::translate('Ratio'), round($module::$imageOpenGraph['ratio'], 2)); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenWeight">%s</span>', helper::translate('Poids'), $module::$imageOpenGraph['size']); ?>
</p>
<?php endif; ?>
</div>
</div>
@ -44,10 +48,10 @@
<div class="col6">
<?php if (
$this->getData(['config', 'seo', 'openGraphImage']) &&
file_exists(self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']))
file_exists(self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']))
): ?>
<img
src="<?php echo self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']); ?>" />
src="<?php echo self::FILE_DIR . 'source/' . $this->getData(['config', 'seo', 'openGraphImage']); ?>" />
<?php endif; ?>
</div>
</div>
@ -80,6 +84,12 @@
<div class="col12">
<div class="block">
<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>
<div class="row">
<div class="col3">

View File

@ -8,7 +8,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -8,7 +8,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -118,9 +118,6 @@ class install extends common
// Validation de la langue transmise
self::$i18nUI = $_SESSION['ZWII_UI'];
self::$i18nUI = array_key_exists(self::$i18nUI, self::$languages) ? self::$i18nUI : 'fr_FR';
// Stockage de la langue par défaut afin d'afficher le site dans cette langue lors de l'affichage de la bannière de connexion.
$this->setData(['config','defaultLanguageUI', self::$i18nUI], false);
// par défaut le contenu est la langue d'installation
$_SESSION['ZWII_SITE_CONTENT'] = self::$i18nUI;
@ -131,14 +128,12 @@ class install extends common
}
// Installation du site de test
$sample = false;
if (
$this->getInput('installDefaultData', helper::FILTER_BOOLEAN) === false
&& $_SESSION['ZWII_SITE_CONTENT'] === 'fr_FR'
) {
$sample = true;
}
$this->initData('page', $_SESSION['ZWII_SITE_CONTENT'], $sample);
$this->initData('module', $_SESSION['ZWII_SITE_CONTENT'], $sample);
$this->initData('locale', $_SESSION['ZWII_SITE_CONTENT'], $sample);
@ -184,9 +179,9 @@ class install extends common
}
// Sauvegarder la configuration du Proxy
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')], false);
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')], false);
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)], false);
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')]);
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')]);
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)]);
// Images exemples livrées dans tous les cas
try {
@ -224,7 +219,7 @@ class install extends common
$this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR);
// 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
$this->addOutput([
@ -233,8 +228,6 @@ class install extends common
'state' => true
]);
}
// Force la sauvegarde
$this->saveDB('config');
// Valeurs en sortie
$this->addOutput([
@ -291,7 +284,7 @@ class install extends common
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => $message
'data' => $success ? null : json_encode($message, JSON_UNESCAPED_UNICODE)
]
]);
break;
@ -324,7 +317,7 @@ class install extends common
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => $message
'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
]
]);
break;
@ -367,7 +360,7 @@ class install extends common
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => $message,
'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
]
]);
break;
@ -439,13 +432,12 @@ class install extends common
if (!empty($message)) {
$this->saveLog($message);
}
// Valeurs en sortie
$this->addOutput([
'display' => self::DISPLAY_JSON,
'content' => [
'success' => $success,
'data' => $message
'data' => json_encode($message, JSON_UNESCAPED_UNICODE)
]
]);
}

View File

@ -287,16 +287,16 @@ class init extends common
'blacklist' => [],
'language' => [
"fr_FR" => [
"version" => 13500,
"date" => 1734641934
"version" => 13007,
"date" => 1699354723
],
"es" => [
"version" => 13500,
"date" => 1734641934
"version" => 13007,
"date" => 1699354723
],
"en_EN" => [
"version" => 13500,
"date" => 1734641934
"version" => 13007,
"date" => 1699354723
]
],
'profil' => [

View File

@ -1,693 +0,0 @@
{
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "\"Nicht anzeigen\" erstellt eine Orphan -Seite, die über Menüs nicht zugegriffen werden kann.",
"'Sauvegarder et télécharger les données du module": "'Speichern und herunterladen Moduldaten",
"1 jour": "1 tag",
"1/4 : Préparation...": "1/4: Vorbereitung ...",
"10 minutes": "10 Minuten",
"10 tentatives": "10 Versuche",
"14 jours": "14 Tage",
"15 minutes": "15 Minuten",
"2 jours": "2 Tage",
"2/4 : Téléchargement...": "2/4: Download ...",
"3 tentatives": "3 Versuche",
"3/4 : Installation...": "3/4: Installation ...",
"4 jours": "4 Tage",
"4/4 : Configuration...": "4/4: Konfiguration ...",
"5 minutes": "5 Minuten",
"5 tentatives": "5 Versuche",
"7 jours": "7 Tage",
"Accueil": "Willkommen",
"Accède au site": "Zugriff auf die Website",
"Accède aux pages réservées": "Zugriff auf gesperrte Seiten",
"Accède aux pages réservées et à un dossier partagé": "Zugriff auf gesperrte Seiten und einen freigegebenen Ordner",
"Accès bloqué %d minutes": "Blockierter Zugang %der Minuten",
"Accès désactivé": "Zugriff deaktiviert",
"Accès interdit, erreur 403": "Zugriff verboten, Fehler 403",
"Action interdite": "Verbotene Aktion",
"Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.": "Obligatorische Aktivierung gemäß den französischen Gesetzen, es sei denn, Sie verwenden Ihr eigenes Einverständnissystem.",
"Activer": "Ermöglichen",
"Activer la journalisation": "Journalisierung aktivieren",
"Actualiser": "Aktualisieren",
"Adaptation": "Anpassung",
"Administrateur": "Administrator",
"Administration": "Verwaltung",
"Adresse SMTP": "Adresse SMTP",
"Adresse du proxy": "Proxy-Adresse",
"Adresse électronique": "E-Mail-Addresse",
"Affectation": "Affektiertheit",
"Affiche le nom de la page parente suivi du nom de la page, le titre ne doit pas être masqué.": "Zeigt den Namen der Parente -Seite an, gefolgt vom Seitennamen, der Titel sollte nicht maskiert werden.",
"Affiche les icônes de gestion du compte et de déconnexion des membres simples connectés": "Zeigt die Symbole zur Kontoverwaltung und Abmeldung von eingeloggten Standardmitgliedern an",
"Afin d'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l'opération.": "Um das ordnungsgemäße Funktionieren von Zwii zu gewährleisten, schließen Sie diese Seite bitte nicht vor dem Ende der Operation.",
"Aide": "Berater",
"Ajouter": "Hinzufügen",
"Ajouter un profil": "Profil hinzufügen",
"Ajouter un utilisateur": "Fügen Sie einen Benutzer hinzu",
"Ajouter une fonte": "Fügen Sie eine Schriftart hinzu",
"Alignement": "Ausrichtung des Inhalts",
"Aligner la bannière avec le contenu": "Richten Sie das Banner mit dem Inhalt aus",
"Ancien mot de passe": "Altes Passwort",
"Anonymat des adresses IP": "Anonymität von IP -Adressen",
"Apache URL intelligent": "Apache URL intelligent",
"Apache URL intelligentes": "Apache URL intelligentes",
"Apparence": "Aussehen",
"Appliquer": "Anwenden",
"Approuver un commentaire": "Kommentare genehmigen",
"Après": "Nach",
"Après la bannière": "Nach dem Banner",
"Après le contenu de la page": "Nach dem Inhalt der Seite",
"Archive": "Archiv",
"Archive ZIP": "Archiv Reißverschluss",
"Archive copiée dans le dossier Modules du gestionnaire de fichier": "Archiv kopiert in den Dateimodulen des Dateimanagers",
"Archive de thème invalide": "Ungültiges Themenarchiv",
"Archive invalide": "Archive Invalide",
"Archive invalide, l'écriture dans le dossier core est interdite": "Ungültiges Archiv, das Schreiben in der Kerndatei ist verboten",
"Archive invalide, le descripteur est absent": "Ungültiges Archiv, der Deskriptor fehlt",
"Archive invalide, le fichier de classe est absent": "Invalide -Archiv, die Klassendatei fehlt",
"Archive invalide, les dossiers ne correspondent pas au descripteur": "Ungültiges Archiv entsprechen die Dateien nicht dem Deskriptor",
"Archive non spécifiée ou introuvable": "Archiv nicht angegeben oder nicht gefunden",
"Archive à restaurer": "Archiv zur Wiederherstellung",
"Arrière plan": "Hintergrund",
"Arrière plan des blocs": "Hintergrund der Blöcke",
"Arrière plan des champs": "Hintergrund",
"Arrondi des angles": "Rundung der Winkel",
"Au centre": "Im Zentrum",
"Au début": "Anfangs",
"Au milieu au centre": "In der Mitte in der Mitte",
"Au milieu à droite": "In der mittleren rechts",
"Au milieu à gauche": "In der Mitte links",
"Au-dessus du site": "Über der Seite",
"Aucun": "Kein",
"Aucun dossier": "Kein Verzeichnis",
"Aucun fichier journal à télécharger": "Keine Protokolldatei zum Herunterladen",
"Aucun journal à effacer": "Keine Zeitung zum Löschen",
"Aucun menu": "Kein Menü",
"Aucune": "Keine",
"Aucune liste noire à effacer": "Keine schwarze Liste zu löschen",
"Aucune liste noire à télécharger": "Keine schwarze Liste zum Herunterladen",
"Auteur :": "Auteur:",
"Authentification": "Authentifizierung",
"Automatique": "Automatik",
"Autoriser les robots à référencer le site": "Erlauben Sie Robotern, auf die Site zu verweisen",
"Autorisé": "Erlaubt",
"Avant la bannière": "Vor dem Banner",
"Avant le contenu de la page": "Vor dem Inhalt der Seite",
"Background": "Hintergrund",
"Banni": "Verbot",
"Bannière": "Banner",
"Bannière cliquable": "Klickbares Banner",
"Barre 1/3 - page 2/3": "Barre 1/3 - Seite 2/3",
"Barre 1/4 - page 1/2 - barre 1/4": "Barre 1/4 - Seite 1/2 - Barre 1/4",
"Barre 1/4 - page 3/4": "Barre 1/4 - Seite 3/4",
"Barre 2/12 - page 7/12 - barre 3/12": "Barre 2/12 - Seite 7/12 - Barre 3/12",
"Barre 3/12 - page 7/12 - barre 2/12": "Barre 3/12 - Seite 7/12 - Barre 2/12",
"Barre de membre": "Mitgliederleiste",
"Barre latérale": "Seitliche Bar",
"Barre latérale droite :": "Rechte Sidebar:",
"Barre latérale gauche :": "Linke Seitenstange:",
"Barres latérales": "Seitenstangen",
"Bienvenue %s %s": "Willkommen %s %",
"Blocage après échecs": "Blockieren nach Fehlern",
"Blog": "Blog",
"Bords arrondis": "Abgerundete Kanten",
"Bordure des blocs": "Blockgrenze",
"Bordure des champs": "Feldgrenze",
"Bouton Aide": "Hilfeknopf",
"Bouton Standard": "Bouton Standard",
"Bouton de validation": "Validierungstaste",
"Bouton effacement": "Löschen",
"Bouton retour": "Rückgabeknopf",
"Bouton standard": "Bouton Standard",
"Bouton validation": "Bouton -Validierung",
"Boutons": "Boutons",
"Caché": "Versteckt",
"Cachée": "Versteckt",
"Captcha complexe": "Captcha Complexe",
"Captcha à la connexion": "Captcha in Verbindung",
"Captcha, identifiant ou mot de passe incorrects": "Captcha, falsche Kennung oder Passwort",
"Capture d'écran Open Graph": "Graph Screenshot öffnen",
"Capture d'écran générée avec succès": "Erfolgreicher generierter Screenshot",
"Casse": "Gebrochen",
"Catalogue": "Katalog",
"Catégorie": "Kategorie",
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "Dieses Mitglied kann Dateien im Ordner \"Freigeben\" und in seinen Unterordnern festlegen oder herunterladen",
"Cette page ne doit pas apparaître dans l'arborescence du menu. Créez une page orpheline.": "Diese Seite sollte nicht im Menübaum angezeigt werden. Erstellen Sie eine Waisenseite.",
"Cette redirection ne concerne que les pages d'administration du site.": "Diese Umleitung betrifft nur die Verwaltungsseiten der Website.",
"Chaîne Youtube": "Youtube Kanal",
"Chiffres": "Zahlen",
"Cible": "Ziel",
"Cliquez sur une zone afin d'accéder à ses options de personnalisation.": "Klicken Sie auf einen Bereich, um auf die Anpassungsoptionen zuzugreifen.",
"Commentaire": "Kommentar",
"Complète": "Vollständig",
"Compte administrateur": "Administrator",
"Compte de l'utilisateur": "Benutzerkonto",
"Compte verrouillé": "Gesperrt",
"Configuration": "Aufbau",
"Configuration du module": "Konfigurations -DU -Modul",
"Configurer": "Konfigurieren",
"Configurer mon compte": "Konfigurieren Sie mein Konto",
"Confirmation": "Bestätigung",
"Confirmer la suppression de cet utilisateur": "Bestätigen Sie die Löschung dieses Benutzers",
"Confirmer la dissociation du module de cette page": "Bestätigen Sie die Dissoziation des Moduls dieser Seite",
"Confirmer la désinstallation du module": "Bestätigen Sie das Deinstallieren des Moduls",
"Confirmer la suppression de cet utilisateur": "Bestätigen Sie die Löschung dieses Benutzers",
"Confirmer la suppression de cette langue": "Bestätigen Sie das Löschen dieser Sprache",
"Confirmer la suppression de la page": "Bestätigen Sie die Löschung der Seite",
"Confirmer la suppression des données du module": "Bestätigen Sie die Löschung der Moduldaten",
"Confirmez-vous la suppression de cette page ?": "Bestätigen Sie die Löschung dieser Seite?",
"Connexion": "Verbindung",
"Consulter l'aide en ligne": "Online -Hilfe konsultieren",
"Contents": "Inhalt",
"Contenu": "Inhalt",
"Contenu HTML": "HTML enthalten",
"Contenu avancé": "Fortgeschrittene Inhalt",
"Contenu du menu vertical": "Da fällige Vertikale enthalten",
"Contrôle total": "Vollständige Kontrolle",
"Cookies": "Kekse",
"Cookies Zwii": "Kekse Zwii",
"Copie de contenus localisés": "Lokalisierte Inhaltskopie",
"Copie de sites inter-langues": "Kopie von Intersprage-Websites",
"Copie des traductions rédigées": "Kopie der schriftlichen Übersetzungen",
"Copie terminée avec des erreurs": "Kopieren Sie mit Fehlern fertig",
"Copie terminée avec succès": "Erfolgreich abgeschlossen sein",
"Copier": "Kopierer",
"Copier sauvegardes auto": "Kopieren Sie automatische Sicherungen",
"Couleur de fond automatique": "Automatische Hintergrundfarbe",
"Couleur icône haut de page": "Farbe des Icons oben auf der Seite",
"Couleur texte page active": "Textfarbe der aktiven Seite",
"Couleur unie ou papier-peint": "Farbe oder Tapete vereinigte Tapete",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Sichtbare Farbe in Abwesenheit eines Bildes. <br /> Der horizontale Cursor reguliert das Transparenzniveau.",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Sichtbare Farbe in Abwesenheit eines Bildes. <br /> Der horizontale Cursor reguliert das Transparenzniveau. Die Farbe des Textes ist automatisch.",
"Couleurs": "Farben",
"Dans le site": "In der Seite",
"Dans quelle langue utiliserez-vous Zwii ?": "In welcher Sprache werden Sie Zwii verwenden?",
"Date": "Datum",
"Description": "Beschreibung",
"Disponible si le consentement des cookies est activé.": "Verfügbar, wenn die Cookie-Einwilligung aktiviert ist.",
"Disposition": "Anordnung",
"Données %s copiées vers %s": "Daten %s auf %s kopiert",
"Données des modules": "Module",
"Données importées": "Importierte Daten",
"Dossier": "Verzeichnis",
"Droits sur les dossiers": "Rechte für Verzeichnisse",
"Droits sur les fichiers": "Dateirechte",
"Dupliquer": "Duplizieren",
"Dupliquer la page": "Duplizieren Sie die Seite",
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Trennen Sie die offenen Sitzungen zuvor von anderen Browsern oder Terminals. Empfohlene Aktivierung.",
"Déconnecter": "Trennen",
"Déconnexion !": "Trennen!",
"Déconnexion automatique": "Automatische Trennung",
"Définir par défaut": "Als Standard festlegen",
"Dévoiler le mot de passe": "Das Passwort angeben",
"Effacer": "Löschen",
"Effacer la page": "Löschen Sie die Seite",
"Effacer tous les commentaires": "Alle Kommentare löschen",
"Effacer toutes les statistiques": "Delete all statistics",
"Effacer un commentaire": "Kommentar löschen",
"Effacer une catégorie": "Kategorie löschen",
"Emplacement :": "Einstellung:",
"Emplacement dans le menu": "Lage im Menü",
"En bas au centre": "Runter in der Mitte",
"En bas à droite": "Unten rechts",
"En bas à gauche": "Unten nach links",
"En cas de changement de module, les données du module précédent seront supprimées.": "Im Falle einer Moduländerung werden Daten aus dem vorherigen Modul gelöscht.",
"En dessous du site": "Unterhalb der Website",
"En haut au centre": "Top in der Mitte",
"En haut à droite": "Oben rechts",
"En haut à gauche": "An der oberen Ecke links",
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "Fügen Sie in der freien Position das Modul hinzu, indem Sie [Modul] dem gewünschten Ort in Ihrer Seite platzieren.",
"En-dehors du site": "Außerhalb der Website",
"Enregistrer": "Registrieren",
"Envoyer un message de confirmation": "Senden Sie eine Bestätigungsnachricht",
"Erreur : sauvegarde non générée !": "Fehler: Nicht erzeugte Sicherung!",
"Erreur d'URL": "URL -Fehler",
"Erreur d'extraction, vérifiez les permissions": "Extraktionsfehler, Berechtigungen überprüfen",
"Erreur de copie": "Fehler kopieren",
"Erreur de copie, vérifiez les permissions": "Fehler kopieren, Berechtigungen überprüfen",
"Erreur de lecture, vérifiez les permissions": "Lesenfehler, Überprüfen Sie die Berechtigungen",
"Erreur inconnue": "unbekannter Fehler",
"Erreur inconnue, le module n'est pas installé": "Unbekannter Fehler, das Modul ist nicht installiert",
"Export CSV": "CSV exportieren",
"Expéditeur": "Absender",
"Extension": "Verlängerung",
"Extraire": "Extrahieren",
"Facebook": "Facebook",
"Famille": "Familie",
"Favicon thème sombre": "Dunkeles Thema Favicon",
"Feuille de style spécifique à la page.": "Stilblatt spezifisch für die Seite.",
"Fichiers": "Dateien",
"Fichiers effacés": "Gelöschte Dateien",
"Fil d'Ariane dans le titre": "Ariane -Thread im Titel",
"Fond du sous-menu": "Untermenü",
"FontId": "Schriftart",
"Fonte": "Quelle",
"Fonte actualisée": "Aktualisieren",
"Fonte créée": "Fonte erstellt",
"Fonte en ligne": "Online -Schmelzen",
"Fonte installée": "Installiertes Gusseisen",
"Fonte non créée, ressource absente !": "Fonte nicht erstellt, abwesende Ressource!",
"Fonte supprimée": "Löschen Schmelzen",
"Fontes": "Quellen",
"Format incorrect": "Format falsch",
"Formulaire": "Formular",
"Fréquence de recherche": "Forschungshäufigkeit",
"Fuseau horaire": "Zeitzone",
"Gabarits de page - Barre latérale": "Seitenvorlage - Seitenleiste",
"Gestion": "Management",
"Gestion des modules": "Modulverwaltung",
"Gestion des thèmes": "Themenmanagement",
"Gestionnaire de fichiers": "Dateimanager",
"Github": "Github",
"Grande": "Groß",
"Grande (220%)": "Grande (220%)",
"Grande (300px)": "Grande (300px)",
"Gras": "Fett",
"Groupe": "Gruppe",
"Groupe associé": "Zugehörige Gruppe",
"Groupe requis pour accéder à la page :": "Gruppe erforderlich, um auf die Seite zuzugreifen:",
"Groupes": "Gruppen",
"Générer sitemap.xml et robots.txt": "Generieren Sie Sitemap.xml und Robots.txt",
"Générer une capture Open Graph": "Erstellen Sie eine offene Graph -Erfassung",
"Gérer les catégories": "Kategorien verwalten",
"Gérer les commentaires": "Kommentare verwalten",
"Gérer les données": "Daten verwalten",
"Hauteur": "Höhe",
"Hauteur de l'image": "Höhe des Bildes",
"Hauteur de l'image sélectionnée": "Höhe des ausgewählten Bildes",
"Hauteur maximale": "Maximale Höhe",
"ID de la chaîne : https://www.youtube.com/channel/[ID].": "Kanal -ID: https://www.youtube.com/channel/).",
"Icône": "Symbol",
"Icône avec bulle de texte": "Symbol mit Textblase",
"Icône haut de page, couleur arrière-plan": "Icon oben auf der Seite, Hintergrundfarbe",
"Identifiant": "Kennung",
"Identifiant (sans espace ni majuscule)": "Kennung (ohne Platz oder Großbuchstaben)",
"Identité": "Identifizieren",
"Identité de la fonte": "Identität des Gusseisen",
"Identité du site": "Standortidentität",
"Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.": "Er erscheint in der Titelleiste und teilt in sozialen Netzwerken.",
"Image": "Bild",
"Image étirée (100% 100%)": "Gestrecktes Bild (100% 100%)",
"Important": "Wichtig",
"Importante": "Wichtig",
"Importation d'utilisateurs": "Import von Benutzern",
"Importation de fichier plat CSV": "CSV Flat File Import",
"Importation effectuée": "Einfuhr",
"Importer": "Importeur",
"Importer dans": "Import in",
"Importer des utilisateurs en masse": "Massenbenutzer importieren",
"Impossible d'ouvrir l'archive": "Das Archiv kann nicht öffnen",
"Impossible de modifier votre propre groupe.": "Ihre eigene Gruppe kann nicht geändert werden.",
"Impossible de soumettre le formulaire, car il contient des erreurs": "Es ist unmöglich, das Formular einzureichen, da es Fehler enthält",
"Impossible de supprimer une page contenant des pages enfants": "Eine Seite mit Kinderseiten kann nicht gelöscht werden",
"Impossible de supprimer votre propre compte": "Ihr eigenes Konto kann nicht gelöscht werden",
"Inclure le contenu du gestionnaire de fichiers": "Fügen Sie den Inhalt des Dateimanagers hinzu",
"Incorrect": "Falsch",
"Informations": "Informationen",
"Instagram": "Instagram",
"Installation terminée": "Installation abgeschlossen",
"Installer": "Installateur",
"Installer depuis le catalogue en ligne": "Installieren Sie aus dem Online -Katalog",
"Installer depuis une archive": "Aus einem Archiv installieren",
"Installer les données d'un module": "Installieren Sie eine Moduldaten",
"Installer ou mettre à jour un module téléchargé": "Installieren oder aktualisieren Sie ein heruntergeladenes Modul",
"Installer un module": "Installieren Sie ein Modul",
"Installer un thème archivé (site ou administration)": "Installieren Sie ein archiviertes Thema (Standort oder Verwaltung)",
"Instructions JS ou jquery spécifiques à la page.": "JS- oder JQuery -Anweisungen, die für die Seite spezifisch sind.",
"Interface": "Schnittstelle",
"Jeton invalide": "Ungültiges Token",
"Journal réinitialisé avec succès": "Erfolgreiches Reset -Journal",
"Journalisation": "Journalisierung",
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "Das Archiv wurde im Dateimanager hinterlegt. Archive unter Version 9 werden nicht akzeptiert.",
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "Die Kennung wird beim Erstellen des Kontos definiert, es kann nicht geändert werden.",
"La carte du site a été mise à jour": "Die Site -Karte wurde aktualisiert",
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "Sicherungskopie der htaccess-Datei wurde nicht wiederhergestellt!",
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "Die Beschreibung einer Seite nimmt an ihrer Referenzierung teil. Jede Seite muss eine andere Beschreibung haben.",
"La page %s est ouverte par l'utilisateur %s": "Der %s wird vom Benutzer %s geöffnet",
"La page demandée n'existe pas ou est introuvable (erreur 404)": "Die angeforderte Seite existiert nicht oder wird nicht gefunden (Fehler 404)",
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "Die Seite wird in einem horizontalen Menü, jedoch nicht im vertikalen Menü einer Seitenleiste angezeigt.",
"La première page que vos visiteurs verront.": "Die erste Seite, die Ihre Besucher sehen werden.",
"La règlementation française impose un anonymat de niveau 2": "Französische Vorschriften erfordern Anonymität der Stufe 2",
"La réécriture d'URL n'a pas été restaurée !": "URL-Umschreibung wurde nicht wiederhergestellt!",
"La sauvegarde des fichiers peut prendre du temps. Continuer ?": "Die Sicherung der Dateien kann einige Zeit in Anspruch nehmen. Weitermachen ?",
"La suppression a échoué": "Die Löschung schlug fehl",
"La version installée est plus récente": "Die installierte Version ist neuer",
"La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.": "Die Überprüfung ist täglich. Option deaktiviert, wenn die Serverkonfiguration dies nicht zulässt.",
"Langue de l'administration": "Verwaltungssprache",
"Langue du site par défaut": "Standardsprache der Website",
"Langue par défaut": "Standard",
"Langues": "SPRACHEN",
"Langues disponibles": "Verfügbare Sprachen",
"Langues installées": "Sprachen installiert",
"Largeur": "Breite",
"Largeur de l'image": "Breite des Bildes",
"Largeur du site": "Breite der Website",
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "Der horizontale Cursor reguliert das Transparenzniveau und platziert ihn links für unsichtbare Highlights.",
"Le curseur horizontal règle le niveau de transparence.": "Der horizontale Cursor reguliert das Transparenzniveau.",
"Le fuseau horaire est utile au bon référencement": "Die Zeitzone ist nützlich für gute SEO",
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "Das Zubehörmenü ist rechts neben der Menüleiste ausgerichtet. Es ist ein Standort für Flaggen und die Verbindungsschaltfläche.",
"Le menu horizontal intégral": "Das vollständige horizontale Menü",
"Le module %s a été %s": "Das Modul %war %s",
"Le module %s de la page %s a été supprimé": "Das %s -Modul des %s wurde gelöscht",
"Le module %s est désinstallé, il reste peut-être des données dans %s": "Das Modul %S ist deinstalliert, es kann Daten in %s geben",
"Le sous-menu de la page parente": "Das Untermenü der Elternseite",
"Le survol d'une icône de l'écran de connexion affiche temporairement le mot de passe.": "Die Überflucht eines Symbols auf dem Verbindungsbildschirm zeigt das Kennwort vorübergehend an.",
"Le titre court est affiché dans les menus. Il peut être identique au titre de la page.": "Der kurze Titel wird in den Menüs angezeigt. Es kann mit dem Titel der Seite identisch sein.",
"Les langues sélectionnées sont identiques": "Die ausgewählten Sprachen sind identisch",
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Rechtliche Mitteilungen sind in Frankreich obligatorisch. Eine Option der Fußzeile fügt dieser Seite einen diskreten Link hinzu.",
"Les modifications que vous avez apportées ne seront peut-être pas enregistrées.": "Die Änderungen, die Sie vorgenommen haben, werden möglicherweise nicht aufgezeichnet.",
"Les tailles des polices de la bannière, de menu et de pied de page sont proportionnelles à cette taille.": "Die Schriftgrößen des Banners, Menüs und Fußzeile sind proportional zu dieser Größe.",
"Lettres": "Lettres",
"Libre": "Libre",
"Licence :": "Lizenz:",
"Lien de connexion": "Anmeldelink",
"Lien page des mentions légales.": "Link der rechtlichen Hinweise.",
"Liens": "Grundpfandrechte",
"Limitation des tentatives": "Einschränkung der Versuche",
"Limitée au site": "Auf die Website beschränkt",
"Linkedin": "LinkedIn",
"Liste noire": "Schwarze Liste",
"Liste noire réinitialisée avec succès": "Erfolgreiche schwarze Liste erfolgreich zurücksetzen",
"Lors d'une mise à jour automatique, conserve le fichier htaccess de la racine du site.": "Während eines automatischen Updates hält die HTaccess -Datei des Site -Stammes.",
"Léger": "Leicht",
"Légère": "Leicht",
"Maigre": "Mager",
"Maintenance": "Wartung",
"Majuscule à chaque mot": "Capper mit jedem Wort",
"Majuscules": "Großbuchstaben",
"Marges verticales": "Vertikale Ränder",
"Masquer la bannière en écran réduit": "Verstecken Sie das Banner im reduzierten Bildschirm",
"Masquer la page et les pages enfants dans le menu d'une barre latérale": "Verstecken Sie die Seiten- und Kinderseiten im Menü einer Seitenleiste",
"Masquer les pages enfants dans le menu horizontal": "Verstecken Sie Kinderseiten im horizontalen Menü",
"Membre": "Mitglied",
"Membre avec droit de partage": "Mitglied mit Freigaberecht",
"Membre simple": "Einfaches Mitglied",
"Mentions légales": "Impressum",
"Menu": "Speisekarte",
"Menu accessoire": "Zubehörmenü",
"Menu burger dans écran réduit": "Burger-Menü bei reduziertem Bildschirm",
"Menu standard": "Menüstandard",
"Message d'acceptation des Cookies": "Cookie -Akzeptanznachricht",
"Message de consentement aux cookies": "Cookie -Zustimmungsnachricht",
"Mettre à jour": "Aktualisieren",
"Mettre à jour le module orphelin": "Aktualisieren Sie das Orphan -Modul",
"Minuscules": "Winzig",
"Mise en forme des titres": "Formatierende Titel",
"Mise en forme du texte": "Textformatierung",
"Mise en forme du titre": "Titelformatierung",
"Mise en page": "Layout",
"Mise à jour": "Aktualisieren",
"Mise à jour automatisée": "Automatisiertes Update",
"Mise à jour terminée avec succès.": "Erfolgreiches Update abgeschlossen.",
"Modifications enregistrées": "Modifikationen aufgezeichnet",
"Module": "Modul",
"Module de la page": "Seitenmodul",
"Modules": "Module",
"Modules configurés": "Konfigurierte Module",
"Modules installés": "Module installiert",
"Modules orphelins": "Verwaiste Module",
"Mot de passe": "Passwort",
"Mot de passe oublié": "Haben Sie Ihr Passwort vergessen",
"Mot de passe perdu": "Haben Sie Ihr Passwort vergessen",
"Motorisé par": "Angetrieben von",
"Moyen": "Mittel",
"Moyenne": "Durchschnittlich",
"Moyenne (200%)": "Durchschnitt (200%)",
"Moyenne (200px)": "Durchschnitt (200px)",
"Méta-description": "Meta-Schreiben",
"Méta-titre": "Stoffitis",
"Ne pas afficher": "Werden nicht angezeigt",
"Ne pas charger l'exemple de site (utilisateurs avancés)": "Laden Sie das Beispiel einer Website nicht auf (erweiterte Benutzer)",
"Ne pas répéter": "Wiederhole nicht",
"Ne pas saisir les balises": "Geben Sie die Tags nicht ein",
"News": "Nachrichten",
"Niveau 1 (192.168.12.x)": "Stufe 1 (192.168.12.x)",
"Niveau 2 (192.168.x.x)": "Stufe 2 (192.168.x.x)",
"Niveau 3 (192.x.x.x)": "Stufe 3 (192.x.x.x)",
"Nom": "Nom",
"Nom Prénom": "Nachname Vorname",
"Nom du profil": "Profilname",
"Nom utilisateur": "Nutzername",
"Non": "Nicht",
"Non tronquée": "Unbemannt",
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "Unsere Website befindet sich derzeit in der Wartung. Wir entschuldigen uns für die verursachten Unannehmlichkeiten und geben unser Bestes, um schnell zurück zu sein.",
"Nouveau contenu localisé": "Neue lokalisierte Inhalte",
"Nouveau mot de passe": "Neues Kennwort",
"Nouveau mot de passe enregistré": "Neues aufgezeichnetes Passwort",
"Nouvel utilisateur": "Neuer Benutzer",
"Nouvelle page créée": "Neue Seite erstellt",
"Nouvelle page ou barre latérale": "Neue Seite oder Seitenleiste",
"Obligatoire": "Obligatorisch",
"Ombre": "Ombre",
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Aktive Option im getrennten Modus, Kinderseiten sind sichtbar und zugänglich.",
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Empfohlene Option zur Sicherung der Verbindung. Bewerben Sie sich für alle Captchas der Website. Einfache Captcha ist auf die Zugabe von Zahlen von 0 bis 10 beschränkt. Der komplexe Capha verwendet vier Zahlen von 0 bis 20. Empfohlene Aktivierung.",
"Options": "Optionen",
"Options avancées": "Erweiterte Optionen",
"Origine": "Herkunft",
"Oui": "Oui",
"Page": "Buchseite",
"Page 2/3 - barre 1/3": "Seite 2/3 - Barre 1/3",
"Page 3/4 - barre 1/4": "Seite 3/4 - Barre 1/4",
"Page associée": "Zugeordnete Seite",
"Page de recherche": "Suchseite",
"Page dupliquée": "Doppelte Seite",
"Page et module dupliqués": "Duplizierte Seite und Modul",
"Page inexistante, erreur 404": "Seite nicht vorhanden, Fehler 404",
"Page non cliquable": "Nicht klickbare Seite",
"Page parent": "Seite Elternteil",
"Page standard": "Page Standard",
"Page supprimée": "Gelöschte Seite",
"Pages dans le menu": "Seiten im Menü",
"Pages du site": "Standortseiten",
"Pages et les modules de": "Seiten und Module von",
"Pages orphelines": "Waisenseiten",
"Papier peint": "Hintergrund",
"Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.": "Standardmäßig wird das Menü nach dem Inhalt der Seite angezeigt. Um es an einem bestimmten Ort zu positionieren, fügen Sie [Menü] in den Inhalt der Seite ein.",
"Paramètres": "Einstellungen",
"Paramètres de la localisation": "Standortparameter",
"Paramètres de la sauvegarde": "Backup-Einstellungen",
"Paramètres du profil": "Profil-Einstellungen",
"Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d'envoi de mail.": "Einstellungen, die verwendet werden müssen, wenn Ihr Host die E -Mail -Sendungsfunktionen nicht anbietet.",
"Pas de marge au-dessus et en dessous du site": "Kein Rand über und unter der Website",
"Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.": "Denken Sie daran, den Cache Ihres Browsers zu löschen, wenn sich das Favicon nicht ändert.",
"Permission": "Erlaubnis",
"Permission et référencement": "Erlaubnis und SEO",
"Permissions": "Berechtigungen",
"Permissions sur les dossiers": "Berechtigungen für Verzeichnisse",
"Permissions sur les fichiers": "Berechtigungen für Dateien",
"Permissions sur les pages": "Berechtigungen für Seiten",
"Petite": "Klein",
"Petite (150px)": "Klein (150px)",
"Petite (180%)": "Petite (180%)",
"Pied de page": "Fuß",
"Pinterest": "Pinterest",
"Plan du site": "Seitenverzeichnis",
"Police des titres": "Titel der Polizei",
"Police du texte": "Textpolizei",
"Port SMTP": "Port SMTP",
"Port du proxy": "Hafen des Stellvertreters",
"Position": "Position",
"Position du module": "Position du module",
"Pour définir la page comme barre latérale, choisissez l'option dans la liste.": "Um die Seite als Seitenleiste zu definieren, wählen Sie die Option aus der Liste.",
"Presse Papier": "Zwischenablage",
"Presse papier": "Zwischenablage",
"Profils des groupes": "Gruppenprofile",
"Proportionnelle à la taille définie dans le site.": "Proportional zu dem in der Stelle definierten.",
"Prénom": "Vorname",
"Prénom Nom": "Vorname Name",
"Préparation de la mise à jour": "Vorbereitung des Updates",
"Préserver le fichier htaccess racine": "Bewahren Sie die HTaccess Racine -Datei auf",
"Préserver les comptes des utilisateurs déjà installés": "Bewahren Sie die bereits installierten Benutzerkonten auf",
"Prévenir l'utilisateur par mail": "Verhindern Sie den Benutzer per E -Mail",
"Prévisualiser": "Vorschau",
"Pseudo": "Pseudo",
"Rang 9 > rang 1. Le profil de rang 1 n'est pas modifiable.": "Rang 9 > Rang 1. Das Profil von Rang 1 ist nicht änderbar.",
"Ratio": "Verhältnis",
"Ratio :": "Verhältnis :",
"Recherche": "Suche",
"Recherche dans le site": "Suche auf der Website",
"Rechercher": "Forschen",
"Rechercher une mise à jour en ligne": "Suchen Sie nach einem Online -Update",
"Redirection": "Weiterleitung",
"Redirection vers la connexion": "Umleitung zur Verbindung",
"Renommer": "Umbenennen",
"Renseignez les champs ci-dessous pour finaliser l'installation.": "Finden Sie die folgenden Felder heraus, um die Installation abzuschließen.",
"Responsive (contain)": "Reaktionsschnell (enthalten)",
"Responsive (cover)": "Reaktionsschnell (Cover)",
"Restauration des bases de données absentes": "Wiederherstellung abwesender Datenbanken",
"Restauration effectuée avec succès": "Catering erfolgreich durchgeführt",
"Restaurer": "Wiederherstellen",
"Restaurer les données du site": "Site -Daten wiederherstellen",
"Rester connecté sur ce navigateur": "Bleiben Sie in diesem Browser in Verbindung",
"Retour": "Rückmeldung",
"Rien à importer, erreur de format ou fichier incorrect": "Nichts zu importieren, formatieren Sie Fehler oder eine falsche Datei",
"Rédacteur": "Redakteur",
"Référencement": "SEO",
"Réinitialisation du mot de passe": "Passwort zurücksetzen",
"Réinitialiser avec le thème par défaut": "Mit dem Standardthema zurücksetzen",
"Réinitialiser la feuille de style": "Setzen Sie das Stilblatt zurück",
"Réinitialiser la liste": "Setzen Sie die Liste zurück",
"Réinitialiser le journal": "Setzen Sie die Zeitung zurück",
"Réinstaller": "Neu installieren",
"Répétition": "Wiederholung",
"Réseau": "Netzwerk",
"Réseaux sociaux": "Soziale Netzwerke",
"S'ouvre dans un nouvel onglet": "Öffnet sich in einer neuen Registerkarte",
"SMTP": "SMTP",
"SMTP personnalisé": "Personalisierte SMTP",
"Saisir la clé, puis valider le formulaire avant de cliquer sur le bouton de génération": "Geben Sie die Taste ein und validieren Sie das Formular, bevor Sie auf die Schaltfläche Generation klicken",
"Saisissez le Titre de gestion des cookies.": "Geben Sie den Cookie -Management -Titel ein.",
"Saisissez le message pour les cookies déposés par ZwiiCMS, nécessaires au fonctionnement et qui ne nécessitent pas de consentement.": "Geben Sie die von Zwiicms abgelagerte Meldung für den Betrieb erforderlich und müssen keine Zustimmung erfordern.",
"Saisissez le texte du lien vers les mentions légales,la page doit être définie dans la configuration du site.": "Geben Sie den Link -Text in die rechtlichen Hinweise ein. Die Seite muss in der Site -Konfiguration definiert werden.",
"Saisissez votre ID : https://pinterest.com/[ID].": "Geben Sie Ihre ID ein: https://pinterest.com/).",
"Saisissez votre ID : https://twitter.com/[ID].": "Geben Sie Ihre ID ein: https://twitter.com/).",
"Saisissez votre ID : https://www.facebook.com/[ID].": "Geben Sie Ihre ID ein: https://www.facebook.com/).",
"Saisissez votre ID : https://www.instagram.com/[ID].": "Geben Sie Ihre ID ein: https://www.instagram.com/).",
"Saisissez votre ID Github : https://github.com/[ID].": "Geben Sie Ihre GitHub -ID ein: https://github.com/).",
"Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].": "Geben Sie Ihre LinkedIn -ID ein: https://fr.linkedin.com/in/ style].",
"Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].": "Geben Sie Ihre Benutzer -ID ein: https://www.youtube.com/user/).",
"Sauvegarde": "Backup",
"Sauvegarde automatique quotidienne du site": "Tägliche automatische Sicherung der Website",
"Sauvegarde du thème dans le": "Sicherung des Themas in der",
"Sauvegarde générée avec succès": "Erfolgreich erzeugte Backup.",
"Sauvegarder": "Schützen",
"Sauvegarder et télécharger le module": "Speichern und laden Sie das Modul herunter und laden Sie sie herunter",
"Sauvegarder le module dans le gestionnaire de fichiers": "Speichern Sie das Modul im Dateimanager",
"Sauvegarder les données du module dans le gestionnaire de fichiers": "Speichern Sie Moduldaten im Dateimanager",
"Sauvegarder les données du site": "Site -Daten speichern",
"Script dans body": "Skript dans Körper",
"Script dans head": "Skript Dans Kopf",
"Scripts externes": "Skripte externe",
"Se déconnecter": "austragen",
"Service en ligne inaccessible": "Unzugänglicher Online -Service",
"Seul un administrateur peut se connecter lors d'une maintenance": "Nur ein Administrator kann während der Wartung eine Verbindung herstellen",
"Si le contenu du gestionnaire de fichiers est très volumineux, mieux vaut une copie par FTP.": "Wenn der Inhalt des Dateimanagers sehr groß ist, ist es besser, eine Kopie von FTP zu kopieren.",
"Signature": "Unterschrift",
"Site": "Grundstück",
"Site en maintenance": "Seite wird gewartet",
"Size": "Größe",
"Source": "Quelle",
"Standard": "Standard",
"Style": "Stil",
"Suppression interdite": "Löschung verboten",
"Suppression interdite, page active dans la configuration de la langue du site": "Löschen nicht erlaubt, Seite ist in der Sprachkonfiguration der Website aktiv",
"Supprime le point d'interrogation dans les URL, l'option est indisponible avec les autres serveurs Web": "Löscht das Fragezeichen in den URLs, die Option ist mit anderen Webservern nicht verfügbar",
"Supprimer": "LÖSCHEN",
"Supprimer la page": "Löschen Sie die Seite",
"Supprimer le module": "Löschen Sie das Modul",
"Supprimer toutes les sauvegardes automatiques ?": "Alle automatischen Sicherungen entfernen?",
"Sur l'axe horizontal": "Auf der horizontalen Achse",
"Sur l'axe vertical": "Auf der vertikalen Achse",
"Sur les deux axes": "Auf beiden Achsen",
"Sécurité": "Sicherheit",
"Sécurité de la connexion": "Verbindungssicherheit",
"Sécurité désactivée": "Sicherheit deaktiviert",
"Sélectionner un fichier": "Wählen Sie eine Datei aus",
"Sélectionnez au moins un contenu à afficher": "Wählen Sie mindestens einen Inhalt zum Anzeigen aus",
"Sélectionnez la langue à copier vers une langue cible": "Wählen Sie die Sprache aus, um in eine Zielsprache zu kopieren",
"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.": "Wählen Sie ein an ein dunkles Thema adaptiertes Symbol aus. <br> Denken Sie daran, den Cache aus Ihrem Browser zu löschen, wenn sich das Favicon nicht ändert.",
"Sélectionnez une image ou une icône de petite dimension": "Wählen Sie ein Bild oder ein kleines Symbol aus",
"Sélectionnez une langue": "Wähle eine Sprache",
"Sélectionnez une page contenant le module 'Recherche'. Une option du pied de page ajoute un lien discret vers cette page.": "Wählen Sie eine Seite mit dem Modul \"Forschung\" aus. Eine Option der Fußzeile fügt dieser Seite einen diskreten Link hinzu.",
"Sélectionnez une page pour activer": "Wählen Sie eine Seite aus, um sie zu aktivieren",
"Séparateur": "Separator",
"Taille": "Größe",
"Text": "Text",
"Texte": "Text",
"Thème": "Thema",
"Thème de l'administration": "Verwaltungsthema",
"Thème du site": "Site -Thema",
"Thème importé": "Importiertes Thema",
"Thèmes": "Themen",
"Titre": "Titer",
"Titre court": "Kurzer Titel",
"Titre masqué": "Maskierter Titel",
"Titre masqué dans la page": "Maskierter Titel auf der Seite",
"Titres": "Titres",
"Tous les dossiers": "Alle Verzeichnisse",
"Tous les droits d'édition des contenus": "Alle Bearbeitungsrechte für Inhalte",
"Tout Effacer": "Alles löschen",
"Traduction supprimée": "Gelöschte Übersetzung",
"Très grande": "Sehr groß",
"Très grande (240%)": "Sehr groß (240%)",
"Très grande (400px)": "Sehr groß (400px)",
"Très important": "Sehr wichtig",
"Très importante": "Sehr wichtig",
"Très léger": "Sehr leicht",
"Très légère": "Sehr leicht",
"Très petite": "Sehr klein",
"Très petite (100px) ": "Sehr klein (100px)",
"Très petite (160%)": "Sehr klein (160%)",
"Twitter": "Twitter",
"Type de captcha": "Typ de captcha",
"Type de proxy": "Geben Sie de Proxy ein",
"Téléchargement et validation de l'archive": "Laden Sie das Archiv herunter und bestätigen Sie das Archiv",
"Télécharger": "Herunterladen",
"Télécharger la liste": "Laden Sie die Liste herunter",
"Télécharger le journal": "Laden Sie die Zeitung herunter",
"Télécharger le module dans le gestionnaire de fichiers": "Laden Sie das Modul im Dateimanager herunter",
"Téléverser": "Hochladen",
"URL incorrecte": "Falsche URL",
"Un mail a été envoyé pour confirmer la réinitialisation": "Eine E -Mail wurde gesendet, um den Reset zu bestätigen",
"Une archive du dossier /site/data est conservée pendant 30 jours. Activation recommandée": "Ein Archiv der Datei /Site /Daten wird 30 Tage lang aufbewahrt. Empfohlene Aktivierung",
"Une erreur est survenue lors de l'étape :": "Während der Stadium trat ein Fehler auf:",
"Url du fichier de fonte": "URL der Gusseisen -Datei",
"Utilisateur inexistant": "Nicht existierender Benutzer",
"Utilisateur supprimé": "Gelöschter Benutzer",
"Utilisateurs": "Benutzer",
"Valider": "Bestätigen",
"Version": "Ausführung",
"Version n°": "Version N °",
"Vider dossier sauvegardes auto": "Leere automatische Sicherungsdatei",
"Visiteur": "Besucher",
"Vous n'êtes pas autorisé à consulter cette page (erreur 403)": "Sie dürfen diese Seite nicht konsultieren (Fehler 403)",
"Youtube": "Youtube",
"ZwiiCMS - Installation": "ZwiiCMS - Installation",
"actualisé": "Aktualisiert",
"favicon.ico": "Favicon.ico",
"faviconDark.ico": "Favicondark.ico",
"gestionnaire de fichiers": "Dateimanager",
"installé": "Eingerichtet",
"jour": "jour",
"jours": "Tage",
"sauvegardé avec succès": "Erfolgreich gespeichert",
"vers": "gegen",
"À droite": "Nach rechts",
"À gauche": "Nach links",
"À l'emplacement du mot clé [MODULE] dans la page": "Am Ort des Schlüsselworts [Modul] auf der Seite",
"Échec de l'écriture, vérifiez les permissions": "Schreiben, Schreiben, Überprüfen Sie die Berechtigungen",
"Échecs": "Schach",
"Éditer": "Bearbeiten",
"Éditer la page": "Veröffentlichen Sie die Seite",
"Éditer les dialogues": "Bearbeiten Sie die Dialoge",
"Éditer une catégorie": "Kategorie bearbeiten",
"Éditeur": "Editor",
"Éditeur CSS": "CSS -Verlag",
"Éditeur JS": "Verlag JS",
"Éditeur de script %s": "Skript Editor %s",
"Éditeur de script dans Body": "Skripteditor im Körper",
"Éditeur de script dans Head": "Skripteditor im Kopf",
"Éditeur simple": "Einfacher Editor",
"Édition des pages": "Seitenbearbeitung",
"Édition du profil %s": "Profil bearbeiten %s",
"Éléments": "Elemente",
"Étendu sur la page": "Über die Seite ausgebreitet",
"Étiquettes des pages spéciales": "Spezielle Seiten Beschriftungen",
"Dimensions minimales": "Mindestabmessungen",
"Taille maximale du fichier": "Maximale Dateigröße",
"5 Mo pour les images JPEG": "5 MB für JPEG-Bilder",
"1 Mo pour les images PNG": "1 MB für PNG-Bilder",
"Poids": "Gewicht",
"Supprimer ce profil ?": "Dieses Profil löschen?",
"Masqué": "Versteckt",
"Haut de page": "Seitenanfang",
"Bas de page": "Seitenende",
"Petit triangle": "Kleines Dreieck",
"Grand triangle": "Großes Dreieck",
"Flèche": "Pfeil",
"Modèle": "Vorlage",
"Bouton de navigation droit": "Rechte Navigations-Schaltfläche",
"Bouton de navigation gauche": "Linke Navigations-Schaltfläche",
"Groupes / Profils": "Gruppen / Profile",
"Prénom commence par": "Vorname beginnt mit",
"Nom commence par": "Nachname beginnt mit",
"Impossible de réinitialiser le mot de passe de ce compte !": "Das Passwort für dieses Konto kann nicht zurückgesetzt werden!"
}

View File

@ -1,7 +1,7 @@
{
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "'Do not display' creates an orphan page not accessible through menus.",
"'Sauvegarder et télécharger les données du module": "'Save and download module data",
"1 jour": "1 day",
"1 jour": "1 jour",
"1/4 : Préparation...": "1/4: preparation ...",
"10 minutes": "10 minutes",
"10 tentatives": "10 attempts",
@ -31,7 +31,7 @@
"Adaptation": "Adaptation",
"Administrateur": "Administrator",
"Administration": "Administration",
"Adresse SMTP": "SMTP address",
"Adresse SMTP": "SMTP Address",
"Adresse du proxy": "Proxy address",
"Adresse électronique": "email address",
"Affectation": "Assignment",
@ -60,10 +60,10 @@
"Archive copiée dans le dossier Modules du gestionnaire de fichier": "Archive copied in the Modules folder",
"Archive de thème invalide": "Invalid theme archive",
"Archive invalide": "Invalid archive",
"Archive invalide, l'écriture dans le dossier core est interdite": "Invalid archive, writing in the core folder is prohibited",
"Archive invalide, l'écriture dans le dossier core est interdite": "Invalid archive, writing in the core file is prohibited",
"Archive invalide, le descripteur est absent": "Invalid archive, the descriptor is absent",
"Archive invalide, le fichier de classe est absent": "Invalid archive, the class file is absent",
"Archive invalide, les dossiers ne correspondent pas au descripteur": "Invalid archive, the files do not match the descriptor",
"Archive invalide, le fichier de classe est absent": "Invalide archive, the class file is absent",
"Archive invalide, les dossiers ne correspondent pas au descripteur": "Invalid archive, the files do not correspond to the descriptor",
"Archive non spécifiée ou introuvable": "Archive not specified or not found",
"Archive à restaurer": "Archive to restore",
"Arrière plan": "Background",
@ -86,7 +86,7 @@
"Aucune liste noire à télécharger": "No blacklist to download",
"Auteur :": "Author:",
"Authentification": "Authentication",
"Automatique": "Automatic",
"Automatique": "Automatique",
"Autoriser les robots à référencer le site": "Allow robots to reference the site",
"Autorisé": "Allowed",
"Avant la bannière": "Before the banner",
@ -104,9 +104,9 @@
"Barre latérale": "Sidebar",
"Barre latérale droite :": "Right sidebar:",
"Barre latérale gauche :": "Left sidebar:",
"Barres latérales": "Sidebars",
"Barres latérales": "Side bars",
"Bienvenue %s %s": "Welcome %s %s",
"Blocage après échecs": "Blocking after failure",
"Blocage après échecs": "Blocking after chess",
"Blog": "Blog",
"Bords arrondis": "Rounded edges",
"Bordure des blocs": "Blocks border",
@ -122,16 +122,16 @@
"Caché": "Hidden",
"Cachée": "Hidden",
"Captcha complexe": "Complex captcha",
"Captcha à la connexion": "Captcha",
"Captcha à la connexion": "Captcha at connecting",
"Captcha, identifiant ou mot de passe incorrects": "Incorrect captcha, login or password",
"Capture d'écran Open Graph": "Open Graph screenshot",
"Capture d'écran générée avec succès": "Successful generated screenshot",
"Casse": "Case",
"Catalogue": "Store",
"Catégorie": "Category",
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "This member can upload or download files in the 'Sharing' folder and its subfolders",
"Ce membre pourra téléverser ou télécharger des fichiers dans le dossier 'partage' et ses sous-dossiers": "This member upload or download files in the 'Sharing' folder and its subfolders",
"Cette page ne doit pas apparaître dans l'arborescence du menu. Créez une page orpheline.": "This page should not appear in the menu tree. Create an orphan page.",
"Cette redirection ne concerne que les pages d'administration du site.": "This redirection only concerns the site administration pages.",
"Cette redirection ne concerne que les pages d'administration du site.": "This redirection only concerns the administration pages of the site.",
"Chaîne Youtube": "Youtube channel",
"Chiffres": "Numbers",
"Cible": "Target",
@ -158,8 +158,8 @@
"Consulter l'aide en ligne": "Online help",
"Contents": "Contents",
"Contenu": "Contents",
"Contenu HTML": "HTML content",
"Contenu avancé": "Advanced content",
"Contenu HTML": "HTML contents",
"Contenu avancé": "Advanced contents",
"Contenu du menu vertical": "Vertical menu content",
"Contrôle total": "Full control",
"Cookies": "Cookies",
@ -174,7 +174,7 @@
"Couleur de fond automatique": "Automatic background color",
"Couleur icône haut de page": "Color of top page icon",
"Couleur texte page active": "Active page text color",
"Couleur unie ou papier-peint": "Plain color or wallpaper",
"Couleur unie ou papier-peint": "United color or wallpaper",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence.": "Visible color in the absence of an image. <br /> The horizontal cursor regulates the level of transparency.",
"Couleur visible en l'absence d'une image.<br />Le curseur horizontal règle le niveau de transparence. La couleur du texte est automatique.": "Visible color in the absence of an image. <br /> The horizontal cursor regulates the level of transparency. The color of the text is automatic.",
"Couleurs": "Colors",
@ -190,8 +190,8 @@
"Dossier": "Folder",
"Droits sur les dossiers": "Folder authorizations",
"Droits sur les fichiers": "File authorizations",
"Dupliquer": "Clone",
"Dupliquer la page": "Clone page",
"Dupliquer": "Duplicate",
"Dupliquer la page": "Duplicate the page",
"Déconnecte les sessions ouvertes précédemment sur d'autres navigateurs ou terminaux. Activation recommandée.": "Disconnects the previously opened sessions on other browsers or terminals. Recommended activation.",
"Déconnecter": "Disconnect",
"Déconnexion !": "Logout!",
@ -199,7 +199,7 @@
"Définir par défaut": "Set as default",
"Dévoiler le mot de passe": "Reveal the password",
"Effacer": "Delete",
"Effacer la page": "Delete page",
"Effacer la page": "Delete the page",
"Effacer tous les commentaires": "Delete all Comments",
"Effacer toutes les statistiques": "Delete all statistics",
"Effacer un commentaire": "Delete Comment",
@ -212,9 +212,9 @@
"En cas de changement de module, les données du module précédent seront supprimées.": "In the event of a module change, data from the previous module will be deleted.",
"En dessous du site": "Below the site",
"En haut au centre": "Top in the center",
"En haut à droite": "Top right corner",
"En haut à gauche": "Top left corner",
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "In free position add the module by placing [MODULE] to the desired location in your page.",
"En haut à droite": "Top right",
"En haut à gauche": "On the top corner left",
"En position libre ajoutez le module en plaçant [MODULE] à l'endroit voulu dans votre page.": "In free position add the module by placing [module] to the desired location in your page.",
"En-dehors du site": "Outside the site",
"Enregistrer": "Save",
"Envoyer un message de confirmation": "Send a confirmation message",
@ -226,7 +226,7 @@
"Erreur de lecture, vérifiez les permissions": "Reading error, check permissions",
"Erreur inconnue": "unknown error",
"Erreur inconnue, le module n'est pas installé": "Unknown error, the module is not installed",
"Export CSV": "CSV Export",
"Export CSV": "Export CSV",
"Expéditeur": "From",
"Extension": "Extension",
"Extraire": "Extract",
@ -260,7 +260,7 @@
"Grande": "Large",
"Grande (220%)": "Grande (220%)",
"Grande (300px)": "Grande (300px)",
"Gras": "Bold",
"Gras": "Fetter",
"Groupe": "Group",
"Groupe associé": "Associated Group",
"Groupe requis pour accéder à la page :": "Group required to access the page:",
@ -318,7 +318,7 @@
"Journalisation": "Journalization",
"L'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.": "The archive was deposited in the file manager. Archives below version 9 are not accepted.",
"L'identifiant est défini lors de la création du compte, il ne peut pas être modifié.": "The identifier is defined when creating the account, it cannot be changed.",
"La carte du site a été mise à jour": "The sitemap has been updated",
"La carte du site a été mise à jour": "The site card has been updated",
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "Backup copy of htaccess file has not been restored!",
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "The description of a page participates in its referencing, each page must have a different description.",
"La page %s est ouverte par l'utilisateur %s": "Page %s opened by user %s",
@ -340,8 +340,8 @@
"Largeur": "Width",
"Largeur de l'image": "Image Width",
"Largeur du site": "Site Width",
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "The horizontal cursor sets the level of transparency, place it on the left for invisible highlights.",
"Le curseur horizontal règle le niveau de transparence.": "The horizontal cursor sets the level of transparency.",
"Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.": "The horizontal cursor regulates the level of transparency, place it on the left for invisible highlights.",
"Le curseur horizontal règle le niveau de transparence.": "The horizontal cursor regulates the level of transparency.",
"Le fuseau horaire est utile au bon référencement": "The time zone is useful for the right SEO",
"Le menu accessoire est aligné à droite de la barre de menu, c'est un emplacement réservé aux drapeaux et au bouton de connexion.": "The accessory menu is aligned to the right of the menu bar, it is a place reserved for flags and the login button.",
"Le menu horizontal intégral": "The full horizontal menu",
@ -349,7 +349,7 @@
"Le module %s de la page %s a été supprimé": "The %s module of the %s has been deleted",
"Le module %s est désinstallé, il reste peut-être des données dans %s": "The module %s is uninstalled, there may be data in %s",
"Le sous-menu de la page parente": "The parent page submenu",
"Le survol d'une icône de l'écran de connexion affiche temporairement le mot de passe.": "Hovering over a login screen icon temporarily displays the password",
"Le survol d'une icône de l'écran de connexion affiche temporairement le mot de passe.": "Flyover of an icon on the connection screen temporarily displays the password.",
"Le titre court est affiché dans les menus. Il peut être identique au titre de la page.": "The short title is displayed in the menus. It can be identical to the page title.",
"Les langues sélectionnées sont identiques": "The selected languages are identical",
"Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.": "Legal notices are compulsory in France. An option of the footer adds a discrete link to this page.",
@ -359,7 +359,7 @@
"Libre": "Libre",
"Licence :": "Licence:",
"Lien de connexion": "Login link",
"Lien page des mentions légales.": "Link to legal notices.",
"Lien page des mentions légales.": "Link of legal notices.",
"Liens": "Links",
"Limitation des tentatives": "Limitation of attempts",
"Limitée au site": "Limited to the site",
@ -371,7 +371,7 @@
"Légère": "Light",
"Maigre": "Lean",
"Maintenance": "Maintenance",
"Majuscule à chaque mot": "Capitalize each word",
"Majuscule à chaque mot": "Capper with each word",
"Majuscules": "Capital letters",
"Marges verticales": "Vertical margins",
"Masquer la bannière en écran réduit": "Hide the banner in reduced screen",
@ -405,20 +405,20 @@
"Modules installés": "Installed modules",
"Modules orphelins": "Orphaned modules",
"Mot de passe": "Password",
"Mot de passe oublié": "Forgot password",
"Mot de passe oublié": "Forgot your password",
"Mot de passe perdu": "Lost password",
"Motorisé par": "Powered by",
"Moyen": "Medium",
"Moyenne": "Medium",
"Moyenne (200%)": "Medium (200%)",
"Moyenne (200px)": "Medium (200px)",
"Moyenne (200%)": "Average (200%)",
"Moyenne (200px)": "Average (200px)",
"Méta-description": "Meta-description",
"Méta-titre": "Meta title",
"Ne pas afficher": "Do not display",
"Ne pas charger l'exemple de site (utilisateurs avancés)": "Do not load the example of a site (advanced users)",
"Ne pas répéter": "Do not repeat",
"Ne pas saisir les balises": "Don't type tags",
"News": "News",
"News": "",
"Niveau 1 (192.168.12.x)": "Level 1 (192.168.12.x)",
"Niveau 2 (192.168.x.x)": "Level 2 (192.168.x.x)",
"Niveau 3 (192.x.x.x)": "Level 3 (192.x.x.x)",
@ -427,18 +427,18 @@
"Nom du profil": "Profile Name",
"Nom utilisateur": "Username",
"Non": "No",
"Non tronquée": "Untruncated",
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "Our site is currently under maintenance. Sorry for the inconvenience and we do our best to be back soon.",
"Non tronquée": "Unmanned",
"Notre site est actuellement en maintenance. Nous sommes désolés pour la gêne occasionnée et faisons notre possible pour être rapidement de retour.": "Our site is currently under maintenance. We are sorry for the inconvenience caused and do our best to be quickly back.",
"Nouveau contenu localisé": "New localized content",
"Nouveau mot de passe": "New Password",
"Nouveau mot de passe enregistré": "New password recorded",
"Nouvel utilisateur": "New user",
"Nouvelle page créée": "New page created",
"Nouvelle page ou barre latérale": "New page or sidebar",
"Obligatoire": "Required",
"Obligatoire": "Missing",
"Ombre": "Shadow",
"Option active en mode déconnecté uniquement, les pages enfants sont visibles et accessibles.": "Active option in disconnected mode only, children's pages are visible and accessible.",
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Recommended option to secure the connection. Applies to all the Captchas of the site. Simple Captcha is limited to an addition of numbers from 0 to 10. Complex Captcha uses four numbers from 0 to 20. Recommended activation.",
"Option recommandée pour sécuriser la connexion. S'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.": "Recommended option to secure the connection. Applies to all the Captchas of the site. Simple Captcha is limited to an addition of numbers from 0 to 10. Complex Captcha uses four numbers of 0 to 20. Recommended activation.",
"Options": "Options",
"Options avancées": "Advanced options",
"Origine": "Origin",
@ -450,7 +450,7 @@
"Page de recherche": "Search page",
"Page dupliquée": "Duplicate page",
"Page et module dupliqués": "Duplicated page and module",
"Page inexistante, erreur 404": "Non-existent page, error 404",
"Page inexistante, erreur 404": "Page non-existent, error 404",
"Page non cliquable": "Non-clickable page",
"Page parent": "Parent page",
"Page standard": "Standard page",
@ -476,7 +476,7 @@
"Permissions sur les pages": "Page Permissions",
"Petite": "Small",
"Petite (150px)": "Small (150px)",
"Petite (180%)": "Small (180%)",
"Petite (180%)": "Petite (180%)",
"Pied de page": "Footer",
"Pinterest": "Pinterest",
"Plan du site": "Sitemap",
@ -490,9 +490,9 @@
"Presse Papier": "Clipboard",
"Presse papier": "Clipboard",
"Profils des groupes": "Group Profiles",
"Proportionnelle à la taille définie dans le site.": "Proportional to the size defined in the site.",
"Proportionnelle à la taille définie dans le site.": "Proportional to that defined in the site.",
"Prénom": "First name",
"Prénom Nom": "First name Name",
"Prénom Nom": "Firstname name",
"Préparation de la mise à jour": "Preparation of the update",
"Préserver le fichier htaccess racine": "Preserve the root htaccess file",
"Préserver les comptes des utilisateurs déjà installés": "Preserve user accounts already installed",
@ -579,7 +579,7 @@
"Sur les deux axes": "On both axes",
"Sécurité": "Security",
"Sécurité de la connexion": "Connection security",
"Sécurité désactivée": "Security disabled",
"Sécurité désactivée": "Safety deactivated",
"Sélectionner un fichier": "Select a file",
"Sélectionnez au moins un contenu à afficher": "Select at least one content to display",
"Sélectionnez la langue à copier vers une langue cible": "Select the language to copy to a target language",
@ -689,18 +689,5 @@
"Groupes / Profils": "Groups / Profiles",
"Prénom commence par": "First Name starts with",
"Nom commence par": "Last Name starts with",
"Impossible de réinitialiser le mot de passe de ce compte !": "Impossible to reset this account password!",
"Test de la messagerie du site": "Site messaging test",
"Il semblerait que votre messagerie fonctionne correctement !": "It seems that your messaging is working correctly!",
"Message de test envoyé avec succès": "Test message sent successfully",
"Message non envoyé": "Message not sent",
"Validation par clé ⚠️": "Key-based validation ⚠️",
"La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.": "The connection is confirmed using a key sent via messaging. From the selected group and the higher groups.",
"Envoi du message d'authentification": "Sending authentication message",
"Connexion réussie": "Login successful",
"Erreur de mot de passe": "Password error",
"Erreur de captcha": "Captcha error",
"Clé envoyée par message": "Key sent via message",
"Message de test": "Test message",
"Clé d'authentification envoyée à votre adresse mail %s": "Authentication key sent to your email address %s"
"Impossible de réinitialiser le mot de passe de ce compte !": "Impossible to reset this account password!"
}

View File

@ -1,7 +1,7 @@
{
"'Ne pas afficher' crée une page orpheline non accessible par le biais des menus.": "'No mostrar' crea una página huérfana a la que no se puede acceder a través de los menús.",
"'Sauvegarder et télécharger les données du module": "Guardar y descargar de los datos del módulo",
"1 jour": "1 diaz",
"1 jour": "1 Jour",
"1/4 : Préparation...": "1/4: Preparando...",
"10 minutes": "10 minutos",
"10 tentatives": "6 intentos",
@ -322,7 +322,7 @@
"La copie de sauvegarde du fichier htaccess n'a pas été restaurée !": "¡La copia de seguridad del archivo htaccess no ha sido restaurada!",
"La description d'une page participe à son référencement, chaque page doit disposer d'une description différente.": "La descripción de una página participa en su referenciación, cada página debe tener una descripción diferente.",
"La page %s est ouverte par l'utilisateur %s": "La página %s ha sido abierta por el usuario %s",
"La page demandée n'existe pas ou est introuvable (erreur 404)": "La página solicitada no existe o no se encuentra (error 404).",
"La page demandée n'existe pas ou est introuvable (erreur 404)": "La page demandée n'existe pas ou est introuvable (erreur 404)",
"La page est affichée dans un menu horizontal mais pas dans le menu vertical d'une barre latérale.": "La página se muestra en un menú horizontal pero no en el menú vertical de una barra lateral.",
"La première page que vos visiteurs verront.": "La primera página que verán tus visitantes.",
"La règlementation française impose un anonymat de niveau 2": "La normativa francesa impone el anonimato de nivel 2",
@ -476,7 +476,7 @@
"Permissions sur les pages": "Permisos de las páginas",
"Petite": "Pequeño",
"Petite (150px)": "Pequeño (150px)",
"Petite (180%)": "Pequeño (180px)",
"Petite (180%)": "Petite (180%)",
"Pied de page": "Pie de página",
"Pinterest": "Pinterest",
"Plan du site": "Mapa del sitio",
@ -689,18 +689,5 @@
"Groupes / Profils": "Grupos / Perfiles",
"Prénom commence par": "El nombre comienza con",
"Nom commence par": "El apellido comienza con",
"Impossible de réinitialiser le mot de passe de ce compte !": "No puedo restablecer la contraseña de esta cuenta.",
"Test de la messagerie du site": "Prueba de mensajería del sitio",
"Il semblerait que votre messagerie fonctionne correctement !": "¡Parece que su mensajería funciona correctamente!",
"Message de test envoyé avec succès": "Mensaje de prueba enviado con éxito",
"Message non envoyé": "Mensaje no enviado",
"Validation par clé ⚠️": "Validación por clave ⚠️",
"La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.": "La conexión se confirma con una clave enviada por mensajería. Desde el grupo seleccionado y los grupos superiores.",
"Envoi du message d'authentification": "Envío del mensaje de autenticación",
"Connexion réussie": "Conexión exitosa",
"Erreur de mot de passe": "Error de contraseña",
"Erreur de captcha": "Error de captcha",
"Clé envoyée par message": "Clave enviada por mensaje",
"Message de test": "Mensaje de prueba",
"Clé d'authentification envoyée à votre adresse mail %s": "Clave de autenticación enviada a su dirección de correo electrónico %s"
"Impossible de réinitialiser le mot de passe de ce compte !": "No puedo restablecer la contraseña de esta cuenta."
}

View File

@ -689,18 +689,5 @@
"Groupes / Profils": "",
"Prénom commence par": "",
"Nom commence par": "",
"Impossible de réinitialiser le mot de passe de ce compte !": "",
"Test de la messagerie du site": "",
"Il semblerait que votre messagerie fonctionne correctement !": "",
"Message de test envoyé avec succès": "",
"Message non envoyé": "",
"Validation par clé ⚠️": "",
"La connexion est confirmée à l'aide d'une clé transmise par messagerie. Depuis le groupe sélectionné et les groupes supérieurs.": "",
"Envoi du message d'authentification": "",
"Connexion réussie": "",
"Erreur de mot de passe": "",
"Erreur de captcha": "",
"Clé envoyée par message": "",
"Message de test": "",
"Clé d'authentification envoyée à votre adresse mail %s": ""
"Impossible de réinitialiser le mot de passe de ce compte !": ""
}

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
<div class="col6 offset3">
<?php echo template::select('installLanguage', $module::$i18nFiles, [
'label' => 'Langues installées',
'selected' => isset(self::$i18nUI) ? self::$i18nUI : 'fr_FR',
'selected' => array_key_exists ('fr_FR', $module::$i18nFiles) ? 'fr_FR': reset($module::$i18nFiles),
]); ?>
</div>
</div>

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -8,7 +8,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -91,15 +91,16 @@ class language extends common
}
// Télécharger le descripteur en ligne
$languageData = helper::getUrlContents(self::ZWII_UI_URL . $lang . '.json');
$languageData = json_decode(helper::getUrlContents(self::ZWII_UI_URL . $lang . '.json'), true);
$descripteur = json_decode(helper::getUrlContents(self::ZWII_UI_URL . 'language.json'), true);
$success = false;
if (
$languageData &&
is_array($languageData) &&
is_array($descripteur['language'][$lang])
) {
if ($this->setData(['language', $lang, $descripteur['language'][$lang]])) {
$success = $this->secure_file_put_contents(self::I18N_DIR . $lang . '.json', $languageData);
$success = is_int($success) ? true : false;
}
}
@ -257,12 +258,15 @@ class language extends common
helper::dateUTF8('%d/%m/%Y', $value['date'], self::$i18nUI),
//self::$i18nUI === $file ? helper::translate('Interface') : '',
'',
template::button('translateContentLanguageUIEdit' . $file, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $file,
'value' => template::ico('pencil'),
'help' => 'Éditer',
'disabled' => 'fr_FR' === $file
]),
/*
template::button('translateContentLanguageUIEdit' . $file, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $file,
'value' => template::ico('pencil'),
'help' => 'Éditer',
'disabled' => 'fr_FR' === $file
]),
*/
template::button('translateContentLanguageUIDownload' . $file, [
'class' => isset($storeUI[$file]['version']) && version_compare($installedUI[$file]['version'], $storeUI[$file]['version']) < 0 ? 'buttonGreen' : '',
'href' => helper::baseUrl() . $this->getUrl(0) . '/update/' . $file,
@ -508,7 +512,7 @@ class language extends common
$data[$key] = $target;
}
}
file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($data));
$this->secure_file_put_contents(self::I18N_DIR . $lang . '.json', $data);
// Mettre à jour le descripteur
$this->setData([
@ -536,18 +540,13 @@ class language extends common
}
// Ajout des champs absents selon la langue de référence
/*
$dataFr = json_decode(file_get_contents(self::I18N_DIR . 'fr_FR.json'), true);
foreach ($dataFr as $key => $value) {
if (!array_key_exists($key, $data)) {
$data[$key] = '';
}
}
file_put_contents(self::I18N_DIR . $lang . '.json', $data);
*/
// Trier le tableau
asort($data);
$dataFr = json_decode(file_get_contents(self::I18N_DIR . 'fr_FR.json'), true);
foreach ($dataFr as $key => $value) {
if (!array_key_exists($key, $data)) {
$data[$key] = '';
}
}
$this->secure_file_put_contents(self::I18N_DIR . $lang . '.json', $data);
// Tableau des chaines à traduire dans la langue sélectionnée
foreach ($data as $key => $value) {
@ -570,7 +569,7 @@ class language extends common
'title' => helper::translate('Éditer les dialogues') . '&nbsp;' . template::flag($lang, '20 %'),
'view' => 'edit',
'vendor' => [
'tablednd'
'flatpickr',
],
]);
}

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -37,7 +37,7 @@
<?php echo helper::translate('Langues installées'); ?>
</h4>
<?php if ($module::$languagesUiInstalled): ?>
<?php echo template::table([2, 1, 1, 4, 1, 1, 1], $module::$languagesUiInstalled, ['Langues', 'Version', 'Date', '', '', '', '']); ?>
<?php echo template::table([2, 1, 1, 5, 1, 1], $module::$languagesUiInstalled, ['Langues', 'Version', 'Date', '', '', '']); ?>
<?php endif; ?>
</div>
</div>

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -8,7 +8,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -9,7 +9,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -23,8 +23,7 @@ class page extends common
'edit' => self::GROUP_EDITOR,
'duplicate' => self::GROUP_EDITOR,
'jsEditor' => self::GROUP_EDITOR,
'cssEditor' => self::GROUP_EDITOR,
'register' => self::GROUP_EDITOR,
'cssEditor' => self::GROUP_EDITOR
];
public static $pagesNoParentId = [
'' => 'Aucune'
@ -119,16 +118,14 @@ class page extends common
$page
]);
// Ecriture
$this->setData(['page', $pageId, $data], false);
$this->setData(['page', $pageId, $data]);
$notification = helper::translate('Page dupliquée');
// Duplication du module présent
if ($this->getData(['page', $page, 'moduleId'])) {
$data = $this->getData(['module', $page]);
$this->setData(['module', $pageId, $data], false);
$this->setData(['module', $pageId, $data]);
$notification = helper::translate('Page et module dupliqués');
}
// Force la sauvegarde
$this->saveDB('page');
// Valeurs en sortie
$this->addOutput([
@ -384,13 +381,11 @@ class page extends common
$pageId = helper::increment($pageId, self::$moduleIds);
// Met à jour les enfants
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
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)]);
// Renommer le dossier du module
$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);
$this->deleteDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2));
// 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
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 :
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'])) {
$this->setData(['locale', 'searchPageId', $pageId], false);
$this->setData(['locale', 'searchPageId', $pageId]);
}
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'])) {
$this->setData(['locale', 'page403', $pageId], false);
$this->setData(['locale', 'page403', $pageId]);
}
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
$lastPosition = 1;
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
@ -458,7 +449,7 @@ class page extends common
$lastPosition++;
}
// Change la position
$this->setData(['page', $hierarchyPageId, 'position', $lastPosition], false);
$this->setData(['page', $hierarchyPageId, 'position', $lastPosition]);
// Incrémente pour la prochaine position
$lastPosition++;
}
@ -483,28 +474,26 @@ class page extends common
) {
foreach ($this->getHierarchy($pageId) as $parentId => $childId) {
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
if ($this->getinput('pageEditBlock') === 'bar') {
foreach ($this->getHierarchy() as $eachPageId => $parentId) {
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)) {
$this->setData(['page', $eachPageId, 'barLeft', $pageId], false);
$this->setData(['page', $eachPageId, 'barLeft', $pageId]);
}
foreach ($parentId as $childId) {
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)) {
$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']);
$d = array_map(function ($d) {
unset($d["css"], $d["js"]);
unset ($d["css"], $d["js"]);
return $d;
}, $p);
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

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @authorFrédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -15,7 +15,7 @@
/**
* Confirmation de suppression
*/
$("#pageEditDelete").on("click", function() {
$("#pageEditDelete").on("click", function() {
var _this = $(this);
var message_delete = "<?php echo helper::translate('Confirmer la suppression de la page'); ?>";
return core.confirm(message_delete, function() {
@ -67,19 +67,16 @@ $( document ).ready(function() {
/**
* Sélection des onglets
*/
var pageLayout = "<?php echo $this->getData(['user', $this->getUser('id'), 'view', 'page']);?>";
// Non défini, valeur par défaut
if (pageLayout == "") {
var pageLayout = getCookie("pageLayout");
if (pageLayout == null) {
pageLayout = "content";
setCookie("pageLayout", "content");
}
// Tout cacher
$("#pageEditContentContainer").hide();
$("#pageEditExtensionContainer").hide();
$("#pageEditPositionContainer").hide();
$("#pageEditLayoutContainer").hide();
$("#pageEditPermissionContainer").hide();
// Afficher la bonne tab
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Container").show();
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Button").addClass("activeButton");
@ -298,6 +295,7 @@ $( document ).ready(function() {
$("#PageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton");
setCookie("pageLayout", "content");
});
$("#pageEditExtensionButton").on("click", function () {
$("#pageEditContentContainer").hide();
@ -310,6 +308,7 @@ $( document ).ready(function() {
$("#PageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton");
setCookie("pageLayout", "extension");
});
$("#PageEditPositionButton").on("click", function () {
$("#pageEditContentContainer").hide();
@ -322,6 +321,7 @@ $( document ).ready(function() {
$("#PageEditPositionButton").addClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton");
setCookie("pageLayout", "position");
});
$("#pageEditLayoutButton").on("click", function () {
$("#pageEditContentContainer").hide();
@ -334,6 +334,7 @@ $( document ).ready(function() {
$("#PageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").addClass("activeButton");
$("#pageEditPermissionButton").removeClass("activeButton");
setCookie("pageLayout", "layout");
});
$("#pageEditPermissionButton").on("click", function () {
$("#pageEditContentContainer").hide();
@ -346,6 +347,7 @@ $( document ).ready(function() {
$("#pageEditPositionButton").removeClass("activeButton");
$("#pageEditLayoutButton").removeClass("activeButton");
$("#pageEditPermissionButton").addClass("activeButton");
setCookie("pageLayout", "permission");
});
/**
@ -720,6 +722,30 @@ function buildPagesList(extraPosition) {
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
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1);

View File

@ -7,7 +7,16 @@
'value' => template::ico('left')
]); ?>
</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', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'page/delete/' . $this->getUrl(2) . '/' . self::$siteContent,
@ -17,7 +26,7 @@
</div>
<div class="col1">
<?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'),
'help' => 'Dupliquer la page'
]); ?>
@ -28,31 +37,27 @@
]); ?>
</div>
</div>
<div class="tab">
<?php echo template::button('pageEditContentButton', [
'value' => 'Contenu',
'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/content/' . $this->geturl(2)
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditPositionButton', [
<?php echo template::button('PageEditPositionButton', [
'value' => 'Menu',
'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/position/' . $this->geturl(2)
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditExtensionButton', [
'value' => 'Extension',
'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/extension/' . $this->geturl(2)
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditLayoutButton', [
'value' => 'Mise en page',
'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/layout/' . $this->geturl(2)
'class' => 'buttonTab'
]); ?>
<?php echo template::button('pageEditPermissionButton', [
'value' => 'Permission',
'class' => 'buttonTab',
'href' => helper::baseUrl() . 'page/register/permission/' . $this->geturl(2)
'class' => 'buttonTab'
]); ?>
</div>
@ -62,6 +67,11 @@
<div class="block">
<h4>
<?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>
<div class="row">
<div class="col8">
@ -110,6 +120,11 @@
<div class="block">
<h4>
<?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>
<div class="blockContainer">
<div class="row">
@ -161,6 +176,11 @@
<div class="block">
<h4>
<?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>
<div class="blockContainer">
<div class="row">
@ -175,8 +195,7 @@
'help' => 'Sélectionnez une image ou une icône de petite dimension',
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Icône',
'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl']),
'folder' => $this->getData(['page', $this->getUrl(2), 'iconUrl']) ? dirname($this->getData(['page', $this->getUrl(2), 'iconUrl'])) : '',
'value' => $this->getData(['page', $this->getUrl(2), 'iconUrl'])
]); ?>
</div>
</div>
@ -273,6 +292,11 @@
<div class="block">
<h4>
<?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>
<div class="blockContainer">
<div class="row">
@ -348,6 +372,11 @@
<div class="block">
<h4>
<?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>
<div class="blockContainer">
<div class="row">
@ -395,4 +424,5 @@
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -9,7 +9,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -22,7 +22,7 @@ class plugin extends common
'delete' => self::GROUP_ADMIN,
'save' => self::GROUP_ADMIN,
'store' => self::GROUP_ADMIN,
//'item' => self::GROUP_ADMIN,
'item' => self::GROUP_ADMIN,
// détail d'un objet
'upload' => self::GROUP_ADMIN,
// Téléverser catalogue
@ -330,7 +330,6 @@ class plugin extends common
'state' => $r['success']
]);
}
// Valeurs en sortie
$this->addOutput([
'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
*/
@ -566,9 +556,6 @@ class plugin extends common
}
}
// Désactive l'icône rouge
$this->setData(['core', 'updateModuleAvailable', false]);
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Gestion des modules'),

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -8,7 +8,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -11,7 +11,7 @@
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
* @copyright : Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
*/
class theme extends common
@ -419,7 +419,7 @@ class theme extends common
]);
// 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')]);
// Valeurs en sortie
@ -507,23 +507,21 @@ class theme extends common
'featureContent' => $featureContent,
'featureFiles' => $files
]
], false);
]);
// Modification de la position du menu selon la position de la bannière
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') {
$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
if (
$this->getData(['theme', 'header', 'position']) == 'hide' &&
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
$this->addOutput([
'notification' => helper::translate('Modifications enregistrées'),
@ -652,7 +650,7 @@ class theme extends common
if (is_array($typeValue)) {
foreach ($typeValue as $fontId => $fontValue) {
// Recherche les correspondances
$result = array_filter($fonts, function ($value) use ($fontId) {
$result = array_filter($fonts, function($value) use ($fontId) {
return $value == $fontId;
});
$keyResults = array_keys($result);
@ -848,7 +846,7 @@ class theme extends common
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
@ -923,7 +921,7 @@ class theme extends common
'fontWeight' => $this->getInput('themeTitleFontWeight'),
'textTransform' => $this->getInput('themeTitleTextTransform')
]
], false);
]);
$this->setData([
'theme',
'text',
@ -933,7 +931,7 @@ class theme extends common
'textColor' => $this->getInput('themeTextTextColor'),
'linkColor' => $this->getInput('themeTextLinkColor')
]
], false);
]);
$this->setData([
'theme',
'site',
@ -944,14 +942,14 @@ class theme extends common
'width' => $this->getInput('themeSiteWidth'),
'margin' => $this->getInput('themeSiteMargin', helper::FILTER_BOOLEAN)
]
], false);
]);
$this->setData([
'theme',
'button',
[
'backgroundColor' => $this->getInput('themeButtonBackgroundColor')
]
], false);
]);
$this->setData([
'theme',
'block',
@ -959,9 +957,7 @@ class theme extends common
'backgroundColor' => $this->getInput('themeBlockBackgroundColor'),
'borderColor' => $this->getInput('themeBlockBorderColor')
]
], false);
// Force la sauvegarde
$this->saveDB('theme');
]);
// Valeurs en sortie
$this->addOutput([
'notification' => helper::translate('Modifications enregistrées'),

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,15 @@
'value' => template::ico('left')
]); ?>
</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'); ?>
</div>
</div>
@ -27,7 +35,7 @@
</div>
<div class="row">
<div class="col6">
<?php echo template::text('themeBodyToTopColor', [
<?php echo template::text('themeBodyToTopColor', [
'class' => 'colorPicker',
'help' => 'Le curseur horizontal règle le niveau de transparence.',
'label' => 'Couleur icône haut de page',
@ -60,8 +68,7 @@
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Arrière plan',
'type' => 1,
'value' => $imageFile,
'folder' => $imageFile ? dirname($imageFile) : ''
'value' => $imageFile
]); ?>
</div>
</div>

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -4,7 +4,7 @@
* file that was distributed with this source code.
*
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -20,7 +20,6 @@ $('#dataTables').DataTable({
},
locale: 'fr',
stateSave: true,
"lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "Tout"]],
"columnDefs": [{
target: 5,
orderable: false,

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -4,7 +4,7 @@
* file that was distributed with this source code.
*
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -4,7 +4,7 @@
* file that was distributed with this source code.
*
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

File diff suppressed because one or more lines are too long

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -8,7 +8,7 @@
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,15 @@
'value' => template::ico('left')
]); ?>
</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'); ?>
</div>
</div>
@ -150,17 +158,13 @@
'label' => 'Image',
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'type' => 1,
'value' => $imageFile,
'folder' => $imageFile ? dirname($imageFile) : ''
'value' => $imageFile
]);
?>
<span class="themeHeaderImageOptions displayNone" id="themeHeaderImageInfo">
<?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 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('Hauteur de l\'image'); ?> <span
id="themeHeaderImageHeight"></span>
<?php echo helper::translate('Hauteur de l\'image'); ?> <span id="themeHeaderImageHeight"></span>
|
<?php echo helper::translate('Ratio'); ?> <span id="themeHeaderImageRatio"></span>
</span>

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -7,15 +7,22 @@
'value' => template::ico('left')
]); ?>
</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'); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Paramètres'); ?>
<h4><?php echo helper::translate('Paramètres'); ?>
</h4>
<div class="row">
<div class="col6">
@ -77,8 +84,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Contenu'); ?>
<h4><?php echo helper::translate('Contenu'); ?>
</h4>
<div class="row">
<div class="col3">
@ -106,8 +112,7 @@
'language' => $this->getData(['user', $this->getUser('id'), 'language']),
'label' => 'Logo du menu burger',
'type' => 1,
'value' => $imageFile,
'folder' => $imageFile ? dirname($imageFile) : ''
'value' => $imageFile
]);
?>
</div>
@ -118,8 +123,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Couleurs'); ?>
<h4><?php echo helper::translate('Couleurs'); ?>
</h4>
<div class="row">
<div class="col4">
@ -160,7 +164,7 @@
<?php
echo template::checkbox('themeMenuActiveColorAuto', true, 'Couleur de fond automatique', [
'checked' => $this->getData(['theme', 'menu', 'activeColorAuto']),
]); ?>
]); ?>
</div>
<div class="col4">
<?php echo template::text('themeMenuActiveColor', [
@ -177,8 +181,7 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Mise en forme du texte'); ?>
<h4><?php echo helper::translate('Mise en forme du texte'); ?>
</h4>
<div class="row">
<div class="col3">

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -8,7 +8,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -26,7 +26,6 @@ class user extends common
'logout' => self::GROUP_MEMBER,
'forgot' => self::GROUP_VISITOR,
'login' => self::GROUP_VISITOR,
'auth' => self::GROUP_VISITOR,
'reset' => self::GROUP_VISITOR,
'profil' => self::GROUP_ADMIN,
'profilEdit' => self::GROUP_ADMIN,
@ -67,7 +66,7 @@ class user extends common
public static $groupProfils = [
self::GROUP_MEMBER => 'Membre',
self::GROUP_EDITOR => 'Éditeur',
self::GROUP_EDITOR => 'Éditeur'
];
public static $listModules = [];
@ -203,7 +202,7 @@ class user extends common
// L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null
// Groupe insuffisant
and ($this->getUser('group') < self::GROUP_EDITOR)
and ($this->getUrl('group') < self::GROUP_EDITOR)
) {
// Valeurs en sortie
$this->addOutput([
@ -250,10 +249,10 @@ class user extends common
and (
// Impossible de s'auto-éditer
($this->getUser('id') === $this->getUrl(2)
and $this->getUser('group') <= self::GROUP_VISITOR
and $this->getUrl('group') <= self::GROUP_VISITOR
)
// Impossible d'éditer un autre utilisateur
or ($this->getUser('group') < self::GROUP_EDITOR)
or ($this->getUrl('group') < self::GROUP_EDITOR)
)
) {
// Valeurs en sortie
@ -346,7 +345,6 @@ class user extends common
'files' => $this->getInput('userEditFiles', helper::FILTER_BOOLEAN),
'language' => $this->getInput('userEditLanguage', 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
@ -417,7 +415,7 @@ class user extends common
// Enregistre la date de la demande dans le compte utilisateur
$this->setData(['user', $userId, 'forgot', time()]);
// 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
$sent = $this->sendMail(
$this->getData(['user', $userId, 'mail']),
@ -980,7 +978,6 @@ class user extends common
) {
// Lire Id du compte
$userId = $this->getInput('userLoginId', helper::FILTER_ID, true);
$notification = '';
// Check le captcha
if (
$this->getData(['config', 'connect', 'captcha'])
@ -1033,8 +1030,8 @@ class user extends common
$this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time()
and $this->getData(['user', $userId, 'connectFail']) === $this->getData(['config', 'connect', 'attempt'])
) {
$this->setData(['user', $userId, 'connectFail', 0], false);
$this->setData(['user', $userId, 'connectTimeout', 0], false);
$this->setData(['user', $userId, 'connectFail', 0]);
$this->setData(['user', $userId, 'connectTimeout', 0]);
}
// Check la présence des variables et contrôle du blocage du compte si valeurs dépassées
// Vérification du mot de passe et du groupe
@ -1045,14 +1042,27 @@ class user extends common
and $this->getData(['user', $userId, 'group']) >= self::GROUP_MEMBER
and $captcha === true
) {
// RAZ
$this->setData(['user', $userId, 'connectFail', 0]);
$this->setData(['user', $userId, 'connectTimeout', 0]);
// RAZ des compteurs de blocage
$this->setData(['user', $userId, 'connectFail', 0], false);
$this->setData(['user', $userId, 'connectTimeout', 0], false);
// Validité du cookie
$expire = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN) === true ? strtotime("+1 year") : 0;
switch ($this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN)) {
case false:
// Cookie de session
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);
break;
default:
// Cookie persistant
setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false));
setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false));
break;
}
// 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
if (
$this->getData(['config', 'maintenance'])
@ -1064,79 +1074,7 @@ class user extends common
'state' => false
]);
} else {
/**
* Le site n'est pas en maintenance
* Double authentification en cas de saisie correcte
*/
// Clé d'authenfication utilisée pour lier le compte au cookie au lieu de stocker le hash du mot de passe
$authKey = uniqid('', true) . bin2hex(random_bytes(8));
// Clé pour la double validation
$keyByMail = rand(100000, 999999);
// La page d'authentification est vide
$authRedirect = '';
if (
$this->getData(['config', 'connect', 'mailAuth']) > 0
&& $this->getData(['user', $userId, 'group']) >= $this->getData(['config', 'connect', 'mailAuth'])
) {
/**
* Envoi d'un email contenant une clé
* Stockage de la clé dans le compte de l'utilisateur
*/
$sent = $this->sendMail(
$this->getData(['user', $userId, 'mail']),
'Validation de la connexion à votre compte',
'<p>Clé de validation à saisir dans le formulaire de connexion :</p>' .
'<h1><center>' . $keyByMail . '</center></h1>',
null,
$this->getData(['config', 'smtp', 'from'])
);
// L'email a été envoyé avec succès, redirection vers la page de double authentification
if ($sent === true) {
// Journalisation
$logStatus = helper::translate('Envoi du message d\'authentification');
// Redirection vers la page d'authentification
$authRedirect = 'user/auth/';
// Stocker la clé envoyée par email
$this->setData(['user', $userId, 'authKey', $keyByMail]);
$notification = sprintf('Clé d\'authentification envoyée à votre adresse mail %s', $this->getData(['user', $userId, 'mail']));
} else {
// Impossible d'envoyer le message
// Double authentification désactivée
$this->setData(['config', 'connect', 'mailAuth', 0]);
$this->setData(['user', $userId, 'authKey', $authKey]);
// Journalisation
$this->saveLog($sent);
$notification = sprintf(helper::translate('Bienvenue %s %s'), $this->getData(['user', $userId, 'firstname']), $this->getData(['user', $userId, 'lastname']));
}
} else {
$logStatus = helper::translate('Connexion réussie');
$notification = sprintf(helper::translate('Bienvenue %s %s'), $this->getData(['user', $userId, 'firstname']), $this->getData(['user', $userId, 'lastname']));
$this->setData(['user', $userId, 'authKey', $authKey]);
}
// Validité du cookie
$expire = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN) === true ? strtotime("+1 year") : 0;
switch ($this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN)) {
case false:
// Cookie de session
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);
// Connexion par clé
setcookie('ZWII_AUTH_KEY', $authKey, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true);
break;
default:
// Cookie persistant
setcookie('ZWII_USER_ID', $userId, $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;
}
$logStatus = 'Connexion réussie';
$pageId = $this->getUrl(2);
if (
$this->getData(['config', 'page404']) === $pageId
@ -1144,10 +1082,10 @@ class user extends common
) {
$pageId = '';
}
$redirect = ($pageId && strpos($pageId, 'user_reset') !== 0) ? helper::baseUrl() . $authRedirect . str_replace('_', '/', str_replace('__', '#', $pageId)) : helper::baseUrl() . $authRedirect;
$redirect = ($pageId && strpos($pageId, 'user_reset') !== 0) ? helper::baseUrl() . str_replace('_', '/', str_replace('__', '#', $pageId)) : helper::baseUrl();
// Valeurs en sortie
$this->addOutput([
'notification' => $notification,
'notification' => sprintf(helper::translate('Bienvenue %s %s'), $this->getData(['user', $userId, 'firstname']), $this->getData(['user', $userId, 'lastname'])),
'redirect' => $redirect,
'state' => true
]);
@ -1155,14 +1093,14 @@ class user extends common
// Sinon notification d'échec
} else {
$notification = helper::translate('Captcha, identifiant ou mot de passe incorrects');
$logStatus = $captcha === true ? helper::translate('Erreur de mot de passe') : helper::translate('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
if ($this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt'])) {
$this->setData(['user', $userId, 'connectFail', $this->getdata(['user', $userId, 'connectFail']) + 1]);
}
// Cas 2 la limite du nombre de connexion est atteinte : placer le timer
if ($this->getdata(['user', $userId, 'connectFail']) == $this->getData(['config', 'connect', 'attempt'])) {
$this->setData(['user', $userId, 'connectTimeout', time()], false);
$this->setData(['user', $userId, 'connectTimeout', time()]);
}
// Cas 3 le délai de bloquage court
if ($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) > time()) {
@ -1171,12 +1109,10 @@ class user extends common
// Valeurs en sortie
$this->addOutput([
'notification' => $notification,
'notification' => $notification
]);
}
}
// Force la sauvegarde
$this->saveDB('user');
}
// Journalisation
$this->saveLog($logStatus);
@ -1193,81 +1129,15 @@ class user extends common
]);
}
/**
*
* Validation de la connexion par email
* @return void
*/
public function auth()
{
// Soumission du formulaire
if (
$this->isPost()
) {
// Vérifier la clé saisie
$targetKey = $this->getData(['user', $this->getUser('id'), 'authKey']);
$inputKey = $this->getInput('userAuthKey', helper::FILTER_INT);
// Redirection
$pageId = $this->getUrl(2);
$redirect = $pageId? helper::baseUrl() . $pageId : helper::baseUrl() ;
if (
// La clé est valide ou le message n'ayant pas été expédié, la double authentification est désactivée
$targetKey === $inputKey || $this->getData(['config', 'connect', 'mailAuth', 0]) === 0
) {
// La fiche de l'utilisateur contient la clé d'authentification
$this->setData(['user', $this->getUser('id'), 'authKey', $this->getInput('ZWII_AUTH_KEY')]);
// Journalisation
$this->saveLog('Connexion réussie');
// Utilisateur connecté
$userId = $this->getUser('id');
// Valeurs en sortie
$this->addOutput([
'redirect' => $redirect,
'notification' => sprintf(helper::translate('Bienvenue %s %s'), $this->getData(['user', $userId, 'firstname']), $this->getData(['user', $userId, 'lastname'])),
'state' => true
]);
} else {
// Supprime la clé stockée et le temps limite
$this->deleteData(['user', $this->getUser('id'), 'authKey']);
// Réinitialiser le compteur de temps
$this->setData(['user', $this->getUser('id'), 'connectTimeout', 0]);
// Détruit les cookies d'authenfication
helper::deleteCookie('ZWII_USER_ID');
helper::deleteCookie('ZWII_AUTH_KEY');
// Détruit la session
session_destroy();
// Journalisation
$this->saveLog('Erreur de vérification de la clé envoyée par email ' . $this->getUser('id'));
// Valeurs en sortie
$this->addOutput([
'redirect' => $redirect,
'notification' => helper::translate('La clé est incorrecte'),
'state' => false
]);
}
} else {
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Double authentification'),
'view' => 'auth',
'display' => self::DISPLAY_LAYOUT_LIGHT,
]);
}
}
/**
* Déconnexion
*/
public function logout()
{
// Détruit les cookies d'authenfication
helper::deleteCookie('ZWII_USER_ID');
helper::deleteCookie('ZWII_AUTH_KEY');
helper::deleteCookie('ZWII_USER_PASSWORD');
// Détruit la session
session_destroy();
@ -1289,16 +1159,11 @@ class user extends common
// L'utilisateur n'existe pas
$this->getData(['user', $this->getUrl(2)]) === null
// Lien de réinitialisation trop vieux
|| $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()
or $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()
// Id unique incorrecte
|| $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2), 'logout'])))
or $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2)])))
) {
$this->saveLog(
' Erreur de réinitialisation de mot de passe ' . $this->getUrl(2) .
' Compte : ' . $this->getData(['user', $this->getUrl(2)]) .
' Temps : ' . ($this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()) .
' Clé : ' . ($this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2), 'forgot']))))
);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseurl(),
@ -1325,11 +1190,11 @@ class user extends common
$newPassword = $this->getInput('userResetNewPassword', helper::FILTER_PASSWORD, true);
}
// 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
$this->setData(['user', $this->getUrl(2), 'forgot', 0], false);
$this->setData(['user', $this->getUrl(2), 'forgot', 0]);
// 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]);
// Valeurs en sortie
$this->addOutput([
@ -1444,7 +1309,7 @@ class user extends common
"accessCsrf" => null,
'tags' => $item['tags']
]
], false);
]);
// Icône de notification
$item['notification'] = $create ? template::ico('check') : template::ico('cancel');
// Envoi du mail
@ -1485,8 +1350,6 @@ class user extends common
}
}
// Force la sauvegarde
$this->saveDB('user');
if (empty(self::$users)) {
$notification = helper::translate('Rien à importer, erreur de format ou fichier incorrect');
$success = false;

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -6,7 +6,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

View File

@ -1,49 +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-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
@media screen and (max-width: 768px) {
#buttonsContainer {
display: grid;
}
#loginContainer {
order: 1;
}
#backContainer{
order: 2;
}
}
#userAuthKey {
text-align: center;
font-size: 2rem;
border: none; /* Supprime toutes les bordures */
border-bottom: 2px solid #000; /* Ajoute uniquement une bordure inférieure */
padding: 5px 0; /* Ajoute un peu d'espace au-dessus et en dessous */
margin-top: 10px; /* Ajoute un espacement au-dessus du champ */
outline: none; /* Supprime l'effet de focus par défaut */
letter-spacing: 6px; /* Ajoute un espacement de 2 pixels */
}
#userAuthKey:focus {
border-bottom-color: #007bff; /* Change la couleur du cadre bas lorsqu'on clique */
border-bottom-width: 3px; /* Accentue la bordure inférieure */
}
.container.light {
filter: drop-shadow(5px 5px 10px rgba(0, 0, 0, 0.2));
}

View File

@ -1,33 +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-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
$(document).ready(function () {
$('#userAuthKey').on('input', function () {
// Récupère la valeur du champ
let input = $(this).val();
// Supprime tous les caractères non numériques
input = input.replace(/\D/g, '');
// Limite à 6 caractères maximum
if (input.length > 6) {
input = input.substring(0, 6);
}
// Met à jour la valeur du champ
$(this).val(input);
});
});

View File

@ -1,23 +0,0 @@
<?php echo template::formOpen('userAuthForm'); ?>
<div class="row">
<div class="col4 offset4">
<?php echo template::text('userAuthKey', [
'label' => helper::translate('Clé envoyée par message')
]); ?>
</div>
</div>
<div class="row" id="buttonsContainer">
<div class="col2" id="backContainer">
<?php echo template::button('userAuthBack', [
'href' => $this->getUrl(2) ? helper::baseUrl() . 'user/login/' . str_replace('_', '/', str_replace('__', '#', $this->getUrl(2))) : helper::baseUrl() . 'user/login',
'value' => template::ico('left')
]); ?>
</div>
<div class="col3 offset7" id="loginContainer">
<?php echo template::submit('userLoginSubmit', [
'value' => 'Connexion',
'ico' => ''
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -7,7 +7,7 @@
* @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-2025, Frédéric Tempez
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/

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