nouvelle config WIP

This commit is contained in:
fredtempez 2021-10-29 16:14:51 +02:00
parent ebbe211b92
commit 511dbd1246
20 changed files with 1994 additions and 681 deletions

View File

@ -22,7 +22,10 @@ class config extends common {
'configMetaImage' => self::GROUP_ADMIN,
'generateFiles' => self::GROUP_ADMIN,
'index' => self::GROUP_ADMIN,
'advanced' => self::GROUP_ADMIN,
'locale' => self::GROUP_ADMIN,
'social' => self::GROUP_ADMIN,
'safety' => self::GROUP_ADMIN,
'network' => self::GROUP_ADMIN,
'restore' => self::GROUP_ADMIN,
'updateBaseUrl' => self::GROUP_ADMIN,
'script' => self::GROUP_ADMIN,
@ -385,86 +388,10 @@ class config extends common {
]);
}
/**
* Configuration
/** *
* Configuration de base
*/
public function index() {
// Soumission du formulaire
if($this->isPost()) {
// Répercuter la suppression de la page dans la configuration du footer
if ( $this->getData(['theme','footer','displaySearch']) === true
AND $this->getInput('configSearchPageId') === 'none'
){
$this->setData(['theme', 'footer', 'displaySearch', false]);
}
if ( $this->getData(['theme','footer','displayLegal']) === true
AND $this->getInput('configLegalPageId') === 'none'
){
$this->setData(['theme', 'footer', 'displayLegal', false]);
}
// Sauvegarder
$this->setData([
'locale',
[
'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true),
'page404' => $this->getInput('configPage404'),
'page403' => $this->getInput('configPage403'),
'page302' => $this->getInput('configPage302'),
'legalPageId' => $this->getInput('configLegalPageId'),
'searchPageId' => $this->getInput('configSearchPageId'),
'searchPageLabel' => empty($this->getInput('configSearchPageLabel', helper::FILTER_STRING_SHORT)) ? 'Rechercher' : $this->getInput('configSearchPageLabel', helper::FILTER_STRING_SHORT),
'legalPageLabel' => empty($this->getInput('configLegalPageLabel', helper::FILTER_STRING_SHORT)) ? 'Mentions légales' : $this->getInput('configLegalPageLabel', helper::FILTER_STRING_SHORT),
'sitemapPageLabel' => empty($this->getInput('configSitemapPageLabel', helper::FILTER_STRING_SHORT)) ? 'Plan du site' : $this->getInput('configSitemapPageLabel', helper::FILTER_STRING_SHORT),
'metaDescription' => $this->getInput('configMetaDescription', helper::FILTER_STRING_LONG, true),
'title' => $this->getInput('configTitle', helper::FILTER_STRING_SHORT, true)
]
]);
$this->setData(['config', 'i18n', 'enable', $this->getInput('configI18n',helper::FILTER_BOOLEAN) ]);
// Générer robots.txt et sitemap
$this->generateFiles();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => 'Modifications enregistrées',
'state' => true
]);
}
// Liste des pages
self::$pagesList = $this->getData(['page']);
foreach(self::$pagesList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true) {
unset(self::$pagesList[$page]);
}
}
self::$orphansList = $this->getData(['page']);
foreach(self::$orphansList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true ||
$this->getdata(['page',$page, 'position']) !== 0) {
unset(self::$orphansList[$page]);
}
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Configuration',
'view' => 'index'
]);
}
/**
* Configuration avancée
*/
public function advanced() {
// Soumission du formulaire
if($this->isPost()) {
// Basculement en mise à jour auto
@ -593,10 +520,312 @@ class config extends common {
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Configuration de base',
'view' => 'index'
]);
}
/**
* Configuration
*/
public function locale() {
// Soumission du formulaire
if($this->isPost()) {
// Répercuter la suppression de la page dans la configuration du footer
if ( $this->getData(['theme','footer','displaySearch']) === true
AND $this->getInput('configSearchPageId') === 'none'
){
$this->setData(['theme', 'footer', 'displaySearch', false]);
}
if ( $this->getData(['theme','footer','displayLegal']) === true
AND $this->getInput('configLegalPageId') === 'none'
){
$this->setData(['theme', 'footer', 'displayLegal', false]);
}
// Sauvegarder
$this->setData([
'locale',
[
'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true),
'page404' => $this->getInput('configPage404'),
'page403' => $this->getInput('configPage403'),
'page302' => $this->getInput('configPage302'),
'legalPageId' => $this->getInput('configLegalPageId'),
'searchPageId' => $this->getInput('configSearchPageId'),
'searchPageLabel' => empty($this->getInput('configSearchPageLabel', helper::FILTER_STRING_SHORT)) ? 'Rechercher' : $this->getInput('configSearchPageLabel', helper::FILTER_STRING_SHORT),
'legalPageLabel' => empty($this->getInput('configLegalPageLabel', helper::FILTER_STRING_SHORT)) ? 'Mentions légales' : $this->getInput('configLegalPageLabel', helper::FILTER_STRING_SHORT),
'sitemapPageLabel' => empty($this->getInput('configSitemapPageLabel', helper::FILTER_STRING_SHORT)) ? 'Plan du site' : $this->getInput('configSitemapPageLabel', helper::FILTER_STRING_SHORT),
'metaDescription' => $this->getInput('configMetaDescription', helper::FILTER_STRING_LONG, true),
'title' => $this->getInput('configTitle', helper::FILTER_STRING_SHORT, true)
]
]);
$this->setData(['config', 'i18n', 'enable', $this->getInput('configI18n',helper::FILTER_BOOLEAN) ]);
// Générer robots.txt et sitemap
$this->generateFiles();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => 'Modifications enregistrées',
'state' => true
]);
}
// Liste des pages
self::$pagesList = $this->getData(['page']);
foreach(self::$pagesList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true) {
unset(self::$pagesList[$page]);
}
}
self::$orphansList = $this->getData(['page']);
foreach(self::$orphansList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true ||
$this->getdata(['page',$page, 'position']) !== 0) {
unset(self::$orphansList[$page]);
}
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Localisation',
'view' => 'locale'
]);
}
/**
* Sécurité de la connexion
**/
public function safety() {
// Valeurs en sortie
$this->addOutput([
'title' => 'Configuration avancée',
'view' => 'advanced'
'view' => 'safety'
]);
}
/**
* Configuration
*/
public function social() {
// Soumission du formulaire
if($this->isPost()) {
// Répercuter la suppression de la page dans la configuration du footer
if ( $this->getData(['theme','footer','displaySearch']) === true
AND $this->getInput('configSearchPageId') === 'none'
){
$this->setData(['theme', 'footer', 'displaySearch', false]);
}
if ( $this->getData(['theme','footer','displayLegal']) === true
AND $this->getInput('configLegalPageId') === 'none'
){
$this->setData(['theme', 'footer', 'displayLegal', false]);
}
// Sauvegarder
$this->setData([
'locale',
[
'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true),
'page404' => $this->getInput('configPage404'),
'page403' => $this->getInput('configPage403'),
'page302' => $this->getInput('configPage302'),
'legalPageId' => $this->getInput('configLegalPageId'),
'searchPageId' => $this->getInput('configSearchPageId'),
'searchPageLabel' => empty($this->getInput('configSearchPageLabel', helper::FILTER_STRING_SHORT)) ? 'Rechercher' : $this->getInput('configSearchPageLabel', helper::FILTER_STRING_SHORT),
'legalPageLabel' => empty($this->getInput('configLegalPageLabel', helper::FILTER_STRING_SHORT)) ? 'Mentions légales' : $this->getInput('configLegalPageLabel', helper::FILTER_STRING_SHORT),
'sitemapPageLabel' => empty($this->getInput('configSitemapPageLabel', helper::FILTER_STRING_SHORT)) ? 'Plan du site' : $this->getInput('configSitemapPageLabel', helper::FILTER_STRING_SHORT),
'metaDescription' => $this->getInput('configMetaDescription', helper::FILTER_STRING_LONG, true),
'title' => $this->getInput('configTitle', helper::FILTER_STRING_SHORT, true)
]
]);
$this->setData(['config', 'i18n', 'enable', $this->getInput('configI18n',helper::FILTER_BOOLEAN) ]);
// Générer robots.txt et sitemap
$this->generateFiles();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => 'Modifications enregistrées',
'state' => true
]);
}
// Liste des pages
self::$pagesList = $this->getData(['page']);
foreach(self::$pagesList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true) {
unset(self::$pagesList[$page]);
}
}
self::$orphansList = $this->getData(['page']);
foreach(self::$orphansList as $page => $pageId) {
if ($this->getData(['page',$page,'block']) === 'bar' ||
$this->getData(['page',$page,'disable']) === true ||
$this->getdata(['page',$page, 'position']) !== 0) {
unset(self::$orphansList[$page]);
}
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Référencements',
'view' => 'social'
]);
}
/**
* Configuration avancée
*/
public function network() {
// Soumission du formulaire
if($this->isPost()) {
// Basculement en mise à jour auto
// Remise à 0 du compteur
if ($this->getData(['config','autoUpdate']) === false &&
$this->getInput('configAdvancedAutoUpdate', helper::FILTER_BOOLEAN) === true) {
$this->setData(['core','lastAutoUpdate',0]);
}
// Eviter déconnexion automatique après son activation
if ( $this->getData(['config','autoDisconnect']) === false
AND $this->getInput('configAdvancedAutoDisconnect',helper::FILTER_BOOLEAN) === true ) {
$this->setData(['user',$this->getuser('id'),'accessCsrf',$_SESSION['csrf']]);
}
// Sauvegarder
$this->setData([
'config',
[
'analyticsId' => $this->getInput('configAdvancedAnalyticsId'),
'autoBackup' => $this->getInput('configAdvancedAutoBackup', helper::FILTER_BOOLEAN),
'maintenance' => $this->getInput('configAdvancedMaintenance', helper::FILTER_BOOLEAN),
'cookieConsent' => $this->getInput('configAdvancedCookieConsent', helper::FILTER_BOOLEAN),
'favicon' => $this->getInput('configAdvancedFavicon'),
'faviconDark' => $this->getInput('configAdvancedFaviconDark'),
'social' => [
'facebookId' => $this->getInput('configAdvancedSocialFacebookId'),
'linkedinId' => $this->getInput('configAdvancedSocialLinkedinId'),
'instagramId' => $this->getInput('configAdvancedSocialInstagramId'),
'pinterestId' => $this->getInput('configAdvancedSocialPinterestId'),
'twitterId' => $this->getInput('configAdvancedSocialTwitterId'),
'youtubeId' => $this->getInput('configAdvancedSocialYoutubeId'),
'youtubeUserId' => $this->getInput('configAdvancedSocialYoutubeUserId'),
'githubId' => $this->getInput('configAdvancedSocialGithubId')
],
'timezone' => $this->getInput('configAdvancedTimezone', helper::FILTER_STRING_SHORT, true),
'autoUpdate' => $this->getInput('configAdvancedAutoUpdate', helper::FILTER_BOOLEAN),
'autoUpdateHtaccess' => $this->getInput('configAdvancedAutoUpdateHtaccess', helper::FILTER_BOOLEAN),
'proxyType' => $this->getInput('configAdvancedProxyType'),
'proxyUrl' => $this->getInput('configAdvancedProxyUrl'),
'proxyPort' => $this->getInput('configAdvancedProxyPort',helper::FILTER_INT),
'captchaStrong' => $this->getInput('configAdvancedCaptchaStrong',helper::FILTER_BOOLEAN),
'autoDisconnect' => $this->getInput('configAdvancedAutoDisconnect',helper::FILTER_BOOLEAN),
'smtp' => [
'enable' => $this->getInput('configAdvancedSmtpEnable',helper::FILTER_BOOLEAN),
'host' => $this->getInput('configAdvancedSmtpHost',helper::FILTER_STRING_SHORT),
'port' => $this->getInput('configAdvancedSmtpPort',helper::FILTER_INT),
'auth' => $this->getInput('configAdvancedSmtpAuth',helper::FILTER_BOOLEAN),
'secure' => $this->getInput('configAdvancedSmtpSecure'),
'username' => $this->getInput('configAdvancedSmtpUsername',helper::FILTER_STRING_SHORT),
'password' =>helper::encrypt($this->getData(['config','smtp','username']),$this->getInput('configAdvancedSmtpPassword')),
'sender' => $this->getInput('configAdvancedSmtpSender',helper::FILTER_MAIL)
],
'seo' => [
'robots' => $this->getInput('configAdvancedSeoRobots',helper::FILTER_BOOLEAN)
],
'connect' => [
'attempt' => $this->getInput('configAdvancedConnectAttempt',helper::FILTER_INT),
'timeout' => $this->getInput('configAdvancedConnectTimeout',helper::FILTER_INT),
'log' => $this->getInput('configAdvancedConnectLog',helper::FILTER_BOOLEAN),
'anonymousIp' => $this->getInput('configAdvancedConnectAnonymousIp',helper::FILTER_INT),
'captcha' => $this->getInput('configAdvancedConnectCaptcha',helper::FILTER_BOOLEAN),
],
'i18n' => [
'enable' => $this->getData(['config', 'i18n', 'enable'])
]
]
]);
// Efface les fichiers de backup lorsque l'option est désactivée
if ($this->getInput('configAdvancedFileBackup', helper::FILTER_BOOLEAN) === false) {
$path = realpath('site/data');
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)) as $filename)
{
if (strpos($filename,'backup.json')) {
unlink($filename);
}
}
if (file_exists('site/data/.backup')) unlink('site/data/.backup');
} else {
touch('site/data/.backup');
}
// Notice
if(self::$inputNotices === []) {
// Active la réécriture d'URL
$rewrite = $this->getInput('rewrite', helper::FILTER_BOOLEAN);
if(
$rewrite
AND helper::checkRewrite() === false
) {
// Ajout des lignes dans le .htaccess
file_put_contents(
'.htaccess',
PHP_EOL .
'<ifModule mod_rewrite.c>' . PHP_EOL .
"\tRewriteEngine on" . PHP_EOL .
"\tRewriteBase " . helper::baseUrl(false, false) . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-f" . PHP_EOL .
"\tRewriteCond %{REQUEST_FILENAME} !-d" . PHP_EOL .
"\tRewriteRule ^(.*)$ index.php?$1 [L]" . PHP_EOL .
"\tRewriteCond %{SERVER_PORT} 80" . PHP_EOL .
"\tRewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]" . PHP_EOL .
'</ifModule>',
FILE_APPEND
);
// Change le statut de la réécriture d'URL (pour le helper::baseUrl() de la redirection)
helper::$rewriteStatus = true;
}
// Désactive la réécriture d'URL
elseif(
$rewrite === false
AND helper::checkRewrite()
) {
// Suppression des lignes dans le .htaccess
$htaccess = explode('# URL rewriting', file_get_contents('.htaccess'));
file_put_contents('.htaccess', $htaccess[0] . '# URL rewriting');
// Change le statut de la réécriture d'URL (pour le helper::baseUrl() de la redirection)
helper::$rewriteStatus = false;
}
// Met à jour la baseUrl
$this->setData(['core', 'baseUrl', helper::baseUrl(true,false) ]);
}
// Générer robots.txt et sitemap
$this->generateFiles();
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(),
'notification' => 'Modifications enregistrées ' ,
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => 'Reseau et scripts',
'view' => 'network'
]);
}

View File

