forked from ZwiiCMS-Team/ZwiiCMS
10400 #3
10
CHANGES.md
10
CHANGES.md
@ -1,7 +1,15 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
## version 10.4.00
|
## version 10.4.00
|
||||||
|
Corrections :
|
||||||
|
- Bug de pages non accessibles dans le menu suite à la création d'entrées fantômes dans le fichier de données de modules.
|
||||||
|
- Nettoyage du fichiers des données de modules des entrées fantômes.
|
||||||
|
- Thème : déformation des images en arrière-plan dans les modes responsives cover et contain lorsque la longueur de la page change. L'image en arrière-plan est désormais placée dans la balise html et l'option fixe s'active lorsque cover ou contain sont sélectionnés.
|
||||||
|
- Thème : déformation du sélecteur de fichiers dans certains formats de page.
|
||||||
|
- Module Form : mauvais affichage du guillemet et de l'apostrophe dans les noms des champs lors de l'édition.
|
||||||
|
- Thème : faille CSRF, protection de la réinitialisation des fichiers de thème.
|
||||||
- Modifications :
|
- Modifications :
|
||||||
|
- Filtrage des URL générées par facebook (FBCLID) occasionnant une erreur 404
|
||||||
- Captcha arithmétique, activation recommandée dans la configuration.
|
- Captcha arithmétique, activation recommandée dans la configuration.
|
||||||
- Module User
|
- Module User
|
||||||
- Pour les articles de blog et de news, choix de la signature, nom+prenom ; nom+prenom ; id ; pseudo
|
- Pour les articles de blog et de news, choix de la signature, nom+prenom ; nom+prenom ; id ; pseudo
|
||||||
@ -15,9 +23,9 @@
|
|||||||
- Approbation des commentaires
|
- Approbation des commentaires
|
||||||
- Gestion des thèmes :
|
- Gestion des thèmes :
|
||||||
- Bouton de réinitialisation avec confirmation
|
- Bouton de réinitialisation avec confirmation
|
||||||
- Traduction automatique dans la langue du navigateur.
|
|
||||||
- Amélioration de la structure du flux RSS.
|
- Amélioration de la structure du flux RSS.
|
||||||
|
|
||||||
|
|
||||||
## Version 10.3.13
|
## Version 10.3.13
|
||||||
Modifications :
|
Modifications :
|
||||||
- Système de données (JsonDB) :
|
- Système de données (JsonDB) :
|
||||||
|
135
core/core.php
135
core/core.php
@ -44,7 +44,7 @@ class common {
|
|||||||
const ACCESS_TIMER = 1800;
|
const ACCESS_TIMER = 1800;
|
||||||
|
|
||||||
// Numéro de version
|
// Numéro de version
|
||||||
const ZWII_VERSION = '10.4.00.013';
|
const ZWII_VERSION = '10.4.00.015';
|
||||||
const ZWII_UPDATE_CHANNEL = "v10";
|
const ZWII_UPDATE_CHANNEL = "v10";
|
||||||
|
|
||||||
public static $actions = [];
|
public static $actions = [];
|
||||||
@ -192,10 +192,6 @@ class common {
|
|||||||
$this->input['_COOKIE'] = $_COOKIE;
|
$this->input['_COOKIE'] = $_COOKIE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Déterminer le dossier de langues
|
|
||||||
if (isset($_POST['ZWII_USER_I18N'])) {
|
|
||||||
self::$i18nCurrent = $_POST['ZWII_USER_I18N'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Instanciation de la classe des entrées / sorties
|
// Instanciation de la classe des entrées / sorties
|
||||||
// Récupère les descripteurs
|
// Récupère les descripteurs
|
||||||
@ -236,30 +232,6 @@ class common {
|
|||||||
$this->user = $this->getData(['user', $this->getInput('ZWII_USER_ID')]);
|
$this->user = $this->getData(['user', $this->getInput('ZWII_USER_ID')]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Traduction du site avec le script Google
|
|
||||||
if ( $this->getData(['config','translate','scriptGoogle'])) {
|
|
||||||
// Lire la langue stockée dans le cookie (choix manuel)
|
|
||||||
if ( isset($_COOKIE['ZWII_USER_I18N']) ) {
|
|
||||||
$lan_cookie = $_COOKIE['ZWII_USER_I18N'];
|
|
||||||
}
|
|
||||||
// Lire la langue du navigateur
|
|
||||||
if ( $this->getData(['config','translate','autoDetect'])) {
|
|
||||||
$lan_browser = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Priorité : choix manuel - navigateur - fr
|
|
||||||
$lan = isset($lan_cookie) ? $lan_cookie : (isset($lan_browser) ? $lan_browser : 'fr');
|
|
||||||
|
|
||||||
// Changer la locale
|
|
||||||
if ( $lan !== 'fr') {
|
|
||||||
setlocale (LC_TIME, $lan . '_' . strtoupper ($lan) );
|
|
||||||
// Charge la librairie Google Translate
|
|
||||||
setrawcookie("googtrans", '/fr/'. $lan, time() + 3600, helper::baseUrl());
|
|
||||||
} else {
|
|
||||||
setrawcookie("googtrans", '/fr/fr', time() + 3600, helper::baseUrl());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Construit la liste des pages parents/enfants
|
// Construit la liste des pages parents/enfants
|
||||||
if($this->hierarchy['all'] === []) {
|
if($this->hierarchy['all'] === []) {
|
||||||
$pages = helper::arrayCollumn($this->getData(['page']), 'position', 'SORT_ASC');
|
$pages = helper::arrayCollumn($this->getData(['page']), 'position', 'SORT_ASC');
|
||||||
@ -561,16 +533,7 @@ class common {
|
|||||||
// Une partie de l'url
|
// Une partie de l'url
|
||||||
else {
|
else {
|
||||||
$url = explode('/', $this->url);
|
$url = explode('/', $this->url);
|
||||||
if (array_key_exists($key, $url) ) {
|
return array_key_exists($key, $url) ? $url[$key] : null;
|
||||||
if (strpos($url[$key],'fbclid=') === false) {
|
|
||||||
$result = $url[$key];
|
|
||||||
} else {
|
|
||||||
$result = $key === 0 ? $this->getData(['config','homePageId']) : '';
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$result = null;
|
|
||||||
}
|
|
||||||
return $result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1536,12 +1499,8 @@ class common {
|
|||||||
foreach ($pageList as $parentKey => $parent) {
|
foreach ($pageList as $parentKey => $parent) {
|
||||||
//La page est un blog
|
//La page est un blog
|
||||||
if ($this->getData(['page',$parent,'moduleId']) === 'blog' ) {
|
if ($this->getData(['page',$parent,'moduleId']) === 'blog' ) {
|
||||||
//echo "<pre>".$parent;
|
|
||||||
$articleIds = array_keys(helper::arrayCollumn($this->getData(['module', $parent, 'posts']), 'publishedOn', 'SORT_DESC'));
|
$articleIds = array_keys(helper::arrayCollumn($this->getData(['module', $parent, 'posts']), 'publishedOn', 'SORT_DESC'));
|
||||||
//var_dump($articleIds);
|
|
||||||
foreach ($articleIds as $key => $article) {
|
foreach ($articleIds as $key => $article) {
|
||||||
//echo $article;
|
|
||||||
//echo "<p>";
|
|
||||||
// Droits les deux groupes
|
// Droits les deux groupes
|
||||||
$this->setData(['module', $parent, 'posts', $article,'editConsent', 3]);
|
$this->setData(['module', $parent, 'posts', $article,'editConsent', 3]);
|
||||||
// Limite de taille 500
|
// Limite de taille 500
|
||||||
@ -1579,13 +1538,29 @@ class common {
|
|||||||
$path = realpath('site/data');
|
$path = realpath('site/data');
|
||||||
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename)
|
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename)
|
||||||
{
|
{
|
||||||
echo "$filename</br>";
|
|
||||||
if (strpos($filename,'back.json')) {
|
if (strpos($filename,'back.json')) {
|
||||||
rename($filename, str_replace('back.json','backup.json',$filename));
|
rename($filename, str_replace('back.json','backup.json',$filename));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Supprimer les fichiers CSS devenus inutiles du module search
|
||||||
|
if (file_exists('module/search/ressource/theme.css') )
|
||||||
|
unlink('module/search/ressource/theme.css');
|
||||||
|
if (file_exists('module/search/ressource/vartheme.css') )
|
||||||
|
unlink('module/search/ressource/vartheme.css');
|
||||||
|
$this->deleteData(['theme','search','keywordColor']);
|
||||||
|
|
||||||
|
// Nettoyer les modules avec des données null
|
||||||
|
|
||||||
|
$modules = $this->getData(['module']);
|
||||||
|
foreach($modules as $key => $value) {
|
||||||
|
if (is_null($value) ) {
|
||||||
|
unset($modules[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->setData (['module',$modules]);
|
||||||
|
|
||||||
$this->setData(['core', 'dataVersion', 10400]);
|
$this->setData(['core', 'dataVersion', 10400]);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1672,20 +1647,27 @@ class core extends common {
|
|||||||
$css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/';
|
$css = '/*' . md5(json_encode($this->getData(['theme']))) . '*/';
|
||||||
// Import des polices de caractères
|
// Import des polices de caractères
|
||||||
$css .= '@import url("https://fonts.googleapis.com/css?family=' . $this->getData(['theme', 'text', 'font']) . '|' . $this->getData(['theme', 'title', 'font']) . '|' . $this->getData(['theme', 'header', 'font']) . '|' . $this->getData(['theme', 'menu', 'font']) . '");';
|
$css .= '@import url("https://fonts.googleapis.com/css?family=' . $this->getData(['theme', 'text', 'font']) . '|' . $this->getData(['theme', 'title', 'font']) . '|' . $this->getData(['theme', 'header', 'font']) . '|' . $this->getData(['theme', 'menu', 'font']) . '");';
|
||||||
// Fond du site
|
// Fond du body
|
||||||
$colors = helper::colorVariants($this->getData(['theme', 'body', 'backgroundColor']));
|
$colors = helper::colorVariants($this->getData(['theme', 'body', 'backgroundColor']));
|
||||||
$css .= 'body,div.mce-edit-area{background-color:' . $colors['normal'] . ';font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'text', 'font'])) . '",sans-serif}';
|
// Body
|
||||||
// Fond TinyMCe
|
$css .= 'body{font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'text', 'font'])) . '",sans-serif}';
|
||||||
$css .= 'div.mce-edit-area{background-color:' . $colors['normal'] . ' !important}';
|
|
||||||
if($themeBodyImage = $this->getData(['theme', 'body', 'image'])) {
|
if($themeBodyImage = $this->getData(['theme', 'body', 'image'])) {
|
||||||
$css .= 'body,div.mce-edit-area{background-image:url("../file/source/' . $themeBodyImage . '");background-position:' . $this->getData(['theme', 'body', 'imagePosition']) . ';background-attachment:' . $this->getData(['theme', 'body', 'imageAttachment']) . ';background-size:' . $this->getData(['theme', 'body', 'imageSize']) . ';background-repeat:' . $this->getData(['theme', 'body', 'imageRepeat']) . '}';
|
// Image dans html pour éviter les déformations.
|
||||||
$css .= 'div.mce-edit-area{background-image:url("../file/source/' . $themeBodyImage . '") !important;background-position:' . $this->getData(['theme', 'body', 'imagePosition']) . ';background-attachment:' . $this->getData(['theme', 'body', 'imageAttachment']) . ';background-size:' . $this->getData(['theme', 'body', 'imageSize']) . ';background-repeat:' . $this->getData(['theme', 'body', 'imageRepeat']) . '}';
|
$css .= 'html{background-image:url("../file/source/' . $themeBodyImage . '");background-position:' . $this->getData(['theme', 'body', 'imagePosition']) . ';background-attachment:' . $this->getData(['theme', 'body', 'imageAttachment']) . ';background-size:' . $this->getData(['theme', 'body', 'imageSize']) . ';background-repeat:' . $this->getData(['theme', 'body', 'imageRepeat']) . '}';
|
||||||
|
// Couleur du body transparente
|
||||||
|
$css .= 'body{background-color: rgba(0,0,0,0)}';
|
||||||
|
} else {
|
||||||
|
// Pas d'image couleur du body
|
||||||
|
$css .= 'html{background-color:' . $colors['normal'] . ';}';
|
||||||
}
|
}
|
||||||
// Icône BacktoTop
|
// Icône BacktoTop
|
||||||
$css .= '#backToTop {background-color:' .$this->getData(['theme', 'body', 'toTopbackgroundColor']). ';color:'.$this->getData(['theme', 'body', 'toTopColor']).';}';
|
$css .= '#backToTop {background-color:' .$this->getData(['theme', 'body', 'toTopbackgroundColor']). ';color:'.$this->getData(['theme', 'body', 'toTopColor']).';}';
|
||||||
// Site
|
// Site
|
||||||
$colors = helper::colorVariants($this->getData(['theme', 'text', 'linkColor']));
|
$colors = helper::colorVariants($this->getData(['theme', 'text', 'linkColor']));
|
||||||
$css .= 'a{color:' . $colors['normal'] . '}';
|
$css .= 'a{color:' . $colors['normal'] . '}';
|
||||||
|
// Fond TinyMCe
|
||||||
|
$css .= 'div.mce-edit-area{background-color:' . $colors['normal'] . ' !important}';
|
||||||
|
$css .= 'div.mce-edit-area{background-color:' . $colors['normal'] . ';font-family:"' . str_replace('+', ' ', $this->getData(['theme', 'text', 'font'])) . '",sans-serif}';
|
||||||
//$css .= 'a:hover:not(.inputFile, button){color:' . $colors['darken'] . '}';
|
//$css .= 'a:hover:not(.inputFile, button){color:' . $colors['darken'] . '}';
|
||||||
$css .= 'body,.row > div{font-size:' . $this->getData(['theme', 'text', 'fontSize']) . '}';
|
$css .= 'body,.row > div{font-size:' . $this->getData(['theme', 'text', 'fontSize']) . '}';
|
||||||
$css .= 'body{color:' . $this->getData(['theme', 'text', 'textColor']) . '}';
|
$css .= 'body{color:' . $this->getData(['theme', 'text', 'textColor']) . '}';
|
||||||
@ -1937,7 +1919,7 @@ class core extends common {
|
|||||||
$access = false;
|
$access = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Empêcher l'accès aux page désactivée par URL directe
|
// Empêcher l'accès aux pages désactivées par URL directe
|
||||||
if ( ( $this->getData(['page', $this->getUrl(0),'disable']) === true
|
if ( ( $this->getData(['page', $this->getUrl(0),'disable']) === true
|
||||||
AND $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
AND $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
||||||
) OR (
|
) OR (
|
||||||
@ -2188,21 +2170,6 @@ class core extends common {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Chargement de la librairie googtrans
|
|
||||||
// Le multi langue est actif
|
|
||||||
if ($this->getData(['config','translate','scriptGoogle']) === true ) {
|
|
||||||
// la traduction auto est active
|
|
||||||
if ( $this->getData(['config','translate','autoDetect']) === true
|
|
||||||
// Cas des pages d'administration
|
|
||||||
AND $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')
|
|
||||||
OR ($this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD')
|
|
||||||
AND $this->getData(['config','translate','admin']) === true )
|
|
||||||
) {
|
|
||||||
$this->addOutput([
|
|
||||||
'vendor' => array_merge($this->output['vendor'], ['i18n'])
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Erreurs
|
// Erreurs
|
||||||
if($access === 'login') {
|
if($access === 'login') {
|
||||||
http_response_code(302);
|
http_response_code(302);
|
||||||
@ -2339,26 +2306,6 @@ class layout extends common {
|
|||||||
|
|
||||||
echo $this->core->output['content'];
|
echo $this->core->output['content'];
|
||||||
|
|
||||||
/**
|
|
||||||
* Affiche les crédits, conditions requis :
|
|
||||||
* La traduction est active et le site n'est pas en français.
|
|
||||||
* La fonction est activée.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ( (
|
|
||||||
( $this->getData(['config','translate','scriptGoogle']) === true
|
|
||||||
AND substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2) !== 'fr'
|
|
||||||
)
|
|
||||||
OR ( isset($_COOKIES['ZWII_USER_I18N'])
|
|
||||||
AND array_key_exists($_COOKIES['ZWII_USER_I18N'],$this->i18nList
|
|
||||||
AND $_COOKIES['ZWII_USER_I18N'] !== 'fr' )
|
|
||||||
)
|
|
||||||
)
|
|
||||||
AND $this->getData(['config','translate','showCredits']) === true
|
|
||||||
)
|
|
||||||
{
|
|
||||||
echo '<div id="googTransLogo"><a href="//policies.google.com/terms#toc-content" data-lity><img src="core/module/translate/ressource/googtrans.png" /></a></div>';
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3047,20 +2994,4 @@ class layout extends common {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Affiche le cadre avec les drapeaux
|
|
||||||
*/
|
|
||||||
public function showi18n() {
|
|
||||||
if ( $this->getData(['config','translate','scriptGoogle']) === true ) {
|
|
||||||
echo '<div id="i18nContainer"><ul>';
|
|
||||||
foreach (self::$i18nList as $key => $value) {
|
|
||||||
if ($this->getData(['config','translate','script' . strtoupper($key)]) ) {
|
|
||||||
echo '<li>';
|
|
||||||
echo '<a href="' . helper::baseUrl() . 'translate/language/' . $key . '/' . $this->getUrl(0) . '"><img class= "flag" src="' . helper::baseUrl(false) . 'core/vendor/i18n/png/' . $key . '.png" /></a>';
|
|
||||||
echo '</li>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo '</ul></div>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1158,10 +1158,14 @@ textarea {
|
|||||||
}
|
}
|
||||||
|
|
||||||
label {
|
label {
|
||||||
display: inline-block;
|
display: block;
|
||||||
margin-bottom: 4px;
|
margin-bottom: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.captcha label {
|
||||||
|
display:inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
/* Simule le padding des cols pour les inputs en dehors des cols */
|
/* Simule le padding des cols pour les inputs en dehors des cols */
|
||||||
:not([class^="col"])>.inputWrapper {
|
:not([class^="col"])>.inputWrapper {
|
||||||
padding: 10px 0;
|
padding: 10px 0;
|
||||||
|
@ -60,7 +60,7 @@ $lan = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); ?>
|
|||||||
<?php if($this->getData(['theme', 'header', 'position']) === 'body'): ?>
|
<?php if($this->getData(['theme', 'header', 'position']) === 'body'): ?>
|
||||||
<!-- Bannière dans le fond du site -->
|
<!-- Bannière dans le fond du site -->
|
||||||
<header>
|
<header>
|
||||||
<?php $layout->showi18n();?>
|
<?php //$layout->showi18n();?>
|
||||||
<?php
|
<?php
|
||||||
if ($this->getData(['theme','header','linkHomePage'])){
|
if ($this->getData(['theme','header','linkHomePage'])){
|
||||||
echo "<a href='" . helper::baseUrl(false) . "'>" ;} ?>
|
echo "<a href='" . helper::baseUrl(false) . "'>" ;} ?>
|
||||||
@ -154,7 +154,7 @@ $lan = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2); ?>
|
|||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
<!-- Corps de page -->
|
<!-- Corps de page -->
|
||||||
<section>
|
<section>
|
||||||
<?php $layout->showi18n();?>
|
<?php //$layout->showi18n();?>
|
||||||
<?php
|
<?php
|
||||||
// Gabarit :
|
// Gabarit :
|
||||||
// Récupérer la config de la page courante
|
// Récupérer la config de la page courante
|
||||||
|
@ -552,8 +552,6 @@ class config extends common {
|
|||||||
PHP_EOL .
|
PHP_EOL .
|
||||||
'<ifModule mod_rewrite.c>' . PHP_EOL .
|
'<ifModule mod_rewrite.c>' . PHP_EOL .
|
||||||
"\tRewriteEngine on" . PHP_EOL .
|
"\tRewriteEngine on" . PHP_EOL .
|
||||||
"\tRewriteCond %{QUERY_STRING} ^(.*)&?fbclid=[^&]+&?(.*)$ [NC]". PHP_EOL .
|
|
||||||
"\tRewriteRule ^/?(.*)$ /$1?%1%2 [R=301,L]". PHP_EOL .
|
|
||||||
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
|
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
|
||||||
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
|
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
|
||||||
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
|
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
|
||||||
|
@ -781,17 +781,7 @@ class init extends common {
|
|||||||
'values' => ''
|
'values' => ''
|
||||||
]
|
]
|
||||||
]
|
]
|
||||||
],
|
]
|
||||||
'locale' => [
|
|
||||||
'homePageId' => 'accueil',
|
|
||||||
'page302' => 'erreur302',
|
|
||||||
'page403' => 'erreur403',
|
|
||||||
'page404' => 'erreur404',
|
|
||||||
'legalPageId' => 'mentions-legales',
|
|
||||||
'searchPageId' => 'recherche',
|
|
||||||
'metaDescription' => 'Zwii est un CMS sans base de données qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.',
|
|
||||||
'title' => 'Votre site en quelques clics !'
|
|
||||||
],
|
|
||||||
]
|
]
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -317,8 +317,10 @@ class page extends common {
|
|||||||
$this->setData(['page', $childrenPageId, 'parentPageId', $pageId]);
|
$this->setData(['page', $childrenPageId, 'parentPageId', $pageId]);
|
||||||
}
|
}
|
||||||
// Change l'id de page dans les données des modules
|
// Change l'id de page dans les données des modules
|
||||||
$this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])]);
|
if ($this->getData(['module', $this->getUrl(2)]) !== null ) {
|
||||||
$this->deleteData(['module', $this->getUrl(2)]);
|
$this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])]);
|
||||||
|
$this->deleteData(['module', $this->getUrl(2)]);
|
||||||
|
}
|
||||||
// Si la page correspond à la page d'accueil, change l'id dans la configuration du site
|
// Si la page correspond à la page d'accueil, change l'id dans la configuration du site
|
||||||
if($this->getData(['locale', 'homePageId']) === $this->getUrl(2)) {
|
if($this->getData(['locale', 'homePageId']) === $this->getUrl(2)) {
|
||||||
$this->setData(['locale', 'homePageId', $pageId]);
|
$this->setData(['locale', 'homePageId', $pageId]);
|
||||||
|
@ -533,31 +533,43 @@ class theme extends common {
|
|||||||
* Réinitialisation de la personnalisation avancée
|
* Réinitialisation de la personnalisation avancée
|
||||||
*/
|
*/
|
||||||
public function reset() {
|
public function reset() {
|
||||||
// Supprime le fichier de personnalisation avancée
|
// $url prend l'adresse sans le token
|
||||||
$redirect ='';
|
$url = explode('&',$this->getUrl(2));
|
||||||
switch ($this->getUrl(2)) {
|
|
||||||
case 'admin':
|
|
||||||
$this->initData('admin');
|
|
||||||
$redirect = helper::baseUrl() . 'theme/admin';
|
|
||||||
break;
|
|
||||||
case 'manage':
|
|
||||||
$this->initData('theme');
|
|
||||||
$redirect = helper::baseUrl() . 'theme/manage';
|
|
||||||
break;
|
|
||||||
case 'custom':
|
|
||||||
unlink(self::DATA_DIR.'custom.css');
|
|
||||||
$redirect = helper::baseUrl() . 'theme/advanced';
|
|
||||||
break;
|
|
||||||
default :
|
|
||||||
$redirect = helper::baseUrl() . 'theme';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Valeurs en sortie
|
if ( isset($_GET['csrf'])
|
||||||
$this->addOutput([
|
AND $_GET['csrf'] === $_SESSION['csrf']
|
||||||
'notification' => 'Réinitialisation effectuée',
|
) {
|
||||||
'redirect' => $redirect,
|
// Réinitialisation
|
||||||
'state' => true
|
$redirect ='';
|
||||||
]);
|
switch ($url[0]) {
|
||||||
|
case 'admin':
|
||||||
|
$this->initData('admin');
|
||||||
|
$redirect = helper::baseUrl() . 'theme/admin';
|
||||||
|
break;
|
||||||
|
case 'manage':
|
||||||
|
$this->initData('theme');
|
||||||
|
$redirect = helper::baseUrl() . 'theme/manage';
|
||||||
|
break;
|
||||||
|
case 'custom':
|
||||||
|
unlink(self::DATA_DIR.'custom.css');
|
||||||
|
$redirect = helper::baseUrl() . 'theme/advanced';
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
$redirect = helper::baseUrl() . 'theme';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'notification' => 'Réinitialisation effectuée',
|
||||||
|
'redirect' => $redirect,
|
||||||
|
'state' => true
|
||||||
|
]);
|
||||||
|
} else {
|
||||||
|
// Valeurs en sortie
|
||||||
|
$this->addOutput([
|
||||||
|
'notification' => 'Jeton incorrect'
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<div class="col2 offset">
|
<div class="col2 offset">
|
||||||
<?php echo template::button('configAdminReset', [
|
<?php echo template::button('configAdminReset', [
|
||||||
'class' => 'buttonRed',
|
'class' => 'buttonRed',
|
||||||
'href' => helper::baseUrl() . 'theme/reset/admin',
|
'href' => helper::baseUrl() . 'theme/reset/admin' . '&csrf=' . $_SESSION['csrf'],
|
||||||
'value' => 'Réinitialiser',
|
'value' => 'Réinitialiser',
|
||||||
'ico' => 'cancel'
|
'ico' => 'cancel'
|
||||||
]); ?>
|
]); ?>
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="col2 offset6">
|
<div class="col2 offset6">
|
||||||
<?php echo template::button('themeAdvancedReset', [
|
<?php echo template::button('themeAdvancedReset', [
|
||||||
'href' => helper::baseUrl() . 'theme/reset/custom',
|
'href' => helper::baseUrl() . 'theme/reset/custom' . '&csrf=' . $_SESSION['csrf'],
|
||||||
'class' => 'buttonRed',
|
'class' => 'buttonRed',
|
||||||
'ico' => 'cancel',
|
'ico' => 'cancel',
|
||||||
'value' => 'Réinitialiser'
|
'value' => 'Réinitialiser'
|
||||||
|
@ -21,15 +21,25 @@ $(document).ready(function(){
|
|||||||
* Aperçu en direct
|
* Aperçu en direct
|
||||||
*/
|
*/
|
||||||
$("input, select").on("change", function() {
|
$("input, select").on("change", function() {
|
||||||
|
|
||||||
|
// Option fixe pour contain et cover
|
||||||
|
var themeBodyImageSize = $("#themeBodyImageSize").val();
|
||||||
|
|
||||||
|
if(themeBodyImageSize === "cover" ||
|
||||||
|
themeBodyImageSize === "contain" ) {
|
||||||
|
$("#themeBodyImageAttachment").val("fixed");
|
||||||
|
}
|
||||||
|
|
||||||
// Couleur du fond
|
// Couleur du fond
|
||||||
var css = "body{background-color:" + $("#themeBodyBackgroundColor").val() + "}";
|
var css = "html{background-color:" + $("#themeBodyBackgroundColor").val() + "}";
|
||||||
// Image du fond
|
// Image du fond
|
||||||
var themeBodyImage = $("#themeBodyImage").val();
|
var themeBodyImage = $("#themeBodyImage").val();
|
||||||
if(themeBodyImage) {
|
if(themeBodyImage) {
|
||||||
css += "body{background-image:url('<?php echo helper::baseUrl(false); ?>site/file/source/" + themeBodyImage + "');background-repeat:" + $("#themeBodyImageRepeat").val() + ";background-position:" + $("#themeBodyImagePosition").val() + ";background-attachment:" + $("#themeBodyImageAttachment").val() + ";background-size:" + $("#themeBodyImageSize").val() + "}";
|
css += "html{background-image:url('<?php echo helper::baseUrl(false); ?>site/file/source/" + themeBodyImage + "');background-repeat:" + $("#themeBodyImageRepeat").val() + ";background-position:" + $("#themeBodyImagePosition").val() + ";background-attachment:" + $("#themeBodyImageAttachment").val() + ";background-size:" + $("#themeBodyImageSize").val() + "}";
|
||||||
|
css += "html{background-color:rgba(0,0,0,0);}";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
css += "body{background-image:none}";
|
css += "html{background-image:none}";
|
||||||
}
|
}
|
||||||
css += '#backToTop {background-color:' + $("#themeBodyToTopBackground").val() + ';color:' + $("#themeBodyToTopColor").val() + ';}';
|
css += '#backToTop {background-color:' + $("#themeBodyToTopBackground").val() + ';color:' + $("#themeBodyToTopColor").val() + ';}';
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
<div class="col2 offset6">
|
<div class="col2 offset6">
|
||||||
<?php echo template::button('configManageReset', [
|
<?php echo template::button('configManageReset', [
|
||||||
'class' => 'buttonRed',
|
'class' => 'buttonRed',
|
||||||
'href' => helper::baseUrl() . 'theme/reset/manage',
|
'href' => helper::baseUrl() . 'theme/reset/manage' . '&csrf=' . $_SESSION['csrf'],
|
||||||
'value' => 'Réinitialiser',
|
'value' => 'Réinitialiser',
|
||||||
'ico' => 'cancel'
|
'ico' => 'cancel'
|
||||||
]); ?>
|
]); ?>
|
||||||
|
@ -32,7 +32,7 @@ class form extends common {
|
|||||||
|
|
||||||
public static $pagination;
|
public static $pagination;
|
||||||
|
|
||||||
const FORM_VERSION = '2.5';
|
const FORM_VERSION = '2.6';
|
||||||
|
|
||||||
// Objets
|
// Objets
|
||||||
const TYPE_MAIL = 'mail';
|
const TYPE_MAIL = 'mail';
|
||||||
@ -94,7 +94,7 @@ class form extends common {
|
|||||||
$inputs = [];
|
$inputs = [];
|
||||||
foreach($this->getInput('formConfigPosition', null) as $index => $position) {
|
foreach($this->getInput('formConfigPosition', null) as $index => $position) {
|
||||||
$inputs[] = [
|
$inputs[] = [
|
||||||
'name' => $this->getInput('formConfigName[' . $index . ']'),
|
'name' => htmlspecialchars_decode($this->getInput('formConfigName[' . $index . ']'),ENT_QUOTES),
|
||||||
'position' => helper::filter($position, helper::FILTER_INT),
|
'position' => helper::filter($position, helper::FILTER_INT),
|
||||||
'required' => $this->getInput('formConfigRequired[' . $index . ']', helper::FILTER_BOOLEAN),
|
'required' => $this->getInput('formConfigRequired[' . $index . ']', helper::FILTER_BOOLEAN),
|
||||||
'type' => $this->getInput('formConfigType[' . $index . ']'),
|
'type' => $this->getInput('formConfigType[' . $index . ']'),
|
||||||
|
@ -1,14 +1,10 @@
|
|||||||
<?php
|
<?php
|
||||||
class theme extends search {
|
class init extends search {
|
||||||
public static $defaultData = [
|
|
||||||
'keywordColor' => 'rgba(229, 229, 1, 1)'
|
|
||||||
];
|
|
||||||
}
|
|
||||||
class data extends search {
|
|
||||||
public static $defaultData = [
|
public static $defaultData = [
|
||||||
'previewLength' => 100,
|
'previewLength' => 100,
|
||||||
'resultHideContent' => false,
|
'resultHideContent' => false,
|
||||||
'placeHolder' => 'Un ou plusieurs mots-clés séparés par un espace ou par +',
|
'placeHolder' => 'Un ou plusieurs mots-clés séparés par un espace ou par +',
|
||||||
'submitText' => 'Rechercher'
|
'submitText' => 'Rechercher',
|
||||||
|
'keywordColor' => 'rgba(229, 229, 1, 1)'
|
||||||
];
|
];
|
||||||
}
|
}
|
@ -1,11 +0,0 @@
|
|||||||
.searchTitle {
|
|
||||||
font: caption;
|
|
||||||
font-style: italic;
|
|
||||||
margin-left: 1em;
|
|
||||||
}
|
|
||||||
.searchKeyword {
|
|
||||||
background: var(--keywordColor);
|
|
||||||
}
|
|
||||||
.searchResult {
|
|
||||||
margin: .3em 0 .3em 1em;
|
|
||||||
}
|
|
@ -1,3 +0,0 @@
|
|||||||
.searchKeyword {
|
|
||||||
--keywordColor: #keywordColor#;
|
|
||||||
}
|
|
@ -38,37 +38,31 @@ class search extends common {
|
|||||||
400 => '400 caractères',
|
400 => '400 caractères',
|
||||||
];
|
];
|
||||||
|
|
||||||
// Message par défaut
|
const SEARCH_VERSION = '1.2';
|
||||||
public static $messagePlaceHolder = 'Un ou plusieurs mots-clés entre des espaces ou des guillemets';
|
|
||||||
public static $messageButtontext = 'Rechercher';
|
|
||||||
|
|
||||||
const SEARCH_VERSION = '1.1';
|
|
||||||
|
|
||||||
// Configuration vide
|
// Configuration vide
|
||||||
public function config() {
|
public function config() {
|
||||||
// Initialisation des données de thème de la galerie dasn theme.json
|
// Création des valeurs de réglage par défaut
|
||||||
|
if ( $this->getData(['module', $this->getUrl(0)]) === null ) {
|
||||||
|
require_once('module/search/ressource/defaultdata.php');
|
||||||
|
$this->setData(['module', $this->getUrl(0), init::$defaultData]);
|
||||||
|
}
|
||||||
|
|
||||||
if($this->isPost()) {
|
if($this->isPost()) {
|
||||||
// Soumission du formulaire
|
// Soumission du formulaire
|
||||||
$this->setData(['theme', 'search', [
|
|
||||||
'keywordColor' => $this->getInput('searchKeywordColor')
|
|
||||||
]]);
|
|
||||||
$this->setData(['module', $this->getUrl(0), [
|
$this->setData(['module', $this->getUrl(0), [
|
||||||
'submitText' => $this->getInput('searchSubmitText'),
|
'submitText' => $this->getInput('searchSubmitText'),
|
||||||
'placeHolder' => $this->getInput('searchPlaceHolder'),
|
'placeHolder' => $this->getInput('searchPlaceHolder'),
|
||||||
'resultHideContent' => $this->getInput('searchResultHideContent',helper::FILTER_BOOLEAN),
|
'resultHideContent' => $this->getInput('searchResultHideContent',helper::FILTER_BOOLEAN),
|
||||||
'previewLength' => $this->getInput('searchPreviewLength',helper::FILTER_INT)
|
'previewLength' => $this->getInput('searchPreviewLength',helper::FILTER_INT),
|
||||||
|
'keywordColor' => $this->getInput('searchKeywordColor')
|
||||||
]]);
|
]]);
|
||||||
// Création des fichiers CSS
|
|
||||||
$content = file_get_contents('module/search/ressource/vartheme.css');
|
|
||||||
$themeCss = file_get_contents('module/search/ressource/theme.css');
|
|
||||||
// Injection des variables
|
|
||||||
$content = str_replace('#keywordColor#',$this->getinput('searchKeywordColor'),$content );
|
|
||||||
$success = file_put_contents('module/search/view/index/index.css',$content . $themeCss);
|
|
||||||
|
|
||||||
// Valeurs en sortie, affichage du formulaire
|
// Valeurs en sortie, affichage du formulaire
|
||||||
$this->addOutput([
|
$this->addOutput([
|
||||||
'redirect' => helper::baseUrl() . $this->getUrl(),
|
'redirect' => helper::baseUrl() . $this->getUrl(),
|
||||||
'notification' => $success !== FALSE ? 'Modifications enregistrées' : 'Modifications non enregistées !',
|
'notification' => $success !== FALSE ? 'Modifications enregistrées' : 'Modifications non enregistrées !',
|
||||||
'state' => $success !== FALSE
|
'state' => $success !== FALSE
|
||||||
]);
|
]);
|
||||||
|
|
||||||
@ -84,15 +78,11 @@ class search extends common {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function index() {
|
public function index() {
|
||||||
// Création des valeurs de thème par défaut
|
|
||||||
if ( $this->getData(['theme', 'search']) === null ) {
|
|
||||||
require_once('module/search/ressource/defaultdata.php');
|
|
||||||
$this->setData(['theme', 'search', theme::$defaultData]);
|
|
||||||
}
|
|
||||||
// Création des valeurs de réglage par défaut
|
// Création des valeurs de réglage par défaut
|
||||||
if ( $this->getData(['module', 'search']) === null ) {
|
if ( $this->getData(['module', $this->getUrl(0)]) === null ) {
|
||||||
require_once('module/search/ressource/defaultdata.php');
|
require_once('module/search/ressource/defaultdata.php');
|
||||||
$this->setData(['module', $this->getUrl(0), data::$defaultData]);
|
$this->setData(['module', $this->getUrl(0), init::$defaultData]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($this->isPost()) {
|
if($this->isPost()) {
|
||||||
@ -241,7 +231,7 @@ class search extends common {
|
|||||||
// Découper l'aperçu
|
// Découper l'aperçu
|
||||||
$t = substr($contenu, $d ,$this->getData(['module',$this->getUrl(0),'previewLength']));
|
$t = substr($contenu, $d ,$this->getData(['module',$this->getUrl(0),'previewLength']));
|
||||||
// Applique une mise en évidence
|
// Applique une mise en évidence
|
||||||
$t = preg_replace($keywords, '<span class="searchKeyword">\1</span>',$t);
|
$t = preg_replace($keywords, '<span style="background:' . $this->getData(['module',$this->getUrl(0),'keywordColor']). ';">\1</span>',$t);
|
||||||
// Sauver résultat
|
// Sauver résultat
|
||||||
$resultat .= '<p class="searchResult">'.$t.'...</p>';
|
$resultat .= '<p class="searchResult">'.$t.'...</p>';
|
||||||
$resultat .= '<p class="searchTitle">' . count($matches[0]) . (count($matches[0]) === 1 ? ' correspondance<p>' : ' correspondances<p>');
|
$resultat .= '<p class="searchTitle">' . count($matches[0]) . (count($matches[0]) === 1 ? ' correspondance<p>' : ' correspondances<p>');
|
||||||
|
@ -59,7 +59,7 @@
|
|||||||
'class' => 'colorPicker',
|
'class' => 'colorPicker',
|
||||||
'help' => 'Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.',
|
'help' => 'Le curseur horizontal règle le niveau de transparence, le placer tout à la gauche pour un surlignement invisible.',
|
||||||
'label' => 'Surlignement',
|
'label' => 'Surlignement',
|
||||||
'value' => $this->getData(['theme', 'search', 'keywordColor'])
|
'value' => $this->getData(['module', $this->getUrl(0), 'keywordColor'])
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,14 +1,10 @@
|
|||||||
.searchKeyword {
|
|
||||||
--keywordColor: rgba(229, 229, 1, 1);
|
|
||||||
}
|
|
||||||
.searchTitle {
|
.searchTitle {
|
||||||
font: caption;
|
font: caption;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
margin-left: 1em;
|
margin-left: 1em;
|
||||||
}
|
}
|
||||||
.searchKeyword {
|
|
||||||
background: var(--keywordColor);
|
|
||||||
}
|
|
||||||
.searchResult {
|
.searchResult {
|
||||||
margin: .3em 0 .3em 1em;
|
margin: .3em 0 .3em 1em;
|
||||||
}
|
}
|
@ -4,13 +4,13 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col9 verticalAlignMiddle">
|
<div class="col9 verticalAlignMiddle">
|
||||||
<?php echo template::text('searchMotphraseclef', [
|
<?php echo template::text('searchMotphraseclef', [
|
||||||
'placeholder' => $this->getData(['module', $this->getUrl(0), 'placeHolder']) ? $this->getData(['module', $this->getUrl(0), 'placeHolder']) : $module::$messagePlaceHolder,
|
'placeholder' => $this->getData(['module', $this->getUrl(0), 'placeHolder']),
|
||||||
'value' => $module::$motclef
|
'value' => $module::$motclef
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
<div class="col3 verticalAlignMiddle">
|
<div class="col3 verticalAlignMiddle">
|
||||||
<?php echo template::submit('pageEditSubmit', [
|
<?php echo template::submit('pageEditSubmit', [
|
||||||
'value' => $this->getData(['module', $this->getUrl(0), 'submitText']) ? $this->getData(['module', $this->getUrl(0), 'submitText']) : $module::$messageButtontext
|
'value' => $this->getData(['module', $this->getUrl(0), 'submitText'])
|
||||||
]); ?>
|
]); ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
# Bloque l'accès aux données
|
# Bloque l'accès aux données
|
||||||
<FilesMatch ".(htaccess|json|log)$">
|
<Files ~ "\.(htaccess|json|log)$">
|
||||||
Order deny,allow
|
Order deny,allow
|
||||||
Deny from all
|
Deny from all
|
||||||
</FilesMatch>
|
</Files>
|
Loading…
Reference in New Issue
Block a user