Compare commits
54 Commits
Author | SHA1 | Date | |
---|---|---|---|
20c09d8b0a | |||
4c88d7a71d | |||
bb9b8b086f | |||
61752a9a51 | |||
889e2754fc | |||
77b241c69f | |||
442b84a99d | |||
09f9f6bdd6 | |||
5eace20e26 | |||
18df3848f8 | |||
7b9d145533 | |||
75ad5853cf | |||
7862815f1f | |||
a87d439282 | |||
509c1d6365 | |||
e641ec1c03 | |||
3dec8a8ce5 | |||
54f0b0c6e3 | |||
931e59db2e | |||
cae0e6c8fb | |||
afee77b1e7 | |||
cf8963248e | |||
22af8ac751 | |||
2d4385f038 | |||
c4bb124bea | |||
a474a41402 | |||
e9f65a1e22 | |||
8183b0bb0b | |||
585c888007 | |||
d0997ccbf9 | |||
1a6bfab54b | |||
23f38a606f | |||
f1e1989c97 | |||
9bb5793720 | |||
64443322a0 | |||
76258c835f | |||
dc81614114 | |||
8dc1adc28a | |||
65eac4ac4a | |||
a8f70dc73a | |||
02aeb6ec22 | |||
5bdb38dfec | |||
5700200bc3 | |||
4ffca0e34a | |||
f4553110e1 | |||
bf3b1f9cb0 | |||
05d8ae9e0b | |||
6128d0778d | |||
c38bd7d12f | |||
cd509dfcb1 | |||
5ab8efe72e | |||
6cf6a8d6b2 | |||
daaf309b4d | |||
2d5c395aec |
@ -1,4 +1,4 @@
|
||||
# ZwiiCampus 1.12.08
|
||||
# ZwiiCampus 1.14.00
|
||||
|
||||
ZwiiCampus (Learning Management System) est logiciel auteur destiné à mettre en ligne des tutoriels. Il dispose de plusieurs modalités d'ouverture et d'accès des contenus. Basé sur la version 13 du CMS Zwii, la structure logicielle est solide, le framework de Zwii est éprouvé.
|
||||
|
||||
|
@ -673,10 +673,30 @@ class helper
|
||||
public static function subword($text, $start, $length)
|
||||
{
|
||||
$text = trim($text);
|
||||
if (strlen($text) > $length) {
|
||||
|
||||
// Vérifier si la longueur du texte sans les balises dépasse la longueur souhaitée
|
||||
if (mb_strlen(strip_tags($text)) > $length) {
|
||||
// Utiliser mb_substr pour couper le texte
|
||||
$text = mb_substr($text, $start, $length);
|
||||
$text = mb_substr($text, 0, min(mb_strlen($text), mb_strrpos($text, ' ')));
|
||||
|
||||
// S'assurer que le texte ne se termine pas au milieu d'un mot
|
||||
$lastSpace = mb_strrpos($text, ' ');
|
||||
if ($lastSpace !== false) {
|
||||
$text = mb_substr($text, 0, $lastSpace);
|
||||
}
|
||||
|
||||
// Fermer les balises HTML ouvertes
|
||||
$dom = new DOMDocument();
|
||||
@$dom->loadHTML('<div>' . $text . '</div>', LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
|
||||
$text = $dom->saveHTML();
|
||||
|
||||
// Retirer la balise de conteneur ajoutée
|
||||
$text = preg_replace('~^<div>(.*)</div>$~s', '$1', $text);
|
||||
|
||||
// Ajouter des points de suspension si le texte a été coupé
|
||||
$text .= '...';
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
|
@ -156,21 +156,21 @@ class JsonDb extends \Prowebcraft\Dot
|
||||
// Essaye d'écrire les données encodées dans le fichier de base de données
|
||||
$write_result = file_put_contents($this->db, $encoded_data, LOCK_EX); // Les utilisateurs multiples obtiennent un verrou
|
||||
|
||||
// $now = \DateTime::createFromFormat('U.u', microtime(true));
|
||||
// file_put_contents("tmplog.txt", '[JsonDb][' . $now->format('H:i:s.u') . ']--' . $this->db . "\r\n", FILE_APPEND);
|
||||
|
||||
// Vérifie si l'écriture a réussi
|
||||
if ($write_result === $encoded_length) {
|
||||
// Sort de la boucle si l'écriture a réussi
|
||||
break;
|
||||
}
|
||||
|
||||
// Incrémente le compteur de tentatives
|
||||
$attempt++;
|
||||
}
|
||||
|
||||
// Vérifie si l'écriture a échoué même après plusieurs tentatives
|
||||
if ($write_result !== $encoded_length) {
|
||||
// Enregistre un message d'erreur dans le journal des erreurs
|
||||
error_log('Erreur d\'écriture, les données n\'ont pas été sauvegardées.');
|
||||
|
||||
// Affiche un message d'erreur et termine le script
|
||||
exit('Erreur d\'écriture, les données n\'ont pas été sauvegardées.');
|
||||
}
|
||||
|
@ -1098,14 +1098,14 @@ class layout extends common
|
||||
'help' => 'Langues',
|
||||
'href' => helper::baseUrl() . 'language'
|
||||
]) . '</li>';
|
||||
$rightItems .= '<li>' . template::ico('cog-alt', [
|
||||
'help' => 'Configuration',
|
||||
'href' => helper::baseUrl() . 'config'
|
||||
]) . '</li>';
|
||||
$rightItems .= '<li>' . template::ico('users', [
|
||||
'help' => 'Utilisateurs',
|
||||
'href' => helper::baseUrl() . 'user'
|
||||
]) . '</li>';
|
||||
$rightItems .= '<li>' . template::ico('cog-alt', [
|
||||
'help' => 'Configuration',
|
||||
'href' => helper::baseUrl() . 'config'
|
||||
]) . '</li>';
|
||||
// Mise à jour automatique
|
||||
$today = mktime(0, 0, 0);
|
||||
$checkUpdate = $this->getData(['core', 'lastAutoUpdate']);
|
||||
@ -1117,32 +1117,35 @@ class layout extends common
|
||||
$today > $checkUpdate + $this->getData(['config', 'autoUpdateDelay', 86400])
|
||||
) {
|
||||
// Dernier auto controle
|
||||
$this->setData(['core', 'lastAutoUpdate', $today]);
|
||||
$this->setData(['core', 'lastAutoUpdate', $today], false);
|
||||
if (
|
||||
helper::checkNewVersion(common::ZWII_UPDATE_CHANNEL)
|
||||
) {
|
||||
$this->setData(['core', 'updateAvailable', true]);
|
||||
$this->setData(['core', 'updateAvailable', true], false);
|
||||
}
|
||||
|
||||
// Modules installés
|
||||
$infoModules = helper::getModules();
|
||||
// Recherche de mise à jour des modules
|
||||
$store = plugin::getStore();
|
||||
if (is_array($store)) {
|
||||
// Modules installés
|
||||
$infoModules = helper::getModules();
|
||||
// Clés moduleIds dans les pages
|
||||
$inPages = helper::arrayColumn($this->getData(['page']), 'moduleId', 'SORT_DESC');
|
||||
// Parcourir les données des modules
|
||||
// Parcourir les données des modules du store
|
||||
foreach ($store as $key => $value) {
|
||||
if (empty($key)) {
|
||||
continue;
|
||||
}
|
||||
// Mise à jour d'un module
|
||||
if (array_key_exists($key, $infoModules) === true) {
|
||||
$this->setData(['core', 'updateModuleAvailable', true]);
|
||||
// Le module est installé et une mise à jour est en ligne
|
||||
if (
|
||||
isset($infoModules[$key])
|
||||
&&
|
||||
version_compare($infoModules[$key]['version'], $value['version'], '<')
|
||||
) {
|
||||
$this->setData(['core', 'updateModuleAvailable', true], false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB('core');
|
||||
}
|
||||
}
|
||||
// Afficher le bouton : Mise à jour détectée + activée
|
||||
|
@ -32,8 +32,6 @@ class core extends common
|
||||
}
|
||||
// Date de la dernière suppression
|
||||
$this->setData(['core', 'lastClearTmp', $lastClearTmp]);
|
||||
// Enregistre les données
|
||||
//$this->SaveData();
|
||||
}
|
||||
// Backup automatique des données
|
||||
$lastBackup = mktime(0, 0, 0);
|
||||
@ -423,7 +421,7 @@ class core extends common
|
||||
)
|
||||
) {
|
||||
// Stocke la dernière page vue et sa date de consultation
|
||||
$this->setData(['enrolment', common::$siteContent, $this->getUser('id'), 'lastPageView', $this->getUrl(0)]);
|
||||
$this->setData(['enrolment', common::$siteContent, $this->getUser('id'), 'lastPageView', $this->getUrl(0)], false);
|
||||
$this->setData(['enrolment', common::$siteContent, $this->getUser('id'), 'datePageView', time()]);
|
||||
|
||||
// Stocke le rapport en CSV
|
||||
@ -505,6 +503,22 @@ class core extends common
|
||||
) {
|
||||
$access = false;
|
||||
}
|
||||
|
||||
/** Empêche la consultation d'un espace laissé ouvert après la déconnexion et redirige vers home
|
||||
* L'utilisateur n'est pas connecté
|
||||
* ET l'accueil n'est pas affiché
|
||||
* ET l'espace affiché nécessite un compte d'accès, enrolment vaut 1,2 ou 3
|
||||
* */
|
||||
|
||||
if (
|
||||
$this->isConnected() === false
|
||||
and self::$siteContent !== 'home'
|
||||
and $this->getData(['course', self::$siteContent, 'enrolment']) > 0
|
||||
) {
|
||||
$_SESSION['ZWII_SITE_CONTENT'] = 'home';
|
||||
header(header: 'Location:' . helper::baseUrl(true) . 'swap/' . self::$siteContent);
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -540,8 +554,9 @@ class core extends common
|
||||
if (
|
||||
$this->isConnected() === true
|
||||
&& $this->getUser('id')
|
||||
&& !$this->isPost()
|
||||
) {
|
||||
$this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()]);
|
||||
$this->setData(['user', $this->getUser('id'), 'accessUrl', $this->getUrl()], false);
|
||||
$this->setData(['user', $this->getUser('id'), 'accessTimer', time()]);
|
||||
}
|
||||
// Breadcrumb
|
||||
|
102
core/core.php
102
core/core.php
@ -51,7 +51,7 @@ class common
|
||||
const ACCESS_TIMER = 1800;
|
||||
|
||||
// Numéro de version
|
||||
const ZWII_VERSION = '1.12.08';
|
||||
const ZWII_VERSION = '1.14.04';
|
||||
|
||||
// URL autoupdate
|
||||
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/';
|
||||
@ -320,29 +320,58 @@ class common
|
||||
public function __construct()
|
||||
{
|
||||
|
||||
// Construct cache
|
||||
if (isset($GLOBALS['common_construct'])) {
|
||||
$this->input['_POST'] = $GLOBALS['common_construct']['input']['_POST'];
|
||||
$this->input['_COOKIE'] = $GLOBALS['common_construct']['input']['_COOKIE'];
|
||||
self::$siteContent = $GLOBALS['common_construct']['siteContent'];
|
||||
$this->dataFiles = $GLOBALS['common_construct']['dataFiles'];
|
||||
$this->configFiles = $GLOBALS['common_construct']['configFiles'];
|
||||
$this->user = $GLOBALS['common_construct']['user'];
|
||||
self::$i18nUI = $GLOBALS['common_construct']['i18nUI'];
|
||||
$this->hierarchy = $GLOBALS['common_construct']['hierarchy'];
|
||||
$this->url = $GLOBALS['common_construct']['url'];
|
||||
self::$dialog = $GLOBALS['common_construct']['dialog'];
|
||||
return;
|
||||
}
|
||||
|
||||
// Extraction des données http
|
||||
if (isset($_POST)) {
|
||||
$this->input['_POST'] = $_POST;
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['input']['_POST'] = $this->input['_POST'];
|
||||
}
|
||||
if (isset($_COOKIE)) {
|
||||
$this->input['_COOKIE'] = $_COOKIE;
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['input']['_COOKIE'] = $this->input['_COOKIE'];
|
||||
}
|
||||
|
||||
// Déterminer le contenu du site
|
||||
if (isset($_SESSION['ZWII_SITE_CONTENT'])) {
|
||||
// Déterminé par la session présente
|
||||
self::$siteContent = $_SESSION['ZWII_SITE_CONTENT'];
|
||||
} else {
|
||||
$_SESSION['ZWII_SITE_CONTENT'] = 'home';
|
||||
self::$siteContent = 'home';
|
||||
}
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['siteContent'] = self::$siteContent;
|
||||
|
||||
// Instanciation de la classe des entrées / sorties
|
||||
// Les fichiers de configuration
|
||||
foreach ($this->configFiles as $module => $value) {
|
||||
$this->initDB($module);
|
||||
}
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['configFiles'] = $this->configFiles;
|
||||
// Les fichiers des contenus
|
||||
foreach ($this->contentFiles as $module => $value) {
|
||||
$this->initDB($module, self::$siteContent);
|
||||
}
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['dataFiles'] = $this->dataFiles;
|
||||
|
||||
|
||||
// Installation fraîche, initialisation de la configuration inexistante
|
||||
// Nécessaire pour le constructeur
|
||||
@ -368,6 +397,8 @@ class common
|
||||
if ($this->user === []) {
|
||||
$this->user = $this->getData(['user', $this->getInput('ZWII_USER_ID')]);
|
||||
}
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['user'] = $this->user;
|
||||
|
||||
// Langue de l'administration si le user est connecté
|
||||
if ($this->getData(['user', $this->getUser('id'), 'language'])) {
|
||||
@ -392,11 +423,15 @@ class common
|
||||
// Stocker l'courseId pour le thème de TinyMCE
|
||||
//setcookie('ZWII_SITE_CONTENT', self::$siteContent, time() + 3600, '', '', false, false);
|
||||
setlocale(LC_ALL, self::$i18nUI);
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['i18nUI'] = self::$i18nUI;
|
||||
|
||||
// Construit la liste des pages parents/enfants
|
||||
if ($this->hierarchy['all'] === []) {
|
||||
$this->buildHierarchy();
|
||||
}
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['hierarchy'] = $this->hierarchy;
|
||||
|
||||
// Construit l'url
|
||||
if ($this->url === '') {
|
||||
@ -406,6 +441,8 @@ class common
|
||||
$this->url = $this->homePageId();
|
||||
}
|
||||
}
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['url'] = $this->url;
|
||||
|
||||
// Chargement des dialogues
|
||||
if (!file_exists(self::I18N_DIR . self::$i18nUI . '.json')) {
|
||||
@ -425,6 +462,8 @@ class common
|
||||
self::$dialog = array_merge(self::$dialog, $d);
|
||||
}
|
||||
}
|
||||
// Cache
|
||||
$GLOBALS['common_construct']['dialog'] = self::$dialog;
|
||||
|
||||
// Données de proxy
|
||||
$proxy = $this->getData(['config', 'proxyType']) . $this->getData(['config', 'proxyUrl']) . ':' . $this->getData(['config', 'proxyPort']);
|
||||
@ -511,8 +550,10 @@ class common
|
||||
/**
|
||||
* Sauvegarde des données
|
||||
* @param array $keys Clé(s) des données
|
||||
* @param bool $save Indique si le fichier doit être sauvegardé après modification (par défaut true)
|
||||
* @return bool Succès de l'opération
|
||||
*/
|
||||
public function setData($keys = [])
|
||||
public function setData($keys = [], $save = true)
|
||||
{
|
||||
// Pas d'enregistrement lorsqu'une notice est présente ou tableau transmis vide
|
||||
if (
|
||||
@ -540,11 +581,12 @@ class common
|
||||
$query .= '.' . $keys[$i];
|
||||
}
|
||||
// Appliquer la modification, le dernier élément étant la donnée à sauvegarder
|
||||
$success = is_object($db->set($query, $keys[count($keys) - 1], true));
|
||||
$success = is_object($db->set($query, $keys[count($keys) - 1], $save));
|
||||
}
|
||||
return $success;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Accède aux données
|
||||
* @param array $keys Clé(s) des données
|
||||
@ -588,7 +630,7 @@ class common
|
||||
/**
|
||||
* Ecrire les données de la page
|
||||
* @param string pageId
|
||||
* @param string contenu de la page
|
||||
* @param array contenu de la page
|
||||
* @return int nombre d'octets écrits ou erreur
|
||||
*/
|
||||
public function setPage($page, $value, $path)
|
||||
@ -614,7 +656,7 @@ class common
|
||||
* Écrit les données dans un fichier avec plusieurs tentatives d'écriture et verrouillage
|
||||
*
|
||||
* @param string $filename Le nom du fichier
|
||||
* @param array $data Les données à écrire dans le fichier
|
||||
* @param string $data Les données à écrire dans le fichier
|
||||
* @param int $flags Les drapeaux optionnels à passer à la fonction $this->secure_file_put_contents
|
||||
* @return bool True si l'écriture a réussi, sinon false
|
||||
*/
|
||||
@ -624,45 +666,60 @@ class common
|
||||
// Initialise le compteur de tentatives
|
||||
$attempts = 0;
|
||||
|
||||
// Convertit les données en chaîne de caractères
|
||||
$serialized_data = serialize($data);
|
||||
|
||||
// Vérifie la longueur des données
|
||||
$data_length = strlen($serialized_data);
|
||||
$data_length = strlen($data);
|
||||
|
||||
// Effectue jusqu'à 5 tentatives d'écriture
|
||||
while ($attempts < 5) {
|
||||
// Essaye d'écrire les données dans le fichier avec verrouillage exclusif
|
||||
$write_result = file_put_contents($filename, $data, LOCK_EX | $flags);
|
||||
|
||||
// $now = \DateTime::createFromFormat('U.u', microtime(true));
|
||||
// file_put_contents("tmplog.txt", '[SecurePut][' . $now->format('H:i:s.u') . ']' . "\r\n", FILE_APPEND);
|
||||
|
||||
// Vérifie si l'écriture a réussi
|
||||
if ($write_result !== false && $write_result === $data_length) {
|
||||
// Sort de la boucle si l'écriture a réussi
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Incrémente le compteur de tentatives
|
||||
$attempts++;
|
||||
sleep(1);
|
||||
}
|
||||
|
||||
// Échec de l'écriture après plusieurs tentatives
|
||||
return false;
|
||||
// Etat de l'écriture
|
||||
return ($attempts < 5);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function initDB($module, $path = '')
|
||||
{
|
||||
// Instanciation de la classe des entrées / sorties
|
||||
// Constructeur JsonDB;
|
||||
$this->dataFiles[$module] = new \Prowebcraft\JsonDb([
|
||||
// Chemin complet vers le fichier JSON
|
||||
$dir = empty($path) ? self::DATA_DIR : self::DATA_DIR . $path . '/';
|
||||
$config = [
|
||||
'name' => $module . '.json',
|
||||
'dir' => empty($path) ? self::DATA_DIR : self::DATA_DIR . $path . '/',
|
||||
'backup' => file_exists('site/data/.backup')
|
||||
]);
|
||||
'dir' => $dir,
|
||||
'backup' => file_exists('site/data/.backup'),
|
||||
'update' => false,
|
||||
];
|
||||
|
||||
// Instanciation de l'objet et stockage dans dataFiles
|
||||
$this->dataFiles[$module] = new \Prowebcraft\JsonDb($config);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Cette fonction est liée à saveData
|
||||
* @param mixed $module
|
||||
* @return void
|
||||
*/
|
||||
public function saveDB($module): void
|
||||
{
|
||||
$db = $this->dataFiles[$module];
|
||||
$db->save();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialisation des données sur un contenu ou la page d'accueil
|
||||
* @param string $course : id du module à générer
|
||||
@ -1016,7 +1073,8 @@ class common
|
||||
/**
|
||||
* @return bool l'utilisateur est connecté true sinon false
|
||||
*/
|
||||
public function isConnected() {
|
||||
public function isConnected()
|
||||
{
|
||||
return (
|
||||
!empty($this->getUser('authKey'))
|
||||
&&
|
||||
|
@ -2,7 +2,7 @@
|
||||
<html prefix="og: http://ogp.me/ns#" lang="fr_FR">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="content-type" content="text/html;">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<?php $layout->showMetaTitle(); ?>
|
||||
<?php $layout->showMetaDescription(); ?>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<html prefix="og: http://ogp.me/ns#" lang="fr_FR">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="content-type" content="text/html;">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<?php $layout->showMetaTitle(); ?>
|
||||
<?php $layout->showMetaDescription(); ?>
|
||||
|
@ -2,7 +2,7 @@
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr_FR">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="content-type" content="text/html;">
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="x-apple-disable-message-reformatting">
|
||||
|
@ -2,7 +2,7 @@
|
||||
<html prefix="og: http://ogp.me/ns#" lang="fr_FR">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
|
||||
<meta http-equiv="content-type" content="text/html;">
|
||||
<meta meta="description=" content="ZwiiCMS le CMS multilingue sans base de données">
|
||||
<meta name="generator" content="ZiiCMS https://forge.chapril.org/ZwiiCMS-Team/ZwiiCMS">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
|
@ -30,7 +30,8 @@ class config extends common
|
||||
'logReset' => self::GROUP_ADMIN,
|
||||
'logDownload' => self::GROUP_ADMIN,
|
||||
'blacklistReset' => self::GROUP_ADMIN,
|
||||
'blacklistDownload' => self::GROUP_ADMIN
|
||||
'blacklistDownload' => self::GROUP_ADMIN,
|
||||
'register' => self::GROUP_ADMIN,
|
||||
];
|
||||
|
||||
public static $timezones = [
|
||||
@ -972,4 +973,25 @@ class config extends common
|
||||
return getenv('HTTP_MOD_REWRITE') == 'On' || getenv('REDIRECT_STATUS') == '200';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stocke la variable dans les paramètres de l'utilisateur pour activer la tab à sa prochaine visite
|
||||
* @return never
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
$this->setData([
|
||||
'user',
|
||||
$this->getUser('id'),
|
||||
'view',
|
||||
[
|
||||
'config' => $this->getUrl(2),
|
||||
'page' => $this->getData(['user', $this->getUser('id'), 'view', 'page']),
|
||||
]
|
||||
]);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'config/' . $this->getUrl(2),
|
||||
]);
|
||||
}
|
||||
}
|
@ -66,11 +66,12 @@ $(document).ready(function () {
|
||||
$("#connectCaptchaStrong").prop("checked", false);
|
||||
}
|
||||
|
||||
var configLayout = getCookie("configLayout");
|
||||
if (configLayout == null) {
|
||||
configLayout = "locale";
|
||||
setCookie("configLayout", "locale");
|
||||
var configLayout = "<?php echo $this->getData(['user', $this->getUser('id'), 'view', 'config']);?>";
|
||||
// Non défini, valeur par défaut
|
||||
if (configLayout == "") {
|
||||
configLayout = "setup";
|
||||
}
|
||||
|
||||
$("#localeContainer").hide();
|
||||
$("#socialContainer").hide();
|
||||
$("#connectContainer").hide();
|
||||
@ -168,7 +169,6 @@ $(document).ready(function () {
|
||||
$("#configSocialButton").removeClass("activeButton");
|
||||
$("#configConnectButton").removeClass("activeButton");
|
||||
$("#configNetworkButton").removeClass("activeButton");
|
||||
setCookie("configLayout", "locale");
|
||||
});
|
||||
$("#configSetupButton").on("click", function () {
|
||||
$("#localeContainer").hide();
|
||||
@ -181,7 +181,6 @@ $(document).ready(function () {
|
||||
$("#configSocialButton").removeClass("activeButton");
|
||||
$("#configConnectButton").removeClass("activeButton");
|
||||
$("#configNetworkButton").removeClass("activeButton");
|
||||
setCookie("configLayout", "setup");
|
||||
});
|
||||
|
||||
$("#configSocialButton").on("click", function () {
|
||||
@ -195,7 +194,6 @@ $(document).ready(function () {
|
||||
$("#configSocialButton").addClass("activeButton");
|
||||
$("#configConnectButton").removeClass("activeButton");
|
||||
$("#configNetworkButton").removeClass("activeButton");
|
||||
setCookie("configLayout", "social");
|
||||
});
|
||||
$("#configConnectButton").on("click", function () {
|
||||
$("#setupContainer").hide();
|
||||
@ -208,7 +206,6 @@ $(document).ready(function () {
|
||||
$("#configSocialButton").removeClass("activeButton");
|
||||
$("#configConnectButton").addClass("activeButton");
|
||||
$("#configNetworkButton").removeClass("activeButton");
|
||||
setCookie("configLayout", "connect");
|
||||
});
|
||||
$("#configNetworkButton").on("click", function () {
|
||||
$("#setupContainer").hide();
|
||||
@ -221,7 +218,6 @@ $(document).ready(function () {
|
||||
$("#configSocialButton").removeClass("activeButton");
|
||||
$("#configConnectButton").removeClass("activeButton");
|
||||
$("#configNetworkButton").addClass("activeButton");
|
||||
setCookie("configLayout", "network");
|
||||
});
|
||||
|
||||
|
||||
@ -308,27 +304,6 @@ $(document).ready(function () {
|
||||
});
|
||||
|
||||
|
||||
function setCookie(name, value, days) {
|
||||
var expires = "";
|
||||
if (days) {
|
||||
var date = new Date();
|
||||
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
||||
expires = "; expires=" + date.toUTCString();
|
||||
}
|
||||
document.cookie = name + "=" + (value || "") + expires + "; path=/; samesite=lax";
|
||||
}
|
||||
|
||||
function getCookie(name) {
|
||||
var nameEQ = name + "=";
|
||||
var ca = document.cookie.split(';');
|
||||
for (var i = 0; i < ca.length; i++) {
|
||||
var c = ca[i];
|
||||
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
|
||||
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Define function to capitalize the first letter of a string
|
||||
function capitalizeFirstLetter(string) {
|
||||
return string.charAt(0).toUpperCase() + string.slice(1);
|
||||
|
@ -7,44 +7,35 @@
|
||||
'value' => template::ico('home')
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<?php /**echo template::button('configHelp', [
|
||||
'class' => 'buttonHelp',
|
||||
'href' => 'https://doc.zwiicms.fr/configuration-du-site',
|
||||
'target' => '_blank',
|
||||
'value' => template::ico('help'),
|
||||
'help' => 'Consulter l\'aide en ligne'
|
||||
]); */?>
|
||||
</div>
|
||||
<div class="col2 offset8">
|
||||
<div class="col2 offset9">
|
||||
<?php echo template::submit('Submit'); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab">
|
||||
<?php echo template::button('configLocaleButton', [
|
||||
'value' => 'Identité - Étiquettes',
|
||||
'class' => 'buttonTab'
|
||||
]); ?>
|
||||
<?php echo template::button('configSetupButton', [
|
||||
'value' => 'Configuration - Outils',
|
||||
'class' => 'buttonTab'
|
||||
'value' => 'Configuration',
|
||||
'class' => 'buttonTab',
|
||||
//'href' => helper::baseUrl() . 'config/register/setup'
|
||||
]); ?>
|
||||
<?php echo template::button('configSocialButton', [
|
||||
'value' => 'Réseaux sociaux',
|
||||
'class' => 'buttonTab'
|
||||
'value' => 'Référencement',
|
||||
'class' => 'buttonTab',
|
||||
//'href' => helper::baseUrl() . 'config/register/social'
|
||||
]); ?>
|
||||
|
||||
<?php echo template::button('configConnectButton', [
|
||||
'value' => 'Sécurité',
|
||||
'class' => 'buttonTab'
|
||||
'value' => 'Connexion',
|
||||
'class' => 'buttonTab',
|
||||
//'href' => helper::baseUrl() . 'config/register/connect'
|
||||
]); ?>
|
||||
|
||||
<?php echo template::button('configNetworkButton', [
|
||||
'value' => 'Réseau',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
//'href' => helper::baseUrl() . 'config/register/network'
|
||||
]); ?>
|
||||
|
||||
</div>
|
||||
<?php include('core/module/config/view/locale/locale.php') ?>
|
||||
<?php include('core/module/config/view/setup/setup.php') ?>
|
||||
|
@ -669,17 +669,12 @@ class course extends common
|
||||
// Liste des pages contenues dans cet espace et exclure les barres et les pages masquées
|
||||
$sumPages = 0;
|
||||
$pages = json_decode(file_get_contents(self::DATA_DIR . $courseId . '/page.json'), true);
|
||||
$pages = $pages['page'];
|
||||
foreach ($pages as $pageId => $pageData) {
|
||||
if ($pageData['position'] > 0) {
|
||||
$sumPages++;
|
||||
}
|
||||
}
|
||||
|
||||
$sumPages = $this->countPages($pages['page']);
|
||||
|
||||
// Liste des inscrits dans le contenu sélectionné.
|
||||
$users = $this->getData(['enrolment', $courseId]);
|
||||
|
||||
// Obtient les statistiques de l'ensemble de la cohorte
|
||||
$reports = $this->getReport($courseId);
|
||||
|
||||
if (is_array($users)) {
|
||||
@ -798,9 +793,11 @@ class course extends common
|
||||
$this->getData(['user', $keyPost]) !== null
|
||||
&& $this->getData(['enrolment', $courseId, $keyPost]) === null
|
||||
) {
|
||||
$this->setData(['enrolment', $courseId, $keyPost, 'history', array()]);
|
||||
$this->setData(['enrolment', $courseId, $keyPost, 'history', array()], false);
|
||||
}
|
||||
}
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB('enrolment');
|
||||
}
|
||||
|
||||
// Liste des groupes et des profils
|
||||
@ -1154,11 +1151,6 @@ class course extends common
|
||||
? helper::baseUrl() . $this->getData(['enrolment', $courseId, $userId, 'lastPageView'])
|
||||
: helper::baseUrl();
|
||||
|
||||
/*
|
||||
$essage = $this->getData(['enrolment', $courseId, $userId, 'datePageView'])
|
||||
? $this->getData(['enrolment', $courseId, $userId, 'datePageView'])
|
||||
: '';
|
||||
*/
|
||||
if ($this->getData(['course', $courseId, 'access']) === self::COURSE_ACCESS_DATE) {
|
||||
$to = helper::dateUTF8('%d %B %Y', $this->getData(['course', $courseId, 'closingDate']), self::$i18nUI) . helper::translate(' à ') . helper::dateUTF8('%H:%M', $this->getData(['course', $courseId, 'closingDate']), self::$i18nUI);
|
||||
$message .= sprintf(helper::translate('Ce contenu ferme le %s'), $to);
|
||||
@ -1390,7 +1382,7 @@ class course extends common
|
||||
if (!empty($userValue['history'])) {
|
||||
$maxTime = max($userValue['history']);
|
||||
$lastPageId = array_search($maxTime, $userValue['history']);
|
||||
$this->setData(['enrolment', $courseId, $userId, 'lastPageView', $lastPageId]);
|
||||
$this->setData(['enrolment', $courseId, $userId, 'lastPageView', $lastPageId], false);
|
||||
$this->setData(['enrolment', $courseId, $userId, 'datePageView', $maxTime]);
|
||||
}
|
||||
}
|
||||
@ -2027,7 +2019,7 @@ class course extends common
|
||||
|
||||
/**
|
||||
* Autorise l'accès à un contenu
|
||||
* @param @return bool le user a le droit d'entrée dans le contenu
|
||||
* @return bool le user a le droit d'entrée dans le contenu
|
||||
* @param string $courseId identifiant du contenu sollicité
|
||||
*/
|
||||
public function courseIsAvailable($courseId)
|
||||
@ -2055,17 +2047,23 @@ class course extends common
|
||||
time() <= $this->getData(['course', $courseId, 'closingDate'])
|
||||
);
|
||||
case self::COURSE_ACCESS_CLOSE:
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Compte les pages d'un espace
|
||||
* @param mixed $array Tableau des pages de l'espace
|
||||
* @return int Nombre de pages
|
||||
*/
|
||||
private function countPages($array)
|
||||
{
|
||||
$count = 0;
|
||||
foreach ($array as $key => $value) {
|
||||
$count++; // Incrémente le compteur pour chaque clé associative trouvée
|
||||
if (is_array($value)) {
|
||||
$count += $this->countPages($value); // Appelle récursivement la fonction si la valeur est un tableau
|
||||
foreach ($array as $pageId => $pageData) {
|
||||
if ($pageData['position'] > 0) {
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
return $count;
|
||||
@ -2085,7 +2083,7 @@ class course extends common
|
||||
|
||||
/**
|
||||
* Autorise l'accès à un contenu
|
||||
* @param @return bool le user a le droit d'entrée dans le contenu
|
||||
* @return bool le user a le droit d'entrée dans le contenu
|
||||
* @param string $userId identifiant de l'utilisateur
|
||||
* @param string $courseId identifiant du contenu sollicité
|
||||
*/
|
||||
@ -2118,7 +2116,7 @@ class course extends common
|
||||
/**
|
||||
* Lit le contenu des fichiers de traces au format CS et renvoie un tableau associatif
|
||||
*/
|
||||
private function getReport($courseId, $userId = null)
|
||||
public function getReport($courseId, $userId = null)
|
||||
{
|
||||
|
||||
$data = [];
|
||||
@ -2134,14 +2132,19 @@ class course extends common
|
||||
$pageId = $line[1];
|
||||
$timestamp = $line[2];
|
||||
// Filtre userId
|
||||
// if (!is_null($userId) && $name === $userId) {
|
||||
if (
|
||||
is_null($userId) === false
|
||||
&& $name !== $userId
|
||||
) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Initialiser le tableau si nécessaire
|
||||
if (!isset($data[$name][$pageId])) {
|
||||
$data[$name][$pageId] = array();
|
||||
}
|
||||
// Ajouter le timestamp
|
||||
$data[$name][$pageId][] = $timestamp;
|
||||
//}
|
||||
}
|
||||
|
||||
// Fermer le fichier
|
||||
@ -2158,6 +2161,4 @@ class course extends common
|
||||
// Afficher le JSON;
|
||||
return $data;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -8,7 +8,7 @@
|
||||
</div>
|
||||
<div class="col1 offset10">
|
||||
<?php echo template::button('userDeleteAll', [
|
||||
'href' => helper::baseUrl() . 'course/userHistoryExport/' . $this->getUrl(2) . '/' . $this->getUrl(3),
|
||||
'href' => helper::baseUrl() . 'course/userReportExport/' . $this->getUrl(2) . '/' . $this->getUrl(3),
|
||||
'value' => template::ico('download'),
|
||||
'help' => 'Exporter',
|
||||
]) ?>
|
||||
|
@ -8,7 +8,7 @@
|
||||
</div>
|
||||
<div class="col1 offset8">
|
||||
<?php echo template::button('userDeleteAll', [
|
||||
'href' => helper::baseUrl() . 'course/usersHistoryExport/' . $this->getUrl(2),
|
||||
'href' => helper::baseUrl() . 'course/usersReportExport/' . $this->getUrl(2),
|
||||
'value' => template::ico('download'),
|
||||
'help' => 'Exporter',
|
||||
]) ?>
|
||||
|
@ -158,9 +158,9 @@ class install extends common
|
||||
);
|
||||
|
||||
// Sauvegarder la configuration du Proxy
|
||||
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')]);
|
||||
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')]);
|
||||
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)]);
|
||||
$this->setData(['config', 'proxyType', $this->getInput('installProxyType')], false);
|
||||
$this->setData(['config', 'proxyUrl', $this->getInput('installProxyUrl')], false);
|
||||
$this->setData(['config', 'proxyPort', $this->getInput('installProxyPort', helper::FILTER_INT)], false);
|
||||
|
||||
// Images exemples livrées dans tous les cas
|
||||
try {
|
||||
@ -203,7 +203,7 @@ class install extends common
|
||||
$this->copyDir('core/module/install/ressource/i18n', self::I18N_DIR);
|
||||
|
||||
// Fixe l'adresse from pour les envois d'email
|
||||
$this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])]);
|
||||
$this->setData(['config', 'smtp', 'from', 'no-reply@' . str_replace('www.', '', $_SERVER['HTTP_HOST'])], false);
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
@ -212,9 +212,10 @@ class install extends common
|
||||
'state' => true
|
||||
]);
|
||||
}
|
||||
// Force la sauvegarde
|
||||
$this->saveDB('config');
|
||||
|
||||
// Affichage du formulaire
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'display' => self::DISPLAY_LAYOUT_LIGHT,
|
||||
|
@ -246,7 +246,7 @@ class init extends common
|
||||
'manage' => false,
|
||||
'users' => false,
|
||||
'userHistory' => false,
|
||||
'userHistoryExport' => false,
|
||||
'userReportExport' => false,
|
||||
'usersAdd' => false,
|
||||
'userDelete' => false,
|
||||
'usersDelete' => false,
|
||||
@ -343,7 +343,7 @@ class init extends common
|
||||
'manage' => false,
|
||||
'users' => false,
|
||||
'userHistory' => false,
|
||||
'userHistoryExport' => false,
|
||||
'userReportExport' => false,
|
||||
'usersAdd' => false,
|
||||
'userDelete' => false,
|
||||
'usersDelete' => false,
|
||||
@ -445,7 +445,7 @@ class init extends common
|
||||
'manage' => true,
|
||||
'users' => true,
|
||||
'userHistory' => true,
|
||||
'userHistoryExport' => true,
|
||||
'userReportExport' => true,
|
||||
'usersAdd' => true,
|
||||
'userDelete' => false,
|
||||
'usersDelete' => false,
|
||||
@ -543,7 +543,7 @@ class init extends common
|
||||
'manage' => true,
|
||||
'users' => true,
|
||||
'userHistory' => true,
|
||||
'userHistoryExport' => true,
|
||||
'userReportExport' => true,
|
||||
'usersAdd' => true,
|
||||
'userDelete' => true,
|
||||
'usersDelete' => true,
|
||||
|
@ -23,7 +23,8 @@ class page extends common
|
||||
'edit' => self::GROUP_EDITOR,
|
||||
'duplicate' => self::GROUP_EDITOR,
|
||||
'jsEditor' => self::GROUP_EDITOR,
|
||||
'cssEditor' => self::GROUP_EDITOR
|
||||
'cssEditor' => self::GROUP_EDITOR,
|
||||
'register' => self::GROUP_EDITOR,
|
||||
];
|
||||
public static $pagesNoParentId = [
|
||||
'' => 'Aucune'
|
||||
@ -118,14 +119,16 @@ class page extends common
|
||||
$page
|
||||
]);
|
||||
// Ecriture
|
||||
$this->setData(['page', $pageId, $data]);
|
||||
$this->setData(['page', $pageId, $data], false);
|
||||
$notification = helper::translate('Page dupliquée');
|
||||
// Duplication du module présent
|
||||
if ($this->getData(['page', $page, 'moduleId'])) {
|
||||
$data = $this->getData(['module', $page]);
|
||||
$this->setData(['module', $pageId, $data]);
|
||||
$this->setData(['module', $pageId, $data], false);
|
||||
$notification = helper::translate('Page et module dupliqués');
|
||||
}
|
||||
// Force la sauvegarde
|
||||
$this->saveDB('page');
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
@ -390,11 +393,11 @@ class page extends common
|
||||
$pageId = helper::increment($pageId, self::$moduleIds);
|
||||
// Met à jour les enfants
|
||||
foreach ($this->getHierarchy($this->getUrl(2), null) as $childrenPageId) {
|
||||
$this->setData(['page', $childrenPageId, 'parentPageId', $pageId]);
|
||||
$this->setData(['page', $childrenPageId, 'parentPageId', $pageId], false);
|
||||
}
|
||||
// Change l'id de page dans les données des modules
|
||||
if ($this->getData(['module', $this->getUrl(2)]) !== null) {
|
||||
$this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])]);
|
||||
$this->setData(['module', $pageId, $this->getData(['module', $this->getUrl(2)])], false);
|
||||
$this->deleteData(['module', $this->getUrl(2)]);
|
||||
// Renommer le dossier du module
|
||||
$moduleId = $this->getData(['page', $this->getUrl(2), 'moduleId']);
|
||||
@ -405,8 +408,10 @@ class page extends common
|
||||
copy($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2), $modulesData[$moduleId]['dataDirectory'] . $pageId);
|
||||
$this->deleteDir($modulesData[$moduleId]['dataDirectory'] . $this->getUrl(2));
|
||||
// Mettre à jour le nom de la feuille de style
|
||||
$this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId]);
|
||||
$this->setData(['module', $pageId, 'theme', 'style', $modulesData[$moduleId]['dataDirectory'] . $pageId], false);
|
||||
}
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB('module');
|
||||
}
|
||||
// Met à jour les historiques des utilisateurs
|
||||
foreach ($this->getData(['enrolment', self::$siteContent]) as $userId => $userData) {
|
||||
@ -417,14 +422,17 @@ class page extends common
|
||||
) {
|
||||
// Remplacer l'ancienne ID par la nouvelle
|
||||
$datas = $this->getData(['enrolment', self::$siteContent, $userId, 'history', $this->getUrl(2)]);
|
||||
$this->setData(['enrolment', self::$siteContent, $userId, 'history', $pageId, $datas]);
|
||||
$this->setData(['enrolment', self::$siteContent, $userId, 'history', $pageId, $datas], false);
|
||||
$this->deleteData(['enrolment', self::$siteContent, $userId, 'history', $this->getUrl(2)]);
|
||||
}
|
||||
// Mettre à jour la dernière page vue si nécessaire
|
||||
if ($this->getData(['enrolment', self::$siteContent, $userId, 'lastPageView']) === $this->getUrl(2)) {
|
||||
$this->setData(['enrolment', self::$siteContent, $userId, 'lastPageView', $pageId]);
|
||||
$this->setData(['enrolment', self::$siteContent, $userId, 'lastPageView', $pageId], false);
|
||||
}
|
||||
}
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB('enrolment');
|
||||
|
||||
// Met à jour la homePage si nécessaire
|
||||
if ($this->getUrl(2) === $this->getData(['course', self::$siteContent, 'homePageId'])) {
|
||||
$this->setData(['course', self::$siteContent, 'homePageId', $pageId]);
|
||||
@ -432,7 +440,7 @@ class page extends common
|
||||
|
||||
// Si la page correspond à la page d'accueil, change l'id dans la configuration du site
|
||||
if ($this->getData(['config', 'homePageId']) === $this->getUrl(2)) {
|
||||
$this->setData(['config', 'homePageId', $pageId]);
|
||||
$this->setData(['config', 'homePageId', $pageId], false);
|
||||
}
|
||||
}
|
||||
// Supprime les données du module en cas de changement de module
|
||||
@ -448,20 +456,22 @@ class page extends common
|
||||
}
|
||||
// Traitement des pages spéciales affectées dans la config :
|
||||
if ($this->getUrl(2) === $this->getData(['config', 'legalPageId'])) {
|
||||
$this->setData(['config', 'legalPageId', $pageId]);
|
||||
$this->setData(['config', 'legalPageId', $pageId], false);
|
||||
}
|
||||
if ($this->getUrl(2) === $this->getData(['config', 'searchPageId'])) {
|
||||
$this->setData(['config', 'searchPageId', $pageId]);
|
||||
$this->setData(['config', 'searchPageId', $pageId], false);
|
||||
}
|
||||
if ($this->getUrl(2) === $this->getData(['config', 'page404'])) {
|
||||
$this->setData(['config', 'page404', $pageId]);
|
||||
$this->setData(['config', 'page404', $pageId], false);
|
||||
}
|
||||
if ($this->getUrl(2) === $this->getData(['config', 'page403'])) {
|
||||
$this->setData(['config', 'page403', $pageId]);
|
||||
$this->setData(['config', 'page403', $pageId], false);
|
||||
}
|
||||
if ($this->getUrl(2) === $this->getData(['config', 'page302'])) {
|
||||
$this->setData(['config', 'page302', $pageId]);
|
||||
$this->setData(['config', 'page302', $pageId], false);
|
||||
}
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB(module: 'config');
|
||||
// Si la page est une page enfant, actualise les positions des autres enfants du parent, sinon actualise les pages sans parents
|
||||
$lastPosition = 1;
|
||||
$hierarchy = $this->getInput('pageEditParentPageId') ? $this->getHierarchy($this->getInput('pageEditParentPageId')) : array_keys($this->getHierarchy());
|
||||
@ -480,11 +490,12 @@ class page extends common
|
||||
$lastPosition++;
|
||||
}
|
||||
// Change la position
|
||||
$this->setData(['page', $hierarchyPageId, 'position', $lastPosition]);
|
||||
$this->setData(['page', $hierarchyPageId, 'position', $lastPosition], false);
|
||||
// Incrémente pour la prochaine position
|
||||
$lastPosition++;
|
||||
}
|
||||
}
|
||||
|
||||
if ($this->getinput('pageEditBlock') !== 'bar') {
|
||||
$barLeft = $this->getinput('pageEditBarLeft');
|
||||
$barRight = $this->getinput('pageEditBarRight');
|
||||
@ -505,7 +516,7 @@ class page extends common
|
||||
) {
|
||||
foreach ($this->getHierarchy($pageId) as $parentId => $childId) {
|
||||
if ($this->getData(['page', $childId, 'parentPageId']) === $pageId) {
|
||||
$this->setData(['page', $childId, 'position', 0]);
|
||||
$this->setData(['page', $childId, 'position', 0], false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -514,17 +525,17 @@ class page extends common
|
||||
if ($this->getinput('pageEditBlock') === 'bar') {
|
||||
foreach ($this->getHierarchy() as $eachPageId => $parentId) {
|
||||
if ($this->getData(['page', $eachPageId, 'barRight']) === $this->getUrl(2)) {
|
||||
$this->setData(['page', $eachPageId, 'barRight', $pageId]);
|
||||
$this->setData(['page', $eachPageId, 'barRight', $pageId], false);
|
||||
}
|
||||
if ($this->getData(['page', $eachPageId, 'barLeft']) === $this->getUrl(2)) {
|
||||
$this->setData(['page', $eachPageId, 'barLeft', $pageId]);
|
||||
$this->setData(['page', $eachPageId, 'barLeft', $pageId], false);
|
||||
}
|
||||
foreach ($parentId as $childId) {
|
||||
if ($this->getData(['page', $childId, 'barRight']) === $this->getUrl(2)) {
|
||||
$this->setData(['page', $childId, 'barRight', $pageId]);
|
||||
$this->setData(['page', $childId, 'barRight', $pageId], false);
|
||||
}
|
||||
if ($this->getData(['page', $childId, 'barLeft']) === $this->getUrl(2)) {
|
||||
$this->setData(['page', $childId, 'barLeft', $pageId]);
|
||||
$this->setData(['page', $childId, 'barLeft', $pageId], false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -746,4 +757,25 @@ class page extends common
|
||||
return json_encode($d);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stocke la variable dans les paramètres de l'utilisateur pour activer la tab à sa prochaine visite
|
||||
* @return never
|
||||
*/
|
||||
public function register(): void
|
||||
{
|
||||
$this->setData([
|
||||
'user',
|
||||
$this->getUser('id'),
|
||||
'view',
|
||||
[
|
||||
'page' => $this->getUrl(2),
|
||||
'config' => $this->getData(['user', $this->getUser('id'), 'view', 'config']),
|
||||
]
|
||||
]);
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'page/edit/' . $this->getUrl(3) . '/' . self::$siteContent,
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
@ -67,16 +67,18 @@ $( document ).ready(function() {
|
||||
/**
|
||||
* Sélection des onglets
|
||||
*/
|
||||
var pageLayout = getCookie("pageLayout");
|
||||
if (pageLayout == null) {
|
||||
var pageLayout = "<?php echo $this->getData(['user', $this->getUser('id'), 'view', 'page']);?>";
|
||||
// Non défini, valeur par défaut
|
||||
if (pageLayout == "") {
|
||||
pageLayout = "content";
|
||||
setCookie("pageLayout", "content");
|
||||
}
|
||||
// Tout cacher
|
||||
$("#pageEditContentContainer").hide();
|
||||
$("#pageEditExtensionContainer").hide();
|
||||
$("#pageEditPositionContainer").hide();
|
||||
$("#pageEditLayoutContainer").hide();
|
||||
$("#pageEditPermissionContainer").hide();
|
||||
// Afficher la bonne tab
|
||||
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Container").show();
|
||||
$("#pageEdit" + capitalizeFirstLetter(pageLayout) + "Button").addClass("activeButton");
|
||||
|
||||
@ -295,7 +297,6 @@ $( document ).ready(function() {
|
||||
$("#PageEditPositionButton").removeClass("activeButton");
|
||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||
setCookie("pageLayout", "content");
|
||||
});
|
||||
$("#pageEditExtensionButton").on("click", function () {
|
||||
$("#pageEditContentContainer").hide();
|
||||
@ -308,7 +309,6 @@ $( document ).ready(function() {
|
||||
$("#PageEditPositionButton").removeClass("activeButton");
|
||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||
setCookie("pageLayout", "extension");
|
||||
});
|
||||
$("#PageEditPositionButton").on("click", function () {
|
||||
$("#pageEditContentContainer").hide();
|
||||
@ -321,7 +321,6 @@ $( document ).ready(function() {
|
||||
$("#PageEditPositionButton").addClass("activeButton");
|
||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||
setCookie("pageLayout", "position");
|
||||
});
|
||||
$("#pageEditLayoutButton").on("click", function () {
|
||||
$("#pageEditContentContainer").hide();
|
||||
@ -334,7 +333,6 @@ $( document ).ready(function() {
|
||||
$("#PageEditPositionButton").removeClass("activeButton");
|
||||
$("#pageEditLayoutButton").addClass("activeButton");
|
||||
$("#pageEditPermissionButton").removeClass("activeButton");
|
||||
setCookie("pageLayout", "layout");
|
||||
});
|
||||
$("#pageEditPermissionButton").on("click", function () {
|
||||
$("#pageEditContentContainer").hide();
|
||||
@ -347,7 +345,6 @@ $( document ).ready(function() {
|
||||
$("#pageEditPositionButton").removeClass("activeButton");
|
||||
$("#pageEditLayoutButton").removeClass("activeButton");
|
||||
$("#pageEditPermissionButton").addClass("activeButton");
|
||||
setCookie("pageLayout", "permission");
|
||||
});
|
||||
|
||||
/**
|
||||
@ -722,30 +719,6 @@ function buildPagesList(extraPosition) {
|
||||
positionDOM.val(positionSelected);
|
||||
};
|
||||
|
||||
/**
|
||||
* Cookies
|
||||
*/
|
||||
function setCookie(name, value, days) {
|
||||
var expires = "";
|
||||
if (days) {
|
||||
var date = new Date();
|
||||
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
||||
expires = "; expires=" + date.toUTCString();
|
||||
}
|
||||
document.cookie = name + "=" + (value || "") + expires + "; path=/; samesite=lax";
|
||||
}
|
||||
|
||||
function getCookie(name) {
|
||||
var nameEQ = name + "=";
|
||||
var ca = document.cookie.split(';');
|
||||
for (var i = 0; i < ca.length; i++) {
|
||||
var c = ca[i];
|
||||
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
|
||||
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Define function to capitalize the first letter of a string
|
||||
function capitalizeFirstLetter(string) {
|
||||
return string.charAt(0).toUpperCase() + string.slice(1);
|
||||
|
@ -30,26 +30,32 @@
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tab">
|
||||
<?php echo template::button('pageEditContentButton', [
|
||||
'value' => 'Contenu',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
'href' => helper::baseUrl() . 'page/register/content/' . $this->geturl(2)
|
||||
]); ?>
|
||||
<?php echo template::button('PageEditPositionButton', [
|
||||
<?php echo template::button('pageEditPositionButton', [
|
||||
'value' => 'Menu',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
'href' => helper::baseUrl() . 'page/register/position/' . $this->geturl(2)
|
||||
]); ?>
|
||||
<?php echo template::button('pageEditExtensionButton', [
|
||||
'value' => 'Extension',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
'href' => helper::baseUrl() . 'page/register/extension/' . $this->geturl(2)
|
||||
]); ?>
|
||||
<?php echo template::button('pageEditLayoutButton', [
|
||||
'value' => 'Mise en page',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
'href' => helper::baseUrl() . 'page/register/layout/' . $this->geturl(2)
|
||||
]); ?>
|
||||
<?php echo template::button('pageEditPermissionButton', [
|
||||
'value' => 'Permission',
|
||||
'class' => 'buttonTab'
|
||||
'class' => 'buttonTab',
|
||||
'href' => helper::baseUrl() . 'page/register/permission/' . $this->geturl(2)
|
||||
]); ?>
|
||||
</div>
|
||||
|
||||
|
@ -507,21 +507,23 @@ class theme extends common
|
||||
'featureContent' => $featureContent,
|
||||
'featureFiles' => $files
|
||||
]
|
||||
]);
|
||||
], false);
|
||||
// Modification de la position du menu selon la position de la bannière
|
||||
if ($this->getData(['theme', 'header', 'position']) == 'site') {
|
||||
$this->setData(['theme', 'menu', 'position', str_replace('body-', 'site-', $this->getData(['theme', 'menu', 'position']))]);
|
||||
$this->setData(['theme', 'menu', 'position', str_replace('body-', 'site-', $this->getData(['theme', 'menu', 'position']))], false);
|
||||
}
|
||||
if ($this->getData(['theme', 'header', 'position']) == 'body') {
|
||||
$this->setData(['theme', 'menu', 'position', str_replace('site-', 'body-', $this->getData(['theme', 'menu', 'position']))]);
|
||||
$this->setData(['theme', 'menu', 'position', str_replace('site-', 'body-', $this->getData(['theme', 'menu', 'position']))], false);
|
||||
}
|
||||
// Menu accroché à la bannière qui devient cachée
|
||||
if (
|
||||
$this->getData(['theme', 'header', 'position']) == 'hide' &&
|
||||
in_array($this->getData(['theme', 'menu', 'position']), ['body-first', 'site-first', 'body-first', 'site-second'])
|
||||
) {
|
||||
$this->setData(['theme', 'menu', 'position', 'site']);
|
||||
$this->setData(['theme', 'menu', 'position', 'site'], false);
|
||||
}
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB(module: 'theme');
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'notification' => helper::translate('Modifications enregistrées'),
|
||||
@ -929,7 +931,7 @@ class theme extends common
|
||||
'fontWeight' => $this->getInput('themeTitleFontWeight'),
|
||||
'textTransform' => $this->getInput('themeTitleTextTransform')
|
||||
]
|
||||
]);
|
||||
], false);
|
||||
$this->setData([
|
||||
'theme',
|
||||
'text',
|
||||
@ -939,7 +941,7 @@ class theme extends common
|
||||
'textColor' => $this->getInput('themeTextTextColor'),
|
||||
'linkColor' => $this->getInput('themeTextLinkColor')
|
||||
]
|
||||
]);
|
||||
], false);
|
||||
$this->setData([
|
||||
'theme',
|
||||
'site',
|
||||
@ -950,14 +952,14 @@ class theme extends common
|
||||
'width' => $this->getInput('themeSiteWidth'),
|
||||
'margin' => $this->getInput('themeSiteMargin', helper::FILTER_BOOLEAN)
|
||||
]
|
||||
]);
|
||||
], false);
|
||||
$this->setData([
|
||||
'theme',
|
||||
'button',
|
||||
[
|
||||
'backgroundColor' => $this->getInput('themeButtonBackgroundColor')
|
||||
]
|
||||
]);
|
||||
], false);
|
||||
$this->setData([
|
||||
'theme',
|
||||
'block',
|
||||
|
@ -428,7 +428,8 @@ class user extends common
|
||||
if ($this->getUser('group') < self::GROUP_ADMIN) {
|
||||
if ($this->getInput('userEditNewPassword')) {
|
||||
// L'ancien mot de passe est correct
|
||||
if (password_verify(html_entity_decode($this->getInput('userEditOldPassword')), $this->getData(['user', $this->getUrl(2), 'password']))
|
||||
if (
|
||||
password_verify(html_entity_decode($this->getInput('userEditOldPassword')), $this->getData(['user', $this->getUrl(2), 'password']))
|
||||
) {
|
||||
// La confirmation correspond au mot de passe
|
||||
if ($this->getInput('userEditNewPassword') === $this->getInput('userEditConfirmPassword')) {
|
||||
@ -574,7 +575,7 @@ class user extends common
|
||||
// Enregistre la date de la demande dans le compte utilisateur
|
||||
$this->setData(['user', $userId, 'forgot', time()]);
|
||||
// Crée un id unique pour la réinitialisation
|
||||
$uniqId = md5(json_encode($this->getData(['user', $userId])));
|
||||
$uniqId = md5(json_encode($this->getData(['user', $userId, 'forgot'])));
|
||||
// Envoi le mail
|
||||
$sent = $this->sendMail(
|
||||
$this->getData(['user', $userId, 'mail']),
|
||||
@ -897,7 +898,7 @@ class user extends common
|
||||
// Droits spécifiques
|
||||
'users' => $this->getInput('profilEditCourseUsers', helper::FILTER_BOOLEAN),
|
||||
'userHistory' => $this->getInput('profilEditCourseUserHistory', helper::FILTER_BOOLEAN),
|
||||
'userHistoryExport' => $this->getInput('profilEditCourseUserHistoryExport', helper::FILTER_BOOLEAN),
|
||||
'userReportExport' => $this->getInput('profilEditCourseuserReportExport', helper::FILTER_BOOLEAN),
|
||||
'export' => $this->getInput('profilEditCourseExport', helper::FILTER_BOOLEAN),
|
||||
'userAdd' => $this->getInput('profilEditCourseUserAdd', helper::FILTER_BOOLEAN),
|
||||
'usersAdd' => $this->getInput('profilEditCourseUsersAdd', helper::FILTER_BOOLEAN),
|
||||
@ -1094,7 +1095,7 @@ class user extends common
|
||||
// La suite
|
||||
'users' => $this->getInput('profilAddCourseUsers', helper::FILTER_BOOLEAN),
|
||||
'userHistory' => $this->getInput('profilAddCourseUserHistory', helper::FILTER_BOOLEAN),
|
||||
'userHistoryExport' => $this->getInput('profilAddCourseUserHistoryExport', helper::FILTER_BOOLEAN),
|
||||
'userReportExport' => $this->getInput('profilAddCourseuserReportExport', helper::FILTER_BOOLEAN),
|
||||
'export' => $this->getInput('profilAddCourseExport', helper::FILTER_BOOLEAN),
|
||||
'userAdd' => $this->getInput('profilAddCourseUserAdd', helper::FILTER_BOOLEAN),
|
||||
'usersAdd' => $this->getInput('profilAddCourseUsersAdd', helper::FILTER_BOOLEAN),
|
||||
@ -1261,7 +1262,7 @@ class user extends common
|
||||
'lastFail' => time(),
|
||||
'ip' => helper::getIp()
|
||||
]
|
||||
]);
|
||||
], false);
|
||||
// Verrouillage des IP
|
||||
$ipBlackList = helper::arrayColumn($this->getData(['blacklist']), 'ip');
|
||||
if (
|
||||
@ -1290,8 +1291,8 @@ class user extends common
|
||||
$this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time()
|
||||
and $this->getData(['user', $userId, 'connectFail']) === $this->getData(['config', 'connect', 'attempt'])
|
||||
) {
|
||||
$this->setData(['user', $userId, 'connectFail', 0]);
|
||||
$this->setData(['user', $userId, 'connectTimeout', 0]);
|
||||
$this->setData(['user', $userId, 'connectFail', 0], false);
|
||||
$this->setData(['user', $userId, 'connectTimeout', 0], false);
|
||||
}
|
||||
// Check la présence des variables et contrôle du blocage du compte si valeurs dépassées
|
||||
// Vérification du mot de passe et du groupe
|
||||
@ -1303,12 +1304,12 @@ class user extends common
|
||||
and $captcha === true
|
||||
) {
|
||||
// RAZ
|
||||
$this->setData(['user', $userId, 'connectFail', 0]);
|
||||
$this->setData(['user', $userId, 'connectTimeout', 0]);
|
||||
$this->setData(['user', $userId, 'connectFail', 0], false);
|
||||
$this->setData(['user', $userId, 'connectTimeout', 0], false);
|
||||
|
||||
// Clé d'authenfication
|
||||
$authKey = uniqid('', true) . bin2hex(random_bytes(8));
|
||||
$this->setData(['user', $userId, 'authKey', $authKey]);
|
||||
$this->setData(['user', $userId, 'authKey', $authKey], false);
|
||||
|
||||
// Validité du cookie
|
||||
$expire = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN) === true ? strtotime("+1 year") : 0;
|
||||
@ -1332,7 +1333,7 @@ class user extends common
|
||||
}
|
||||
|
||||
// Accès multiples avec le même compte
|
||||
$this->setData(['user', $userId, 'accessCsrf', $_SESSION['csrf']]);
|
||||
$this->setData(['user', $userId, 'accessCsrf', $_SESSION['csrf']], false);
|
||||
// Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur
|
||||
if (
|
||||
$this->getData(['config', 'maintenance'])
|
||||
@ -1366,11 +1367,11 @@ class user extends common
|
||||
$logStatus = $captcha === true ? 'Erreur de mot de passe' : 'Erreur de captcha';
|
||||
// Cas 1 le nombre de connexions est inférieur aux tentatives autorisées : incrément compteur d'échec
|
||||
if ($this->getData(['user', $userId, 'connectFail']) < $this->getData(['config', 'connect', 'attempt'])) {
|
||||
$this->setData(['user', $userId, 'connectFail', $this->getdata(['user', $userId, 'connectFail']) + 1]);
|
||||
$this->setData(['user', $userId, 'connectFail', $this->getdata(['user', $userId, 'connectFail']) + 1], false);
|
||||
}
|
||||
// Cas 2 la limite du nombre de connexion est atteinte : placer le timer
|
||||
if ($this->getdata(['user', $userId, 'connectFail']) == $this->getData(['config', 'connect', 'attempt'])) {
|
||||
$this->setData(['user', $userId, 'connectTimeout', time()]);
|
||||
$this->setData(['user', $userId, 'connectTimeout', time()], false);
|
||||
}
|
||||
// Cas 3 le délai de bloquage court
|
||||
if ($this->getData(['user', $userId, 'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) > time()) {
|
||||
@ -1383,7 +1384,10 @@ class user extends common
|
||||
]);
|
||||
}
|
||||
}
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB(module: 'user');
|
||||
}
|
||||
|
||||
// Journalisation
|
||||
$this->saveLog($logStatus);
|
||||
|
||||
@ -1408,7 +1412,6 @@ class user extends common
|
||||
helper::deleteCookie('ZWII_USER_ID');
|
||||
//helper::deleteCookie('ZWII_USER_PASSWORD');
|
||||
helper::deleteCookie('ZWII_AUTH_KEY');
|
||||
$this->setData(['user', $this->getUser('id'), 'authKey', '']);
|
||||
|
||||
// Détruit la session
|
||||
session_destroy();
|
||||
@ -1433,13 +1436,29 @@ class user extends common
|
||||
// Lien de réinitialisation trop vieux
|
||||
or $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()
|
||||
// Id unique incorrecte
|
||||
or $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2)])))
|
||||
or $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2), 'forgot'])))
|
||||
) {
|
||||
$this->saveLog(
|
||||
' Erreur de réinitialisation de mot de passe ' . $this->getUrl(2) .
|
||||
' Compte : ' . $this->getData(['user', $this->getUrl(2)]) .
|
||||
' Temps : ' . $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time() .
|
||||
' Clé : ' . $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2), 'forgot'])))
|
||||
);
|
||||
// Message d'erreur en cas de problème de réinitialisation de mot de passe
|
||||
$message = $this->getData(['user', $this->getUrl(2)]) === null
|
||||
? ' Utilisateur inconnu '
|
||||
: '';
|
||||
$message = $this->getData(['user', $this->getUrl(2), 'forgot']) + 86400 < time()
|
||||
? ' Temps dépassé '
|
||||
: $message;
|
||||
$message = $this->getUrl(3) !== md5(json_encode($this->getData(['user', $this->getUrl(2)])))
|
||||
? ' Clé invalide '
|
||||
: $message;
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseurl(),
|
||||
'notification' => helper::translate('Impossible de réinitialiser le mot de passe de ce compte !'),
|
||||
'notification' => helper::translate('Impossible de réinitialiser le mot de passe de ce compte !') . $message,
|
||||
'state' => false
|
||||
//'access' => false
|
||||
]);
|
||||
@ -1462,12 +1481,14 @@ class user extends common
|
||||
$newPassword = $this->getInput('userResetNewPassword', helper::FILTER_PASSWORD, true);
|
||||
}
|
||||
// Modifie le mot de passe
|
||||
$this->setData(['user', $this->getUrl(2), 'password', $newPassword]);
|
||||
$this->setData(['user', $this->getUrl(2), 'password', $newPassword], false);
|
||||
// Réinitialise la date de la demande
|
||||
$this->setData(['user', $this->getUrl(2), 'forgot', 0]);
|
||||
$this->setData(['user', $this->getUrl(2), 'forgot', 0], false);
|
||||
// Réinitialise le blocage
|
||||
$this->setData(['user', $this->getUrl(2), 'connectFail', 0]);
|
||||
$this->setData(['user', $this->getUrl(2), 'connectTimeout', 0]);
|
||||
$this->setData(['user', $this->getUrl(2), 'connectFail', 0], false);
|
||||
$this->setData(['user', $this->getUrl(2), 'connectTimeout', 0], false);
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB('user');
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'notification' => helper::translate('Nouveau mot de passe enregistré'),
|
||||
@ -1581,7 +1602,7 @@ class user extends common
|
||||
"accessCsrf" => null,
|
||||
'tags' => $item['tags']
|
||||
]
|
||||
]);
|
||||
], false);
|
||||
// Icône de notification
|
||||
$item['notification'] = $create ? template::ico('check') : template::ico('cancel');
|
||||
// Envoi du mail
|
||||
@ -1622,6 +1643,8 @@ class user extends common
|
||||
}
|
||||
|
||||
}
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB(module: 'user');
|
||||
if (empty(self::$users)) {
|
||||
$notification = helper::translate('Rien à importer, erreur de format ou fichier incorrect');
|
||||
$success = false;
|
||||
@ -1682,7 +1705,7 @@ class user extends common
|
||||
if (
|
||||
isset($_POST['usersTagSubmit'])
|
||||
) {
|
||||
$notification = helper::translate('Modification de %s étiquette');
|
||||
$notification = helper::translate('Modification de %s étiquette(s)');
|
||||
$success = true;
|
||||
$count = 0;
|
||||
$newTags = $this->getInput('usersTagLabel', null, true);
|
||||
@ -1691,10 +1714,12 @@ class user extends common
|
||||
if (
|
||||
$this->getData(['user', $keyPost]) !== null
|
||||
) {
|
||||
$this->setData(['user', $keyPost, 'tags', $newTags]);
|
||||
$this->setData(['user', $keyPost, 'tags', $newTags], false);
|
||||
$count += 1;
|
||||
}
|
||||
}
|
||||
// Sauvegarde la base manuellement
|
||||
$this->saveDB(module: 'user');
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . 'user/tag',
|
||||
|
@ -8,4 +8,32 @@
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
$(document).ready((function(){$(".zwiico-eye").mouseenter((function(){$("#userLoginPassword").attr("type","text")})),$(".zwiico-eye").mouseleave((function(){$("#userLoginPassword").attr("type","password")}))}));
|
||||
$(document).ready((function() {
|
||||
$("#userLoginId").on("change keydown keyup", function (event) {
|
||||
var userId = $(this).val();
|
||||
if (
|
||||
event.keyCode !== 8 // BACKSPACE
|
||||
&& event.keyCode !== 37 // LEFT
|
||||
&& event.keyCode !== 39 // RIGHT
|
||||
&& event.keyCode !== 46 // DELETE
|
||||
&& window.getSelection().toString() !== userId // Texte sélectionné
|
||||
) {
|
||||
var searchReplace = {
|
||||
"á": "a", "à": "a", "â": "a", "ä": "a", "ã": "a", "å": "a", "ç": "c", "é": "e", "è": "e", "ê": "e", "ë": "e", "í": "i", "ì": "i", "î": "i", "ï": "i", "ñ": "n", "ó": "o", "ò": "o", "ô": "o", "ö": "o", "õ": "o", "ú": "u", "ù": "u", "û": "u", "ü": "u", "ý": "y", "ÿ": "y",
|
||||
"Á": "A", "À": "A", "Â": "A", "Ä": "A", "Ã": "A", "Å": "A", "Ç": "C", "É": "E", "È": "E", "Ê": "E", "Ë": "E", "Í": "I", "Ì": "I", "Î": "I", "Ï": "I", "Ñ": "N", "Ó": "O", "Ò": "O", "Ô": "O", "Ö": "O", "Õ": "O", "Ú": "U", "Ù": "U", "Û": "U", "Ü": "U", "Ý": "Y", "Ÿ": "Y",
|
||||
"'": "-", "\"": "-", " ": "-"
|
||||
};
|
||||
userId = userId.replace(/[áàâäãåçéèêëíìîïñóòôöõúùûüýÿ'" ]/ig, function (match) {
|
||||
return searchReplace[match];
|
||||
});
|
||||
userId = userId.replace(/[^a-z0-9-]/ig, "");
|
||||
$(this).val(userId);
|
||||
}
|
||||
});
|
||||
|
||||
$(".zwiico-eye").mouseenter((function() {
|
||||
$("#userLoginPassword").attr("type", "text")
|
||||
})), $(".zwiico-eye").mouseleave((function() {
|
||||
$("#userLoginPassword").attr("type", "password")
|
||||
}))
|
||||
}));
|
@ -196,7 +196,7 @@
|
||||
<?php echo template::checkbox('profilAddCourseUserHistory', true, 'Voir historique d\'un participant'); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('profilAddCourseUserHistoryExport', true, 'Exporter historique d\'un participant'); ?>
|
||||
<?php echo template::checkbox('profilAddCourseuserReportExport', true, 'Exporter historique d\'un participant'); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('profilAddCourseUserDelete', true, 'Désinscrire un participant'); ?>
|
||||
|
@ -56,10 +56,10 @@ $(document).ready(function () {
|
||||
|
||||
if ($('#profilEditCourseUsers').is(':checked')) {
|
||||
// Activer les autres checkboxes
|
||||
$('#profilEditCourseUserHistory, #profilEditCourseUserHistoryExport, #profilEditCourseUserDelete, #profilEditCourseUsersAdd, #profilEditCourseUsersDelete, #profilEditCourseReset').prop('disabled', false);
|
||||
$('#profilEditCourseUserHistory, #profilEditCourseuserReportExport, #profilEditCourseUserDelete, #profilEditCourseUsersAdd, #profilEditCourseUsersDelete, #profilEditCourseReset').prop('disabled', false);
|
||||
} else {
|
||||
// Désactiver les autres checkboxes
|
||||
$('#profilEditCourseUserHistory, #profilEditCourseUserHistoryExport, #profilEditCourseUserDelete, #profilEditCourseUsersAdd, #profilEditCourseUsersDelete, #profilEditCourseReset').prop('checked', false).prop('disabled', true);
|
||||
$('#profilEditCourseUserHistory, #profilEditCourseuserReportExport, #profilEditCourseUserDelete, #profilEditCourseUsersAdd, #profilEditCourseUsersDelete, #profilEditCourseReset').prop('checked', false).prop('disabled', true);
|
||||
// Désactiver les modules et tout décocher
|
||||
$(".courseContainer").slideUp();
|
||||
$('.courseContainer input[type="checkbox"]').prop('checked', false);
|
||||
@ -135,11 +135,11 @@ $(document).ready(function () {
|
||||
$('#profilEditCourseUsers').change(function () {
|
||||
if ($(this).is(':checked')) {
|
||||
// Activer les autres checkboxes
|
||||
$('#profilEditCourseUserHistory, #profilEditCourseUserHistoryExport, #profilEditCourseUserDelete, #profilEditCourseUsersAdd, #profilEditCourseUsersDelete, #profilEditCourseReset').prop('disabled', false);
|
||||
$('#profilEditCourseUserHistory, #profilEditCourseuserReportExport, #profilEditCourseUserDelete, #profilEditCourseUsersAdd, #profilEditCourseUsersDelete, #profilEditCourseReset').prop('disabled', false);
|
||||
|
||||
} else {
|
||||
// Désactiver les autres checkboxes
|
||||
$('#profilEditCourseUserHistory, #profilEditCourseUserHistoryExport, #profilEditCourseUserDelete, #profilEditCourseUsersAdd, #profilEditCourseUsersDelete, #profilEditCourseReset').prop('checked', false).prop('disabled', true);
|
||||
$('#profilEditCourseUserHistory, #profilEditCourseuserReportExport, #profilEditCourseUserDelete, #profilEditCourseUsersAdd, #profilEditCourseUsersDelete, #profilEditCourseReset').prop('checked', false).prop('disabled', true);
|
||||
// Désactiver les modules et tout décocher
|
||||
$(".courseContainer").slideUp();
|
||||
$('.courseContainer input[type="checkbox"]').prop('checked', false);
|
||||
|
@ -291,8 +291,8 @@
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('profilEditCourseUserHistoryExport', true, 'Exporter historique d\'un participant', [
|
||||
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'course', 'userHistoryExport']),
|
||||
<?php echo template::checkbox('profilEditCourseuserReportExport', true, 'Exporter historique d\'un participant', [
|
||||
'checked' => $this->getData(['profil', $this->getUrl(2), $this->getUrl(3), 'course', 'userReportExport']),
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
|
@ -7,7 +7,7 @@
|
||||
'value' => template::ico('left')
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col1">
|
||||
<div class="col1 offset10">
|
||||
<?php echo template::submit('usersDeleteSubmit', [
|
||||
'class' => 'buttonRed',
|
||||
'ico' => '',
|
||||
|
2
core/vendor/filemanager/config/config.php
vendored
2
core/vendor/filemanager/config/config.php
vendored
@ -19,7 +19,7 @@ setlocale(LC_CTYPE, $lang);
|
||||
|
||||
/* Lecture du groupe de l'utilisateur connecté pour attribuer les droits et les dossiers */
|
||||
$userId = $_COOKIE['ZWII_USER_ID'];
|
||||
$courseId = $_SESSION['ZWII_SITE_CONTENT'];
|
||||
$courseId = $_GET['lang'];
|
||||
$u = json_decode(file_get_contents('../../../site/data/user.json'), true);
|
||||
$g = json_decode(file_get_contents('../../../site/data/profil.json'), true);
|
||||
|
||||
|
@ -26,13 +26,18 @@ $siteId = md5($_SERVER['SERVER_NAME'] . $_SERVER['SCRIPT_FILENAME']); // Ou util
|
||||
session_name('zwii_session_' . $siteId);
|
||||
|
||||
// Récupère dynamiquement le chemin du dossier dans lequel le script est exécuté
|
||||
$scriptPath = dirname($_SERVER['SCRIPT_NAME']) . '/';
|
||||
$scriptPath = dirname($_SERVER['SCRIPT_NAME']);
|
||||
|
||||
// Si le chemin est vide (ce qui peut arriver si le site est à la racine), définis-le comme '/'
|
||||
if ($scriptPath === '/' || $scriptPath === '\\' || $scriptPath === '.') {
|
||||
$scriptPath = '/';
|
||||
}
|
||||
|
||||
// Définissez le chemin du cookie de session dynamiquement
|
||||
session_set_cookie_params([
|
||||
'lifetime' => 0,
|
||||
'path' => $scriptPath, // Utilise le chemin du script pour restreindre la session à ce répertoire
|
||||
'domain' => $_SERVER['SERVER_NAME'], // Domain par défaut
|
||||
'domain' => $_SERVER['SERVER_NAME'], // Domaine par défaut
|
||||
'secure' => isset($_SERVER['HTTPS']), // Pour HTTPS, si nécessaire
|
||||
'httponly' => true,
|
||||
'samesite' => 'Lax' // Ou 'Strict' ou 'None' selon tes besoins
|
||||
|
@ -16,7 +16,7 @@
|
||||
class blog extends common
|
||||
{
|
||||
|
||||
const VERSION = '7.11';
|
||||
const VERSION = '8.0';
|
||||
const REALNAME = 'Blog';
|
||||
const DELETE = true;
|
||||
const UPDATE = '0.0';
|
||||
@ -174,10 +174,12 @@ class blog extends common
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'timeFormat', '%H:%M']);
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'versionData', '6.5']);
|
||||
}
|
||||
// Version 7.4
|
||||
if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '7.4', '<')) {
|
||||
// Version 8.0
|
||||
if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '8.0', '<')) {
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'buttonBack', true]);
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'versionData', '7.4']);
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'showTime', true]);
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'showDate', true]);
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'versionData', '8.0']);
|
||||
}
|
||||
}
|
||||
|
||||
@ -578,7 +580,9 @@ class blog extends common
|
||||
'itemsperPage' => $this->getInput('blogOptionItemsperPage', helper::FILTER_INT, true),
|
||||
'dateFormat' => $this->getInput('blogOptionDateFormat'),
|
||||
'timeFormat' => $this->getInput('blogOptionTimeFormat'),
|
||||
'buttonBack' => $this->getInput('newsOptionButtonBack'),
|
||||
'buttonBack' => $this->getInput('blogOptionButtonBack', helper::FILTER_BOOLEAN),
|
||||
'showDate' => $this->getInput('blogOptionShowDate', helper::FILTER_BOOLEAN),
|
||||
'showTime' => $this->getInput('blogOptionShowTime', helper::FILTER_BOOLEAN),
|
||||
'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']),
|
||||
]
|
||||
]);
|
||||
@ -596,7 +600,6 @@ class blog extends common
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Suppression
|
||||
*/
|
||||
|
@ -1,6 +1,11 @@
|
||||
# Versions 7.11
|
||||
# Version 8.00
|
||||
- Ajoute deux nouvelles options pour afficher ou masquer la date et l'heure de l'article.
|
||||
- Corrige un bug d'affichage des articles lorsque le thème Moderne est sélectionné.
|
||||
- Corrige un bug dans la méthode de tronquage de l'article, nécessite Zwii 13.5
|
||||
- Corrige un mauvais format de la propriété buttonBack non stockée au type booléen.
|
||||
# Version 7.11
|
||||
- Le sélecteur de fichier affiche par défaut le chemin vers le fichier présent dans le champ.
|
||||
# Versions 7.10
|
||||
# Version 7.10
|
||||
- Empêche la validation d'un commentaire lorsque le contenu est vide.
|
||||
# Versions 7.8 - 7.9
|
||||
- Le flux RSS ne fonctionne pas si les méta de la page sont vides.
|
||||
|
@ -1 +1 @@
|
||||
{"name":"blog","realName":"Blog","version":"7.10","update":"0.0","delete":true,"dataDirectory":""}
|
||||
{"name":"blog","realName":"Blog","version":"7.12","update":"0.0","delete":true,"dataDirectory":""}
|
@ -18,11 +18,28 @@
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="col6 newsDate textAlignRight">
|
||||
<!-- bloc signature et date -->
|
||||
<!-- bloc signature -->
|
||||
<?php echo template::ico('user'); ?>
|
||||
<?php echo $module::$articleSignature; ?>
|
||||
<?php echo template::ico('calendar-empty'); ?>
|
||||
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI) . ' ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
|
||||
<!-- bloc date -->
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?>
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo ' - '; ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?>
|
||||
<!-- Bloc edition -->
|
||||
<?php if (
|
||||
$this->isConnected() === true
|
||||
|
@ -24,11 +24,28 @@
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col6 blogEdit">
|
||||
<!-- bloc signature et date -->
|
||||
<!-- bloc signature -->
|
||||
<?php echo template::ico('user'); ?>
|
||||
<?php echo $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?>
|
||||
<?php echo template::ico('calendar-empty'); ?>
|
||||
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI) . ' ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
|
||||
<!-- bloc Date -->
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?>
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo ' - '; ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
@ -103,7 +120,8 @@
|
||||
file_exists(self::FILE_DIR . 'source/' . $article['picture'])
|
||||
): ?>
|
||||
<div class="col3">
|
||||
<?php // Déterminer le nom de la miniature
|
||||
<?php
|
||||
// Déterminer le nom de la miniature
|
||||
$parts = pathinfo($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'picture']));
|
||||
$thumb = 'mini_' . $parts['basename'];
|
||||
// Créer la miniature si manquante
|
||||
@ -138,15 +156,33 @@
|
||||
</a>
|
||||
</div>
|
||||
<div class="blogDate">
|
||||
<!-- bloc signature et date -->
|
||||
<!-- bloc signature -->
|
||||
<?php echo template::ico('user'); ?>
|
||||
<?php echo $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'userId'])); ?>
|
||||
<?php echo template::ico('calendar-empty'); ?>
|
||||
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI) . ' ' . helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
|
||||
</div>
|
||||
<!-- bloc date -->
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?>
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo ' - '; ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $articleId, 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?>
|
||||
<div class="blogContent">
|
||||
<?php $lenght = $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) !== 0 ? $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']) : 500 ?>
|
||||
<?php echo helper::subword(strip_tags($article['content'], '<br><p>'), 0, $lenght); ?>...
|
||||
<?php $lenght = $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght']); ?>
|
||||
<?php if ($lenght > 0): ?>
|
||||
<?php ?>
|
||||
<?php echo helper::subword($article['content'], 0, $lenght); ?>...
|
||||
<div class="readMoreContainer">
|
||||
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/' . $articleId; ?>">
|
||||
<button class="readMoreButton">
|
||||
@ -154,6 +190,10 @@
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
<?php else: ?>
|
||||
<?php echo $article['content']; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
40
module/blog/view/option/option.js.php
Normal file
40
module/blog/view/option/option.js.php
Normal file
@ -0,0 +1,40 @@
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Rémi Jean <remi.jean@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
||||
$(document).ready(function() {
|
||||
// Gestion du changement de la case "Afficher la date"
|
||||
$('#blogOptionShowDate').change(function() {
|
||||
var showDateChecked = $(this).is(':checked');
|
||||
|
||||
// Afficher ou masquer le wrapper de l'heure selon l'état de la date
|
||||
if (showDateChecked) {
|
||||
$('.timeWrapper').show();
|
||||
} else {
|
||||
$('.timeWrapper').hide();
|
||||
// Désactiver l'option "Afficher l'heure" lorsque la date est désactivée
|
||||
$('#blogOptionShowTime').prop('checked', false).trigger('change');
|
||||
}
|
||||
|
||||
// Afficher ou masquer le format de la date
|
||||
$('#blogOptionDateFormatWrapper').toggle(showDateChecked);
|
||||
}).trigger('change'); // Déclenchement au chargement de la page
|
||||
|
||||
// Gestion du changement de la case "Afficher l'heure"
|
||||
$('#blogOptionShowTime').change(function() {
|
||||
var showTimeChecked = $(this).is(':checked');
|
||||
|
||||
// Afficher ou masquer le format de l'heure
|
||||
$('#blogOptionTimeFormatWrapper').toggle(showTimeChecked);
|
||||
}).trigger('change'); // Déclenchement au chargement de la page
|
||||
});
|
@ -19,30 +19,22 @@
|
||||
</h4>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::select('blogOptionArticlesLayout', $module::$articlesLayout, [
|
||||
'label' => 'Disposition',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'layout'])
|
||||
<?php echo template::checkbox('blogOptionShowDate', true, 'Afficher la date', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showDate']),
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::select('blogOptionArticlesLenght', $module::$articlesLenght, [
|
||||
'label' => 'Aperçus',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
<?php echo template::select('blogOptionItemsperPage', $module::$ArticlesListed, [
|
||||
'label' => 'Articles par page',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
<?php echo template::select('blogOptionDateFormat', $module::$dateFormats, [
|
||||
'label' => 'Format des dates',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
<div class="col3 timeWrapper">
|
||||
<?php echo template::checkbox('blogOptionShowTime', true, 'Afficher l\'heure', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showTime']),
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3 timeWrapper">
|
||||
<?php echo template::select('blogOptionTimeFormat', $module::$timeFormats, [
|
||||
'label' => 'Format des heures',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat'])
|
||||
@ -50,19 +42,39 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('blogOptionShowFeeds', true, 'Lien du flux RSS', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'feeds']),
|
||||
<div class="col4">
|
||||
<?php echo template::select('blogOptionArticlesLayout', $module::$articlesLayout, [
|
||||
'label' => 'Disposition',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'layout'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col4">
|
||||
<?php echo template::select('blogOptionArticlesLenght', $module::$articlesLenght, [
|
||||
'label' => 'Aperçus',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'articlesLenght'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col4">
|
||||
<?php echo template::select('blogOptionItemsperPage', $module::$ArticlesListed, [
|
||||
'label' => 'Articles par page',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage'])
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('newsOptionButtonBack', true, 'Bouton de retour', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'buttonBack'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('blogOptionShowFeeds', true, 'Lien du flux RSS', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'feeds']),
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php echo template::text('blogOptionFeedslabel', [
|
||||
'label' => 'Texte de l\'étiquette',
|
||||
'label' => 'Texte de l\'étiquette RSS',
|
||||
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel'])
|
||||
]); ?>
|
||||
</div>
|
||||
|
@ -27,8 +27,6 @@ $( document ).ready(function() {
|
||||
serializeRegexp: ""
|
||||
});
|
||||
|
||||
console.log($("#galleryEditSort").val());
|
||||
|
||||
if ($("#galleryEditSort").val() !== "SORT_HAND") {
|
||||
$("#galleryTable tr").addClass("nodrag nodrop");
|
||||
$(".zwiico-sort").hide();
|
||||
|
@ -1,3 +1,6 @@
|
||||
# Versions 6.0
|
||||
- Ajoute deux nouvelles options pour afficher ou masquer la date et l'heure de l'article.
|
||||
- Corrige un mauvais format de la propriété buttonBack non stockée au type booléen.
|
||||
# Versions 5.9
|
||||
- Largeur d'un bouton de retour.
|
||||
# Versions 5.7 - 5.8
|
||||
|
@ -16,7 +16,7 @@
|
||||
class news extends common
|
||||
{
|
||||
|
||||
const VERSION = '5.9';
|
||||
const VERSION = '6.0';
|
||||
const REALNAME = 'News';
|
||||
const DATADIRECTORY = self::DATA_DIR . 'news/';
|
||||
|
||||
@ -128,7 +128,8 @@ class news extends common
|
||||
$feeds->setLink(helper::baseUrl() . $this->getUrl(0));
|
||||
if ($this->getData(['page', $this->getUrl(0), 'metaDescription'])) {
|
||||
$feeds->setDescription($this->getData(['page', $this->getUrl(0), 'metaDescription']));
|
||||
};
|
||||
}
|
||||
;
|
||||
$feeds->setChannelElement('language', 'fr-FR');
|
||||
$feeds->setDate(date('r', time()));
|
||||
$feeds->addGenerator();
|
||||
@ -174,7 +175,8 @@ class news extends common
|
||||
$publishedOn = $this->getInput('newsAddPublishedOn', helper::FILTER_DATETIME, true);
|
||||
$publishedOff = $this->getInput('newsAddPublishedOff') ? $this->getInput('newsAddPublishedOff', helper::FILTER_DATETIME) : '';
|
||||
$this->setData([
|
||||
'module', $this->getUrl(0),
|
||||
'module',
|
||||
$this->getUrl(0),
|
||||
'posts',
|
||||
$newsId,
|
||||
[
|
||||
@ -288,7 +290,8 @@ class news extends common
|
||||
// Fin feuille de style
|
||||
|
||||
$this->setData([
|
||||
'module', $this->getUrl(0),
|
||||
'module',
|
||||
$this->getUrl(0),
|
||||
'theme',
|
||||
[
|
||||
'style' => $success ? self::DATADIRECTORY . $this->getUrl(0) . '/theme.css' : '',
|
||||
@ -300,7 +303,8 @@ class news extends common
|
||||
]);
|
||||
|
||||
$this->setData([
|
||||
'module', $this->getUrl(0),
|
||||
'module',
|
||||
$this->getUrl(0),
|
||||
'config',
|
||||
[
|
||||
'feeds' => $this->getInput('newsOptionShowFeeds', helper::FILTER_BOOLEAN),
|
||||
@ -310,7 +314,9 @@ class news extends common
|
||||
'height' => $this->getInput('newsOptionHeight', helper::FILTER_INT, true),
|
||||
'dateFormat' => $this->getInput('newsOptionDateFormat'),
|
||||
'timeFormat' => $this->getInput('newsOptionTimeFormat'),
|
||||
'buttonBack' => $this->getInput('newsOptionButtonBack'),
|
||||
'buttonBack' => $this->getInput('newsOptionButtonBack', helper::FILTER_BOOLEAN),
|
||||
'showDate' => $this->getInput('newsOptionShowDate', helper::FILTER_BOOLEAN),
|
||||
'showTime' => $this->getInput('newsOptionShowTime', helper::FILTER_BOOLEAN),
|
||||
'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']),
|
||||
]
|
||||
]);
|
||||
@ -318,7 +324,7 @@ class news extends common
|
||||
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/option',
|
||||
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
|
||||
'notification' => helper::translate('Modifications enregistrées'),
|
||||
'state' => true
|
||||
]);
|
||||
@ -428,7 +434,8 @@ class news extends common
|
||||
$publishedOn = $this->getInput('newsEditPublishedOn', helper::FILTER_DATETIME, true);
|
||||
$publishedOff = $this->getInput('newsEditPublishedOff') ? $this->getInput('newsEditPublishedOff', helper::FILTER_DATETIME) : '';
|
||||
$this->setData([
|
||||
'module', $this->getUrl(0),
|
||||
'module',
|
||||
$this->getUrl(0),
|
||||
'posts',
|
||||
$newsId,
|
||||
[
|
||||
@ -490,6 +497,8 @@ class news extends common
|
||||
}
|
||||
// L'article existe
|
||||
else {
|
||||
self::$dateFormat = $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat']);
|
||||
self::$timeFormat = $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat']);
|
||||
self::$articleSignature = $this->signature($this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'userId']));
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
@ -609,6 +618,14 @@ class news extends common
|
||||
// Mettre à jour la version
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'versionData', '5.3']);
|
||||
}
|
||||
// Mise à jour 6.0
|
||||
if (version_compare($versionData, '6.0', '<')) {
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'buttonBack', true]);
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'showTime', true]);
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'showDate', true]);
|
||||
// Mettre à jour la version
|
||||
$this->setData(['module', $this->getUrl(0), 'config', 'versionData', '6.0']);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -12,12 +12,28 @@
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<div class="col6 newsDate textAlignRight">
|
||||
<!-- bloc signature et date -->
|
||||
<!-- bloc signature -->
|
||||
<?php echo template::ico('user'); ?>
|
||||
<?php echo $module::$articleSignature . ' - '; ?>
|
||||
<?php echo template::ico('calendar-empty'); ?>
|
||||
<?php echo helper::dateUTF8('%d %B %Y', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI) . ' ' . helper::dateUTF8('%H:%M', $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
|
||||
<!-- Bloc edition -->
|
||||
<?php echo $module::$articleSignature; ?>
|
||||
<!-- bloc date -->
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?>
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo ' - '; ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?> <!-- Bloc edition -->
|
||||
<?php if (
|
||||
$this->isConnected() === true
|
||||
and
|
||||
@ -25,15 +41,13 @@
|
||||
($this->getUser('group') === self::GROUP_ADMIN)
|
||||
)
|
||||
): ?>
|
||||
-
|
||||
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1); ?>">
|
||||
<?php echo template::ico('pencil'); ?>
|
||||
<?php echo template::ico('pencil', ['margin' => 'left']); ?>
|
||||
<?php echo helper::translate('Éditer'); ?>
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
<!-- Bloc RSS-->
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'feeds'])): ?>
|
||||
-
|
||||
<div id="rssFeed">
|
||||
<a type="application/rss+xml" href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>"
|
||||
target="_blank">
|
||||
|
@ -1,5 +1,6 @@
|
||||
<?php if ($module::$news): ?>
|
||||
<link rel="stylesheet" type="text/css" href="<?php echo helper::baseUrl(false) . $this->getData(['module', $this->getUrl(0), 'theme', 'style']);?> "/>
|
||||
<link rel="stylesheet" type="text/css"
|
||||
href="<?php echo helper::baseUrl(false) . $this->getData(['module', $this->getUrl(0), 'theme', 'style']); ?> " />
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'feeds'])): ?>
|
||||
<div id="rssFeed">
|
||||
<a type="application/rss+xml" href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/rss'; ?>" target="_blank">
|
||||
@ -20,10 +21,28 @@
|
||||
<?php echo '<a href="' . helper::baseUrl(true) . $this->getUrl(0) . '/' . $newsId . '">' . $news['title'] . '</a>'; ?>
|
||||
</h2>
|
||||
<div class="newsSignature">
|
||||
<!-- bloc signature -->
|
||||
<?php echo template::ico('user'); ?>
|
||||
<?php echo $news['userId'] . ' - '; ?>
|
||||
<?php echo template::ico('calendar-empty'); ?>
|
||||
<?php echo helper::dateUTF8($module::$dateFormat, $news['publishedOn'], self::$i18nUI) . ' ' . helper::dateUTF8($module::$timeFormat, $news['publishedOn'], self::$i18nUI); ?>
|
||||
<?php echo $news['userId']; ?>
|
||||
<!-- bloc Date -->
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
|| $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo template::ico('calendar-empty', ['margin' => 'left']); ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$dateFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?>
|
||||
<?php if (
|
||||
$this->getData(['module', $this->getUrl(0), 'config', 'showDate']) === true
|
||||
&& $this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true
|
||||
): ?>
|
||||
<?php echo ' - '; ?>
|
||||
<?php endif; ?>
|
||||
<?php if ($this->getData(['module', $this->getUrl(0), 'config', 'showTime']) === true): ?>
|
||||
<?php echo helper::dateUTF8($module::$timeFormat, $this->getData(['module', $this->getUrl(0), 'posts', $this->getUrl(1), 'publishedOn']), self::$i18nUI); ?>
|
||||
<?php endif; ?>
|
||||
<!-- Bloc edition -->
|
||||
<?php if (
|
||||
$this->isConnected() === true
|
||||
@ -32,10 +51,8 @@
|
||||
($this->getUser('group') === self::GROUP_ADMIN)
|
||||
)
|
||||
): ?>
|
||||
-
|
||||
<a
|
||||
href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsId; ?>">
|
||||
<?php echo template::ico('pencil'); ?> Éditer
|
||||
<a href="<?php echo helper::baseUrl() . $this->getUrl(0) . '/edit/' . $newsId; ?>">
|
||||
<?php echo template::ico('pencil', ['margin' => 'left']); ?> Éditer
|
||||
</a>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
@ -51,7 +68,6 @@
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
|
||||
</div>
|
||||
</article>
|
||||
<?php echo $module::$pages; ?>
|
||||
|
40
module/news/view/option/option.js.php
Normal file
40
module/news/view/option/option.js.php
Normal file
@ -0,0 +1,40 @@
|
||||
/**
|
||||
* This file is part of Zwii.
|
||||
*
|
||||
* For full copyright and license information, please see the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*
|
||||
* @author Rémi Jean <remi.jean@outlook.com>
|
||||
* @copyright Copyright (C) 2008-2018, Rémi Jean
|
||||
* @author Frédéric Tempez <frederic.tempez@outlook.com>
|
||||
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
|
||||
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
|
||||
* @link http://zwiicms.fr/
|
||||
*/
|
||||
|
||||
$(document).ready(function() {
|
||||
// Gestion du changement de la case "Afficher la date"
|
||||
$('#newsOptionShowDate').change(function() {
|
||||
var showDateChecked = $(this).is(':checked');
|
||||
|
||||
// Afficher ou masquer le wrapper de l'heure selon l'état de la date
|
||||
if (showDateChecked) {
|
||||
$('.timeWrapper').show();
|
||||
} else {
|
||||
$('.timeWrapper').hide();
|
||||
// Désactiver l'option "Afficher l'heure" lorsque la date est désactivée
|
||||
$('#newsOptionShowTime').prop('checked', false).trigger('change');
|
||||
}
|
||||
|
||||
// Afficher ou masquer le format de la date
|
||||
$('#newsOptionDateFormatWrapper').toggle(showDateChecked);
|
||||
}).trigger('change'); // Déclenchement au chargement de la page
|
||||
|
||||
// Gestion du changement de la case "Afficher l'heure"
|
||||
$('#newsOptionShowTime').change(function() {
|
||||
var showTimeChecked = $(this).is(':checked');
|
||||
|
||||
// Afficher ou masquer le format de l'heure
|
||||
$('#newsOptionTimeFormatWrapper').toggle(showTimeChecked);
|
||||
}).trigger('change'); // Déclenchement au chargement de la page
|
||||
});
|
@ -16,22 +16,9 @@
|
||||
<div class="block">
|
||||
<h4><?php echo helper::translate('Paramètres'); ?></h4>
|
||||
<div class="row">
|
||||
<div class="col2">
|
||||
<?php echo template::select('newsOptionItemsperCol', $module::$columns, [
|
||||
'label' => 'Nombre de colonnes',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperCol'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
<?php echo template::select('newsOptionItemsperPage', $module::$itemsList, [
|
||||
'label' => 'Articles par page',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0),'config', 'itemsperPage'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col2">
|
||||
<?php echo template::select('newsOptionHeight', $module::$height, [
|
||||
'label' => 'Abrégé de l\'article',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0),'config', 'height'])
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('newsOptionShowDate', true, 'Afficher la date', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showDate']),
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
@ -40,7 +27,12 @@
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'dateFormat'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<div class="col3 timeWrapper">
|
||||
<?php echo template::checkbox('newsOptionShowTime', true, 'Afficher l\'heure', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'showTime']),
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3 timeWrapper">
|
||||
<?php echo template::select('newsOptionTimeFormat', $module::$timeFormats, [
|
||||
'label' => 'Format des heures',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'timeFormat'])
|
||||
@ -48,20 +40,40 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col4">
|
||||
<?php echo template::select('newsOptionItemsperCol', $module::$columns, [
|
||||
'label' => 'Nombre de colonnes',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperCol'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col4">
|
||||
<?php echo template::select('newsOptionItemsperPage', $module::$itemsList, [
|
||||
'label' => 'Articles par page',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'itemsperPage'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col4">
|
||||
<?php echo template::select('newsOptionHeight', $module::$height, [
|
||||
'label' => 'Abrégé de l\'article',
|
||||
'selected' => $this->getData(['module', $this->getUrl(0), 'config', 'height'])
|
||||
]); ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('newsOptionButtonBack', true, 'Bouton de retour', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'buttonBack'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('newsOptionShowFeeds', true, 'Lien du flux RSS', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'feeds']),
|
||||
'help' => 'Flux limité aux articles de la première page.'
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col3">
|
||||
<?php echo template::checkbox('newsOptionButtonBack', true, 'Bouton de retour', [
|
||||
'checked' => $this->getData(['module', $this->getUrl(0), 'config', 'buttonBack'])
|
||||
]); ?>
|
||||
</div>
|
||||
<div class="col6">
|
||||
<?php echo template::text('newsOptionFeedslabel', [
|
||||
'label' => 'Étiquette RSS',
|
||||
'label' => 'Texte de l\'étiquette RSS',
|
||||
'value' => $this->getData(['module', $this->getUrl(0), 'config', 'feedsLabel'])
|
||||
]); ?>
|
||||
</div>
|
||||
|
@ -0,0 +1,9 @@
|
||||
# Version 2.3
|
||||
- Warning lors de la saisie d'un email vide
|
||||
# Version 2.2
|
||||
- Ajoute la gestion des profils
|
||||
# Version 2.1
|
||||
- N'envoie pas d'email lorsque le domaine est invalide.
|
||||
- Corrige la validation de domaines multiples séparés par des points virgules.
|
||||
# Version 2.0
|
||||
- trop de corrections.
|
@ -1 +1 @@
|
||||
{"name":"suscribe","realName":"Auto inscription","version":"2.00","update":"0.0","delete":true,"dataDirectory":""}
|
||||
{"name":"suscribe","realName":"Auto Inscription","version":"2.3","update":"0.0","delete":true,"dataDirectory":""}
|
@ -15,7 +15,7 @@
|
||||
class suscribe extends common
|
||||
{
|
||||
|
||||
const VERSION = '2.0';
|
||||
const VERSION = '2.3';
|
||||
const REALNAME = 'Auto Inscription';
|
||||
const DELETE = true;
|
||||
const UPDATE = '0.0';
|
||||
@ -243,19 +243,34 @@ class suscribe extends common
|
||||
*/
|
||||
// Soumission du formulaire
|
||||
if ($this->isPost()) {
|
||||
// Le domaine saisi est invalide si un filtre existe
|
||||
if (
|
||||
!empty($this->getData(['module', $this->getUrl(0), 'config', 'filter']))
|
||||
) {
|
||||
// Contrôler la validité du domaine saisi parmi les domaines valides
|
||||
$email_to_check = $this->getInput('registrationAddMail', helper::FILTER_MAIL, true);
|
||||
$valid_domains[] = strpos($this->getData(['module', $this->getUrl(0), 'config', 'filter']), ';') === false
|
||||
? $this->getData(['module', $this->getUrl(0), 'config', 'filter'])
|
||||
: explode(';', $this->getData(['module', $this->getUrl(0), 'config', 'filter']));
|
||||
if (in_array(explode('@', $email_to_check)[1], $valid_domains) === false) {
|
||||
// Le domaine saisi est invalide si un filtre existe
|
||||
if (
|
||||
empty($this->getData(['module', $this->getUrl(0), 'config', 'filter'])) === true &&
|
||||
empty($email_to_check) === true
|
||||
) {
|
||||
|
||||
|
||||
// Récupérer la liste des domaines valides depuis la configuration et supprimer les espaces autour
|
||||
$filter = trim($this->getData(['module', $this->getUrl(0), 'config', 'filter']));
|
||||
|
||||
// Vérifier si la liste contient plusieurs domaines ou un seul, puis supprimer les espaces pour chaque domaine
|
||||
$valid_domains = strpos($filter, ';') === false
|
||||
? [trim($filter)] // Si un seul domaine, on supprime les espaces et on le met dans un tableau
|
||||
: array_map('trim', explode(';', $filter)); // Si plusieurs domaines, on les explose en tableau et supprime les espaces
|
||||
|
||||
// Extraire le domaine de l'adresse email à vérifier
|
||||
$email_domain = explode('@', $email_to_check)[1];
|
||||
|
||||
// Vérifier si le domaine de l'email est dans la liste des domaines valides
|
||||
if (!in_array($email_domain, $valid_domains)) {
|
||||
self::$inputNotices['registrationAddMail'] = 'Ce domaine n\'est pas autorisé';
|
||||
}
|
||||
|
||||
}
|
||||
// Email valide, on continue le traitement
|
||||
if (self::$inputNotices === []) {
|
||||
// Drapeau de contrôle des données saisies.
|
||||
$check = true;
|
||||
$sentMailtoUser = false;
|
||||
@ -351,6 +366,7 @@ class suscribe extends common
|
||||
'state' => $sentMailtoUser ? true : false
|
||||
]);
|
||||
}
|
||||
}
|
||||
// Valeurs en sortie
|
||||
$this->addOutput([
|
||||
'title' => 'Inscription',
|
||||
|
Loading…
Reference in New Issue
Block a user