@ -1,548 +0,0 @@
<?php echo template::formOpen('configAdvancedForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configAdvancedBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'config',
'ico' => 'left',
'value' => 'Retour'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedHelp', [
'class' => 'buttonHelp',
'ico' => 'help',
'value' => 'Aide'
]); ?>
</div>
<div class="col2 offset6">
<?php echo template::submit('configAdvancedSubmit'); ?>
</div>
</div>
<!-- Aide à propos de la configuration du site, view advanced -->
<div class="helpDisplayContent">
<?php echo file_get_contents( 'core/module/config/view/advanced/advanced.help.html') ;?>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Maintenance</h4>
<div class="row">
<div class="col4">
<?php echo template::checkbox('configAdvancedMaintenance', true, 'Site en maintenance', [
'checked' => $this->getData(['config', 'maintenance'])
]); ?>
</div>
<div class="col3">
<?php echo template::button('configBackupButton', [
'href' => helper::baseUrl() . 'config/backup',
'value' => 'Sauvegarder',
'ico' => 'download-cloud'
]); ?>
</div>
<div class="col3 offset1">
<?php echo template::button('configRestoreButton', [
'href' => helper::baseUrl() . 'config/restore',
'value' => 'Restaurer',
'ico' => 'upload-cloud'
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Réglages</h4>
<div class="row">
<div class="col4">
<?php echo template::file('configAdvancedFavicon', [
'type' => 1,
'help' => 'Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
'label' => 'Favicon',
'value' => $this->getData(['config', 'favicon'])
]); ?>
</div>
<div class="col4">
<?php echo template::file('configAdvancedFaviconDark', [
'type' => 1,
'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'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('configAdvancedTimezone', $module::$timezones, [
'label' => 'Fuseau horaire',
'selected' => $this->getData(['config', 'timezone']),
'help' => 'Le fuseau horaire est utile au bon référencement'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAdvancedCookieConsent', true, 'Message de consentement aux cookies', [
'checked' => $this->getData(['config', 'cookieConsent']),
'help' => 'Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('rewrite', true, 'URL intelligentes', [
'checked' => helper::checkRewrite(),
'help' => 'Vérifiez d\'abord que votre serveur autorise l\'URL rewriting (ce qui n\'est pas le cas chez Free).'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAdvancedCaptchaStrong', true, 'Captcha complexe', [
'checked' => $this->getData(['config','captchaStrong']),
'help' => 'Option recommandée pour sécuriser la connexion. S\'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('configAdvancedAutoDisconnect', true, 'Déconnexion automatique de la session', [
'checked' => $this->getData(['config','autoDisconnect']),
'help' => 'Déconnecte les sessions ouvertes précédemment sur d\'autres navigateurs ou terminaux. Activation recommandée.'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAdvancedAutoBackup', true, 'Sauvegarde automatique quotidienne du site', [
'checked' => $this->getData(['config', 'autoBackup']),
'help' => 'Une archive contenant le dossier /site/data est copiée dans le dossier \'site/backup\'. La sauvegarde est conservée pendant 30 jours.</p><p>Les fichiers du site ne sont pas sauvegardés automatiquement. Activation recommandée.'
]); ?>
</div>
<div class="col3">
<?php echo template::button('configBackupCopyButton', [
'href' => helper::baseUrl() . 'config/copyBackups',
'value' => 'Backups Auto &#10140; FileManager'
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Mises à jour automatisée</h4>
<?php $updateError = helper::urlGetContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');?>
<div class="row">
<div class="col4">
<?php echo template::checkbox('configAdvancedAutoUpdate', true, 'Rechercher une mise à jour en ligne', [
'checked' => $this->getData(['config', 'autoUpdate']),
'help' => 'La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.',
'disabled' => !$updateError
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('configAdvancedAutoUpdateHtaccess', true, 'Préserver le fichier htaccess racine', [
'checked' => $this->getData(['config', 'autoUpdateHtaccess']),
'help' => 'Lors d\'une mise à jour automatique, conserve le fichier htaccess de la racine du site.',
'disabled' => !$updateError
]); ?>
</div>
<div class="col4">
<?php echo template::button('configAdvancedUpdateForced', [
'ico' => 'download-cloud',
'href' => helper::baseUrl() . 'install/update',
'value' => 'Mise à jour manuelle',
'class' => 'buttonRed',
'disabled' => !$updateError
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="social">
<h4>Réseaux sociaux
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::text('configAdvancedSocialFacebookId', [
'help' => 'Saisissez votre ID : https://www.facebook.com/[ID].',
'label' => 'Facebook',
'value' => $this->getData(['config', 'social', 'facebookId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialInstagramId', [
'help' => 'Saisissez votre ID : https://www.instagram.com/[ID].',
'label' => 'Instagram',
'value' => $this->getData(['config', 'social', 'instagramId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialYoutubeId', [
'help' => 'ID de la chaîne : https://www.youtube.com/channel/[ID].',
'label' => 'Chaîne Youtube',
'value' => $this->getData(['config', 'social', 'youtubeId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialYoutubeUserId', [
'help' => 'Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].',
'label' => 'Youtube',
'value' => $this->getData(['config', 'social', 'youtubeUserId'])
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::text('configAdvancedSocialTwitterId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
'label' => 'Twitter',
'value' => $this->getData(['config', 'social', 'twitterId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialPinterestId', [
'help' => 'Saisissez votre ID : https://pinterest.com/[ID].',
'label' => 'Pinterest',
'value' => $this->getData(['config', 'social', 'pinterestId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialLinkedinId', [
'help' => 'Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].',
'label' => 'Linkedin',
'value' => $this->getData(['config', 'social', 'linkedinId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialGithubId', [
'help' => 'Saisissez votre ID Github : https://github.com/[ID].',
'label' => 'Github',
'value' => $this->getData(['config', 'social', 'githubId'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="seo">
<h4>Référencement
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col4 offset1">
<div class="row">
<div class="col12">
<?php echo template::button('configAdvancedMetaImage', [
'href' => helper::baseUrl() . 'config/configMetaImage',
'value' => 'Capture Open Graph',
'ico' => 'pencil'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::button('configAdvancedSiteMap', [
'href' => helper::baseUrl() . 'config/generateFiles',
'value' => 'Sitemap.xml / Robots.txt',
'ico' => 'pencil'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::checkbox('configAdvancedSeoRobots', true, 'Autoriser les robots à référencer le site', [
'checked' => $this->getData(['config', 'seo','robots'])
]); ?>
</div>
</div>
</div>
<div class="col6 offset1">
<?php if (file_exists(self::FILE_DIR.'source/screenshot.jpg')): ?>
<div class="row">
<div class="col8 offset2 textAlignCenter">
<img src="<?php echo helper::baseUrl(false) . self::FILE_DIR.'source/screenshot.jpg';?>" data-tippy-content="Cette capture d'écran est nécessaire aux partages sur les réseaux sociaux. Elle est régénérée lorsque le fichier 'screenshot.jpg' est effacé du gestionnaire de fichiers." />
</div>
</div>
<?php endif;?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="login">
<h4>Sécurité de la connexion
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::select('configAdvancedConnectAttempt', $module::$connectAttempt , [
'label' => 'Connexions successives',
'selected' => $this->getData(['config', 'connect', 'attempt'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('configAdvancedConnectTimeout', $module::$connectTimeout , [
'label' => 'Blocage après échecs',
'selected' => $this->getData(['config', 'connect', 'timeout'])
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<label id="helpBlacklist">Comptes inexistants
<?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('configAdvancedConnectblacListDownload', [
'href' => helper::baseUrl() . 'config/blacklistDownload',
'value' => 'Télécharger liste noire',
'ico' => 'download'
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('configAdvancedConnectReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/blacklistReset',
'value' => 'Réinitialiser liste',
'ico' => 'cancel'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAdvancedConnectCaptcha', true, 'Captcha à la connexion', [
'checked' => $this->getData(['config', 'connect','captcha'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="logs">
<h4>Journalisation
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col4 offset2">
<?php echo template::checkbox('configAdvancedConnectLog', true, 'Activer la journalisation', [
'checked' => $this->getData(['config', 'connect', 'log'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('configAdvancedConnectAnonymousIp', $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="col3 offset2">
<?php echo template::button('configAdvancedLogDownload', [
'href' => helper::baseUrl() . 'config/logDownload',
'value' => 'Télécharger le journal',
'ico' => 'download'
]); ?>
</div>
<div class="col3 offset1">
<?php echo template::button('configAdvancedLogReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/logReset',
'value' => 'Réinitialiser le journal',
'ico' => 'cancel'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="network">
<h4>Réseau
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col2">
<?php echo template::select('configAdvancedProxyType', $module::$proxyType, [
'label' => 'Type de proxy',
'selected' => $this->getData(['config', 'proxyType'])
]); ?>
</div>
<div class="col8">
<?php echo template::text('configAdvancedProxyUrl', [
'label' => 'Adresse du proxy',
'placeholder' => 'cache.proxy.fr',
'value' => $this->getData(['config', 'proxyUrl'])
]); ?>
</div>
<div class="col2">
<?php echo template::text('configAdvancedProxyPort', [
'label' => 'Port du proxy',
'placeholder' => '6060',
'value' => $this->getData(['config', 'proxyPort'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="smtp">
<h4>Messagerie SMTP
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col12">
<?php echo template::checkbox('configAdvancedSmtpEnable', true, 'Activer SMTP', [
'checked' => $this->getData(['config', 'smtp','enable']),
'help' => 'Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d\'envoi de mail.'
]); ?>
</div>
</div>
<div id="configAdvancedSmtpParam">
<div class="row">
<div class="col8">
<?php echo template::text('configAdvancedSmtpHost', [
'label' => 'Adresse SMTP',
'placeholder' => 'smtp.fr',
'value' => $this->getData(['config', 'smtp','host'])
]); ?>
</div>
<div class="col2">
<?php echo template::text('configAdvancedSmtpPort', [
'label' => 'Port SMTP',
'placeholder' => '589',
'value' => $this->getData(['config', 'smtp','port'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('configAdvancedSmtpAuth', $module::$SMTPauth, [
'label' => 'Authentification',
'selected' => $this->getData(['config', 'smtp','auth'])
]); ?>
</div>
</div>
<div id="configAdvancedSmtpAuthParam">
<div class="row">
<div class="col5">
<?php echo template::text('configAdvancedSmtpUsername', [
'label' => 'Nom utilisateur',
'value' => $this->getData(['config', 'smtp','username' ])
]); ?>
</div>
<div class="col5">
<?php echo template::password('configAdvancedSmtpPassword', [
'label' => 'Mot de passe',
'autocomplete' => 'off',
'value' => $this->getData(['config', 'smtp','username' ]) ? helper::decrypt ($this->getData(['config', 'smtp','username' ]),$this->getData(['config','smtp','password'])) : ''
]); ?>
</div>
<div class="col2">
<?php echo template::select('configAdvancedSmtpSecure', $module::$SMTPEnc , [
'label' => 'Sécurité',
'selected' => $this->getData(['config', 'smtp','secure'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="script">
<h4>Scripts
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::text('configAdvancedAnalyticsId', [
'help' => 'Saisissez l\'ID de suivi.',
'label' => 'Google Analytics',
'placeholder' => 'UA-XXXXXXXX-X',
'value' => $this->getData(['config', 'analyticsId'])
]); ?>
</div>
<div class="col3 offset3 verticalAlignBottom">
<?php echo template::button('configAdvancedScriptHead', [
'href' => helper::baseUrl() . 'config/script/head',
'value' => 'Script dans head',
'ico' => 'pencil'
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('configAdvancedScriptBody', [
'href' => helper::baseUrl() . 'config/script/body',
'value' => 'Script dans body',
'ico' => 'pencil'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -1,10 +1,159 @@
<h3>MENTIONS LEGALES</h3>
<p>Pour faire apparaître un lien 'Mentions légales' dans le pied de page, vous sélectionnez la page puis
dans la barre d'administration vous sélectionnez 'Personnaliser les thèmes', vous cliquez sur le pied de page et vous cochez la case 'Mentions légales'.<br>
Vous pouvez personnaliser la page 'Mentions légales', accessible en choisissant cette page dans la barre d'administration, ou créer votre propre page.<br>
<a href="https://www.service-public.fr/professionnels-entreprises/vosdroits/F31228" target="_blank" rel="noopener">Ce site officiel vous indique les mentions obligatoires à y faire figurer</a></p>
<h3>RECHERCHE</h3>
<p>Pour faire apparaître un lien 'Recherche' dans le pied de page, vous procédez de manière similaire.</p>
<h3>ERREURS ET SITE EN MAINTENANCE</h3>
<p>Les pages par défaut sont 'Erreur403', 'Erreur 404' et 'Site en maintenance'. Vous pouvez les modifier, en les choisissant à partir de la barre
d'administration, ou créer vos propres pages orphelines (en édition de page sélectionnez dans le bloc 'Emplacement dans le menu' : 'Ne pas afficher').</p>
<h3>Maintenance</h3>
<p>Pour passer un site en maintenance il faut cocher la case "Site en maintenance".<br>
Tant que cette case sera cochée, la seule page accessible du site sera la page définie pour cette fonction dans les "Pages spéciales" de "Configurer le site".<br>
Ici il est possible de "Sauvegarder" et "Restaurer" le site.<br></p>
<h4>Sauvegarder</h4>
<p>En plus du dossier/site/data/, la sauvegarde intègre par défaut les données du gestionnaire de fichiers, le dossier /site/file/, contrairement à la sauvegarde quotidienne qui peut être activée dans les "Pages spéciales" de "Configurer le site" qui ne comprend que /site/data/. C'est donc une sauvegarde complète des données du site qui peut être réalisée ici.<br>
Si le site a un volume très important de fichiers il est peut-être préférable de décocher la case "Inclure le contenu du gestionnaire de fichiers" pour sauvegarder cette partie par FTP. Avec un gros volume de fichiers le temps pour générer le fichier de sauvegarde sera important et les hébergeurs limites les processus qui sollicitent trop le serveur : si le volume des fichiers est trop important par rapport au curseur de votre hébergeur la sauvegarde plantera, sinon il ne s'agit que d'une question de patience pour attendre la fin de la sauvegarde.<br>
Pour lancer la sauvegarde en cliquer simplement sur le bouton "Sauvegarder" : à la fin de la sauvegarde une fenêtre surgissante doit indiquer "La sauvegarde a été générée avec succès", dans le cas contraire... le fichier de sauvegarde n'a pas pu être créé et il faudra investiguer pour trouver ce qui a empêché sa création.<br>
À la fin de l'opération un fichier de sauvegarde sous la forme "dossier_du_site-backup-AAAA-JJ-MM-hh-mm-ss.zip" a été créé dans le dossier "backup" du gestionnaire de fichiers.<br>
Le dossier "backup" n'existe pas tant qu'une première sauvegarde n'a pas été réalisée.<br>
Ce dossier n'est pas le même que celui des sauvegardes quotidiennes qui ne sont pas elles-mêmes sauvegardées puisque dans le dossier /site/backup/.</p>
<h4>Restaurer</h4>
<h5>Paramètres</h5>
<p>Choisir le fichier de sauvegarde en cliquant sur "Choisissez un fichier" : le fichier doit obligatoirement se trouver dans /site/file/source/backup/<br>
Par défaut la case "Préserver les comptes des utilisateurs déjà installés" est cochée : dans le cas contraire les comptes utilisateurs déjà éventuellement créés sur le site seront supprimés lors de la restauration.<br></p>
<h5>Conversion des URL</h5>
<p>Cette opération est à réaliser AVANT de lancer la restauration !<br>
Cette partie est particulièrement intéressante et importante quand il s'agit de restaurer un site sur une nouvelle installation, dans un dossier différent de celui du site sauvegardé. Sans cette conversion automatique cela serait particulièrement long et fastidieux de réaliser cette opération.<br>
Il suffit de compléter les champs "Dossier de l'archive" et "Dossier du site actuel" avec les noms du dossier d'origine du site sauvegardé et du dossier de base du site de destination de la restauration.<br>
Ensuite il y a juste à cliquer sur le bouton "convertir".<br>
Une fois la conversion terminée, lancer la restauration en cliquant sur le bouton "Restaurer" : une fenêtre surgissante affichera le succès de l'opération quand elle sera terminée... patience.
</p>
<h3>Réglages</h3>
<p>À ce niveau plusieurs paramètres importants peuvent être configurés.</p>
<h4>Favicon</h4>
<p>Il s'agit ici de choisir le fichier de l'icône qui s'affiche dans la barre de titre, l'onglet, du navigateur devant le "Titre du site" que vous avez indiqué dans "Configurer le site" à la rubrique "Identité".<br>
Par défaut c'est l'îcone de ZwiiCMS qui est paramétrée.<br>
Pour la modifier il suffit de cliquer dans le champ pour faire apparaître le gestionnaire de fichier.<br>
Là il faut télécharger le fichier à utiliser pour qu'il soit dans la liste des fichiers afin d'être sélectionné : ce fichier doit obligatoirement avoir l'extension .ico.<br>
Ensuite il suffit de cliquez sur le fichier désiré pour le sélectionner.<br>
Après enregistrement c'est désormais l'icône précédemment sélectionnée qui doit s'afficher dans l'onglet du site : dans le cas contraire il est nécessaire de vider le cache du navigateur pour que le changement soit bien visible.<br></p>
<h4>Favicon thème sombre</h4>
<p>C'est exactement la même chose que le paramètre précédent mais comme son nom l'indique il s'agit ici d'indiquer une icône adaptée à un thème sombre.<br></p>
<h4>Fuseau horaire</h4>
<p>Dans ce champ est tout simplement indiqué le fuseau horaire sur lequel le site fonctionne en le choisissant dans le panneau déroulant.<br></p>
<h4>Consentement aux cookies</h4>
<p>En cochant cette case une fenêtre surgissante apparaîtra obligatoirement aux visiteurs, lors de leur première visite, pour leur demander leur consentement sur l'utilisation des cookies<br>
Le texte suivant apparaîtra :<br>
Ce site utilise des cookies pour assurer l'authentification, améliorer l'expérience utilisateur.<br>
En cliquant sur ”Accepter”, vous acceptez lutilisation de ces cookies.<br>
Tant que le visiteur n'aura pas indiqué son choix en cliquant sur le bouton "Accepter" ou "Refuser" la fenêtre restera affichée.<br>
Demander le consentement des visiteurs sur l'usage de cookies est une obligation légale en Europe.<br>
Seuls les cookies indispensables au bon fonctionnement du site ne nécessitent pas ce consentement.<br>
ZwiiCMS n'utilse ainsi pas de cookies nécessitant le consentement des visiteurs : cette case ne doit être cochée qu'à partir du moment ou des fonctionnalités tierces, comme google analytics par exemple, sont ajoutées au site. Outre ce consentement il faudra alors détailler les cookies ajoutés dans les Mentions légales, "Configurer le site" rubrique "Pages spéciales", en adaptant la page par défaut ou en en créant une spécifique.</p>
<h4>Sauvegarde quotidienne</h4>
<p>Il est prudent d'activer ce paramètre.<br>
Il permet d'enregistrer automatiquement chaque jour une sauvegarde du dossier /site/data/ : c'est le coeur du site. Chaque page créée, modifiée est ainsi sauvegardée.<br>
Par contre, tous les fichiers éventuellement utilisés, chargés via "Gérer les fichiers" ou FTP, ne sont ici pas sauvegardés : pour sauvegarder ces fichiers, et donc l'intégralité des données du site, il faut de temps en temps faire une sauvegarde comme décrit ci-dessus au paragraphe "Maintenance".
Cette sauvegarde quotidienne est enregistrée dans le dossier /site/backup/ sous la forme "dossier_du_site-backup-AAAA-JJ-MM-hh-mm-ss.zip" et conservée 30 jours.<br>
</p>
<h4>Mise à jour en ligne</h4>
<p>L'activation de ce paramètre entraîne la vérification quotidienne de l'existence d'une mise à jour.<br>
Quand il y a effectivement une mise à jour une icône supplémentaire s'affiche alors dans la barre d'administration et permet de la lancer d'un seul clic.<br>
Il est important de maintenir le site à jour afin de corriger d'éventuels dysfonctionnements, de bénéficier des nouvelles fonctionnalités et de le protéger de potentielles failles de sécurité.<br>
Il est donc conseillé d'activer ce paramètre.<br>
Cependant si généralement tout fonctionne bien, certains hébergeurs, rares, ne permettent pas toujours son usage complet : la vérification peut par exemple fonctionner mais la mise à jour non. Ou alors rien ne fonctionne.<br>
Si cela se produit, et suivant le niveau de blocage de l'hébergeur, il faut alors déterminerer si il est judicieux ou pas d'activer ce paramètre : la pluspart du temps la vérification de l'existence d'une mise à jour fonctionne et cela permet ansi d'être simplement averti de sa disponiblité.<br>
</p>
<h4>Mise à jour manuelle</h4>
<p>Ce large bouton rouge permet de lancer d'un simple clic la mise à jour vers la dernière version en ligne.<br>
Une mise à jour existe mais pour une raison inconnue, alors qu'habituellement la "Mise à jour en ligne" fonctionne, là l'icône pour réaliser la mise à jour n'apparaît pas : en cliquant sur ce bouton la mise à jour est forcée.<br>
Même si le site est déjà dans la dernière version la "mise à jour" sera réalisée.<br>
L'usage de ce bouton ne permet pas de passer outre un éventuel blocage de l'hébergeur : les mécanismes de mise à jour sont les mêmes qu'avec la "Mise à jour en ligne"...<br>
Si ce type de blocage de blocage du fait de l'hébergeur se produit le changement d'hébergeur est à envisager : les hébergeurs concernés sont tout de même très rares.<br>
La seule possibilité pour alors réaliser une mise à jour est alors via FTP.<br>
</p>
<h4>Captcha renforcée</h4>
<p>Par défaut ZwiiCMS dispose d'une Captcha simple qui consiste à additionner 2 nombres de 0 à 10 : par mesure de sécurité cette Captcha est activée par défaut (rubrique "Sécurité de la connexion", case "Captcha à la connexion" cochée par défaut).<br>
Afin d'assurer une meilleure sécurité la Captcha renforcée utilise 4 opérations avec les nombres de 0 à 20.<br>
Elle s'applique à l'ensemble des Captchas du site.<br>
Il est fortement conseillé de l'activer afin de beaucoup mieux sécuriser la connexion au site et d'éviter par exemple les spams via un formulaire de contact.<br>
ATTENTION : si la "Captcha à la connexion" est décochée à la rubique "Sécurité de la connexion", même si la Captcha renforcée est cochée, aucune captcha ne s'appliquera !<br>
</p>
<h4>Copie de sauvegarde</h4>
<p>Là encore c'est un paramètre qu'il est préférable d'activer afin, en cas de problème, d'éviter que le site soit corrompu et inaccssible.<br>
En l'activant, une copie des fichiers .json (ZwiiCMS n'a pas de base de données et toutes les données sont en fait enrégistrées dans des fichiers .json) est automatiquement réalisée dès l'édition ou l'effacement/modification d'une donnée : un fichier sous la forme nom.backup.json est généré.<br>
Si pour une raison quelconque un fichier .json est corrompu au moment de son enregistrement le fichier de sauvegarde est alors disponible pour le remplacer après un simple renommage via FTP (en faire une copie avant renommage par prudence) : seules les dernières modifications depuis le dernier enregistrement sont ainsi éventuellement perdues et l'accès au site rétabli avec toutes ses fonctionnalités très rapidement.<br>
</p>
<h4>Préserver htaccess</h4>
<p>Si le fichier .htaccess à la racine du site a été adapté ou modifié il faut absolument activer ce paramètre afin qu'il ne soit pas remplacé lors d'une mise à jour automatique (via l'icône dans la barre d'administration ou le bouton rouge "Mise à jour manuelle").<br>
Si une mise à jour est réalisée via FTP ce paramètre n'empêchera pas le remplacement du fichier .htaccess : il faut alors penser à ne pas le remplacer.<br>
</p>
<h4>Réécriture d'URL</h4>
<p>Sans cette option le nom d'une page dans la barre d'adresse est précédé d'un "?".<br>
L'adresse d'une page nommée par exemple "accueil" est ainsi /mon_site/mon_zwii/?accueil.<br>
En activant la réécriture d'URL la page s'affiche avec l'adresse /mon_site/mon_zwii/accueil, sans le "?", et est plus lisible pour notre esprit.<br>
Un lien déjà communiqué avec le "?" fonctionne toujours après activation de la redirection.<br>
Avant d'activer ce paramètre s'assurer que l'hébergeur autorise son usage : ce n'est par exemple pas le cas de Free.<br></p>
<h3>Réseaux sociaux</h3>
<p>Il suffit ici de compléter l'ID d'un réseau social pour que l'icône correspondante s'affiche dans le pied de page.<br>
Cela implique évidemment d'avoir paramétré via "Personnaliser les thèmes" puis "Personnalisation du pied de page" l'affichage en question.<br>
Par défaut cet affichage est déjà paramétré et l'icône Facebook affichée. Elle se contente au clic de renvoyer alors sur la page d'accueil de Facebook, aucun ID n'étant indiqué.<br>
Pour supprimer l'affichage de cette icône il suffit d'effacer le contenu du champ "Facebbok" et d'enregistrer.
</p>
<h3>Référencement</h3>
<p>Le référencement consiste à mettre en oeuvre des pratiques pour faire apparaître un site dans les moteurs de recherche et pour lui faire gagner des positions, apparaître dans les premiers résultats sinon le premier.<br>
Un site pour un usage strictement personnel, familial, n'a pas besoin d'être référencé, au contraire.<br>
Par contre si un site doit avoir la fréquentation la plus importante possible son référencement est primordial.<br>
Afin d'aider dans cet objectif mais de ne pas tout permettre ZwiiCMS met à la disposition de ses utilisateurs deux outils.<br></p>
<h4>Capture Open Graph</h4>
<p>Le premier est la génération automatique d'une capture OpenGraph de la page d'accueil du site.<br>
C'est cette capture qui sera utilisée lors de tous les partages sur les différents réseaux sociaux.<br>
Les moteurs de recherches ne peuvent ignorer les réseaux sociaux et son utilisation est donc importante.<br>
Il suffit de cliquer sur le bouton bleu Capture Open Graph pour qu'elle soit réalisée et qu'elle apparaissent juste à droite.<br>
Si un message sur fond rouge "Service inaccessible ou erreur d'écriture de l'image" apparaît il faudra donner les droits d'écriture nécessaires, attendre un peu pour réessayer et vérifier si le service Open Graph est vraiment inaccessible et, sinon, voir avec l'hébergeur pourquoi ce service est inacessible ou sous quelles conditions il est accessible.<br></p>
<h4>Sitemap.xml / Robots.txt</h4>
<p>Le deuxième est la génération/mise à jour des fichiers sitemap.xml et robots.txt.<br></p>
<h5>Sitemap.xml</h5>
<p>Le fichier sitemap XML (sitemap.xml) est un fichier texte au format XML (langage de balisage extensible) contenant une liste de toutes les sous-pages du site Web sous forme de lien. Les robots des moteurs de recherches analysent ce fichier et il est donc très important.<br>
Le fichier robots.txt quant à lui sert à indiquer aux moteurs de recherches ce qui leur est interdit/autorisé : ATTENTION, ce n'est pas avec ce fichier que l'on interdit l'indexation d'une page particulière, en tout cas pas seulement, et il faudra employer d'autres mécanismes si ce but est recherché.</p>
<h5>Robots.txt</h5>
<p>Le fichier robots.txt généré par ZwiiCMS interdit l'accès aux dossiers critiques du CMS : /core/, /module/, /site/data, /site/tmp, /site/backup.
Par contre il autorise : /site/file/ et le fichier sitemap.xml.gz.
Il suffit de cliquer sur le bouton bleu Sitemap.xml /Robots.txt pour que les fichiers soient mis à jour (ils sont automatiquement créés au moment de l'installation).<br>
Si au lieu d'un message de succès sur fond vert apparaît le message sur fond rouge "Échec d'écriture, le sitemap n'a pas été mis à jour" il faudra investiguer pour déterminer et résoudre le problème.
</p>
<h3>Sécurité de la connexion</h3>
<p>Cette rubrique regroupe un certain nombre d'éléments importants pour sécuriser la connexion au site : les visiteurs du site sans compte ne sont pas concernés par ces paramètres.<br></p>
<h5>Connexions successives</h5>
<p>Ce panneau déroulant réglé par défaut sur 3 tentatives permet de sélectionner le nombre d'échecs de connexion au bout duquel le blocage de la connexion est mis en place.<br></p>
<h5>Blocage après échecs</h5>
<p>C'est dans ce panneau déroulant réglé par défaut sur 10 minutes qu'est sélectionné le temps de blocage avant de pouvoir tenter à nouveau de se reconnecter après le nombre d'échecs paramétré à la rubrique ci-dessus.<br></p>
<h5>Comptes inexistants</h5>
<p>Les tentatives infructueuses de connexions sont enregistrées dans un fichier avec la date, l'heure, l'identifiant et l'adresse Ip utilisés.<br>
En fonction des paramètres définis précédemment, nombre de tentatives et temps de blocage, l'adresse IP et l'identifiant sont éventuellement bloqués en conséquences.<br>
Une tentative est inscrite quand l'identifiant, le mot de passe ou la captcha est faut : un seul élément erroné implique l'enregistrment d'une tentative.<br>
En cliquant sur le bouton bleu "Télécharger liste noire" un fichier site_tmp_blacklist.log est téléchargé et permet ainsi de prendre connaissance de toutes les tentatives.<br>
Cela permet d'identifier des adresses ip malveillantes et de pouvoir les bloquer définitivement via l'inteface d'administration de l'hébergeur : le blocage de ZwiiCMS n'est au maximum que de 15mn.<br>
Un clic sur le bouton rouge "Réinitialiser liste" efface toutes les tentative de connexion infructueuses.<br></p>
<h5>Captcha à la connexion</h5>
<p>Cette case cochée par défaut active la captcha sur le site : c'est un élément important de sécurité, surtout si vous constatez dans le fichier "liste noire" de nombreuses tentatives de connexion. Dans ce cas il est alors judicieux d'activer la Captcha renforcée dans la rubrique "Réglages".<br>
ATTENTION : si la "Captcha à la connexion" est décochée, même si la Captcha renforcée est cochée à la rubrique "Réglages", c'est ce choix qui prime et aucune captcha ne s'appliquera !<br>
</p>
<h3>Journalisation</h3>
<p>Activer ce paramètre permet d'enregistrer tout ce qui se passe sur le site : c'est un élément à ne pas négliger si il est constaté des anomalies sur le site.<br>
Un clic sur le bouton bleu "Télécharger journal" télécharge un fichier site_data_journal.log et permet ainsi d'examiner toute l'activité du site.<br>
Un clic sur le bouton rouge "Réinitialiser journal" efface tous les enregistrements du journal.<br>
</p>
<h3>Réseau</h3>
<p>Ces paramètres ne sont généralement pas nécessaires quand ZwiiCMS est installé chez un hébergeur ou à domicile.<br>
Par contre dans les milieux professionnels l'usage d'un proxy est la norme.<br>
Afin de permettre un usage normal de ZwiiCMS dans ce cas de figure il peut être nécessaire de renseigner le proxy de l'entreprise : ces paramètres, type, adresse et port, sont à demander à l'administrateur réseaux de l'entreprise.<br>
Ces paramètres sont également généralement accessibles dans la configuration réseau d'un navigateur web fonctionnel.<br>
</p>
<h3>Messagerie SMTP</h3>
<p>Activer le SMTP n'est généralement pas nécessaire : il s'agit de la fonctionnalité d'envoi de courriel et généralement tous les hébergeurs la propose sans qu'il y ait besoin de la paramétrer.<br>
Toutefois il est possible que se ne soit pas le cas, dans le cas d'un auto-hébergement de ZwiiCMS et en milieux professionnels il peut également être nécessaire d'activer cette fonctionnalité et d'en renseigner les paramètres.<br>
Ces paramètres, adresse et port, sont à récupérer auprès de l'hébergeur ou de l'administrateur réseaux de l'entreprise. Une authentification peut également être nécessaire et là encore l'hébergeur et le l'administrateur réseaux sont les bons interlocuteurs : outre le Nom d'utilisateur et le Mot de passe que chacun connait généralement c'est le type de sécurité qui est important.<br>
Ces paramètres sont également généralement accessibles dans la configuration d'un logiciel de messagerie fonctionnel.<br>
</p>
<h3>Scripts</h3>
<p>Pour enrichir les fonctionnalités de ZwiiCMS il est possible d'utiliser de nombreux scripts à disposition sur internet : le plus souvent ces scripts impliquent de modifier le "head" ou/et le "body" du site et c'est donc ici que cela se passe.</p>
<h4>Google Analytics</h4>
<p>Ce script a un traitement particulier compte-tenu son usage intense : il suffit ici d'indiquer l'ID de suivi fournie par Google et d'enregistrer pour qu'il fonctionne.<br>
À noter qu'en configurant ce script il est alors nécessaire de mettre en place un système de consentement aux cookies différent de celui intégré à ZwiiCMS qui ne permet pas de gérer les cookies externes.<br>
De même il est nécessaire de paramétrer les "Mentions légales" dans "Configurer le site" rubrique "Pages spéciales".<br></p>
<h4>Scripts dans head / Scripts dans body</h4>
<p>En fonction du script à paramétrer il suffit de cliquer sur le bouton correspondant pour insérer les lignes nécessaires à son bon fonctionnement au bon endroit : chaque script a ses propres paramétrages et ne nécessite pas obligatoirement d'intervenir à la fois au niveau du "head" et du "body".<br>
</p>

View File

@ -1,4 +1,4 @@
<?php echo template::formOpen('configForm');?>
<?php echo template::formOpen('configAdvancedForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configBack', [
@ -9,36 +9,120 @@
]); ?>
</div>
<div class="col2">
<?php echo template::button('addonIndexHelp', [
<?php echo template::button('configAdvancedHelp', [
'class' => 'buttonHelp',
'ico' => 'help',
'value' => 'Aide'
]); ?>
</div>
<div class="col2 offset4">
<div class="col2 offset6">
<?php echo template::submit('configAdvancedSubmit'); ?>
</div>
</div>
<!-- Aide à propos de la configuration du site, view advanced -->
<div class="helpDisplayContent">
<?php echo file_get_contents( 'core/module/config/view/advanced/advanced.help.html') ;?>
</div>
<div class="row">
<div class="col12">
<div class="row textAlignCenter">
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/advanced',
'value' => 'Avancée',
'ico' => 'cog-alt',
'href' => helper::baseUrl() . 'config/index',
'value' => 'Bases'
]); ?>
</div>
<div class="col2">
<?php echo template::submit('configSubmit'); ?>
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/locale',
'value' => 'Localisation'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/social',
'value' => 'Référencement'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/safety',
'value' => 'Sécurité'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/network',
'value' => 'Réseau'
]); ?>
</div>
</div>
</div>
</div>
<!-- Aide à propos de la configuration du site, view index -->
<div class="helpDisplayContent">
<?php echo file_get_contents( 'core/module/config/view/index/index.help.html') ;?>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Langues étrangères</h4>
<h4>Paramètres</h4>
<div class="row">
<div class="col12">
<?php echo template::checkbox('configI18n', true, 'Activer la gestion des langues étrangères', [
'checked' => $this->getData(['config', 'i18n', 'enable']),
'help'=> 'Une nouvelle icône apparaîtra dans la barre d\'administration. Consultez l\'aide de la page concernée pour en apprendre plus.'
<div class="col4">
<?php echo template::file('configAdvancedFavicon', [
'type' => 1,
'help' => 'Pensez à supprimer le cache de votre navigateur si la favicon ne change pas.',
'label' => 'Favicon',
'value' => $this->getData(['config', 'favicon'])
]); ?>
</div>
<div class="col4">
<?php echo template::file('configAdvancedFaviconDark', [
'type' => 1,
'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'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('configAdvancedTimezone', $module::$timezones, [
'label' => 'Fuseau horaire',
'selected' => $this->getData(['config', 'timezone']),
'help' => 'Le fuseau horaire est utile au bon référencement'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAdvancedCookieConsent', true, 'Message de consentement aux cookies', [
'checked' => $this->getData(['config', 'cookieConsent']),
'help' => 'Activation obligatoire selon les lois françaises sauf si vous utilisez votre propre système de consentement.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('rewrite', true, 'URL intelligentes', [
'checked' => helper::checkRewrite(),
'help' => 'Vérifiez d\'abord que votre serveur autorise l\'URL rewriting (ce qui n\'est pas le cas chez Free).'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAdvancedCaptchaStrong', true, 'Captcha complexe', [
'checked' => $this->getData(['config','captchaStrong']),
'help' => 'Option recommandée pour sécuriser la connexion. S\'applique à tous les captchas du site. Le captcha simple se limite à une addition de nombres de 0 à 10. Le captcha complexe utilise quatre opérations de nombres de 0 à 20. Activation recommandée.'
]); ?>
</div>
<div class="col6">
<?php echo template::checkbox('configAdvancedAutoDisconnect', true, 'Déconnexion automatique de la session', [
'checked' => $this->getData(['config','autoDisconnect']),
'help' => 'Déconnecte les sessions ouvertes précédemment sur d\'autres navigateurs ou terminaux. Activation recommandée.'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAdvancedAutoBackup', true, 'Sauvegarde automatique quotidienne du site', [
'checked' => $this->getData(['config', 'autoBackup']),
'help' => 'Une archive contenant le dossier /site/data est copiée dans le dossier \'site/backup\'. La sauvegarde est conservée pendant 30 jours.</p><p>Les fichiers du site ne sont pas sauvegardés automatiquement. Activation recommandée.'
]); ?>
</div>
</div>
@ -48,111 +132,64 @@
<div class="row">
<div class="col12">
<div class="block">
<h4>Identité du site (en langue <?php echo template::flag('site', '20px');?> )</h4>
<p><em>Cette page doit être adaptée à chaque traduction rédigée.</em></p>
<h4>Mises à jour automatisée</h4>
<?php $updateError = helper::urlGetContents(common::ZWII_UPDATE_URL . common::ZWII_UPDATE_CHANNEL . '/version');?>
<div class="row">
<div class="col9">
<?php echo template::text('configTitle', [
'label' => 'Titre du site' ,
'value' => $this->getData(['locale', 'title']),
'help' => 'Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.'
<div class="col4">
<?php echo template::checkbox('configAdvancedAutoUpdate', true, 'Rechercher une mise à jour en ligne', [
'checked' => $this->getData(['config', 'autoUpdate']),
'help' => 'La vérification est quotidienne. Option désactivée si la configuration du serveur ne le permet pas.',
'disabled' => !$updateError
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('configAdvancedAutoUpdateHtaccess', true, 'Préserver le fichier htaccess racine', [
'checked' => $this->getData(['config', 'autoUpdateHtaccess']),
'help' => 'Lors d\'une mise à jour automatique, conserve le fichier htaccess de la racine du site.',
'disabled' => !$updateError
]); ?>
</div>
<div class="col4">
<?php echo template::button('configAdvancedUpdateForced', [
'ico' => 'download-cloud',
'href' => helper::baseUrl() . 'install/update',
'value' => 'Mise à jour manuelle',
'class' => 'buttonRed',
'disabled' => !$updateError
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Maintenance</h4>
<div class="row">
<div class="col3">
<?php echo template::checkbox('configAdvancedMaintenance', true, 'Site en maintenance', [
'checked' => $this->getData(['config', 'maintenance'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configVersion', [
'label' => 'ZwiiCMS Version',
'value' => common::ZWII_VERSION,
'readonly' => true
<?php echo template::button('configBackupButton', [
'href' => helper::baseUrl() . 'config/backup',
'value' => 'Sauvegarder',
'ico' => 'download-cloud'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('configMetaDescription', [
'label' => 'Description du site',
'value' => $this->getData(['locale', 'metaDescription']),
'help' => 'La description d\'une page participe à son référencement, chaque page doit disposer d\'une description différente.'
<div class="col3">
<?php echo template::button('configRestoreButton', [
'href' => helper::baseUrl() . 'config/restore',
'value' => 'Restaurer',
'ico' => 'upload-cloud'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Etiquettes des pages spéciales</h4>
<div class="row">
<div class="col4">
<?php echo template::text('configLegalPageLabel', [
'label' => 'Mentions légales',
'placeholder' => 'Mentions légales',
'value' => $this->getData(['locale', 'legalPageLabel'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('configSearchPageLabel', [
'label' => 'Rechercher',
'placeholder' => 'Rechercher',
'value' => $this->getData(['locale', 'searchPageLabel'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('configSitemapPageLabel', [
'label' => 'Plan du site',
'placeholder' => 'Plan du site',
'value' => $this->getData(['locale', 'sitemapPageLabel']),
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Assignation des pages spéciales</h4>
<div class="row">
<div class="col4">
<?php echo template::select('configHomePageId', helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC'), [
'label' => 'Accueil du site',
'selected' =>$this->getData(['locale', 'homePageId']),
'help' => 'La première page que vos visiteurs verront.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configPage403', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Accès interdit, erreur 403',
'selected' =>$this->getData(['locale', 'page403']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configPage404', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Page inexistante, erreur 404',
'selected' =>$this->getData(['locale', 'page404']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::select('configLegalPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Mentions légales',
'selected' => $this->getData(['locale', 'legalPageId']),
'help' => 'Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configSearchPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Recherche dans le site',
'selected' => $this->getData(['locale', 'searchPageId']),
'help' => 'Sélectionnez une page contenant le module \'Recherche\'. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php
echo template::select('configPage302', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Site en maintenance',
'selected' =>$this->getData(['locale', 'page302']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
<div class="col3">
<?php echo template::button('configBackupCopyButton', [
'href' => helper::baseUrl() . 'config/copyBackups',
'value' => 'Backups Auto &#10140; FileManager'
]); ?>
</div>
</div>

View File

@ -0,0 +1,18 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2021, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/

View File

@ -0,0 +1,10 @@
<h3>MENTIONS LEGALES</h3>
<p>Pour faire apparaître un lien 'Mentions légales' dans le pied de page, vous sélectionnez la page puis
dans la barre d'administration vous sélectionnez 'Personnaliser les thèmes', vous cliquez sur le pied de page et vous cochez la case 'Mentions légales'.<br>
Vous pouvez personnaliser la page 'Mentions légales', accessible en choisissant cette page dans la barre d'administration, ou créer votre propre page.<br>
<a href="https://www.service-public.fr/professionnels-entreprises/vosdroits/F31228" target="_blank" rel="noopener">Ce site officiel vous indique les mentions obligatoires à y faire figurer</a></p>
<h3>RECHERCHE</h3>
<p>Pour faire apparaître un lien 'Recherche' dans le pied de page, vous procédez de manière similaire.</p>
<h3>ERREURS ET SITE EN MAINTENANCE</h3>
<p>Les pages par défaut sont 'Erreur403', 'Erreur 404' et 'Site en maintenance'. Vous pouvez les modifier, en les choisissant à partir de la barre
d'administration, ou créer vos propres pages orphelines (en édition de page sélectionnez dans le bloc 'Emplacement dans le menu' : 'Ne pas afficher').</p>

View File

@ -0,0 +1,191 @@
<?php echo template::formOpen('configForm');?>
<div class="row">
<div class="col2">
<?php echo template::button('configBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
'ico' => 'home',
'value' => 'Accueil'
]); ?>
</div>
<div class="col2">
<?php echo template::button('addonIndexHelp', [
'class' => 'buttonHelp',
'ico' => 'help',
'value' => 'Aide'
]); ?>
</div>
<div class="col2 offset6">
<?php echo template::submit('configSubmit'); ?>
</div>
</div>
<!-- Aide à propos de la configuration du site, view index -->
<div class="helpDisplayContent">
<?php echo file_get_contents( 'core/module/config/view/index/index.help.html') ;?>
</div>
<div class="row">
<div class="col12">
<div class="row textAlignCenter">
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/index',
'value' => 'Bases'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/locale',
'value' => 'Localisation'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/social',
'value' => 'Référencement'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/safety',
'value' => 'Sécurité'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/network',
'value' => 'Réseau'
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Langues étrangères</h4>
<div class="row">
<div class="col12">
<?php echo template::checkbox('configI18n', true, 'Activer la gestion des langues étrangères', [
'checked' => $this->getData(['config', 'i18n', 'enable']),
'help'=> 'Une nouvelle icône apparaîtra dans la barre d\'administration. Consultez l\'aide de la page concernée pour en apprendre plus.'
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Identité du site (en langue <?php echo template::flag('site', '20px');?> )</h4>
<p><em>Cette page doit être adaptée à chaque traduction rédigée.</em></p>
<div class="row">
<div class="col9">
<?php echo template::text('configTitle', [
'label' => 'Titre du site' ,
'value' => $this->getData(['locale', 'title']),
'help' => 'Il apparaît dans la barre de titre et les partages sur les réseaux sociaux.'
]); ?>
</div>
<div class="col3">
<?php echo template::text('configVersion', [
'label' => 'ZwiiCMS Version',
'value' => common::ZWII_VERSION,
'readonly' => true
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::textarea('configMetaDescription', [
'label' => 'Description du site',
'value' => $this->getData(['locale', 'metaDescription']),
'help' => 'La description d\'une page participe à son référencement, chaque page doit disposer d\'une description différente.'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Etiquettes des pages spéciales</h4>
<div class="row">
<div class="col4">
<?php echo template::text('configLegalPageLabel', [
'label' => 'Mentions légales',
'placeholder' => 'Mentions légales',
'value' => $this->getData(['locale', 'legalPageLabel'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('configSearchPageLabel', [
'label' => 'Rechercher',
'placeholder' => 'Rechercher',
'value' => $this->getData(['locale', 'searchPageLabel'])
]); ?>
</div>
<div class="col4">
<?php echo template::text('configSitemapPageLabel', [
'label' => 'Plan du site',
'placeholder' => 'Plan du site',
'value' => $this->getData(['locale', 'sitemapPageLabel']),
]); ?>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block">
<h4>Assignation des pages spéciales</h4>
<div class="row">
<div class="col4">
<?php echo template::select('configHomePageId', helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC'), [
'label' => 'Accueil du site',
'selected' =>$this->getData(['locale', 'homePageId']),
'help' => 'La première page que vos visiteurs verront.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configPage403', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Accès interdit, erreur 403',
'selected' =>$this->getData(['locale', 'page403']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configPage404', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Page inexistante, erreur 404',
'selected' =>$this->getData(['locale', 'page404']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::select('configLegalPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Mentions légales',
'selected' => $this->getData(['locale', 'legalPageId']),
'help' => 'Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configSearchPageId', array_merge(['none' => 'Aucune'] , helper::arrayCollumn($module::$pagesList, 'title', 'SORT_ASC') ) , [
'label' => 'Recherche dans le site',
'selected' => $this->getData(['locale', 'searchPageId']),
'help' => 'Sélectionnez une page contenant le module \'Recherche\'. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php
echo template::select('configPage302', array_merge(['none' => 'Page par défaut'],helper::arrayCollumn($module::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Site en maintenance',
'selected' =>$this->getData(['locale', 'page302']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -0,0 +1,172 @@
<?php echo template::formOpen('configAdvancedForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
'ico' => 'home',
'value' => 'Accueil'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedHelp', [
'class' => 'buttonHelp',
'ico' => 'help',
'value' => 'Aide'
]); ?>
</div>
<div class="col2 offset6">
<?php echo template::submit('configAdvancedSubmit'); ?>
</div>
</div>
<!-- Aide à propos de la configuration du site, view advanced -->
<div class="helpDisplayContent">
<?php echo file_get_contents( 'core/module/config/view/advanced/advanced.help.html') ;?>
</div>
<div class="row">
<div class="col12">
<div class="row textAlignCenter">
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/index',
'value' => 'Bases'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/locale',
'value' => 'Localisation'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/social',
'value' => 'Référencement'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/safety',
'value' => 'Sécurité'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/network',
'value' => 'Réseau'
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="network">
<h4>Réseau
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col2">
<?php echo template::select('configAdvancedProxyType', $module::$proxyType, [
'label' => 'Type de proxy',
'selected' => $this->getData(['config', 'proxyType'])
]); ?>
</div>
<div class="col8">
<?php echo template::text('configAdvancedProxyUrl', [
'label' => 'Adresse du proxy',
'placeholder' => 'cache.proxy.fr',
'value' => $this->getData(['config', 'proxyUrl'])
]); ?>
</div>
<div class="col2">
<?php echo template::text('configAdvancedProxyPort', [
'label' => 'Port du proxy',
'placeholder' => '6060',
'value' => $this->getData(['config', 'proxyPort'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="smtp">
<h4>Messagerie SMTP
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col12">
<?php echo template::checkbox('configAdvancedSmtpEnable', true, 'Activer SMTP', [
'checked' => $this->getData(['config', 'smtp','enable']),
'help' => 'Paramètres à utiliser lorsque votre hébergeur ne propose pas la fonctionnalité d\'envoi de mail.'
]); ?>
</div>
</div>
<div id="configAdvancedSmtpParam">
<div class="row">
<div class="col8">
<?php echo template::text('configAdvancedSmtpHost', [
'label' => 'Adresse SMTP',
'placeholder' => 'smtp.fr',
'value' => $this->getData(['config', 'smtp','host'])
]); ?>
</div>
<div class="col2">
<?php echo template::text('configAdvancedSmtpPort', [
'label' => 'Port SMTP',
'placeholder' => '589',
'value' => $this->getData(['config', 'smtp','port'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('configAdvancedSmtpAuth', $module::$SMTPauth, [
'label' => 'Authentification',
'selected' => $this->getData(['config', 'smtp','auth'])
]); ?>
</div>
</div>
<div id="configAdvancedSmtpAuthParam">
<div class="row">
<div class="col5">
<?php echo template::text('configAdvancedSmtpUsername', [
'label' => 'Nom utilisateur',
'value' => $this->getData(['config', 'smtp','username' ])
]); ?>
</div>
<div class="col5">
<?php echo template::password('configAdvancedSmtpPassword', [
'label' => 'Mot de passe',
'autocomplete' => 'off',
'value' => $this->getData(['config', 'smtp','username' ]) ? helper::decrypt ($this->getData(['config', 'smtp','username' ]),$this->getData(['config','smtp','password'])) : ''
]); ?>
</div>
<div class="col2">
<?php echo template::select('configAdvancedSmtpSecure', $module::$SMTPEnc , [
'label' => 'Sécurité',
'selected' => $this->getData(['config', 'smtp','secure'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -0,0 +1,37 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2021, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
.blockContainer {
display : none;
}
#info .zwiico-plus-circled {
display: inline;
}
.zwiico-minus-circled,
#info .zwiico-minus-circled {
display: none;
}
.zwiico-minus-circled,
.zwiico-plus-circled {
cursor: pointer;
}

View File

@ -0,0 +1,159 @@
<h3>Maintenance</h3>
<p>Pour passer un site en maintenance il faut cocher la case "Site en maintenance".<br>
Tant que cette case sera cochée, la seule page accessible du site sera la page définie pour cette fonction dans les "Pages spéciales" de "Configurer le site".<br>
Ici il est possible de "Sauvegarder" et "Restaurer" le site.<br></p>
<h4>Sauvegarder</h4>
<p>En plus du dossier/site/data/, la sauvegarde intègre par défaut les données du gestionnaire de fichiers, le dossier /site/file/, contrairement à la sauvegarde quotidienne qui peut être activée dans les "Pages spéciales" de "Configurer le site" qui ne comprend que /site/data/. C'est donc une sauvegarde complète des données du site qui peut être réalisée ici.<br>
Si le site a un volume très important de fichiers il est peut-être préférable de décocher la case "Inclure le contenu du gestionnaire de fichiers" pour sauvegarder cette partie par FTP. Avec un gros volume de fichiers le temps pour générer le fichier de sauvegarde sera important et les hébergeurs limites les processus qui sollicitent trop le serveur : si le volume des fichiers est trop important par rapport au curseur de votre hébergeur la sauvegarde plantera, sinon il ne s'agit que d'une question de patience pour attendre la fin de la sauvegarde.<br>
Pour lancer la sauvegarde en cliquer simplement sur le bouton "Sauvegarder" : à la fin de la sauvegarde une fenêtre surgissante doit indiquer "La sauvegarde a été générée avec succès", dans le cas contraire... le fichier de sauvegarde n'a pas pu être créé et il faudra investiguer pour trouver ce qui a empêché sa création.<br>
À la fin de l'opération un fichier de sauvegarde sous la forme "dossier_du_site-backup-AAAA-JJ-MM-hh-mm-ss.zip" a été créé dans le dossier "backup" du gestionnaire de fichiers.<br>
Le dossier "backup" n'existe pas tant qu'une première sauvegarde n'a pas été réalisée.<br>
Ce dossier n'est pas le même que celui des sauvegardes quotidiennes qui ne sont pas elles-mêmes sauvegardées puisque dans le dossier /site/backup/.</p>
<h4>Restaurer</h4>
<h5>Paramètres</h5>
<p>Choisir le fichier de sauvegarde en cliquant sur "Choisissez un fichier" : le fichier doit obligatoirement se trouver dans /site/file/source/backup/<br>
Par défaut la case "Préserver les comptes des utilisateurs déjà installés" est cochée : dans le cas contraire les comptes utilisateurs déjà éventuellement créés sur le site seront supprimés lors de la restauration.<br></p>
<h5>Conversion des URL</h5>
<p>Cette opération est à réaliser AVANT de lancer la restauration !<br>
Cette partie est particulièrement intéressante et importante quand il s'agit de restaurer un site sur une nouvelle installation, dans un dossier différent de celui du site sauvegardé. Sans cette conversion automatique cela serait particulièrement long et fastidieux de réaliser cette opération.<br>
Il suffit de compléter les champs "Dossier de l'archive" et "Dossier du site actuel" avec les noms du dossier d'origine du site sauvegardé et du dossier de base du site de destination de la restauration.<br>
Ensuite il y a juste à cliquer sur le bouton "convertir".<br>
Une fois la conversion terminée, lancer la restauration en cliquant sur le bouton "Restaurer" : une fenêtre surgissante affichera le succès de l'opération quand elle sera terminée... patience.
</p>
<h3>Réglages</h3>
<p>À ce niveau plusieurs paramètres importants peuvent être configurés.</p>
<h4>Favicon</h4>
<p>Il s'agit ici de choisir le fichier de l'icône qui s'affiche dans la barre de titre, l'onglet, du navigateur devant le "Titre du site" que vous avez indiqué dans "Configurer le site" à la rubrique "Identité".<br>
Par défaut c'est l'îcone de ZwiiCMS qui est paramétrée.<br>
Pour la modifier il suffit de cliquer dans le champ pour faire apparaître le gestionnaire de fichier.<br>
Là il faut télécharger le fichier à utiliser pour qu'il soit dans la liste des fichiers afin d'être sélectionné : ce fichier doit obligatoirement avoir l'extension .ico.<br>
Ensuite il suffit de cliquez sur le fichier désiré pour le sélectionner.<br>
Après enregistrement c'est désormais l'icône précédemment sélectionnée qui doit s'afficher dans l'onglet du site : dans le cas contraire il est nécessaire de vider le cache du navigateur pour que le changement soit bien visible.<br></p>
<h4>Favicon thème sombre</h4>
<p>C'est exactement la même chose que le paramètre précédent mais comme son nom l'indique il s'agit ici d'indiquer une icône adaptée à un thème sombre.<br></p>
<h4>Fuseau horaire</h4>
<p>Dans ce champ est tout simplement indiqué le fuseau horaire sur lequel le site fonctionne en le choisissant dans le panneau déroulant.<br></p>
<h4>Consentement aux cookies</h4>
<p>En cochant cette case une fenêtre surgissante apparaîtra obligatoirement aux visiteurs, lors de leur première visite, pour leur demander leur consentement sur l'utilisation des cookies<br>
Le texte suivant apparaîtra :<br>
Ce site utilise des cookies pour assurer l'authentification, améliorer l'expérience utilisateur.<br>
En cliquant sur ”Accepter”, vous acceptez lutilisation de ces cookies.<br>
Tant que le visiteur n'aura pas indiqué son choix en cliquant sur le bouton "Accepter" ou "Refuser" la fenêtre restera affichée.<br>
Demander le consentement des visiteurs sur l'usage de cookies est une obligation légale en Europe.<br>
Seuls les cookies indispensables au bon fonctionnement du site ne nécessitent pas ce consentement.<br>
ZwiiCMS n'utilse ainsi pas de cookies nécessitant le consentement des visiteurs : cette case ne doit être cochée qu'à partir du moment ou des fonctionnalités tierces, comme google analytics par exemple, sont ajoutées au site. Outre ce consentement il faudra alors détailler les cookies ajoutés dans les Mentions légales, "Configurer le site" rubrique "Pages spéciales", en adaptant la page par défaut ou en en créant une spécifique.</p>
<h4>Sauvegarde quotidienne</h4>
<p>Il est prudent d'activer ce paramètre.<br>
Il permet d'enregistrer automatiquement chaque jour une sauvegarde du dossier /site/data/ : c'est le coeur du site. Chaque page créée, modifiée est ainsi sauvegardée.<br>
Par contre, tous les fichiers éventuellement utilisés, chargés via "Gérer les fichiers" ou FTP, ne sont ici pas sauvegardés : pour sauvegarder ces fichiers, et donc l'intégralité des données du site, il faut de temps en temps faire une sauvegarde comme décrit ci-dessus au paragraphe "Maintenance".
Cette sauvegarde quotidienne est enregistrée dans le dossier /site/backup/ sous la forme "dossier_du_site-backup-AAAA-JJ-MM-hh-mm-ss.zip" et conservée 30 jours.<br>
</p>
<h4>Mise à jour en ligne</h4>
<p>L'activation de ce paramètre entraîne la vérification quotidienne de l'existence d'une mise à jour.<br>
Quand il y a effectivement une mise à jour une icône supplémentaire s'affiche alors dans la barre d'administration et permet de la lancer d'un seul clic.<br>
Il est important de maintenir le site à jour afin de corriger d'éventuels dysfonctionnements, de bénéficier des nouvelles fonctionnalités et de le protéger de potentielles failles de sécurité.<br>
Il est donc conseillé d'activer ce paramètre.<br>
Cependant si généralement tout fonctionne bien, certains hébergeurs, rares, ne permettent pas toujours son usage complet : la vérification peut par exemple fonctionner mais la mise à jour non. Ou alors rien ne fonctionne.<br>
Si cela se produit, et suivant le niveau de blocage de l'hébergeur, il faut alors déterminerer si il est judicieux ou pas d'activer ce paramètre : la pluspart du temps la vérification de l'existence d'une mise à jour fonctionne et cela permet ansi d'être simplement averti de sa disponiblité.<br>
</p>
<h4>Mise à jour manuelle</h4>
<p>Ce large bouton rouge permet de lancer d'un simple clic la mise à jour vers la dernière version en ligne.<br>
Une mise à jour existe mais pour une raison inconnue, alors qu'habituellement la "Mise à jour en ligne" fonctionne, là l'icône pour réaliser la mise à jour n'apparaît pas : en cliquant sur ce bouton la mise à jour est forcée.<br>
Même si le site est déjà dans la dernière version la "mise à jour" sera réalisée.<br>
L'usage de ce bouton ne permet pas de passer outre un éventuel blocage de l'hébergeur : les mécanismes de mise à jour sont les mêmes qu'avec la "Mise à jour en ligne"...<br>
Si ce type de blocage de blocage du fait de l'hébergeur se produit le changement d'hébergeur est à envisager : les hébergeurs concernés sont tout de même très rares.<br>
La seule possibilité pour alors réaliser une mise à jour est alors via FTP.<br>
</p>
<h4>Captcha renforcée</h4>
<p>Par défaut ZwiiCMS dispose d'une Captcha simple qui consiste à additionner 2 nombres de 0 à 10 : par mesure de sécurité cette Captcha est activée par défaut (rubrique "Sécurité de la connexion", case "Captcha à la connexion" cochée par défaut).<br>
Afin d'assurer une meilleure sécurité la Captcha renforcée utilise 4 opérations avec les nombres de 0 à 20.<br>
Elle s'applique à l'ensemble des Captchas du site.<br>
Il est fortement conseillé de l'activer afin de beaucoup mieux sécuriser la connexion au site et d'éviter par exemple les spams via un formulaire de contact.<br>
ATTENTION : si la "Captcha à la connexion" est décochée à la rubique "Sécurité de la connexion", même si la Captcha renforcée est cochée, aucune captcha ne s'appliquera !<br>
</p>
<h4>Copie de sauvegarde</h4>
<p>Là encore c'est un paramètre qu'il est préférable d'activer afin, en cas de problème, d'éviter que le site soit corrompu et inaccssible.<br>
En l'activant, une copie des fichiers .json (ZwiiCMS n'a pas de base de données et toutes les données sont en fait enrégistrées dans des fichiers .json) est automatiquement réalisée dès l'édition ou l'effacement/modification d'une donnée : un fichier sous la forme nom.backup.json est généré.<br>
Si pour une raison quelconque un fichier .json est corrompu au moment de son enregistrement le fichier de sauvegarde est alors disponible pour le remplacer après un simple renommage via FTP (en faire une copie avant renommage par prudence) : seules les dernières modifications depuis le dernier enregistrement sont ainsi éventuellement perdues et l'accès au site rétabli avec toutes ses fonctionnalités très rapidement.<br>
</p>
<h4>Préserver htaccess</h4>
<p>Si le fichier .htaccess à la racine du site a été adapté ou modifié il faut absolument activer ce paramètre afin qu'il ne soit pas remplacé lors d'une mise à jour automatique (via l'icône dans la barre d'administration ou le bouton rouge "Mise à jour manuelle").<br>
Si une mise à jour est réalisée via FTP ce paramètre n'empêchera pas le remplacement du fichier .htaccess : il faut alors penser à ne pas le remplacer.<br>
</p>
<h4>Réécriture d'URL</h4>
<p>Sans cette option le nom d'une page dans la barre d'adresse est précédé d'un "?".<br>
L'adresse d'une page nommée par exemple "accueil" est ainsi /mon_site/mon_zwii/?accueil.<br>
En activant la réécriture d'URL la page s'affiche avec l'adresse /mon_site/mon_zwii/accueil, sans le "?", et est plus lisible pour notre esprit.<br>
Un lien déjà communiqué avec le "?" fonctionne toujours après activation de la redirection.<br>
Avant d'activer ce paramètre s'assurer que l'hébergeur autorise son usage : ce n'est par exemple pas le cas de Free.<br></p>
<h3>Réseaux sociaux</h3>
<p>Il suffit ici de compléter l'ID d'un réseau social pour que l'icône correspondante s'affiche dans le pied de page.<br>
Cela implique évidemment d'avoir paramétré via "Personnaliser les thèmes" puis "Personnalisation du pied de page" l'affichage en question.<br>
Par défaut cet affichage est déjà paramétré et l'icône Facebook affichée. Elle se contente au clic de renvoyer alors sur la page d'accueil de Facebook, aucun ID n'étant indiqué.<br>
Pour supprimer l'affichage de cette icône il suffit d'effacer le contenu du champ "Facebbok" et d'enregistrer.
</p>
<h3>Référencement</h3>
<p>Le référencement consiste à mettre en oeuvre des pratiques pour faire apparaître un site dans les moteurs de recherche et pour lui faire gagner des positions, apparaître dans les premiers résultats sinon le premier.<br>
Un site pour un usage strictement personnel, familial, n'a pas besoin d'être référencé, au contraire.<br>
Par contre si un site doit avoir la fréquentation la plus importante possible son référencement est primordial.<br>
Afin d'aider dans cet objectif mais de ne pas tout permettre ZwiiCMS met à la disposition de ses utilisateurs deux outils.<br></p>
<h4>Capture Open Graph</h4>
<p>Le premier est la génération automatique d'une capture OpenGraph de la page d'accueil du site.<br>
C'est cette capture qui sera utilisée lors de tous les partages sur les différents réseaux sociaux.<br>
Les moteurs de recherches ne peuvent ignorer les réseaux sociaux et son utilisation est donc importante.<br>
Il suffit de cliquer sur le bouton bleu Capture Open Graph pour qu'elle soit réalisée et qu'elle apparaissent juste à droite.<br>
Si un message sur fond rouge "Service inaccessible ou erreur d'écriture de l'image" apparaît il faudra donner les droits d'écriture nécessaires, attendre un peu pour réessayer et vérifier si le service Open Graph est vraiment inaccessible et, sinon, voir avec l'hébergeur pourquoi ce service est inacessible ou sous quelles conditions il est accessible.<br></p>
<h4>Sitemap.xml / Robots.txt</h4>
<p>Le deuxième est la génération/mise à jour des fichiers sitemap.xml et robots.txt.<br></p>
<h5>Sitemap.xml</h5>
<p>Le fichier sitemap XML (sitemap.xml) est un fichier texte au format XML (langage de balisage extensible) contenant une liste de toutes les sous-pages du site Web sous forme de lien. Les robots des moteurs de recherches analysent ce fichier et il est donc très important.<br>
Le fichier robots.txt quant à lui sert à indiquer aux moteurs de recherches ce qui leur est interdit/autorisé : ATTENTION, ce n'est pas avec ce fichier que l'on interdit l'indexation d'une page particulière, en tout cas pas seulement, et il faudra employer d'autres mécanismes si ce but est recherché.</p>
<h5>Robots.txt</h5>
<p>Le fichier robots.txt généré par ZwiiCMS interdit l'accès aux dossiers critiques du CMS : /core/, /module/, /site/data, /site/tmp, /site/backup.
Par contre il autorise : /site/file/ et le fichier sitemap.xml.gz.
Il suffit de cliquer sur le bouton bleu Sitemap.xml /Robots.txt pour que les fichiers soient mis à jour (ils sont automatiquement créés au moment de l'installation).<br>
Si au lieu d'un message de succès sur fond vert apparaît le message sur fond rouge "Échec d'écriture, le sitemap n'a pas été mis à jour" il faudra investiguer pour déterminer et résoudre le problème.
</p>
<h3>Sécurité de la connexion</h3>
<p>Cette rubrique regroupe un certain nombre d'éléments importants pour sécuriser la connexion au site : les visiteurs du site sans compte ne sont pas concernés par ces paramètres.<br></p>
<h5>Connexions successives</h5>
<p>Ce panneau déroulant réglé par défaut sur 3 tentatives permet de sélectionner le nombre d'échecs de connexion au bout duquel le blocage de la connexion est mis en place.<br></p>
<h5>Blocage après échecs</h5>
<p>C'est dans ce panneau déroulant réglé par défaut sur 10 minutes qu'est sélectionné le temps de blocage avant de pouvoir tenter à nouveau de se reconnecter après le nombre d'échecs paramétré à la rubrique ci-dessus.<br></p>
<h5>Comptes inexistants</h5>
<p>Les tentatives infructueuses de connexions sont enregistrées dans un fichier avec la date, l'heure, l'identifiant et l'adresse Ip utilisés.<br>
En fonction des paramètres définis précédemment, nombre de tentatives et temps de blocage, l'adresse IP et l'identifiant sont éventuellement bloqués en conséquences.<br>
Une tentative est inscrite quand l'identifiant, le mot de passe ou la captcha est faut : un seul élément erroné implique l'enregistrment d'une tentative.<br>
En cliquant sur le bouton bleu "Télécharger liste noire" un fichier site_tmp_blacklist.log est téléchargé et permet ainsi de prendre connaissance de toutes les tentatives.<br>
Cela permet d'identifier des adresses ip malveillantes et de pouvoir les bloquer définitivement via l'inteface d'administration de l'hébergeur : le blocage de ZwiiCMS n'est au maximum que de 15mn.<br>
Un clic sur le bouton rouge "Réinitialiser liste" efface toutes les tentative de connexion infructueuses.<br></p>
<h5>Captcha à la connexion</h5>
<p>Cette case cochée par défaut active la captcha sur le site : c'est un élément important de sécurité, surtout si vous constatez dans le fichier "liste noire" de nombreuses tentatives de connexion. Dans ce cas il est alors judicieux d'activer la Captcha renforcée dans la rubrique "Réglages".<br>
ATTENTION : si la "Captcha à la connexion" est décochée, même si la Captcha renforcée est cochée à la rubrique "Réglages", c'est ce choix qui prime et aucune captcha ne s'appliquera !<br>
</p>
<h3>Journalisation</h3>
<p>Activer ce paramètre permet d'enregistrer tout ce qui se passe sur le site : c'est un élément à ne pas négliger si il est constaté des anomalies sur le site.<br>
Un clic sur le bouton bleu "Télécharger journal" télécharge un fichier site_data_journal.log et permet ainsi d'examiner toute l'activité du site.<br>
Un clic sur le bouton rouge "Réinitialiser journal" efface tous les enregistrements du journal.<br>
</p>
<h3>Réseau</h3>
<p>Ces paramètres ne sont généralement pas nécessaires quand ZwiiCMS est installé chez un hébergeur ou à domicile.<br>
Par contre dans les milieux professionnels l'usage d'un proxy est la norme.<br>
Afin de permettre un usage normal de ZwiiCMS dans ce cas de figure il peut être nécessaire de renseigner le proxy de l'entreprise : ces paramètres, type, adresse et port, sont à demander à l'administrateur réseaux de l'entreprise.<br>
Ces paramètres sont également généralement accessibles dans la configuration réseau d'un navigateur web fonctionnel.<br>
</p>
<h3>Messagerie SMTP</h3>
<p>Activer le SMTP n'est généralement pas nécessaire : il s'agit de la fonctionnalité d'envoi de courriel et généralement tous les hébergeurs la propose sans qu'il y ait besoin de la paramétrer.<br>
Toutefois il est possible que se ne soit pas le cas, dans le cas d'un auto-hébergement de ZwiiCMS et en milieux professionnels il peut également être nécessaire d'activer cette fonctionnalité et d'en renseigner les paramètres.<br>
Ces paramètres, adresse et port, sont à récupérer auprès de l'hébergeur ou de l'administrateur réseaux de l'entreprise. Une authentification peut également être nécessaire et là encore l'hébergeur et le l'administrateur réseaux sont les bons interlocuteurs : outre le Nom d'utilisateur et le Mot de passe que chacun connait généralement c'est le type de sécurité qui est important.<br>
Ces paramètres sont également généralement accessibles dans la configuration d'un logiciel de messagerie fonctionnel.<br>
</p>
<h3>Scripts</h3>
<p>Pour enrichir les fonctionnalités de ZwiiCMS il est possible d'utiliser de nombreux scripts à disposition sur internet : le plus souvent ces scripts impliquent de modifier le "head" ou/et le "body" du site et c'est donc ici que cela se passe.</p>
<h4>Google Analytics</h4>
<p>Ce script a un traitement particulier compte-tenu son usage intense : il suffit ici d'indiquer l'ID de suivi fournie par Google et d'enregistrer pour qu'il fonctionne.<br>
À noter qu'en configurant ce script il est alors nécessaire de mettre en place un système de consentement aux cookies différent de celui intégré à ZwiiCMS qui ne permet pas de gérer les cookies externes.<br>
De même il est nécessaire de paramétrer les "Mentions légales" dans "Configurer le site" rubrique "Pages spéciales".<br></p>
<h4>Scripts dans head / Scripts dans body</h4>
<p>En fonction du script à paramétrer il suffit de cliquer sur le bouton correspondant pour insérer les lignes nécessaires à son bon fonctionnement au bon endroit : chaque script a ses propres paramétrages et ne nécessite pas obligatoirement d'intervenir à la fois au niveau du "head" et du "body".<br>
</p>

View File

@ -0,0 +1,135 @@
/**
* 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 Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2021, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
$( document).ready(function() {
/**
* Afficher et masquer options SMTP
*/
if ($("input[name=configAdvancedSmtpEnable]").is(':checked')) {
$("#configAdvancedSmtpParam").addClass("disabled");
$("#configAdvancedSmtpParam").slideDown();
} else {
$("#configAdvancedSmtpParam").removeClass("disabled");
$("#configAdvancedSmtpParam").slideUp();
}
/**
* Afficher et masquer options Auth
*/
if ($("select[name=configAdvancedSmtpEnable]").val() == true) {
$("#configAdvancedSmtpAuthParam").addClass("disabled");
$("#configAdvancedSmtpAuthParam").slideDown();
} else {
$("#configAdvancedSmtpAuthParam").removeClass("disabled");
$("#configAdvancedSmtpAuthParam").slideUp();
}
/**
* Initialisation des blocs
*/
var i = [ "social", "seo", "network", "smtp", "login", "logs", "script" ];
$.each(i,function(e) {
if (getCookie(i[e]) === "true") {
$("#" + i[e]).find(".zwiico-plus-circled").hide();
$("#" + i[e]).find(".zwiico-minus-circled").show();
$("#" + i[e]).find(".blockContainer").show();
}
});
/**
*
* Blocs dépliants
*/
$("div .block").click(function(e) {
$(this).find(".zwiico-plus-circled").toggle();
$(this).find(".zwiico-minus-circled").toggle();
$(this).find(".blockContainer").slideToggle();
/*
* Sauvegarder la position des blocs
* true = bloc déplié
*/
document.cookie = $(this).attr('id') + "=" + $(this).find(".zwiico-minus-circled").is(":visible") + ";expires=Fri, 31 Dec 9999 23:59:59 GMT;path=/;SameSite=Lax";
}).on("click", "span > input, input, textarea, label, option, button, a:not(.inputFile), .blockContainer", function(e) {
// Empêcher les déclenchements dans les blocs
e.stopPropagation();
});
/**
* Afficher et masquer options SMTP
*/
$("input[name=configAdvancedSmtpEnable]").on("change", function() {
if ($("input[name=configAdvancedSmtpEnable]").is(':checked')) {
$("#configAdvancedSmtpParam").addClass("disabled");
$("#configAdvancedSmtpParam").slideDown();
} else {
$("#configAdvancedSmtpParam").removeClass("disabled");
$("#configAdvancedSmtpParam").slideUp();
}
});
/**
* Afficher et masquer options Auth
*/
$("select[name=configAdvancedSmtpAuth]").on("change", function() {
if ($("select[name=configAdvancedSmtpAuth]").val() == true) {
$("#configAdvancedSmtpAuthParam").addClass("disabled");
$("#configAdvancedSmtpAuthParam").slideDown();
} else {
$("#configAdvancedSmtpAuthParam").removeClass("disabled");
$("#configAdvancedSmtpAuthParam").slideUp();
}
});
/**
* Options de blocage de connexions
* Contrôle la cohérence des sélections et interdit une seule valeur Aucune
*/
$("select[name=configConnectAttempt]").on("change", function() {
if ($("select[name=configConnectAttempt]").val() === "999") {
$("select[name=configConnectTimeout]").val(0);
} else {
if ($("select[name=configConnectTimeout]").val() === "0") {
$("select[name=configConnectTimeout]").val(300);
}
}
});
$("select[name=configConnectTimeout]").on("change", function() {
if ($("select[name=configConnectTimeout]").val() === "0") {
$("select[name=configConnectAttempt]").val(999);
} else {
if ($("select[name=configConnectAttempt]").val() === "999") {
$("select[name=configConnectAttempt]").val(3);
}
}
});
});
/**
* Lire un cookie s'il existe
*/
function getCookie(name) {
var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
}

View File

@ -0,0 +1,167 @@
<?php echo template::formOpen('configAdvancedForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
'ico' => 'home',
'value' => 'Accueil'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedHelp', [
'class' => 'buttonHelp',
'ico' => 'help',
'value' => 'Aide'
]); ?>
</div>
<div class="col2 offset6">
<?php echo template::submit('configAdvancedSubmit'); ?>
</div>
</div>
<!-- Aide à propos de la configuration du site, view advanced -->
<div class="helpDisplayContent">
<?php echo file_get_contents( 'core/module/config/view/advanced/advanced.help.html') ;?>
</div>
<div class="row">
<div class="col12">
<div class="row textAlignCenter">
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/index',
'value' => 'Bases'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/locale',
'value' => 'Localisation'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/social',
'value' => 'Référencement'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/safety',
'value' => 'Sécurité'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/network',
'value' => 'Réseau'
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="login">
<h4>Sécurité de la connexion
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::select('configAdvancedConnectAttempt', $module::$connectAttempt , [
'label' => 'Connexions successives',
'selected' => $this->getData(['config', 'connect', 'attempt'])
]); ?>
</div>
<div class="col3">
<?php echo template::select('configAdvancedConnectTimeout', $module::$connectTimeout , [
'label' => 'Blocage après échecs',
'selected' => $this->getData(['config', 'connect', 'timeout'])
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<label id="helpBlacklist">Comptes inexistants
<?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('configAdvancedConnectblacListDownload', [
'href' => helper::baseUrl() . 'config/blacklistDownload',
'value' => 'Télécharger liste noire',
'ico' => 'download'
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('configAdvancedConnectReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/blacklistReset',
'value' => 'Réinitialiser liste',
'ico' => 'cancel'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::checkbox('configAdvancedConnectCaptcha', true, 'Captcha à la connexion', [
'checked' => $this->getData(['config', 'connect','captcha'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="logs">
<h4>Journalisation
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col4 offset2">
<?php echo template::checkbox('configAdvancedConnectLog', true, 'Activer la journalisation', [
'checked' => $this->getData(['config', 'connect', 'log'])
]); ?>
</div>
<div class="col4">
<?php echo template::select('configAdvancedConnectAnonymousIp', $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="col3 offset2">
<?php echo template::button('configAdvancedLogDownload', [
'href' => helper::baseUrl() . 'config/logDownload',
'value' => 'Télécharger le journal',
'ico' => 'download'
]); ?>
</div>
<div class="col3 offset1">
<?php echo template::button('configAdvancedLogReset', [
'class' => 'buttonRed',
'href' => helper::baseUrl() . 'config/logReset',
'value' => 'Réinitialiser le journal',
'ico' => 'cancel'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>

View File

@ -0,0 +1,37 @@
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2021, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
/** NE PAS EFFACER
* admin.css
*/
.blockContainer {
display : none;
}
#info .zwiico-plus-circled {
display: inline;
}
.zwiico-minus-circled,
#info .zwiico-minus-circled {
display: none;
}
.zwiico-minus-circled,
.zwiico-plus-circled {
cursor: pointer;
}

View File

@ -0,0 +1,159 @@
<h3>Maintenance</h3>
<p>Pour passer un site en maintenance il faut cocher la case "Site en maintenance".<br>
Tant que cette case sera cochée, la seule page accessible du site sera la page définie pour cette fonction dans les "Pages spéciales" de "Configurer le site".<br>
Ici il est possible de "Sauvegarder" et "Restaurer" le site.<br></p>
<h4>Sauvegarder</h4>
<p>En plus du dossier/site/data/, la sauvegarde intègre par défaut les données du gestionnaire de fichiers, le dossier /site/file/, contrairement à la sauvegarde quotidienne qui peut être activée dans les "Pages spéciales" de "Configurer le site" qui ne comprend que /site/data/. C'est donc une sauvegarde complète des données du site qui peut être réalisée ici.<br>
Si le site a un volume très important de fichiers il est peut-être préférable de décocher la case "Inclure le contenu du gestionnaire de fichiers" pour sauvegarder cette partie par FTP. Avec un gros volume de fichiers le temps pour générer le fichier de sauvegarde sera important et les hébergeurs limites les processus qui sollicitent trop le serveur : si le volume des fichiers est trop important par rapport au curseur de votre hébergeur la sauvegarde plantera, sinon il ne s'agit que d'une question de patience pour attendre la fin de la sauvegarde.<br>
Pour lancer la sauvegarde en cliquer simplement sur le bouton "Sauvegarder" : à la fin de la sauvegarde une fenêtre surgissante doit indiquer "La sauvegarde a été générée avec succès", dans le cas contraire... le fichier de sauvegarde n'a pas pu être créé et il faudra investiguer pour trouver ce qui a empêché sa création.<br>
À la fin de l'opération un fichier de sauvegarde sous la forme "dossier_du_site-backup-AAAA-JJ-MM-hh-mm-ss.zip" a été créé dans le dossier "backup" du gestionnaire de fichiers.<br>
Le dossier "backup" n'existe pas tant qu'une première sauvegarde n'a pas été réalisée.<br>
Ce dossier n'est pas le même que celui des sauvegardes quotidiennes qui ne sont pas elles-mêmes sauvegardées puisque dans le dossier /site/backup/.</p>
<h4>Restaurer</h4>
<h5>Paramètres</h5>
<p>Choisir le fichier de sauvegarde en cliquant sur "Choisissez un fichier" : le fichier doit obligatoirement se trouver dans /site/file/source/backup/<br>
Par défaut la case "Préserver les comptes des utilisateurs déjà installés" est cochée : dans le cas contraire les comptes utilisateurs déjà éventuellement créés sur le site seront supprimés lors de la restauration.<br></p>
<h5>Conversion des URL</h5>
<p>Cette opération est à réaliser AVANT de lancer la restauration !<br>
Cette partie est particulièrement intéressante et importante quand il s'agit de restaurer un site sur une nouvelle installation, dans un dossier différent de celui du site sauvegardé. Sans cette conversion automatique cela serait particulièrement long et fastidieux de réaliser cette opération.<br>
Il suffit de compléter les champs "Dossier de l'archive" et "Dossier du site actuel" avec les noms du dossier d'origine du site sauvegardé et du dossier de base du site de destination de la restauration.<br>
Ensuite il y a juste à cliquer sur le bouton "convertir".<br>
Une fois la conversion terminée, lancer la restauration en cliquant sur le bouton "Restaurer" : une fenêtre surgissante affichera le succès de l'opération quand elle sera terminée... patience.
</p>
<h3>Réglages</h3>
<p>À ce niveau plusieurs paramètres importants peuvent être configurés.</p>
<h4>Favicon</h4>
<p>Il s'agit ici de choisir le fichier de l'icône qui s'affiche dans la barre de titre, l'onglet, du navigateur devant le "Titre du site" que vous avez indiqué dans "Configurer le site" à la rubrique "Identité".<br>
Par défaut c'est l'îcone de ZwiiCMS qui est paramétrée.<br>
Pour la modifier il suffit de cliquer dans le champ pour faire apparaître le gestionnaire de fichier.<br>
Là il faut télécharger le fichier à utiliser pour qu'il soit dans la liste des fichiers afin d'être sélectionné : ce fichier doit obligatoirement avoir l'extension .ico.<br>
Ensuite il suffit de cliquez sur le fichier désiré pour le sélectionner.<br>
Après enregistrement c'est désormais l'icône précédemment sélectionnée qui doit s'afficher dans l'onglet du site : dans le cas contraire il est nécessaire de vider le cache du navigateur pour que le changement soit bien visible.<br></p>
<h4>Favicon thème sombre</h4>
<p>C'est exactement la même chose que le paramètre précédent mais comme son nom l'indique il s'agit ici d'indiquer une icône adaptée à un thème sombre.<br></p>
<h4>Fuseau horaire</h4>
<p>Dans ce champ est tout simplement indiqué le fuseau horaire sur lequel le site fonctionne en le choisissant dans le panneau déroulant.<br></p>
<h4>Consentement aux cookies</h4>
<p>En cochant cette case une fenêtre surgissante apparaîtra obligatoirement aux visiteurs, lors de leur première visite, pour leur demander leur consentement sur l'utilisation des cookies<br>
Le texte suivant apparaîtra :<br>
Ce site utilise des cookies pour assurer l'authentification, améliorer l'expérience utilisateur.<br>
En cliquant sur ”Accepter”, vous acceptez lutilisation de ces cookies.<br>
Tant que le visiteur n'aura pas indiqué son choix en cliquant sur le bouton "Accepter" ou "Refuser" la fenêtre restera affichée.<br>
Demander le consentement des visiteurs sur l'usage de cookies est une obligation légale en Europe.<br>
Seuls les cookies indispensables au bon fonctionnement du site ne nécessitent pas ce consentement.<br>
ZwiiCMS n'utilse ainsi pas de cookies nécessitant le consentement des visiteurs : cette case ne doit être cochée qu'à partir du moment ou des fonctionnalités tierces, comme google analytics par exemple, sont ajoutées au site. Outre ce consentement il faudra alors détailler les cookies ajoutés dans les Mentions légales, "Configurer le site" rubrique "Pages spéciales", en adaptant la page par défaut ou en en créant une spécifique.</p>
<h4>Sauvegarde quotidienne</h4>
<p>Il est prudent d'activer ce paramètre.<br>
Il permet d'enregistrer automatiquement chaque jour une sauvegarde du dossier /site/data/ : c'est le coeur du site. Chaque page créée, modifiée est ainsi sauvegardée.<br>
Par contre, tous les fichiers éventuellement utilisés, chargés via "Gérer les fichiers" ou FTP, ne sont ici pas sauvegardés : pour sauvegarder ces fichiers, et donc l'intégralité des données du site, il faut de temps en temps faire une sauvegarde comme décrit ci-dessus au paragraphe "Maintenance".
Cette sauvegarde quotidienne est enregistrée dans le dossier /site/backup/ sous la forme "dossier_du_site-backup-AAAA-JJ-MM-hh-mm-ss.zip" et conservée 30 jours.<br>
</p>
<h4>Mise à jour en ligne</h4>
<p>L'activation de ce paramètre entraîne la vérification quotidienne de l'existence d'une mise à jour.<br>
Quand il y a effectivement une mise à jour une icône supplémentaire s'affiche alors dans la barre d'administration et permet de la lancer d'un seul clic.<br>
Il est important de maintenir le site à jour afin de corriger d'éventuels dysfonctionnements, de bénéficier des nouvelles fonctionnalités et de le protéger de potentielles failles de sécurité.<br>
Il est donc conseillé d'activer ce paramètre.<br>
Cependant si généralement tout fonctionne bien, certains hébergeurs, rares, ne permettent pas toujours son usage complet : la vérification peut par exemple fonctionner mais la mise à jour non. Ou alors rien ne fonctionne.<br>
Si cela se produit, et suivant le niveau de blocage de l'hébergeur, il faut alors déterminerer si il est judicieux ou pas d'activer ce paramètre : la pluspart du temps la vérification de l'existence d'une mise à jour fonctionne et cela permet ansi d'être simplement averti de sa disponiblité.<br>
</p>
<h4>Mise à jour manuelle</h4>
<p>Ce large bouton rouge permet de lancer d'un simple clic la mise à jour vers la dernière version en ligne.<br>
Une mise à jour existe mais pour une raison inconnue, alors qu'habituellement la "Mise à jour en ligne" fonctionne, là l'icône pour réaliser la mise à jour n'apparaît pas : en cliquant sur ce bouton la mise à jour est forcée.<br>
Même si le site est déjà dans la dernière version la "mise à jour" sera réalisée.<br>
L'usage de ce bouton ne permet pas de passer outre un éventuel blocage de l'hébergeur : les mécanismes de mise à jour sont les mêmes qu'avec la "Mise à jour en ligne"...<br>
Si ce type de blocage de blocage du fait de l'hébergeur se produit le changement d'hébergeur est à envisager : les hébergeurs concernés sont tout de même très rares.<br>
La seule possibilité pour alors réaliser une mise à jour est alors via FTP.<br>
</p>
<h4>Captcha renforcée</h4>
<p>Par défaut ZwiiCMS dispose d'une Captcha simple qui consiste à additionner 2 nombres de 0 à 10 : par mesure de sécurité cette Captcha est activée par défaut (rubrique "Sécurité de la connexion", case "Captcha à la connexion" cochée par défaut).<br>
Afin d'assurer une meilleure sécurité la Captcha renforcée utilise 4 opérations avec les nombres de 0 à 20.<br>
Elle s'applique à l'ensemble des Captchas du site.<br>
Il est fortement conseillé de l'activer afin de beaucoup mieux sécuriser la connexion au site et d'éviter par exemple les spams via un formulaire de contact.<br>
ATTENTION : si la "Captcha à la connexion" est décochée à la rubique "Sécurité de la connexion", même si la Captcha renforcée est cochée, aucune captcha ne s'appliquera !<br>
</p>
<h4>Copie de sauvegarde</h4>
<p>Là encore c'est un paramètre qu'il est préférable d'activer afin, en cas de problème, d'éviter que le site soit corrompu et inaccssible.<br>
En l'activant, une copie des fichiers .json (ZwiiCMS n'a pas de base de données et toutes les données sont en fait enrégistrées dans des fichiers .json) est automatiquement réalisée dès l'édition ou l'effacement/modification d'une donnée : un fichier sous la forme nom.backup.json est généré.<br>
Si pour une raison quelconque un fichier .json est corrompu au moment de son enregistrement le fichier de sauvegarde est alors disponible pour le remplacer après un simple renommage via FTP (en faire une copie avant renommage par prudence) : seules les dernières modifications depuis le dernier enregistrement sont ainsi éventuellement perdues et l'accès au site rétabli avec toutes ses fonctionnalités très rapidement.<br>
</p>
<h4>Préserver htaccess</h4>
<p>Si le fichier .htaccess à la racine du site a été adapté ou modifié il faut absolument activer ce paramètre afin qu'il ne soit pas remplacé lors d'une mise à jour automatique (via l'icône dans la barre d'administration ou le bouton rouge "Mise à jour manuelle").<br>
Si une mise à jour est réalisée via FTP ce paramètre n'empêchera pas le remplacement du fichier .htaccess : il faut alors penser à ne pas le remplacer.<br>
</p>
<h4>Réécriture d'URL</h4>
<p>Sans cette option le nom d'une page dans la barre d'adresse est précédé d'un "?".<br>
L'adresse d'une page nommée par exemple "accueil" est ainsi /mon_site/mon_zwii/?accueil.<br>
En activant la réécriture d'URL la page s'affiche avec l'adresse /mon_site/mon_zwii/accueil, sans le "?", et est plus lisible pour notre esprit.<br>
Un lien déjà communiqué avec le "?" fonctionne toujours après activation de la redirection.<br>
Avant d'activer ce paramètre s'assurer que l'hébergeur autorise son usage : ce n'est par exemple pas le cas de Free.<br></p>
<h3>Réseaux sociaux</h3>
<p>Il suffit ici de compléter l'ID d'un réseau social pour que l'icône correspondante s'affiche dans le pied de page.<br>
Cela implique évidemment d'avoir paramétré via "Personnaliser les thèmes" puis "Personnalisation du pied de page" l'affichage en question.<br>
Par défaut cet affichage est déjà paramétré et l'icône Facebook affichée. Elle se contente au clic de renvoyer alors sur la page d'accueil de Facebook, aucun ID n'étant indiqué.<br>
Pour supprimer l'affichage de cette icône il suffit d'effacer le contenu du champ "Facebbok" et d'enregistrer.
</p>
<h3>Référencement</h3>
<p>Le référencement consiste à mettre en oeuvre des pratiques pour faire apparaître un site dans les moteurs de recherche et pour lui faire gagner des positions, apparaître dans les premiers résultats sinon le premier.<br>
Un site pour un usage strictement personnel, familial, n'a pas besoin d'être référencé, au contraire.<br>
Par contre si un site doit avoir la fréquentation la plus importante possible son référencement est primordial.<br>
Afin d'aider dans cet objectif mais de ne pas tout permettre ZwiiCMS met à la disposition de ses utilisateurs deux outils.<br></p>
<h4>Capture Open Graph</h4>
<p>Le premier est la génération automatique d'une capture OpenGraph de la page d'accueil du site.<br>
C'est cette capture qui sera utilisée lors de tous les partages sur les différents réseaux sociaux.<br>
Les moteurs de recherches ne peuvent ignorer les réseaux sociaux et son utilisation est donc importante.<br>
Il suffit de cliquer sur le bouton bleu Capture Open Graph pour qu'elle soit réalisée et qu'elle apparaissent juste à droite.<br>
Si un message sur fond rouge "Service inaccessible ou erreur d'écriture de l'image" apparaît il faudra donner les droits d'écriture nécessaires, attendre un peu pour réessayer et vérifier si le service Open Graph est vraiment inaccessible et, sinon, voir avec l'hébergeur pourquoi ce service est inacessible ou sous quelles conditions il est accessible.<br></p>
<h4>Sitemap.xml / Robots.txt</h4>
<p>Le deuxième est la génération/mise à jour des fichiers sitemap.xml et robots.txt.<br></p>
<h5>Sitemap.xml</h5>
<p>Le fichier sitemap XML (sitemap.xml) est un fichier texte au format XML (langage de balisage extensible) contenant une liste de toutes les sous-pages du site Web sous forme de lien. Les robots des moteurs de recherches analysent ce fichier et il est donc très important.<br>
Le fichier robots.txt quant à lui sert à indiquer aux moteurs de recherches ce qui leur est interdit/autorisé : ATTENTION, ce n'est pas avec ce fichier que l'on interdit l'indexation d'une page particulière, en tout cas pas seulement, et il faudra employer d'autres mécanismes si ce but est recherché.</p>
<h5>Robots.txt</h5>
<p>Le fichier robots.txt généré par ZwiiCMS interdit l'accès aux dossiers critiques du CMS : /core/, /module/, /site/data, /site/tmp, /site/backup.
Par contre il autorise : /site/file/ et le fichier sitemap.xml.gz.
Il suffit de cliquer sur le bouton bleu Sitemap.xml /Robots.txt pour que les fichiers soient mis à jour (ils sont automatiquement créés au moment de l'installation).<br>
Si au lieu d'un message de succès sur fond vert apparaît le message sur fond rouge "Échec d'écriture, le sitemap n'a pas été mis à jour" il faudra investiguer pour déterminer et résoudre le problème.
</p>
<h3>Sécurité de la connexion</h3>
<p>Cette rubrique regroupe un certain nombre d'éléments importants pour sécuriser la connexion au site : les visiteurs du site sans compte ne sont pas concernés par ces paramètres.<br></p>
<h5>Connexions successives</h5>
<p>Ce panneau déroulant réglé par défaut sur 3 tentatives permet de sélectionner le nombre d'échecs de connexion au bout duquel le blocage de la connexion est mis en place.<br></p>
<h5>Blocage après échecs</h5>
<p>C'est dans ce panneau déroulant réglé par défaut sur 10 minutes qu'est sélectionné le temps de blocage avant de pouvoir tenter à nouveau de se reconnecter après le nombre d'échecs paramétré à la rubrique ci-dessus.<br></p>
<h5>Comptes inexistants</h5>
<p>Les tentatives infructueuses de connexions sont enregistrées dans un fichier avec la date, l'heure, l'identifiant et l'adresse Ip utilisés.<br>
En fonction des paramètres définis précédemment, nombre de tentatives et temps de blocage, l'adresse IP et l'identifiant sont éventuellement bloqués en conséquences.<br>
Une tentative est inscrite quand l'identifiant, le mot de passe ou la captcha est faut : un seul élément erroné implique l'enregistrment d'une tentative.<br>
En cliquant sur le bouton bleu "Télécharger liste noire" un fichier site_tmp_blacklist.log est téléchargé et permet ainsi de prendre connaissance de toutes les tentatives.<br>
Cela permet d'identifier des adresses ip malveillantes et de pouvoir les bloquer définitivement via l'inteface d'administration de l'hébergeur : le blocage de ZwiiCMS n'est au maximum que de 15mn.<br>
Un clic sur le bouton rouge "Réinitialiser liste" efface toutes les tentative de connexion infructueuses.<br></p>
<h5>Captcha à la connexion</h5>
<p>Cette case cochée par défaut active la captcha sur le site : c'est un élément important de sécurité, surtout si vous constatez dans le fichier "liste noire" de nombreuses tentatives de connexion. Dans ce cas il est alors judicieux d'activer la Captcha renforcée dans la rubrique "Réglages".<br>
ATTENTION : si la "Captcha à la connexion" est décochée, même si la Captcha renforcée est cochée à la rubrique "Réglages", c'est ce choix qui prime et aucune captcha ne s'appliquera !<br>
</p>
<h3>Journalisation</h3>
<p>Activer ce paramètre permet d'enregistrer tout ce qui se passe sur le site : c'est un élément à ne pas négliger si il est constaté des anomalies sur le site.<br>
Un clic sur le bouton bleu "Télécharger journal" télécharge un fichier site_data_journal.log et permet ainsi d'examiner toute l'activité du site.<br>
Un clic sur le bouton rouge "Réinitialiser journal" efface tous les enregistrements du journal.<br>
</p>
<h3>Réseau</h3>
<p>Ces paramètres ne sont généralement pas nécessaires quand ZwiiCMS est installé chez un hébergeur ou à domicile.<br>
Par contre dans les milieux professionnels l'usage d'un proxy est la norme.<br>
Afin de permettre un usage normal de ZwiiCMS dans ce cas de figure il peut être nécessaire de renseigner le proxy de l'entreprise : ces paramètres, type, adresse et port, sont à demander à l'administrateur réseaux de l'entreprise.<br>
Ces paramètres sont également généralement accessibles dans la configuration réseau d'un navigateur web fonctionnel.<br>
</p>
<h3>Messagerie SMTP</h3>
<p>Activer le SMTP n'est généralement pas nécessaire : il s'agit de la fonctionnalité d'envoi de courriel et généralement tous les hébergeurs la propose sans qu'il y ait besoin de la paramétrer.<br>
Toutefois il est possible que se ne soit pas le cas, dans le cas d'un auto-hébergement de ZwiiCMS et en milieux professionnels il peut également être nécessaire d'activer cette fonctionnalité et d'en renseigner les paramètres.<br>
Ces paramètres, adresse et port, sont à récupérer auprès de l'hébergeur ou de l'administrateur réseaux de l'entreprise. Une authentification peut également être nécessaire et là encore l'hébergeur et le l'administrateur réseaux sont les bons interlocuteurs : outre le Nom d'utilisateur et le Mot de passe que chacun connait généralement c'est le type de sécurité qui est important.<br>
Ces paramètres sont également généralement accessibles dans la configuration d'un logiciel de messagerie fonctionnel.<br>
</p>
<h3>Scripts</h3>
<p>Pour enrichir les fonctionnalités de ZwiiCMS il est possible d'utiliser de nombreux scripts à disposition sur internet : le plus souvent ces scripts impliquent de modifier le "head" ou/et le "body" du site et c'est donc ici que cela se passe.</p>
<h4>Google Analytics</h4>
<p>Ce script a un traitement particulier compte-tenu son usage intense : il suffit ici d'indiquer l'ID de suivi fournie par Google et d'enregistrer pour qu'il fonctionne.<br>
À noter qu'en configurant ce script il est alors nécessaire de mettre en place un système de consentement aux cookies différent de celui intégré à ZwiiCMS qui ne permet pas de gérer les cookies externes.<br>
De même il est nécessaire de paramétrer les "Mentions légales" dans "Configurer le site" rubrique "Pages spéciales".<br></p>
<h4>Scripts dans head / Scripts dans body</h4>
<p>En fonction du script à paramétrer il suffit de cliquer sur le bouton correspondant pour insérer les lignes nécessaires à son bon fonctionnement au bon endroit : chaque script a ses propres paramétrages et ne nécessite pas obligatoirement d'intervenir à la fois au niveau du "head" et du "body".<br>
</p>

View File

@ -0,0 +1,135 @@
/**
* 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 Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2021, Frédéric Tempez
* @license GNU General Public License, version 3
* @link http://zwiicms.fr/
*/
$( document).ready(function() {
/**
* Afficher et masquer options SMTP
*/
if ($("input[name=configAdvancedSmtpEnable]").is(':checked')) {
$("#configAdvancedSmtpParam").addClass("disabled");
$("#configAdvancedSmtpParam").slideDown();
} else {
$("#configAdvancedSmtpParam").removeClass("disabled");
$("#configAdvancedSmtpParam").slideUp();
}
/**
* Afficher et masquer options Auth
*/
if ($("select[name=configAdvancedSmtpEnable]").val() == true) {
$("#configAdvancedSmtpAuthParam").addClass("disabled");
$("#configAdvancedSmtpAuthParam").slideDown();
} else {
$("#configAdvancedSmtpAuthParam").removeClass("disabled");
$("#configAdvancedSmtpAuthParam").slideUp();
}
/**
* Initialisation des blocs
*/
var i = [ "social", "seo", "network", "smtp", "login", "logs", "script" ];
$.each(i,function(e) {
if (getCookie(i[e]) === "true") {
$("#" + i[e]).find(".zwiico-plus-circled").hide();
$("#" + i[e]).find(".zwiico-minus-circled").show();
$("#" + i[e]).find(".blockContainer").show();
}
});
/**
*
* Blocs dépliants
*/
$("div .block").click(function(e) {
$(this).find(".zwiico-plus-circled").toggle();
$(this).find(".zwiico-minus-circled").toggle();
$(this).find(".blockContainer").slideToggle();
/*
* Sauvegarder la position des blocs
* true = bloc déplié
*/
document.cookie = $(this).attr('id') + "=" + $(this).find(".zwiico-minus-circled").is(":visible") + ";expires=Fri, 31 Dec 9999 23:59:59 GMT;path=/;SameSite=Lax";
}).on("click", "span > input, input, textarea, label, option, button, a:not(.inputFile), .blockContainer", function(e) {
// Empêcher les déclenchements dans les blocs
e.stopPropagation();
});
/**
* Afficher et masquer options SMTP
*/
$("input[name=configAdvancedSmtpEnable]").on("change", function() {
if ($("input[name=configAdvancedSmtpEnable]").is(':checked')) {
$("#configAdvancedSmtpParam").addClass("disabled");
$("#configAdvancedSmtpParam").slideDown();
} else {
$("#configAdvancedSmtpParam").removeClass("disabled");
$("#configAdvancedSmtpParam").slideUp();
}
});
/**
* Afficher et masquer options Auth
*/
$("select[name=configAdvancedSmtpAuth]").on("change", function() {
if ($("select[name=configAdvancedSmtpAuth]").val() == true) {
$("#configAdvancedSmtpAuthParam").addClass("disabled");
$("#configAdvancedSmtpAuthParam").slideDown();
} else {
$("#configAdvancedSmtpAuthParam").removeClass("disabled");
$("#configAdvancedSmtpAuthParam").slideUp();
}
});
/**
* Options de blocage de connexions
* Contrôle la cohérence des sélections et interdit une seule valeur Aucune
*/
$("select[name=configConnectAttempt]").on("change", function() {
if ($("select[name=configConnectAttempt]").val() === "999") {
$("select[name=configConnectTimeout]").val(0);
} else {
if ($("select[name=configConnectTimeout]").val() === "0") {
$("select[name=configConnectTimeout]").val(300);
}
}
});
$("select[name=configConnectTimeout]").on("change", function() {
if ($("select[name=configConnectTimeout]").val() === "0") {
$("select[name=configConnectAttempt]").val(999);
} else {
if ($("select[name=configConnectAttempt]").val() === "999") {
$("select[name=configConnectAttempt]").val(3);
}
}
});
});
/**
* Lire un cookie s'il existe
*/
function getCookie(name) {
var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
return v ? v[2] : null;
}

View File

@ -0,0 +1,226 @@
<?php echo template::formOpen('configAdvancedForm'); ?>
<div class="row">
<div class="col2">
<?php echo template::button('configBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl(false),
'ico' => 'home',
'value' => 'Accueil'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedHelp', [
'class' => 'buttonHelp',
'ico' => 'help',
'value' => 'Aide'
]); ?>
</div>
<div class="col2 offset6">
<?php echo template::submit('configAdvancedSubmit'); ?>
</div>
</div>
<!-- Aide à propos de la configuration du site, view advanced -->
<div class="helpDisplayContent">
<?php echo file_get_contents( 'core/module/config/view/advanced/advanced.help.html') ;?>
</div>
<div class="row">
<div class="col12">
<div class="row textAlignCenter">
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/index',
'value' => 'Bases'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/locale',
'value' => 'Localisation'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/social',
'value' => 'Référencement'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/safety',
'value' => 'Sécurité'
]); ?>
</div>
<div class="col2">
<?php echo template::button('configAdvancedButton', [
'href' => helper::baseUrl() . 'config/network',
'value' => 'Réseau'
]); ?>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="social">
<h4>Réseaux sociaux
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::text('configAdvancedSocialFacebookId', [
'help' => 'Saisissez votre ID : https://www.facebook.com/[ID].',
'label' => 'Facebook',
'value' => $this->getData(['config', 'social', 'facebookId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialInstagramId', [
'help' => 'Saisissez votre ID : https://www.instagram.com/[ID].',
'label' => 'Instagram',
'value' => $this->getData(['config', 'social', 'instagramId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialYoutubeId', [
'help' => 'ID de la chaîne : https://www.youtube.com/channel/[ID].',
'label' => 'Chaîne Youtube',
'value' => $this->getData(['config', 'social', 'youtubeId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialYoutubeUserId', [
'help' => 'Saisissez votre ID Utilisateur : https://www.youtube.com/user/[ID].',
'label' => 'Youtube',
'value' => $this->getData(['config', 'social', 'youtubeUserId'])
]); ?>
</div>
</div>
<div class="row">
<div class="col3">
<?php echo template::text('configAdvancedSocialTwitterId', [
'help' => 'Saisissez votre ID : https://twitter.com/[ID].',
'label' => 'Twitter',
'value' => $this->getData(['config', 'social', 'twitterId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialPinterestId', [
'help' => 'Saisissez votre ID : https://pinterest.com/[ID].',
'label' => 'Pinterest',
'value' => $this->getData(['config', 'social', 'pinterestId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialLinkedinId', [
'help' => 'Saisissez votre ID Linkedin : https://fr.linkedin.com/in/[ID].',
'label' => 'Linkedin',
'value' => $this->getData(['config', 'social', 'linkedinId'])
]); ?>
</div>
<div class="col3">
<?php echo template::text('configAdvancedSocialGithubId', [
'help' => 'Saisissez votre ID Github : https://github.com/[ID].',
'label' => 'Github',
'value' => $this->getData(['config', 'social', 'githubId'])
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="seo">
<h4>Référencement
<div class="openClose">
<?php
echo template::ico('plus-circled','right');
echo template::ico('minus-circled','right');
?>
</div>
</h4>
<div class="blockContainer">
<div class="row">
<div class="col4 offset1">
<div class="row">
<div class="col12">
<?php echo template::button('configAdvancedMetaImage', [
'href' => helper::baseUrl() . 'config/configMetaImage',
'value' => 'Capture Open Graph',
'ico' => 'pencil'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::button('configAdvancedSiteMap', [
'href' => helper::baseUrl() . 'config/generateFiles',
'value' => 'Sitemap.xml / Robots.txt',
'ico' => 'pencil'
]); ?>
</div>
</div>
<div class="row">
<div class="col12">
<?php echo template::checkbox('configAdvancedSeoRobots', true, 'Autoriser les robots à référencer le site', [
'checked' => $this->getData(['config', 'seo','robots'])
]); ?>
</div>
</div>
</div>
<div class="col6 offset1">
<?php if (file_exists(self::FILE_DIR.'source/screenshot.jpg')): ?>
<div class="row">
<div class="col8 offset2 textAlignCenter">
<img src="<?php echo helper::baseUrl(false) . self::FILE_DIR.'source/screenshot.jpg';?>" data-tippy-content="Cette capture d'écran est nécessaire aux partages sur les réseaux sociaux. Elle est régénérée lorsque le fichier 'screenshot.jpg' est effacé du gestionnaire de fichiers." />
</div>
</div>
<?php endif;?>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<div class="block" id="script">
<h4>Scripts externes</h4>
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::text('configAdvancedAnalyticsId', [
'help' => 'Saisissez l\'ID de suivi.',
'label' => 'Google Analytics',
'placeholder' => 'UA-XXXXXXXX-X',
'value' => $this->getData(['config', 'analyticsId'])
]); ?>
</div>
<div class="col3 offset3 verticalAlignBottom">
<?php echo template::button('configAdvancedScriptHead', [
'href' => helper::baseUrl() . 'config/script/head',
'value' => 'Script dans head',
'ico' => 'pencil'
]); ?>
</div>
<div class="col3 verticalAlignBottom">
<?php echo template::button('configAdvancedScriptBody', [
'href' => helper::baseUrl() . 'config/script/body',
'value' => 'Script dans body',
'ico' => 'pencil'
]); ?>
</div>
</div>
</div>
</div>
</div>
</div>
<?php echo template::formClose(); ?>