Compare commits

..

53 Commits

Author SHA1 Message Date
9356a75946 Bug User Import userId undefine 2025-01-09 19:56:40 +01:00
845afe7dbb 1.17.01 2025-01-08 22:49:46 +01:00
8bfcb0163a Merge branch 'master' of https://forge.chapril.org/ZwiiCMS-Team/ZwiiCampus 2025-01-08 22:46:54 +01:00
057b5f7dd8 Bug de redirection 2025-01-08 22:46:15 +01:00
Fred Tempez
549f752aea Readme 17 2025-01-06 18:15:38 +01:00
Fred Tempez
07d57d83ac readme 16.1 2025-01-06 18:15:09 +01:00
Fred Tempez
85f6c43d79 revert sitemapgenerator v5 2025-01-06 18:08:00 +01:00
Fred Tempez
8a07bf69a7 revert sitemapGenerator v5 2025-01-06 18:07:42 +01:00
Fred Tempez
978bfb2cdc 1.17 RFM $fldr non défini 2025-01-06 17:38:20 +01:00
Fred Tempez
b297e2072d Update sitemap v5 2025-01-06 16:39:49 +01:00
Fred Tempez
018b3ebc5e 1.17 siteMap v5 2025-01-06 16:37:32 +01:00
Fred Tempez
b74f0a8949 1.16.02 erreur de type $db 2025-01-06 16:24:01 +01:00
Fred Tempez
d12d7b6ddb 1.16.02 Remplacement du nom générique de classe dans les vues. 2025-01-06 16:20:55 +01:00
Fred Tempez
1a746acfec Remplacement du nom générique de classe dans les vues des modules 2025-01-06 16:19:43 +01:00
Fred Tempez
b147f44776 - Remplacement du nom générique de classe dans les vues. 2025-01-06 16:17:44 +01:00
Fred Tempez
9b92e29a96 Libellé : clé de sécurité 2025-01-06 15:54:20 +01:00
Fred Tempez
6104123582 Suscribe 2.6 2025-01-05 18:00:52 +01:00
Fred Tempez
3736c2ebc9 suscribe 2.6 2025-01-05 17:58:54 +01:00
384dc2503b Supprime détection erreur objet db 2025-01-03 22:09:37 +01:00
b5ba4e755b 1.16.01 bug installation page par défaut 2025-01-03 21:59:43 +01:00
Fred Tempez
2a44e130f5 Editeur et admins ont accès aux stattistiques 2025-01-02 16:48:51 +01:00
Fred Tempez
65c9aa167d 1.16 Nom des espaces en clair dans la gestion des espaces
Lecture des statitiques par les membres :
- pas depuis un espace ouvert
- pas d'export pour les membres
2025-01-01 15:58:45 +01:00
Fred Tempez
fb06720a00 Consultation par les utilisateurs de leur rapport de stat WIP
Manque l'export du rapport
2024-12-31 16:39:00 +01:00
Fred Tempez
23187d463f La hauteur du menu est géré par lquery et non par le theme 2024-12-31 09:22:27 +01:00
Fred Tempez
aa9c231327 1.16 Fixe la hauteur maximale de la barre de menu 2024-12-30 23:21:45 +01:00
Fred Tempez
3b661fa9e2 1.16.00
- Nouvelle option de masquage des pages dans le menu lorsque les pages sont listées dans une barre latérale et que le menu ne doit afficher que les commandes extra
- Remplace les variables $module par le nom de la classe
2024-12-30 20:52:41 +01:00
1899d2f260 1.15.04 bug formulaire config 2024-12-23 21:11:54 +01:00
46fd26c5c8 changes 2024-12-23 15:35:50 +01:00
58b4ca15c6 Filtrage champ de saisie clé 2024-12-23 15:33:09 +01:00
b85a0bfa78 2018-2025 2024-12-23 15:24:37 +01:00
0e42a15ae1 1.15.03 Messages de redirection 2024-12-23 15:21:28 +01:00
d00770967e 1.15.02 Configuration du site, la page ne se recharge plus après un changement d'onglet.
Le dernier onglet vu avant un submit est mémorisé.
Mise à jour module suscribe 2.4
2024-12-21 22:46:53 +01:00
ff5edbc47c 1.15.02 Edition d'une page module supprimé 2024-12-21 21:52:20 +01:00
b50842b331 1.15.02 Bugs mise à jour des langues et activation édition des langues 2024-12-20 22:01:04 +01:00
be01fa9414 Edition de la traduction 2024-12-20 21:58:25 +01:00
73229b4726 Bug téléchargement descripteur de langues 2024-12-20 21:38:24 +01:00
926e8ea45c Supprime flatpickr dans les vendors 2024-12-20 21:35:36 +01:00
91bb26667f 1.15.01 La double authentification se désactive si le serveur smtp n'est pas joignable 2024-12-19 22:01:30 +01:00
13f7203054 1.15.01 stockage de la langue d'installation dans la configuration conformémeent aux modifications de ZwiiCMS 2024-12-10 16:05:19 +01:00
ed3779b6a0 1.15.01 Langue sélectionnée à l'installation quand le bouton back est cliqué 2024-12-09 21:14:04 +01:00
c157ae9f41 Libellé 2024-12-09 11:17:49 +01:00
27ec459730 1.15 Double authentification
Thème de la fenêtre auth et aussi de login
2024-12-07 18:10:59 +01:00
dcb1ee360d Merge branch 'master' of https://forge.chapril.org/ZwiiCMS-Team/ZwiiCampus 2024-12-07 17:28:03 +01:00
cdc5293580 1.15 Double authentification par email 2024-12-07 17:27:59 +01:00
dfdda38b1c 1.15
Ajout d'espace : statistiques actives  par défaut.

Libellé et aide des rapports de consultations
2024-12-07 14:53:50 +01:00
9bf614fcc5 1.15 formulaire add espace option rapport 2024-12-06 20:19:21 +01:00
9dba1b8e79 1.15
Nouvelle focntionnalité pour activer ou désactiver l'enregistrement des rapports individuels.
2024-12-06 18:58:49 +01:00
124aeeeb98 1.15 Nouveu calcule de la progression dans un espace 2024-12-06 18:20:36 +01:00
7d8d0d7a18 1.15 warning RFM sur espace home 2024-12-06 17:59:49 +01:00
ab89016836 Commente le calcul au fil de l'au de la progression 2024-12-05 19:05:51 +01:00
f172eb4961 1.14.09 bug de folder dans RFM 2024-12-05 18:46:45 +01:00
276950b117 1.14.09 Corrige la méthode de backup 2024-12-05 18:09:18 +01:00
0c8c9f89fd 1.14.09 Suivi de la progression dans enrolment en suspend. 2024-12-05 17:55:27 +01:00
286 changed files with 2666 additions and 2124 deletions

View File

@ -1,4 +1,4 @@
# ZwiiCampus 1.14.07
# ZwiiCampus 1.17.01
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é.

View File

@ -197,14 +197,20 @@ class helper
public static function autoBackup($folder, $filter = ['backup', 'tmp'])
{
// Creation du ZIP
// Création du nom de fichier ZIP
$baseName = str_replace('/', '', helper::baseUrl(false, false));
$baseName = empty($baseName) ? 'ZwiiCMS' : $baseName;
$fileName = $baseName . '-backup-' . date('Y-m-d-H-i-s', time()) . '.zip';
$fileName = $baseName . '-backup-' . date('Y-m-d-H-i-s') . '.zip';
// Initialisation de l'archive ZIP
$zip = new ZipArchive();
$zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE);
if ($zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== true) {
return false; // Retourne false si l'ouverture échoue
}
$directory = 'site/';
//$filter = array('backup','tmp','file');
// Récupération des fichiers et des dossiers
$files = new RecursiveIteratorIterator(
new RecursiveCallbackFilterIterator(
new RecursiveDirectoryIterator(
@ -212,23 +218,28 @@ class helper
RecursiveDirectoryIterator::SKIP_DOTS
),
function ($fileInfo, $key, $iterator) use ($filter) {
return $fileInfo->isFile() || !in_array($fileInfo->getBaseName(), $filter);
// Inclure les fichiers ou les répertoires non filtrés
return $fileInfo->isFile() || ($fileInfo->isDir() && !in_array($fileInfo->getBaseName(), $filter));
}
)
);
foreach ($files as $name => $file) {
// Ajout des fichiers à l'archive
foreach ($files as $file) {
if (!$file->isDir()) {
$filePath = $file->getRealPath();
$relativePath = substr($filePath, strlen(realpath($directory)) + 1);
$relativePath = str_replace(DIRECTORY_SEPARATOR, '/', substr($filePath, strlen(realpath($directory)) + 1));
$zip->addFile($filePath, $relativePath);
}
}
// Fermeture de l'archive ZIP
$zip->close();
return ($fileName);
return $fileName;
}
/**
* Retourne la liste des modules installés dans un tableau composé
* du nom réel

View File

@ -21,7 +21,7 @@ class Dot implements \ArrayAccess, \Iterator, \Countable
*
* @param array|null $data Data
*/
public function __construct(array $data = null)
public function __construct(?array $data = null)
{
if (is_array($data)) {
$this->data = $data;
@ -101,7 +101,7 @@ class Dot implements \ArrayAccess, \Iterator, \Countable
}
} else {
// Iterate path
$keys = explode('.', (string) $key);
$keys = explode('.', (string)$key);
if ($pop === true) {
array_pop($keys);
}
@ -199,7 +199,7 @@ class Dot implements \ArrayAccess, \Iterator, \Countable
*/
public function has($key)
{
$keys = explode('.', (string) $key);
$keys = explode('.', (string)$key);
$data = &$this->data;
foreach ($keys as $key) {
if (!isset($data[$key])) {
@ -371,7 +371,7 @@ class Dot implements \ArrayAccess, \Iterator, \Countable
*/
public function isEmpty(): bool
{
return !(bool) count($this->data);
return !(bool)count($this->data);
}
/**
@ -391,7 +391,7 @@ class Dot implements \ArrayAccess, \Iterator, \Countable
*/
public function toJson()
{
return json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
return json_encode($this->data, JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
}
/**

View File

@ -143,7 +143,7 @@ class JsonDb extends \Prowebcraft\Dot
public function save()
{
// Encode les données au format JSON avec les options spécifiées
$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
$encoded_data = json_encode($this->data, JSON_UNESCAPED_UNICODE | JSON_FORCE_OBJECT);
// Vérifie la longueur de la chaîne JSON encodée
$encoded_length = strlen($encoded_data);

View File

@ -363,8 +363,9 @@ class layout extends common
$this->getUser('permission', 'filemanager') === true
&& $this->getUser('permission', 'folder', (self::$siteContent === 'home' ? 'homePath' : 'coursePath')) !== 'none'
) {
$folder = '&fldr=/' . (self::$siteContent === 'home' ? '' : self::$siteContent);
$items .= '<wbr>' . template::ico('folder', [
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']) . '&fldr=/' . self::$siteContent,
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']) . $folder,
'margin' => 'all',
'attr' => 'data-lity',
'help' => 'Fichiers du site'
@ -495,7 +496,7 @@ class layout extends common
public function showMenu()
{
// Met en forme les items du menu
$itemsLeft = $this->formatMenu(false);
$itemsLeft = $this->formatMenu();
// Menu extra
$itemsRight = $this->formatMenu(true);
@ -518,6 +519,46 @@ class layout extends common
}
}
/**
* Affiche le bouton d'affichage des rapports individuels de consultation
*/
if (
$this->getData(['theme', 'menu', 'userReport']) === true
&& self::$siteContent !== 'home'
// Pas de statistiques pour les espaces ouverts
&& $this->getData(['course', self::$siteContent, 'enrolment']) >= 1
) {
$href = '';
switch ($this->getUser('group')) {
case self::GROUP_MEMBER:
$href = helper::baseUrl() . 'course/userReport/' . self::$siteContent . '/' . $this->getUser('id');
break;
case self::GROUP_EDITOR:
if (
$this->getData(['enrolment', self::$siteContent ]) && ($this->getUser('id') === $this->getData(['course', self::$siteContent , 'author']))
// Permission d'accéder aux espaces dans lesquels le membre est inscrit
||
($this->getData(['enrolment', self::$siteContent ])
&& $this->getUser('permission', __CLASS__, 'tutor') === true
&& array_key_exists($this->getUser('id'), $this->getData(['enrolment', self::$siteContent ])))
)
{
$href = helper::baseUrl() . 'course/users/' . self::$siteContent;
}
break;
case self::GROUP_ADMIN:
$href = helper::baseUrl() . 'course/users/' . self::$siteContent;
}
if ($href) {
$itemsRight .= '<li>' . template::ico('chart-line', [
'help' => 'Rapport des consultations',
'margin' => 'all',
'href' => $href
]) . '</li>';
}
}
/**
* Commandes pour les membres simples
* Affichage des boutons gestionnaire de fichiers et mon compte
@ -532,8 +573,9 @@ class layout extends common
$this->getUser('permission', 'filemanager') === true
&& $this->getUser('permission', 'folder', (self::$siteContent === 'home' ? 'homePath' : 'coursePath')) !== 'none'
) {
$folder = '&fldr=/' . (self::$siteContent === 'home' ? '' : self::$siteContent);
$itemsRight .= '<li>' . template::ico('folder', [
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']) . '&fldr=/' . self::$siteContent,
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']) . $folder,
'attr' => 'data-lity',
'help' => 'Fichiers du site'
]) . '</li>';
@ -587,7 +629,7 @@ class layout extends common
// Menu extra ou standard
if (
// Absence de la position extra, la page est toujours affichée à gauche.
// Absence de la position extra, la page est toujours affichée à gauche.
($this->getData(['page', $parentPageId, 'extraPosition']) !== NULL || $extra === true)
&&
$this->getData(['page', $parentPageId, 'extraPosition']) !== $extra
@ -1021,8 +1063,8 @@ class layout extends common
// Sur une page sans module
or $this->getData(['page', $this->getUrl(0), 'moduleId']) === ''
// Sur une page avec un module invalide
or (!is_null($this->getData(['page', $this->getUrl(2), 'moduleId'])) &&
!class_exists($this->getData(['page', $this->getUrl(2), 'moduleId']))
or (empty($this->getData(['page', $this->getUrl(0), 'moduleId'])) === false
and class_exists($this->getData(['page', $this->getUrl(0), 'moduleId'])) === false
)
// Sur une page d'accueil
or $this->getUrl(0) === ''
@ -1042,6 +1084,7 @@ class layout extends common
$this->getUser('permission', 'page', 'module')
and $this->geturl(1) !== 'edit'
and $this->getData(['page', $this->getUrl(0), 'moduleId'])
and class_exists($this->getData(['page', $this->getUrl(0), 'moduleId'])) === true
) {
$leftItems .= '<li>' . template::ico('gear', [
'href' => helper::baseUrl() . $this->getUrl(0) . '/config',
@ -1084,9 +1127,10 @@ class layout extends common
)
|| $this->getUser('group') === self::GROUP_ADMIN
) {
$folder = '&fldr=/' . (self::$siteContent === 'home' ? '' : self::$siteContent);
$rightItems .= '<li>' . template::ico('folder', [
'help' => 'Fichiers',
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']) . '&fldr=/' . self::$siteContent,
'href' => helper::baseUrl(false) . 'core/vendor/filemanager/dialog.php?type=0&akey=' . md5_file(self::DATA_DIR . 'core.json') . '&lang=' . $this->getData(['user', $this->getUser('id'), 'language']) . $folder,
'attr' => 'data-lity'
]) . '</li>';
}
@ -1227,7 +1271,6 @@ class layout extends common
if ($style) {
echo '<style type="text/css">' . helper::minifyCss(htmlspecialchars_decode($style)) . '</style>';
}
}
}
}
@ -1359,4 +1402,4 @@ class layout extends common
$items .= '</div></div></div>';
echo $items;
}
}
}

View File

@ -251,6 +251,25 @@ class core extends common
}
$css .= '#toggle span,#menu a{padding:' . $this->getData(['theme', 'menu', 'height']) . ';font-family:' . $fonts[$this->getData(['theme', 'menu', 'font'])] . ';font-weight:' . $this->getData(['theme', 'menu', 'fontWeight']) . ';font-size:' . $this->getData(['theme', 'menu', 'fontSize']) . ';text-transform:' . $this->getData(['theme', 'menu', 'textTransform']) . '}';
// Déterminer la hauteur max du menu pour éviter les débordements
$padding = $this->getData(['theme', 'menu', 'height']); // Par exemple, "10px 20px"
$fontSize = (float) $this->getData(['theme', 'text', 'fontSize']); // Taille de référence en pixels
$menuFontSize = (float) $this->getData(['theme', 'menu', 'fontSize']); // Taille du menu en em
// Extraire la première valeur du padding (par exemple "10px 20px" -> "10px")
$firstPadding = (float) explode(" ", $padding)[0]; // Nous prenons la première valeur, supposée être en px
// Convertir menuFontSize (en em) en pixels
$menuFontSizeInPx = $menuFontSize * $fontSize;
// Calculer la hauteur totale
$totalHeight = $firstPadding + $fontSize + $menuFontSizeInPx;
// Fixer la hauteur maximale de la barre de menu
// $css .= '#menuLeft, nav, a.active {max-height:' . $totalHeight . 'px}';
// Pied de page
$colors = helper::colorVariants($this->getData(['theme', 'footer', 'backgroundColor']));
if ($this->getData(['theme', 'footer', 'margin'])) {
@ -409,26 +428,43 @@ class core extends common
exit();
}
// Sauvegarde la dernière page visitée par l'utilisateur connecté et enregistre l'historique des consultations
/*
* Récupère les statistiques de l'utilisateur non admin
* en dehors de home
* et si la connextion est nécessaire et que le membre est connecté
* stocke la progression dans la base des inscriptions
* */
if (
// L'utilisateur est renseigné
$this->getUser('id')
// L'accueil ne stocke pas lea progression
&& common::$siteContent !== 'home'
// La page existe
&& in_array($this->getUrl(0), array_keys($this->getData(['page'])))
// Le userId n'est pas celui d'un admis ni le prof du contenu
// L'espace dispose d'un accès nécessitant un compte
&& $this->getData(['course', self::$siteContent, 'enrolment']) > 0
// Le userId n'est pas celui d'un admis ni le compte d'un gestionnaire de cet espace
&& (
$this->getUser('group') < common::GROUP_ADMIN
|| $this->getUser('id') !== $this->getData(['course', common::$siteContent, 'author'])
)
) {
$course = new course();
// Met à jour la progression de l'utisateur et obtient le nombre de pages vues
$userProgress = $course->setUserProgress(self::$siteContent, $this->getUser('id'));
// Stockage dans les données d'inscription du membre
$this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'progress', $userProgress], false);
// Les rapports sont activés
// Stocke la dernière page vue et sa date de consultation
$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
$file = fopen(common::DATA_DIR . common::$siteContent . '/report.csv', 'a+');
fputcsv($file, [$this->getUser('id'), $this->getUrl(0), time()], ';');
fclose($file);
if ($this->getdata(['course', common::$siteContent, 'report']) === true) {
$this->setData(['enrolment', common::$siteContent, $this->getUser('id'), 'lastPageView', $this->getUrl(0)], false);
$this->setData(['enrolment', common::$siteContent, $this->getUser('id'), 'datePageView', time()]);
}
}
// Journalisation
@ -516,25 +552,9 @@ class core extends common
and $this->getData(['course', self::$siteContent, 'enrolment']) > 0
) {
$_SESSION['ZWII_SITE_CONTENT'] = 'home';
header(header: 'Location:' . helper::baseUrl(true) . 'swap/' . self::$siteContent);
header('Location:' . helper::baseUrl(true) . 'swap/' . self::$siteContent);
exit();
}
/**
* Récupère les statistiques de l'utilisateur non admin
* en dehors de home
* et si la connextion est nécessaire et que le membre est connecté
* stocke la progression dans la base des inscriptions
*
*/
if (
$this->isConnected() === true
and self::$siteContent !== 'home'
and $this->getData(['course', self::$siteContent, 'enrolment']) > 0
) {
$course = new course();
self::$userProgress = $course->userProgress(self::$siteContent, $this->getUser('id'));
$this->setData(['enrolment', self::$siteContent, $this->getUser('id'), 'progress', self::$userProgress ]);
}
}
/**
@ -628,7 +648,6 @@ class core extends common
'inlineStyle' => $inlineStyle,
'inlineScript' => $inlineScript,
]);
}
// Importe le module
else {
@ -857,8 +876,7 @@ class core extends common
// Pour éviter une 404, bascule dans l'espace correct si la page existe dans cet espace.
// Parcourir les espaces y compris l'accueil
foreach (array_merge(['home' => []], $this->getData(['course'])) as $courseId => $value) {
;
foreach (array_merge(['home' => []], $this->getData(['course'])) as $courseId => $value) {;
if (
// l'espace existe
is_dir(common::DATA_DIR . $courseId) &&
@ -913,25 +931,25 @@ class core extends common
]);
}
switch ($this->output['display']) {
// Layout brut
// Layout brut
case common::DISPLAY_RAW:
echo $this->output['content'];
break;
// Layout vide
// Layout vide
case common::DISPLAY_LAYOUT_BLANK:
require 'core/layout/blank.php';
break;
// Affichage en JSON
// Affichage en JSON
case common::DISPLAY_JSON:
header('Content-Type: application/json');
echo json_encode($this->output['content']);
break;
// RSS feed
// RSS feed
case common::DISPLAY_RSS:
header('Content-type: application/rss+xml; charset=UTF-8');
echo $this->output['content'];
break;
// Layout allégé
// Layout allégé
case common::DISPLAY_LAYOUT_LIGHT:
ob_start();
require 'core/layout/light.php';
@ -942,7 +960,7 @@ class core extends common
$content = preg_replace('/[\t ]+/u', ' ', $content);
echo $content;
break;
// Layout principal
// Layout principal
case common::DISPLAY_LAYOUT_MAIN:
ob_start();
require 'core/layout/main.php';
@ -955,4 +973,4 @@ class core extends common
break;
}
}
}
}

View File

@ -369,9 +369,9 @@ class template
'&type=' . $attributes['type'] .
'&akey=' . md5_file(core::DATA_DIR . 'core.json') .
// Ajoute le nom du dossier si la variable est passée
(!empty($attributes['folder']) ? '&fldr=' . $attributes['folder'] : '') .
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '')
. '"
(empty($attributes['folder']) ? '&fldr=/': '&fldr=' . $attributes['folder']) .
($attributes['extensions'] ? '&extensions=' . $attributes['extensions'] : '') .
'"
class="inputFile %s %s"
%s
data-lity

View File

@ -6,7 +6,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -221,7 +221,6 @@ core.start = function () {
var e = new Date();
e.setFullYear(e.getFullYear() + 1);
var expires = "expires=" + e.toUTCString() + ";";
// Stocke le cookie d'acceptation
document.cookie = "ZWII_COOKIE_CONSENT=true; samesite=lax; " + domain + path + expires;
});
@ -254,8 +253,6 @@ core.start = function () {
}
});
/**
* Choix de page dans la barre de membre
*/
@ -372,9 +369,33 @@ core.start = function () {
}
}
}).trigger("resize");
/**
* Masque les pages du menu si demandé dans la configuration du thème du menu
*/
// Option active
var hidePages = "<?php echo $this->getData(['theme', 'menu', 'hidePages'])?>";
// Récupérer les valeurs de dimensions
var padding = "<?php echo $this->getData(['theme', 'menu', 'height'])?>";
var firstPadding = parseFloat(padding.split(" ")[0]); // Convertir la première valeur en nombre
var fontSize = parseFloat("<?php echo $this->getData(['theme', 'text', 'fontSize'])?>"); // Taille du texte
var menuFontSize = parseFloat("<?php echo $this->getData(['theme', 'menu', 'fontSize'])?>"); // Taille du menu
// Convertir menuFontSize en pixels
var menuFontSizeInPx = menuFontSize * fontSize;
// Calculer la hauteur totale
var totalHeight = firstPadding + fontSize + menuFontSizeInPx;
if (hidePages == 1) {
$("#menuLeft").css({
"visibility": "hidden",
"overflow": "hidden",
"max-width": "10px"
});
// Par défaut pour tous les thèmes.
$("#menuLeft, nav").css("max-height", totalHeight + "px");
}
};

View File

@ -8,7 +8,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -51,7 +51,7 @@ class common
const ACCESS_TIMER = 1800;
// Numéro de version
const ZWII_VERSION = '1.14.08';
const ZWII_VERSION = '1.17.01';
// URL autoupdate
const ZWII_UPDATE_URL = 'https://forge.chapril.org/ZwiiCMS-Team/campus-update/raw/branch/master/';
@ -178,7 +178,7 @@ class common
// Espace, contenu sélectionné
public static $siteContent = 'home';
// Progression d'un participant
public static $userProgress = '';
// public static $userProgress = '';
public static $languages = [
'de' => 'Deutsch',
@ -202,20 +202,20 @@ class common
// Descripteur de données Entrées / Sorties
// Liste ici tous les fichiers de données
public $dataFiles = [
'admin' => '',
'blacklist' => '',
'config' => '',
'core' => '',
'course' => '',
'font' => '',
'module' => '',
'page' => '',
'theme' => '',
'user' => '',
'language' => '',
'profil' => '',
'enrolment' => '',
'category' => '',
'admin' => null,
'blacklist' => null,
'config' => null,
'core' => null,
'course' => null,
'font' => null,
'module' => null,
'page' => null,
'theme' => null,
'user' => null,
'language' => null,
'profil' => null,
'enrolment' => null,
'category' => null,
];
private $configFiles = [
@ -393,7 +393,6 @@ class common
$this->initData($stageId, self::$siteContent);
}
}
}
// Récupère un utilisateur connecté
@ -412,15 +411,15 @@ class common
? self::$i18nUI
: 'fr_FR';
} else {
if (isset($_SESSION['ZWII_UI'])) {
self::$i18nUI = $_SESSION['ZWII_UI'];
} elseif (isset($_COOKIE['ZWII_UI'])) {
self::$i18nUI = $_COOKIE['ZWII_UI'];
// Par défaut la langue définie par défaut à l'installation
if ($this->getData(['config', 'defaultLanguageUI'])) {
self::$i18nUI = $this->getData(['config', 'defaultLanguageUI']);
} else {
self::$i18nUI = 'fr_FR';
$this->setData(['config', 'defaultLanguageUI', 'fr_FR']);
}
$_SESSION['ZWII_UI'] = self::$i18nUI;
}
// Stocker le cookie de langue pour l'éditeur de texte ainsi que l'url du contenu pour le theme
setcookie('ZWII_UI', self::$i18nUI, time() + 3600, '', '', false, false);
// Stocker l'courseId pour le thème de TinyMCE
@ -491,7 +490,6 @@ class common
// Mise à jour des données core
include('core/include/update.inc.php');
}
/**
@ -547,7 +545,7 @@ class common
}
// Effacer la donnée
$success = $db->delete($query, true);
return is_object($success);
return $success;
}
/**
@ -584,7 +582,7 @@ class common
$query .= '.' . $keys[$i];
}
// Appliquer la modification, le dernier élément étant la donnée à sauvegarder
$success = is_object($db->set($query, $keys[count($keys) - 1], $save));
$success = $db->set($query, $keys[count($keys) - 1], $save);
}
return $success;
}
@ -707,7 +705,6 @@ class common
// Instanciation de l'objet et stockage dans dataFiles
$this->dataFiles[$module] = new \Prowebcraft\JsonDb($config);
}
@ -754,12 +751,11 @@ class common
if ($module === 'page') {
$content = $path === 'home' ? init::$siteContent : init::$courseContent;
foreach ($content as $key => $value) {
$this->setPage($key, $value, $path);
$this->setPage($key, $value['content'], $path);
}
}
common::$coreNotices[] = $module;
}
/**
* Initialisation des données
@ -1123,6 +1119,7 @@ class common
* @param string Valeurs possibles
*/
public function updateSitemap()
{
// Le drapeau prend true quand au moins une page est trouvée
@ -1239,9 +1236,9 @@ class common
}
return (file_exists('sitemap.xml') && file_exists('robots.txt'));
}
/*
* Création d'une miniature
* Fonction utilisée lors de la mise à jour d'une version 9 à une version 10
@ -1546,7 +1543,7 @@ class common
foreach ($courses as $courseId => $value) {
// Affiche les espaces gérés par l'éditeur, les espaces où il participe et les espaces anonymes
if (
// le membre est inscrit
// le membre est inscrit
($this->getData(['enrolment', $courseId]) && array_key_exists($this->getUser('id'), $this->getData(['enrolment', $courseId])))
// Il est l'auteur
|| $this->getUser('id') === $this->getData(['course', $courseId, 'author'])
@ -1599,5 +1596,4 @@ class common
return $this->getData(['user', $userId, 'firstname']);
}
}
}
}

View File

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

View File

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

View File

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

View File

@ -9,7 +9,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -31,7 +31,7 @@ class config extends common
'logDownload' => self::GROUP_ADMIN,
'blacklistReset' => self::GROUP_ADMIN,
'blacklistDownload' => self::GROUP_ADMIN,
'register' => self::GROUP_ADMIN,
'testmail' => self::GROUP_ADMIN,
];
public static $timezones = [
@ -529,11 +529,24 @@ class config extends common
'autoDisconnect' => $this->getInput('connectAutoDisconnect', helper::FILTER_BOOLEAN),
'captchaType' => $this->getInput('connectCaptchaType'),
'showPassword' => $this->getInput('connectShowPassword', helper::FILTER_BOOLEAN),
'redirectLogin' => $this->getInput('connectRedirectLogin', helper::FILTER_BOOLEAN)
'redirectLogin' => $this->getInput('connectRedirectLogin', helper::FILTER_BOOLEAN),
'mailAuth' => $this->getInput('connectAuthMail', helper::FILTER_BOOLEAN),
]
]
]);
// Sauvegarde la position des onglets de la vue de l'utilisateur courant
$this->setData([
'user',
$this->getUser('id'),
'view',
[
'config' => $this->getInput('containerSelected'),
'page' => $this->getData(['user', $this->getUser('id'), 'view', 'page']),
]
]);
// Efface les fichiers de backup lorsque l'option est désactivée
if ($this->getInput('configFileBackup', helper::FILTER_BOOLEAN) === false) {
$path = realpath('site/data');
@ -975,23 +988,30 @@ class config extends common
}
/**
* Stocke la variable dans les paramètres de l'utilisateur pour activer la tab à sa prochaine visite
* @return never
* Envoi un message de test
* @return void
*/
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),
]);
}
public function testmail()
{
$sent = $this->sendMail(
$this->getUser('mail'),
helper::translate('Test de la messagerie du site'),
'<strong>' . $this->getUser('firstname') . ' ' . $this->getUser('lastname') . '</strong>,<br><br>' .
'<h4>' . helper::translate('Il semblerait que votre messagerie fonctionne correctement !') . '</h4>',
null,
'no-reply@localhost'
);
if ($sent !== true) {
// Désactivation de l'authentification par email
$this->setData(['config', 'connect', 'mailAuth', 0]);
// Journalisation
$this->saveLog($sent);
}
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . 'config/' . $this->getUrl(2),
'state' => $sent === true ? true : false,
'notification' => $sent === true ? helper::translate('Message de test envoyé avec succès') : helper::translate('Message non envoyé')
]);
}
}

View File

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

View File

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

View File

@ -17,7 +17,8 @@
<div class="row">
<div class="col12">
<div class="block">
<h4><?php echo helper::translate('Paramètres de la sauvegarde'); ?>
<h4>
<?php echo helper::translate('Paramètres de la sauvegarde'); ?>
</h4>
<div class="row">
<div class="col12">
@ -27,7 +28,10 @@
]); ?>
</div>
<div class="col12">
<em>L'archive est générée dans <a href="<?php echo helper::baseUrl(false); ?>core/vendor/filemanager/dialog.php?fldr=backup&type=0&akey=<?php echo md5_file(self::DATA_DIR . 'core.json'); ?>&lang=<?php echo $this->getData(['user', $this->getUser('id'), 'language']);?>" data-lity>le dossier Backup</a> du gestionnaire de fichiers.</em>
<em>L'archive est générée dans
<a href="<?php echo helper::baseUrl(false); ?>core/vendor/filemanager/dialog.php?fldr=backup&type=0&akey=<?php echo md5_file(self::DATA_DIR . 'core.json'); ?>&lang=<?php echo $this->getData(['user', $this->getUser('id'), 'language']); ?>"
data-lity>le dossier Backup</a> du gestionnaire de fichiers.
</em>
</div>
</div>
</div>

View File

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

View File

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

View File

@ -5,7 +5,7 @@
* file that was distributed with this source code.
*
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -66,11 +66,11 @@ $(document).ready(function () {
$("#connectCaptchaStrong").prop("checked", false);
}
var configLayout = "<?php echo $this->getData(['user', $this->getUser('id'), 'view', 'config']);?>";
// Non défini, valeur par défaut
if (configLayout == "") {
configLayout = "setup";
}
let 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();
@ -84,6 +84,16 @@ $(document).ready(function () {
// Gestion des événements
//---------------------------------------------------------------------------------------------------------------------
/**
* Transmet le bouton de l'onglet sélectionné avant la soumission
*/
// Mettre à jour le champ caché avant la soumission
$('#configForm').on('submit', function () {
$('#containerSelected').val(configLayout);
});
/**
* Afficher et masquer options smtp
*/
@ -157,13 +167,14 @@ $(document).ready(function () {
/**
* Sélection de la page de configuration à afficher
*/
*/
$("#configLocaleButton").on("click", function () {
$("#setupContainer").hide();
$("#socialContainer").hide();
$("#connectContainer").hide();
$("#networkContainer").hide();
$("#localeContainer").show();
configLayout = "locale";
$("#configSetupButton").removeClass("activeButton");
$("#configLocaleButton").addClass("activeButton");
$("#configSocialButton").removeClass("activeButton");
@ -176,6 +187,7 @@ $(document).ready(function () {
$("#connectContainer").hide();
$("#networkContainer").hide();
$("#setupContainer").show();
configLayout = "setup";
$("#configSetupButton").addClass("activeButton");
$("#configLocaleButton").removeClass("activeButton");
$("#configSocialButton").removeClass("activeButton");
@ -189,6 +201,7 @@ $(document).ready(function () {
$("#localeContainer").hide();
$("#networkContainer").hide();
$("#socialContainer").show();
configLayout = "social";
$("#configSetupButton").removeClass("activeButton");
$("#configLocaleButton").removeClass("activeButton");
$("#configSocialButton").addClass("activeButton");
@ -201,6 +214,7 @@ $(document).ready(function () {
$("#socialContainer").hide();
$("#networkContainer").hide();
$("#connectContainer").show();
configLayout = "connect";
$("#configSetupButton").removeClass("activeButton");
$("#configLocaleButton").removeClass("activeButton");
$("#configSocialButton").removeClass("activeButton");
@ -213,6 +227,7 @@ $(document).ready(function () {
$("#socialContainer").hide();
$("#connectContainer").hide();
$("#networkContainer").show();
configLayout = "network";
$("#configSetupButton").removeClass("activeButton");
$("#configLocaleButton").removeClass("activeButton");
$("#configSocialButton").removeClass("activeButton");
@ -242,7 +257,7 @@ $(document).ready(function () {
// Contrôle l'image Open Screen Graph
// Type d'image
$("span#screenType").each(function(){
$("span#screenType").each(function () {
var text = $(this).text();
if (text.includes("jpg") || text.includes("jpeg") || text.includes("png")) {
$(this).css("color", "green");
@ -251,7 +266,7 @@ $(document).ready(function () {
}
});
// La largeur
$("span#screenWide").each(function(){
$("span#screenWide").each(function () {
var screenId = parseInt($(this).text());
if (screenId >= 1200) {
$(this).css("color", "green");
@ -260,7 +275,7 @@ $(document).ready(function () {
}
});
// La hauteur
$("span#screenHeight").each(function(){
$("span#screenHeight").each(function () {
var screenId = parseInt($(this).text());
if (screenId >= 630) {
$(this).css("color", "green");
@ -269,7 +284,7 @@ $(document).ready(function () {
}
});
// Le ratio
$('span#screenRatio').each(function(){
$('span#screenRatio').each(function () {
var ratio = parseFloat($(this).text());
if (ratio >= 1.90 && ratio <= 1.92) {
$(this).css("color", "green");
@ -280,17 +295,17 @@ $(document).ready(function () {
}
});
// Le poids
$('span#screenWeight').each(function(index){
$('span#screenWeight').each(function (index) {
var weight = parseFloat($(this).text());
var fileType = $('span#screenType').eq(index).text();
if ((fileType === "jpg" || fileType === "jpeg") && weight < 5000000) {
$(this).css("color", "green");
} else {
$(this).css("color", "red");
$(this).css("color", "red");
}
});
$('span#screenWeight').each(function(index){
$('span#screenWeight').each(function (index) {
var weight = parseFloat($(this).text());
var fileType = $('span#screenType').eq(index).text();

View File

@ -19,24 +19,25 @@
<?php echo template::button('configSetupButton', [
'value' => 'Configuration',
'class' => 'buttonTab',
'href' => helper::baseUrl() . 'config/register/setup'
]); ?>
<?php echo template::button('configSocialButton', [
'value' => 'Référencement',
'class' => 'buttonTab',
'href' => helper::baseUrl() . 'config/register/social'
]); ?>
<?php echo template::button('configConnectButton', [
'value' => 'Connexion',
'class' => 'buttonTab',
'href' => helper::baseUrl() . 'config/register/connect'
]); ?>
<?php echo template::button('configNetworkButton', [
'value' => 'Réseau',
'class' => 'buttonTab',
'href' => helper::baseUrl() . 'config/register/network'
]); ?>
</div>
<!-- Champ caché pour transmettre l'onglet-->
<?php echo template::hidden('containerSelected'); ?>
<!-- Pages de formulaires -->
<?php include('core/module/config/view/locale/locale.php') ?>
<?php include('core/module/config/view/setup/setup.php') ?>
<?php include('core/module/config/view/social/social.php') ?>

View File

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

View File

@ -44,21 +44,21 @@
</h4>
<div class="row">
<div class="col4">
<?php echo template::select('configLocaleHomePageId', helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC'), [
<?php echo template::select('configLocaleHomePageId', helper::arrayColumn(config::$pagesList, 'title', 'SORT_ASC'), [
'label' => 'Page d\'accueil de la plate-forme',
'selected' => $this->homePageId(),
'help' => 'Ce n\'est pas la page d\'accueil d\'un espace.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configLocalePage403', array_merge(['none' => 'Page par défaut'], helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
<?php echo template::select('configLocalePage403', array_merge(['none' => 'Page par défaut'], helper::arrayColumn(config::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Accès interdit, erreur 403',
'selected' => $this->getData(['config', 'page403']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configLocalePage404', array_merge(['none' => 'Page par défaut'], helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
<?php echo template::select('configLocalePage404', array_merge(['none' => 'Page par défaut'], helper::arrayColumn(config::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Page inexistante, erreur 404',
'selected' => $this->getData(['config', 'page404']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'
@ -67,14 +67,14 @@
</div>
<div class="row">
<div class="col4">
<?php echo template::select('configLocaleLegalPageId', array_merge(['none' => 'Aucune'], helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC')), [
<?php echo template::select('configLocaleLegalPageId', array_merge(['none' => 'Aucune'], helper::arrayColumn(config::$pagesList, 'title', 'SORT_ASC')), [
'label' => 'Mentions légales',
'selected' => $this->getData(['config', 'legalPageId']),
'help' => 'Les mentions légales sont obligatoires en France. Une option du pied de page ajoute un lien discret vers cette page.'
]); ?>
</div>
<div class="col4">
<?php echo template::select('configLocaleSearchPageId', array_merge(['none' => 'Aucune'], helper::arrayColumn($module::$pagesList, 'title', 'SORT_ASC')), [
<?php echo template::select('configLocaleSearchPageId', array_merge(['none' => 'Aucune'], helper::arrayColumn(config::$pagesList, 'title', 'SORT_ASC')), [
'label' => 'Recherche dans le site',
'selected' => $this->getData(['config', 'searchPageId']),
'help' => 'Sélectionnez une page contenant le module \'Recherche\'. Une option du pied de page ajoute un lien discret vers cette page.'
@ -82,7 +82,7 @@
</div>
<div class="col4">
<?php
echo template::select('configLocalePage302', array_merge(['none' => 'Page par défaut'], helper::arrayColumn($module::$orphansList, 'title', 'SORT_ASC')), [
echo template::select('configLocalePage302', array_merge(['none' => 'Page par défaut'], helper::arrayColumn(config::$orphansList, 'title', 'SORT_ASC')), [
'label' => 'Site en maintenance',
'selected' => $this->getData(['config', 'page302']),
'help' => 'Cette page ne doit pas apparaître dans l\'arborescence du menu. Créez une page orpheline.'

View File

@ -4,15 +4,10 @@
<div class="block">
<h4>
<?php echo helper::translate('Paramètres'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/reseau" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4>
<div class="row">
<div class="col2">
<?php echo template::select('configProxyType', $module::$proxyType, [
<?php echo template::select('configProxyType', config::$proxyType, [
'label' => 'Type de proxy',
'selected' => $this->getData(['config', 'proxyType'])
]); ?>
@ -40,11 +35,6 @@
<div class="block">
<h4>
<?php echo helper::translate('SMTP'); ?>
<!--<span id="specialeHelpButton" class="helpDisplayButton">
<a href="https://doc.zwiicms.fr/smtp" target="_blank" title="Cliquer pour consulter l'aide en ligne">
<?php //echo template::ico('help', ['margin' => 'left']); ?>
</a>
</span>-->
</h4>
<div class="row">
<div class="col6">
@ -79,7 +69,7 @@
]); ?>
</div>
<div class="col2">
<?php echo template::select('smtpAuth', $module::$SMTPauth, [
<?php echo template::select('smtpAuth', config::$SMTPauth, [
'label' => 'Authentification',
'selected' => $this->getData(['config', 'smtp', 'auth'])
]); ?>
@ -97,11 +87,11 @@
<?php echo template::password('smtpPassword', [
'label' => 'Mot de passe',
'autocomplete' => 'off',
'value' => $this->getData(['config', 'smtp', 'password'])
'value' => $this->getData(['config', 'smtp', 'password'])
]); ?>
</div>
<div class="col2">
<?php echo template::select('smtpSecure', $module::$SMTPEnc, [
<?php echo template::select('smtpSecure', config::$SMTPEnc, [
'label' => 'Sécurité',
'selected' => $this->getData(['config', 'smtp', 'secure'])
]); ?>
@ -112,4 +102,5 @@
</div>
</div>
</div>
</div>
</div>
</div>

View File

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

View File

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

View File

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

View File

@ -26,7 +26,7 @@
]); ?>
</div>
<div class="col4">
<?php echo template::select('configTimezone', $module::$timezones, [
<?php echo template::select('configTimezone', config::$timezones, [
'label' => 'Fuseau horaire',
'selected' => $this->getData(['config', 'timezone']),
'help' => 'Le fuseau horaire est utile au bon référencement'
@ -44,7 +44,7 @@
<?php echo template::checkbox('configRewrite', true, 'Apache URL intelligentes', [
'checked' => helper::checkRewrite(),
'help' => 'Supprime le point d\'interrogation dans les URL, l\'option est indisponible avec les autres serveurs Web',
'disabled' => helper::checkServerSoftware() === false and $module->isModRewriteEnabled()
'disabled' => helper::checkServerSoftware() === false and config->isModRewriteEnabled()
]); ?>
</div>
</div>
@ -74,7 +74,7 @@
</div>
<div class="row">
<div class="col3">
<?php echo template::select('configAutoUpdateDelay', $module::$updateDelay, [
<?php echo template::select('configAutoUpdateDelay', config::$updateDelay, [
'label' => 'Fréquence de recherche',
'selected' => $this->getData(['config', 'autoUpdateDelay']),
]); ?>
@ -87,7 +87,7 @@
<?php echo template::button('configUpdateForced', [
'ico' => 'download-cloud',
'href' => helper::baseUrl() . 'install/update',
'value' => $module::$updateButtonText,
'value' => config::$updateButtonText,
'class' => 'buttonRed',
]); ?>
</div>

View File

@ -24,18 +24,18 @@
</div>
<div class="row">
<div class="col10 textAlignCenter">
<?php if (!empty($module::$imageOpenGraph['type'])): ?>
<?php if (!empty(config::$imageOpenGraph['type'])): ?>
<p>
<?php echo sprintf('%s : <span id="screenType">%s</span>', helper::translate('Format'), $module::$imageOpenGraph['type']); ?>
<?php echo sprintf('%s : <span id="screenType">%s</span>', helper::translate('Format'), config::$imageOpenGraph['type']); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenWide">%s</span> x <span id="screenHeight">%s</span> pixels', helper::translate('Dimensions minimales'), $module::$imageOpenGraph['wide'], $module::$imageOpenGraph['height']); ?>
<?php echo sprintf('%s : <span id="screenWide">%s</span> x <span id="screenHeight">%s</span> pixels', helper::translate('Dimensions minimales'), config::$imageOpenGraph['wide'], config::$imageOpenGraph['height']); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenRatio">%s</span><span id="screenFract">:1</span>', helper::translate('Ratio'), round($module::$imageOpenGraph['ratio'], 2)); ?>
<?php echo sprintf('%s : <span id="screenRatio">%s</span><span id="screenFract">:1</span>', helper::translate('Ratio'), round(config::$imageOpenGraph['ratio'], 2)); ?>
</p>
<p>
<?php echo sprintf('%s : <span id="screenWeight">%s</span>', helper::translate('Poids'), $module::$imageOpenGraph['size']); ?>
<?php echo sprintf('%s : <span id="screenWeight">%s</span>', helper::translate('Poids'), config::$imageOpenGraph['size']); ?>
</p>
<?php endif; ?>
</div>

View File

@ -8,7 +8,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -28,7 +28,7 @@ class course extends common
'usersDelete' => self::GROUP_EDITOR, //Fait
'usersReportExport' => self::GROUP_EDITOR, //fait
'userDelete' => self::GROUP_EDITOR, //Fait
'userReport' => self::GROUP_EDITOR, //Fait
'userReport' => self::GROUP_MEMBER, //Fait
'userReportExport' => self::GROUP_EDITOR, //Fait
'backup' => self::GROUP_EDITOR, // Fait
'restore' => self::GROUP_EDITOR, //Fait
@ -109,7 +109,7 @@ class course extends common
? sprintf('%s %s', $this->getData(['user', $this->getData(['course', $courseId, 'author']), 'firstname']), $this->getData(['user', $this->getData(['course', $courseId, 'author']), 'lastname']))
: '';
$categorieUrl = helper::baseUrl() . 'course/swap/' . $courseId;
$info = sprintf(' <a href="%s">%s</a><br />Auteur : %s<br />Id : %s<br />', $categorieUrl, $this->getData(['course', $courseId, 'title']), $author, $courseId, );
$info = sprintf(' <a href="%s">%s</a><br />Auteur : %s<br />Id : %s<br />', $categorieUrl, $this->getData(['course', $courseId, 'title']), $author, $courseId,);
$enrolment = sprintf(
'Accès : %s<br />Inscription : %s<br />',
self::$courseAccess[$this->getData(['course', $courseId, 'access'])],
@ -206,6 +206,7 @@ class course extends common
'enrolmentKey' => $this->getInput('courseAddEnrolmentKey'),
'limitEnrolment' => $this->getInput('courseAddEnrolmentLimit', helper::FILTER_BOOLEAN),
'limitEnrolmentDate' => $this->getInput('courseAddEnrolmentLimitDate', helper::FILTER_DATETIME),
'report' => $this->getInput('courseAddEnrolmentReport', helper::FILTER_BOOLEAN),
]
]);
@ -289,6 +290,7 @@ class course extends common
'enrolmentKey' => $this->getInput('courseEditEnrolmentKey'),
'limitEnrolment' => $this->getInput('courseEditEnrolmentLimit', helper::FILTER_BOOLEAN),
'limitEnrolmentDate' => $this->getInput('courseEditEnrolmentLimitDate', helper::FILTER_DATETIME),
'report' => $this->getInput('courseEditEnrolmentReport', helper::FILTER_BOOLEAN),
]
]);
@ -335,7 +337,7 @@ class course extends common
// Valeurs en sortie
$this->addOutput([
'title' => sprintf('%s id : %s', helper::translate('Éditer l\'espace'), $this->getUrl(2)),
'title' => sprintf('%s %s (%s)', helper::translate('Editer l\'espace'), $this->getData(['course', $courseId, 'title' ]), $this->getUrl(2)),
'view' => 'edit'
]);
}
@ -394,7 +396,7 @@ class course extends common
// Valeurs en sortie
$this->addOutput([
'title' => sprintf('%s id : %s', helper::translate('Gérer l\'espace'), $this->getUrl(2)),
'title' => sprintf('%s %s (%s)', helper::translate('Gérer l\'espace'), $this->getData(['course', $courseId, 'title' ]), $this->getUrl(2)),
'view' => 'manage'
]);
}
@ -460,7 +462,6 @@ class course extends common
$success = $this->deleteDir(self::DATA_DIR . $courseId);
$this->deleteData(['course', $courseId]);
$this->deleteData(['enrolment', $courseId]);
}
// Dossier du gestionnaire de fichier
if (is_dir(self::FILE_DIR . 'source/' . $courseId)) {
@ -474,7 +475,6 @@ class course extends common
'state' => $success
]);
}
}
/**
@ -549,7 +549,6 @@ class course extends common
'title' => helper::translate('Ajouter une catégorie'),
'view' => 'categoryAdd'
]);
}
public function categoryEdit()
@ -616,7 +615,6 @@ class course extends common
'state' => $state
]);
}
}
public function users()
@ -625,7 +623,6 @@ class course extends common
$courseId = $this->getUrl(2);
// Accès limité au propriétaire, admin ou éditeurs isncrits
if (
$this->permissionControl(__FUNCTION__, $courseId) === false
) {
@ -719,32 +716,36 @@ class course extends common
0;
// Construction du tableau
if ($this->getdata(['course', $courseId, 'report']) === true) {
$reportButton = template::button('userReport' . $userId, [
'href' => helper::baseUrl() . 'course/userReport/' . $courseId . '/' . $userId,
'value' => (array_key_exists('progress', $userValue) && is_int($userValue['progress']))
? template::ico('chart-line', ['margin' => 'right']) . number_format($userValue['progress']) . ' %'
: template::ico('chart-line', ['margin' => 'right']) . ($viewPages ? min(round(($viewPages * 100) / $sumPages, 1), 100) . ' %' : '0%'),
'disable' => empty($userValue['datePageView']),
]);
} else {
$reportButton = template::button('userReport' . $userId, [
'value' => template::ico('chart-line'),
'disable' => true,
'help' => 'Rapport désactivé',
]);
}
self::$courseUsers[] = [
//$userId,
$this->getData(['user', $userId, 'firstname']) . ' ' . $this->getData(['user', $userId, 'lastname']),
array_key_exists('lastPageView', $userValue) && isset($pages[$userValue['lastPageView']]['title'])
? $pages[$userValue['lastPageView']]['title']
: '',
? $pages[$userValue['lastPageView']]['title']
: '',
array_key_exists('lastPageView', $userValue)
? helper::dateUTF8('%d/%m/%Y', $userValue['datePageView'])
: '',
? helper::dateUTF8('%d/%m/%Y', $userValue['datePageView'])
: '',
array_key_exists('datePageView', $userValue)
? helper::dateUTF8('%H:%M', $userValue['datePageView'])
: '',
? helper::dateUTF8('%H:%M', $userValue['datePageView'])
: '',
$this->getData(['user', $userId, 'tags']),
template::button('userReport' . $userId, [
'href' => helper::baseUrl() . 'course/userReport/' . $courseId . '/' . $userId,
/** La lecture de la progression s'effectue selon la nouvelle méthode (progression dans la base des enrolements)
* Soit avec l'ancienne méthode qui consiste à recalculer la progression.
* TRANSITOIRE A SUPPRIMER EN FIN D'ANNEE
**/
'value' => array_key_exists('progress', $userValue)
? $userValue['progress']
: ($viewPages ? min(round(($viewPages * 100) / $sumPages, 1), 100) . ' %' : '0%'),
'disable' => empty($userValue['datePageView']),
//'value' => $viewPages ? min(round(($viewPages * 100) / $sumPages, 1), 100) . ' %' : '0%',
//'disable' => empty($viewPages)
]),
$reportButton,
template::button('userDelete' . $userId, [
'class' => 'userDelete buttonRed',
'href' => helper::baseUrl() . 'course/userDelete/' . $courseId . '/' . $userId,
@ -752,7 +753,6 @@ class course extends common
'help' => 'Désinscrire'
])
];
}
}
@ -842,7 +842,6 @@ class course extends common
if (is_array($suscribers)) {
$suscribers = array_keys($suscribers);
$users = array_diff_key($users, array_flip($suscribers));
}
// Tri du tableau par défaut par $userId
@ -894,7 +893,6 @@ class course extends common
$this->getData(['user', $userId, 'lastname']),
$this->getData(['user', $userId, 'tags']),
];
}
// Ajoute les effectifs aux profils du sélecteur
@ -1058,7 +1056,6 @@ class course extends common
$this->getData(['user', $userId, 'lastname']),
$this->getData(['user', $userId, 'tags']),
];
}
}
@ -1119,7 +1116,6 @@ class course extends common
'notification' => helper::translate('Espace réinitialisé'),
'state' => true
]);
}
/*
@ -1185,13 +1181,13 @@ class course extends common
) {
// Gérer les modalités d'inscription
switch ($this->getData(['course', $courseId, 'enrolment'])) {
// Anonyme
// Anonyme
case self::COURSE_ENROLMENT_GUEST:
$_SESSION['ZWII_SITE_CONTENT'] = $courseId;
// Accès direct à la page
$redirect = helper::baseUrl() . $pageId;
break;
// Auto avec ou sans clé
// Auto avec ou sans clé
case self::COURSE_ENROLMENT_SELF:
//L'étudiant doit disposer d'un compte
if ($this->getUser('id')) {
@ -1210,7 +1206,7 @@ class course extends common
$state = false;
}
break;
// Par le prof
// Par le prof
case self::COURSE_ENROLMENT_MANDATORY:
$message = helper::translate('L\'enseignant doit vous inscrire');
$state = false;
@ -1225,7 +1221,6 @@ class course extends common
'notification' => helper::translate($message),
'state' => $state,
]);
}
/**
@ -1239,7 +1234,10 @@ class course extends common
// Accès limité au propriétaire ou éditeurs inscrits ou admin
if (
// Droits consentis
$this->permissionControl(__FUNCTION__, $courseId) === false
// Le compte du membre doit etre celui de l'url
and $this->getUser('id') !== $this->getUrl(3)
) {
// Valeurs en sortie
$this->addOutput([
@ -1324,13 +1322,13 @@ class course extends common
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Historique ') . $this->getData(['user', $userId, 'firstname']) . ' ' . $this->getData(['user', $userId, 'lastname']),
'title' => sprintf(helper::translate('Rapport des consultations : %s'), $this->getData(['course', $courseId, 'title'])) .
sprintf(helper::translate('%s Participant : %s %s'), '<br />', $this->getData(['user', $userId, 'firstname']), $this->getData(['user', $userId, 'lastname'])),
'view' => 'userReport',
'vendor' => [
"plotly"
]
]);
}
public function usersReportExport()
@ -1410,8 +1408,8 @@ class course extends common
$this->getData(['user', $userId, 'lastname']),
$this->getData(['user', $userId, 'mail']),
isset($pages[$this->getData(['enrolment', $courseId, $userId, 'lastPageView'])])
? $pages[$this->getData(['enrolment', $courseId, $userId, 'lastPageView'])]
: $this->getData(['enrolment', $courseId, $userId, 'lastPageView']) . ' (supprimée)',
? $pages[$this->getData(['enrolment', $courseId, $userId, 'lastPageView'])]
: $this->getData(['enrolment', $courseId, $userId, 'lastPageView']) . ' (supprimée)',
helper::dateUTF8('%d/%d/%Y', $this->getData(['enrolment', $courseId, $userId, 'datePageView'])),
helper::dateUTF8('%H:%M', $this->getData(['enrolment', $courseId, $userId, 'datePageView'])),
/** La lecture de la progression s'effectue selon la nouvelle méthode (progression dans la base des enrolements)
@ -1419,8 +1417,8 @@ class course extends common
* TRANSITOIRE A SUPPRIMER EN FIN D'ANNEE
**/
array_key_exists('progress', $userValue)
? $userValue['progress']
: ($viewPages ? min(round(($viewPages * 100) / $sumPages, 1), 100) . ' %' : '0%'),
? $userValue['progress']
: ($viewPages ? min(round(($viewPages * 100) / $sumPages, 1), 100) . ' %' : '0%'),
//number_format(min(round(($viewPages * 100) / $sumPages, 1) / 100, 1), 2, ','),
];
@ -1445,7 +1443,6 @@ class course extends common
'notification' => 'Création ' . basename($filename) . ' dans le dossier "Export"',
'state' => true,
]);
}
}
}
@ -1545,8 +1542,6 @@ class course extends common
'notification' => 'Création ' . basename($filename) . ' dans le dossier "Export"',
'state' => true,
]);
}
// Génération du message d'inscription
@ -1651,7 +1646,6 @@ class course extends common
'notification' => helper::translate('Désinscription'),
'state' => true,
]);
}
}
@ -1717,7 +1711,6 @@ class course extends common
'notification' => $message,
]);
}
}
// Générer un fichier externe contenant le contenu des pages
@ -1847,10 +1840,9 @@ class course extends common
// Valeurs en sortie
$this->addOutput([
'title' => sprintf('%s id : %s', helper::translate('Export des pages de l\'espace'), $this->getUrl(2)),
'title' => sprintf('%s %s (%s)', helper::translate('Export des pages de l\'espace'), $this->getData(['course', $courseId, 'title' ]), $this->getUrl(2)),
'view' => 'export'
]);
}
// Fonction utilisé par l'export en html pour corriger les URL des ressources
@ -1924,8 +1916,7 @@ class course extends common
if (file_exists(self::TEMP_DIR . $tempFolder . '/course.json')) {
$courseData = json_decode(file_get_contents(self::TEMP_DIR . $tempFolder . '/course.json'), true);
// Lire l'id du cours
$courseIds = array_keys($courseData);
;
$courseIds = array_keys($courseData);;
$courseId = $courseIds[0];
$success = true;
} else {
@ -1982,7 +1973,6 @@ class course extends common
'state' => $success,
'notification' => $notification,
]);
}
// Valeurs en sortie
@ -1991,7 +1981,6 @@ class course extends common
'state' => $success,
'notification' => $notification,
]);
}
// Valeurs en sortie
$this->addOutput([
@ -2018,12 +2007,12 @@ class course extends common
$this->getUser('permission', __CLASS__, $function)
&& $this->getUser('group') === self::$actions[$function]
&&
// Permission d'accéder aux espaces dans lesquels le membre auteur
// Permission d'accéder aux espaces dans lesquels le membre auteur
(
$this->getData(['enrolment', $courseId]) && ($this->getUser('id') === $this->getData(['course', $courseId, 'author']))
)
||
( // Permission d'accéder aux espaces dans lesquels le membre est inscrits
( // Permission d'accéder aux espaces dans lesquels le membre est inscrit
$this->getData(['enrolment', $courseId])
&& $this->getUser('permission', __CLASS__, 'tutor') === true
&& array_key_exists($this->getUser('id'), $this->getData(['enrolment', $courseId]))
@ -2073,31 +2062,50 @@ class course extends common
/**
* Méthode externe pour afficher la progression dans les espaces.
* Méthode externe pour calculer la progression dans les espaces et la stocker dans enrolment
*
* @param mixed $courseId
* @param mixed $userId
* @return string Ratio de pages vues
* @return float Ratio de pages vues en décimales de pourcentages
*/
public function userProgress($courseId, $userId): string
private function getUserProgress($courseId, $userId): float
{
// Obtient les statistiques de l'ensemble de la cohorte
$reports = $this->getReport($courseId, $userId);
// Nombre de pages dans l'espace
// Nombre de pages dans l'espace vues par cet utilisateur
$viewPages = array_key_exists($userId, $reports) ?
count($reports[$userId]) :
0;
// Nombre de pages vues
// Nombre de pages totales
$sumPages = $this->countPages($this->getData(['page']));
// Calcule le ratio
$ratio = number_format(min(round(($viewPages * 100) / $sumPages, 1) / 100, 1), 2, ',');
$ratio = ($viewPages * 100) / $sumPages;
// Arrondi le ratio à deux décimales
$ratio = round($ratio, 2);
return $ratio;
}
/**
*
* @param mixed $courseId id de l'espace
* @param mixed $userId id de l'utilisateur
* @return float nombre de pages vues
*/
public function setUserProgress($courseId, $userId): float
{
// Stocke le rapport en CSV
$file = fopen(common::DATA_DIR . $courseId . '/report.csv', 'a+');
fputcsv($file, [$userId, $this->getUrl(0), time()], ';');
fclose($file);
// Retourne le nombre de page vues
return ($this->getUserProgress($courseId, $userId));
}
/**
*
* Compte les pages d'un espace
@ -2150,7 +2158,7 @@ class course extends common
$r = in_array($userId, array_keys($this->getData(['enrolment', $courseId])));
}
break;
// Visiteur non connecté
// Visiteur non connecté
case self::GROUP_VISITOR:
case null:
$r = $this->getData(['course', $courseId, 'enrolment']) === self::COURSE_ENROLMENT_GUEST;

View File

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

View File

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

View File

@ -31,19 +31,19 @@
]); ?>
</div>
<div class="col5">
<?php echo template::select('courseAddAuthor', $module::$courseTeachers, [
<?php echo template::select('courseAddAuthor', course::$courseTeachers, [
'label' => 'Auteur'
]); ?>
</div>
</div>
<div class="row">
<div class="col6">
<?php echo template::select('courseAddTheme', $module::$courses, [
<?php echo template::select('courseAddTheme', course::$courses, [
'label' => 'Copier le thème depuis',
]); ?>
</div>
<div class="col6">
<?php echo template::select('courseAddCategorie', $module::$courseCategories, [
<?php echo template::select('courseAddCategorie', course::$courseCategories, [
'label' => 'Catégorie',
]); ?>
</div>
@ -57,7 +57,7 @@
</div>
<div class="row">
<div class="col4">
<?php echo template::select('courseAddAccess', $module::$courseAccess, [
<?php echo template::select('courseAddAccess', course::$courseAccess, [
'label' => 'Accès'
]); ?>
</div>
@ -76,7 +76,7 @@
</div>
<div class="row">
<div class="col6">
<?php echo template::select('courseAddEnrolment', $module::$courseEnrolment, [
<?php echo template::select('courseAddEnrolment', course::$courseEnrolment, [
'label' => 'Participation'
]); ?>
</div>
@ -87,6 +87,12 @@
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::checkbox('courseAddEnrolmentReport', true, 'Rapport des consultations', [
'help' => 'Enregistre une trace des consultations. Ne s\'applique pas à l\'inscription anonyme',
'checked' => true
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('courseAddEnrolmentLimit', true, 'Date de fin d\'inscription', [
'help' => 'Ne s\'applique pas à l\'inscription anonyme',

View File

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

View File

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

View File

@ -15,8 +15,8 @@
</div>
</div>
<?php if($module::$courseCategories): ?>
<?php echo template::table([5,5,1,1], $module::$courseCategories, ['Id', 'Titre', '','']); ?>
<?php if(course::$courseCategories): ?>
<?php echo template::table([5,5,1,1], course::$courseCategories, ['Id', 'Titre', '','']); ?>
<?php else: ?>
<?php echo template::speech('Aucune catégorie'); ?>
<?php endif; ?>

View File

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

View File

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

View File

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

View File

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

View File

@ -25,7 +25,7 @@
]); ?>
</div>
<div class="col5">
<?php echo template::select('courseEditAuthor', $module::$courseTeachers, [
<?php echo template::select('courseEditAuthor', course::$courseTeachers, [
'label' => 'Auteur',
'selected' => $this->getdata(['course', $this->getUrl(2), 'author'])
]); ?>
@ -33,13 +33,13 @@
</div>
<div class="row">
<div class="col6">
<?php echo template::select('courseEditHomePageId', helper::arrayColumn($module::$pagesList, 'title'), [
<?php echo template::select('courseEditHomePageId', helper::arrayColumn(course::$pagesList, 'title'), [
'label' => 'Page d\'accueil',
'selected' => $this->getdata(['course', $this->getUrl(2), 'homePageId']),
]); ?>
</div>
<div class="col6">
<?php echo template::select('courseEditCategorie', $module::$courseCategories, [
<?php echo template::select('courseEditCategorie', course::$courseCategories, [
'label' => 'Catégorie',
'selected' => $this->getdata(['course', $this->getUrl(2), 'category'])
]); ?>
@ -55,7 +55,7 @@
</div>
<div class="row">
<div class="col4">
<?php echo template::select('courseEditAccess', $module::$courseAccess, [
<?php echo template::select('courseEditAccess', course::$courseAccess, [
'label' => 'Disponibilité',
'selected' => $this->getdata(['course', $this->getUrl(2), 'access'])
]); ?>
@ -77,7 +77,7 @@
</div>
<div class="row">
<div class="col4">
<?php echo template::select('courseEditEnrolment', $module::$courseEnrolment, [
<?php echo template::select('courseEditEnrolment', course::$courseEnrolment, [
'label' => 'Participation',
'selected' => $this->getdata(['course', $this->getUrl(2), 'enrolment'])
]); ?>
@ -90,6 +90,12 @@
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::checkbox('courseEditEnrolmentReport', true, 'Rapport des consultations', [
'checked' => $this->getdata(['course', $this->getUrl(2), 'report']),
'help' => 'Enregistre une trace des consultations. Ne s\'applique pas à l\'inscription anonyme',
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('courseEditEnrolmentLimit', true, 'Date de fin d\'inscription', [
'checked' => $this->getdata(['course', $this->getUrl(2), 'limitEnrolment']),
@ -99,7 +105,7 @@
<div class="col4">
<?php echo template::date('courseEditEnrolmentLimitDate', [
'type' => 'datetime-local',
'label' => 'Fermeture',
'label' => 'Fin d\'inscription',
'value' => is_null($this->getdata(['course', $this->getUrl(2), 'limitEnrolmentDate'])) ? '' : floor($this->getdata(['course', $this->getUrl(2), 'limitEnrolmentDate']) / 60) * 60
]); ?>
</div>

View File

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

View File

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

View File

@ -31,7 +31,7 @@
<h4><?php echo helper::translate('Sélection des pages de l\'espace') ?></h4>
<div class='row'>
<div class='col10 offset2'>
<?php foreach ($module::$pagesList as $key => $value) {
<?php foreach (course::$pagesList as $key => $value) {
echo $value;
}
?>

View File

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

View File

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

View File

@ -36,8 +36,8 @@
</div>
</div>
<?php if ($module::$courses): ?>
<?php echo template::table([4, 3, 3, 1, 1], $module::$courses, ['Titre court', 'Description', 'Inscription', '', '',], ['id' => 'dataTables']); ?>
<?php if (course::$courses): ?>
<?php echo template::table([4, 3, 3, 1, 1], course::$courses, ['Titre court', 'Description', 'Inscription', '', '',], ['id' => 'dataTables']); ?>
<?php else: ?>
<?php echo template::speech('Aucun espace'); ?>
<?php endif; ?>

View File

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

View File

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

View File

@ -98,14 +98,14 @@
<div class="col6">
<?php echo template::text('courseManageHomePageId', [
'label' => 'Page d\'accueil',
'value' => $module::$pagesList[$this->getdata(['course', $this->getUrl(2), 'homePageId'])]['shortTitle'],
'value' => course::$pagesList[$this->getdata(['course', $this->getUrl(2), 'homePageId'])]['shortTitle'],
'readonly' => true,
]); ?>
</div>
<div class="col6">
<?php echo template::text('courseManageCategorie', [
'label' => 'Catégorie',
'value' => $module::$courseCategories[$this->getdata(['course', $this->getUrl(2), 'category'])],
'value' => course::$courseCategories[$this->getdata(['course', $this->getUrl(2), 'category'])],
'readonly' => true,
]); ?>
</div>
@ -123,7 +123,7 @@
<div class="col4">
<?php echo template::text('courseManageAccess', [
'label' => 'Disponibilité',
'value' => $module::$courseAccess[$this->getdata(['course', $this->getUrl(2), 'access'])],
'value' => course::$courseAccess[$this->getdata(['course', $this->getUrl(2), 'access'])],
'readonly' => true,
]); ?>
</div>
@ -148,7 +148,7 @@
<div class="col4">
<?php echo template::text('courseManageEnrolment', [
'label' => 'Participation',
'value' => $module::$courseEnrolment[$this->getdata(['course', $this->getUrl(2), 'enrolment'])],
'value' => course::$courseEnrolment[$this->getdata(['course', $this->getUrl(2), 'enrolment'])],
'readonly' => true,
]); ?>
</div>
@ -161,6 +161,13 @@
</div>
</div>
<div class="row">
<div class="col4">
<?php echo template::checkbox('courseManageEnrolmentReport', true, 'Rapport des consultations', [
'checked' => $this->getdata(['course', $this->getUrl(2), 'report']),
'help' => 'Ne s\'applique pas à l\'inscription anonyme',
'disabled' => true,
]); ?>
</div>
<div class="col4">
<?php echo template::checkbox('courseManageEnrolmentLimit', true, 'Date de fin d\'inscription', [
'checked' => $this->getdata(['course', $this->getUrl(2), 'limitEnrolment']),
@ -171,7 +178,7 @@
<div class="col4">
<?php echo template::date('courseManageEnrolmentLimitDate', [
'type' => 'datetime-local',
'label' => 'Fermeture',
'label' => 'Fin d\'inscription',
'value' => is_null($this->getdata(['course', $this->getUrl(2), 'limitEnrolmentDate'])) ? '' : floor($this->getdata(['course', $this->getUrl(2), 'limitEnrolmentDate']) / 60) * 60,
'readonly' => true,
]); ?>

View File

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

View File

@ -4,14 +4,14 @@
<?php echo "<h3>Auteur : " . $this->signature($this->getData(['course', $this->getUrl(2), 'author'])) . "</h3>"; ?>
<?php echo "<p>Description : " . $this->getData(['course', $this->getUrl(2), 'description']) . "</p>"; ?>
<!--Restriction de date limite d'ouverture-->
<?php echo "<p>Disponibilité : " . $module::$courseAccess[$this->getData(['course', $this->getUrl(2), 'access'])]; ?>
<?php if ($this->getData(['course', $this->getUrl(2), 'access']) === $module::COURSE_ACCESS_DATE): ?>
<?php echo "<p>Disponibilité : " . course::$courseAccess[$this->getData(['course', $this->getUrl(2), 'access'])]; ?>
<?php if ($this->getData(['course', $this->getUrl(2), 'access']) === course::COURSE_ACCESS_DATE): ?>
<?php $from = helper::dateUTF8('%d %B %Y', $this->getData(['course', $this->getUrl(2), 'openingDate']), self::$i18nUI) . helper::translate(' à ') . helper::dateUTF8('%H:%M', $this->getData(['course', $this->getUrl(2), 'openingDate']), self::$i18nUI); ?>
<?php $to = helper::dateUTF8('%d %B %Y', $this->getData(['course', $this->getUrl(2), 'closingDate']), self::$i18nUI) . helper::translate(' à ') . helper::dateUTF8('%H:%M', $this->getData(['course', $this->getUrl(2), 'closingDate']), self::$i18nUI); ?>
<?php echo sprintf(helper::translate(' du %s au %s'), $from, $to); ?>
<?php endif; ?>
<?php echo '</p>'; ?>
<?php echo "<p>Inscription : " . $module::$courseEnrolment[$this->getData(['course', $this->getUrl(2), 'enrolment'])] . '.'; ?>
<?php echo "<p>Inscription : " . course::$courseEnrolment[$this->getData(['course', $this->getUrl(2), 'enrolment'])] . '.'; ?>
<!--Restriction de date limite d'insription-->
<?php if ($this->getData(['course', $this->getUrl(2), 'limitEnrolment']) === true && $this->getData(['course', $this->getUrl(2), 'limitEnrolmentDate']) <= time()):?>
<?php echo helper::translate(' Les inscriptions sont closes depuis le ') ?>
@ -22,12 +22,12 @@
</div>
<div class="row">
<div class="col12">
<?php if ($module::$swapMessage['enrolmentKey']) {
echo $module::$swapMessage['enrolmentKey'];
<?php if (course::$swapMessage['enrolmentKey']) {
echo course::$swapMessage['enrolmentKey'];
}
?>
<?php if ($module::$swapMessage['enrolmentMessage']) {
echo $module::$swapMessage['enrolmentMessage'];
<?php if (course::$swapMessage['enrolmentMessage']) {
echo course::$swapMessage['enrolmentMessage'];
}
?>
</div>
@ -40,7 +40,7 @@
'value' => template::ico('left')
]); ?>
</div>
<?php if ($module::$swapMessage['submitLabel'] === 'Connexion'): ?>
<?php if (course::$swapMessage['submitLabel'] === 'Connexion'): ?>
<div class="col2 offset8">
<?php echo template::button('courseConnect', [
'href' => helper::baseUrl(true) . 'user/login',
@ -51,8 +51,8 @@
<?php else: ?>
<div class="col3 offset7">
<?php echo template::submit('courseSwapSubmit', [
'value' => $module::$swapMessage['submitLabel'],
'disabled' => !($module->courseIsAvailable($this->getUrl(2))
'value' => course::$swapMessage['submitLabel'],
'disabled' => !(course->courseIsAvailable($this->getUrl(2))
&& !($this->getData(['course', $this->getUrl(2), 'limitEnrolment']) === true
&& $this->getData(['course', $this->getUrl(2), 'limitEnrolmentDate']) <= time())
),

View File

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

View File

@ -6,16 +6,16 @@
* @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
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
$(document).ready((function () {
var dataX = <?php echo json_encode(array_map(function ($item) { return $item[0]; }, $module::$userGraph)); ?>;
var dataY = <?php echo json_encode(array_map(function ($item) { return $item[1];}, $module::$userGraph)); ?>;
var dataText = <?php echo json_encode(array_map(function ($item) { return $item[2];}, $module::$userGraph)); ?>;
var dataX = <?php echo json_encode(array_map(function ($item) { return $item[0]; }, course::$userGraph)); ?>;
var dataY = <?php echo json_encode(array_map(function ($item) { return $item[1];}, course::$userGraph)); ?>;
var dataText = <?php echo json_encode(array_map(function ($item) { return $item[2];}, course::$userGraph)); ?>;
var data = [{
x: dataX,

View File

@ -2,15 +2,18 @@
<div class="col1">
<?php echo template::button('courseUserHistoryBack', [
'class' => 'buttonGrey',
'href' => helper::baseUrl() . 'course/users/' . $this->getUrl(2),
// Le retour est différent selon que c'est un admin ou un tuteur ou l'utilisateur lui-même
'href' => $this->getUser('group') === self::GROUP_MEMBER ? helper::baseUrl(false) : helper::baseUrl() . 'course/users/' . $this->getUrl(2),
'value' => template::ico('left')
]); ?>
</div>
<div class="col1 offset10">
<?php echo template::button('userDeleteAll', [
<?php echo template::button('userReportExportAll', [
'href' => helper::baseUrl() . 'course/userReportExport/' . $this->getUrl(2) . '/' . $this->getUrl(3),
'value' => template::ico('download'),
'help' => 'Exporter',
'help' => 'Exporter rapport',
// Le memebre ne peut pas exporter
'disabled' => $this->getUser('group') === self::GROUP_MEMBER
]) ?>
</div>
</div>
@ -20,7 +23,7 @@
</div>
</div>
</div>
<?php if ($module::$userReport): ?>
<?php if (course::$userReport): ?>
<div class="row">
<div class="col4 offset2">
<?php if ($this->getData(['course', $this->getUrl(2), 'access']) === self::COURSE_ACCESS_DATE): ?>
@ -34,19 +37,19 @@
</div>
<div class="col4">
<p>Commencé le :
<?php echo $module::$userStat['floor']; ?>
<?php echo course::$userStat['floor']; ?>
</p>
<p>Terminé le :
<?php echo $module::$userStat['top']; ?>
<?php echo course::$userStat['top']; ?>
</p>
<p>Temps passé :
<?php echo $module::$userStat['time']; ?>
<?php echo course::$userStat['time']; ?>
</p>
</div>
</div>
<div class="row textAlignCenter">
<div class="col8">
<?php echo template::table([6, 3, 3], $module::$userReport, ['Page', 'Début de Consultation', 'Temps consultation']); ?>
<?php echo template::table([6, 3, 3], course::$userReport, ['Page', 'Début de Consultation', 'Temps consultation']); ?>
</div>
</div>
<?php else: ?>

View File

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

View File

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

View File

@ -10,7 +10,7 @@
<?php echo template::button('userDeleteAll', [
'href' => helper::baseUrl() . 'course/usersReportExport/' . $this->getUrl(2),
'value' => template::ico('download'),
'help' => 'Exporter',
'help' => 'Exporter rapports',
]) ?>
</div>
<div class="col1">
@ -33,27 +33,27 @@
<?php echo template::formOpen('courseFilterUserForm'); ?>
<div class="row" id="Bfrtip">
<div class="col3">
<?php echo template::select('courseFilterGroup', $module::$courseGroups, [
<?php echo template::select('courseFilterGroup', course::$courseGroups, [
'label' => 'Groupes / Profils',
'selected' => isset($_POST['courseFilterGroup']) ? $_POST['courseFilterGroup'] : 'all',
]); ?>
</div>
<div class="col3">
<?php echo template::select('courseFilterFirstName', $module::$alphabet, [
<?php echo template::select('courseFilterFirstName', course::$alphabet, [
'label' => 'Prénom commence par',
'selected' => isset($_POST['courseFilterFirstName']) ? $_POST['courseFilterFirstName'] : 'all',
]); ?>
</div>
<div class="col3">
<?php echo template::select('courseFilterLastName', $module::$alphabet, [
<?php echo template::select('courseFilterLastName', course::$alphabet, [
'label' => 'Nom commence par',
'selected' => isset($_POST['courseFilterLastName']) ? $_POST['courseFilterLastName'] : 'all',
]); ?>
</div>
</div>
<?php echo template::formClose(); ?>
<?php if ($module::$courseUsers): ?>
<?php echo template::table([3, 4, 1, 1, 1, 1, 1], $module::$courseUsers, ['Nom Prénom', 'Dernière page vue', 'Date' , 'Heure', 'Étiquettes', 'Progression', ''], ['id' => 'dataTables']); ?>
<?php if (course::$courseUsers): ?>
<?php echo template::table([3, 4, 1, 1, 1, 1, 1], course::$courseUsers, ['Nom Prénom', 'Dernière page vue', 'Date' , 'Heure', 'Étiquettes', 'Progression', ''], ['id' => 'dataTables']); ?>
<?php else: ?>
<?php echo template::speech('Aucun participant'); ?>
<?php endif; ?>

View File

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

View File

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

View File

@ -16,19 +16,19 @@
</div>
<div class="row" id="Bfrtip">
<div class="col3">
<?php echo template::select('courseFilterGroup', $module::$courseGroups, [
<?php echo template::select('courseFilterGroup', course::$courseGroups, [
'label' => 'Groupes / Profils',
'selected' => isset($_POST['courseFilterGroup']) ? $_POST['courseFilterGroup'] : 'all',
]); ?>
</div>
<div class="col3">
<?php echo template::select('courseFilterFirstName', $module::$alphabet, [
<?php echo template::select('courseFilterFirstName', course::$alphabet, [
'label' => 'Prénom commence par',
'selected' => isset($_POST['courseFilterFirstName']) ? $_POST['courseFilterFirstName'] : 'all',
]); ?>
</div>
<div class="col3">
<?php echo template::select('courseFilterLastName', $module::$alphabet, [
<?php echo template::select('courseFilterLastName', course::$alphabet, [
'label' => 'Nom commence par',
'selected' => isset($_POST['courseFilterLastName']) ? $_POST['courseFilterLastName'] : 'all',
]); ?>
@ -46,8 +46,8 @@
]); ?>
</div>
</div>
<?php if ($module::$courseUsers): ?>
<?php echo template::table([1, 2, 3, 3, 3], $module::$courseUsers, ['', 'Id', 'Prénom', 'Nom', 'Étiquettes'], ['id' => 'dataTables']); ?>
<?php if (course::$courseUsers): ?>
<?php echo template::table([1, 2, 3, 3, 3], course::$courseUsers, ['', 'Id', 'Prénom', 'Nom', 'Étiquettes'], ['id' => 'dataTables']); ?>
<?php else: ?>
<?php echo template::speech('Aucun inscrit'); ?>
<?php endif; ?>

View File

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

View File

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

View File

@ -17,19 +17,19 @@
</div>
<div class="row" id="Bfrtip">
<div class="col3">
<?php echo template::select('courseFilterGroup', $module::$courseGroups, [
<?php echo template::select('courseFilterGroup', course::$courseGroups, [
'label' => 'Groupes / Profils',
'selected' => isset($_POST['courseFilterGroup']) ? $_POST['courseFilterGroup'] : 'all',
]); ?>
</div>
<div class="col3">
<?php echo template::select('courseFilterFirstName', $module::$alphabet, [
<?php echo template::select('courseFilterFirstName', course::$alphabet, [
'label' => 'Prénom commence par',
'selected' => isset($_POST['courseFilterFirstName']) ? $_POST['courseFilterFirstName'] : 'all',
]); ?>
</div>
<div class="col3">
<?php echo template::select('courseFilterLastName', $module::$alphabet, [
<?php echo template::select('courseFilterLastName', course::$alphabet, [
'label' => 'Nom commence par',
'selected' => isset($_POST['courseFilterLastName']) ? $_POST['courseFilterLastName'] : 'all',
]); ?>
@ -47,8 +47,8 @@
]); ?>
</div>
</div>
<?php if ($module::$courseUsers): ?>
<?php echo template::table([1, 2, 3, 3, 3], $module::$courseUsers, ['', 'Id', 'Prénom', 'Nom', 'Étiquettes'], ['id' => 'dataTables']); ?>
<?php if (course::$courseUsers): ?>
<?php echo template::table([1, 2, 3, 3, 3], course::$courseUsers, ['', 'Id', 'Prénom', 'Nom', 'Étiquettes'], ['id' => 'dataTables']); ?>
<?php else: ?>
<?php echo template::speech('Aucun inscrit'); ?>
<?php endif; ?>

View File

@ -8,7 +8,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -119,6 +119,8 @@ class install extends common
// Validation de la langue transmise
self::$i18nUI = $_SESSION['ZWII_UI'];
self::$i18nUI = array_key_exists(self::$i18nUI, self::$languages) ? self::$i18nUI : 'fr_FR';
// Stockage de la langue par défaut afin d'afficher le site dans cette langue lors de l'affichage de la bannière de connexion.
$this->setData(['config', 'defaultLanguageUI', self::$i18nUI], false);
// Création du dossier de contenu avec le marqueur de langue par défaut
if (!is_dir(self::DATA_DIR . $_SESSION['ZWII_SITE_CONTENT'])) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -65,7 +65,7 @@
</summary>
<div class="row">
<div class="col3">
<?php echo template::select('installProxyType', $module::$proxyType, [
<?php echo template::select('installProxyType', install::$proxyType, [
'label' => 'Type de proxy'
]); ?>
</div>

View File

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

View File

@ -5,7 +5,7 @@
<?php echo self::ZWII_VERSION; ?>
<?php echo helper::translate('vers'); ?>
&nbsp;
<?php echo $module::$newVersion; ?>
<?php echo install::$newVersion; ?>
</strong></p>
<p>
<?php echo helper::translate('Afin d\'assurer le bon fonctionnement de Zwii, veuillez ne pas fermer cette page avant la fin de l\'opération.'); ?>

View File

@ -8,7 +8,7 @@
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @copyright Copyright (C) 2018-2025, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
@ -91,16 +91,15 @@ class language extends common
}
// Télécharger le descripteur en ligne
$languageData = json_decode(helper::getUrlContents(self::ZWII_UI_URL . $lang . '.json'), true);
$languageData = helper::getUrlContents(self::ZWII_UI_URL . $lang . '.json');
$descripteur = json_decode(helper::getUrlContents(self::ZWII_UI_URL . 'language.json'), true);
$success = false;
if (
is_array($languageData) &&
$languageData &&
is_array($descripteur['language'][$lang])
) {
if ($this->setData(['language', $lang, $descripteur['language'][$lang]])) {
$success = $this->secure_file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($languageData, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
$success = is_int($success) ? true : false;
$success = $this->secure_file_put_contents(self::I18N_DIR . $lang . '.json', $languageData);
}
}
@ -501,7 +500,7 @@ class language extends common
$data[$key] = $target;
}
}
file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($data));
// Mettre à jour le descripteur
$this->setData([
@ -529,13 +528,18 @@ class language extends common
}
// Ajout des champs absents selon la langue de référence
$dataFr = json_decode(file_get_contents(self::I18N_DIR . 'fr_FR.json'), true);
foreach ($dataFr as $key => $value) {
if (!array_key_exists($key, $data)) {
$data[$key] = '';
}
}
file_put_contents(self::I18N_DIR . $lang . '.json', json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), LOCK_EX);
/*
$dataFr = json_decode(file_get_contents(self::I18N_DIR . 'fr_FR.json'), true);
foreach ($dataFr as $key => $value) {
if (!array_key_exists($key, $data)) {
$data[$key] = '';
}
}
file_put_contents(self::I18N_DIR . $lang . '.json', $data);
*/
// Trier le tableau
asort($data);
// Tableau des chaines à traduire dans la langue sélectionnée
foreach ($data as $key => $value) {
@ -558,7 +562,7 @@ class language extends common
'title' => helper::translate('Éditer les dialogues') . '&nbsp;' . template::flag($lang, '20 %'),
'view' => 'edit',
'vendor' => [
'flatpickr',
'tablednd'
],
]);
}

View File

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

View File

@ -18,7 +18,7 @@
</h4>
<div class="row">
<div class="col4 offset4">
<?php echo template::select('translateAddContent', $module::$i18nFiles, [
<?php echo template::select('translateAddContent', language::$i18nFiles, [
'label' => 'Langues disponibles'
]); ?>
</div>

View File

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

View File

@ -20,12 +20,12 @@
</h4>
<div class="row">
<div class="col6">
<?php echo template::select('translateFormCopySource', $module::$languagesInstalled, [
<?php echo template::select('translateFormCopySource', language::$languagesInstalled, [
'label' => 'Source'
]); ?>
</div>
<div class="col6">
<?php echo template::select('translateFormCopyTarget', $module::$languagesTarget, [
<?php echo template::select('translateFormCopyTarget', language::$languagesTarget, [
'label' => 'Cible'
]); ?>
</div>

View File

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

View File

@ -39,7 +39,7 @@
<div class="col12">
<div class="block">
<div class="row">
<?php foreach ($module::$dialogues as $key => $value) : ?>
<?php foreach (language::$dialogues as $key => $value) : ?>
<div class="col6">
<?php echo sprintf('%g -', $key); ?>
<?php echo $value['source']; ?>
@ -52,7 +52,7 @@
</div>
<?php endforeach; ?>
</div>
<?php echo $module::$pages; ?>
<?php echo language::$pages; ?>
</div>
</div>
</div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -128,14 +128,14 @@
'value' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditParentPageId', $module::$pagesNoParentId, [
<?php echo template::select('pageEditParentPageId', page::$pagesNoParentId, [
'label' => 'Page parent',
'selected' => $this->getData(['page', $this->getUrl(2), 'parentPageId'])
]); ?>
<?php endif; ?>
</div>
<div class="col4">
<?php echo template::select('pageEditExtraPosition', $module::$extraPosition, [
<?php echo template::select('pageEditExtraPosition', page::$extraPosition, [
'label' => 'Emplacement',
'selected' => $this->getData(['page', $this->getUrl(2), 'extraPosition']),
'help' => 'Le menu accessoire est aligné à droite de la barre de menu, c\'est un emplacement réservé aux drapeaux et au bouton de connexion.'
@ -168,7 +168,7 @@
<div class="blockContainer">
<div class="row">
<div class="col3">
<?php echo template::select('pageTypeMenu', $module::$typeMenu, [
<?php echo template::select('pageTypeMenu', page::$typeMenu, [
'label' => 'Apparence',
'selected' => $this->getData(['page', $this->getUrl(2), 'typeMenu'])
]); ?>
@ -212,14 +212,14 @@
<div class="row">
<div class="col10">
<?php echo template::hidden('pageEditModuleRedirect'); ?>
<?php echo template::select('pageEditModuleId', $module::$moduleIds, [
<?php echo template::select('pageEditModuleId', page::$moduleIds, [
'help' => 'En cas de changement de module, les données du module précédent seront supprimées.',
'label' => 'Module',
'selected' => $this->getData(['page', $this->getUrl(2), 'moduleId'])
]); ?>
<?php echo template::hidden('pageEditModuleIdOld', ['value' => $this->getData(['page', $this->getUrl(2), 'moduleId'])]); ?>
<?php echo template::hidden('pageEditModuleIdOldText', [
'value' => array_key_exists($this->getData(['page', $this->getUrl(2), 'moduleId']), $module::$moduleIds) ? $module::$moduleIds[$this->getData(['page', $this->getUrl(2), 'moduleId'])] : ucfirst($this->getData(['page', $this->getUrl(2), 'moduleId']))
'value' => array_key_exists($this->getData(['page', $this->getUrl(2), 'moduleId']), page::$moduleIds) ? page::$moduleIds[$this->getData(['page', $this->getUrl(2), 'moduleId'])] : ucfirst($this->getData(['page', $this->getUrl(2), 'moduleId']))
]); ?>
</div>
<div class="col2 verticalAlignBottom">
@ -232,7 +232,7 @@
</div>
<div class="row">
<div class="col12">
<?php echo template::select('pageModulePosition', $module::$modulePosition, [
<?php echo template::select('pageModulePosition', page::$modulePosition, [
'help' => 'En position libre ajoutez le module en plaçant [MODULE] à l\'endroit voulu dans votre page.',
'label' => 'Position du module',
'selected' => $this->getData(['page', $this->getUrl(2), 'modulePosition'])
@ -282,7 +282,7 @@
<div class="col6">
<div class="row">
<div class="col12">
<?php echo template::select('pageEditBlock', $module::$pageBlocks, [
<?php echo template::select('pageEditBlock', page::$pageBlocks, [
'label' => 'Gabarits de page - Barre latérale',
'help' => 'Pour définir la page comme barre latérale, choisissez l\'option dans la liste.',
'selected' => $this->getData(['page', $this->getUrl(2), 'block'])
@ -297,7 +297,7 @@
'value' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditBarLeft', $module::$pagesBarId, [
<?php echo template::select('pageEditBarLeft', page::$pagesBarId, [
'label' => 'Barre latérale gauche :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barLeft'])
]); ?>
@ -307,12 +307,12 @@
'value' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php else: ?>
<?php echo template::select('pageEditBarRight', $module::$pagesBarId, [
<?php echo template::select('pageEditBarRight', page::$pagesBarId, [
'label' => 'Barre latérale droite :',
'selected' => $this->getData(['page', $this->getUrl(2), 'barRight'])
]); ?>
<?php endif; ?>
<?php echo template::select('pageEditDisplayMenu', $module::$displayMenu, [
<?php echo template::select('pageEditDisplayMenu', page::$displayMenu, [
'label' => 'Contenu du menu vertical',
'selected' => $this->getData(['page', $this->getUrl(2), 'displayMenu']),
'help' => 'Par défaut le menu est affiché APRES le contenu de la page. Pour le positionner à un emplacement précis, insérez [MENU] dans le contenu de la page.'
@ -321,19 +321,19 @@
</div>
<div class="row navSelect">
<div class="col4">
<?php echo template::select('pageEditNavLeft', $module::$navIconPosition, [
<?php echo template::select('pageEditNavLeft', page::$navIconPosition, [
'label' => 'Bouton de navigation gauche',
'selected' => $this->getData(['page', $this->getUrl(2), 'navLeft']),
]); ?>
</div>
<div class="col4">
<?php echo template::select('pageEditNavTemplate', $module::$navIconTemplate, [
<?php echo template::select('pageEditNavTemplate', page::$navIconTemplate, [
'label' => 'Modèle',
'selected' => $this->getData(['page', $this->getUrl(2), 'navTemplate']),
]); ?>
</div>
<div class="col4">
<?php echo template::select('pageEditNavRight', $module::$navIconPosition, [
<?php echo template::select('pageEditNavRight', page::$navIconPosition, [
'label' => 'Bouton de navigation droit',
'selected' => $this->getData(['page', $this->getUrl(2), 'navRight']),
]); ?>
@ -364,7 +364,7 @@
<div class="col6">
<div class="pageEditGroupProfil displayNone"
id="pageEditGroupProfil<?php echo self::GROUP_MEMBER; ?>">
<?php echo template::select('pageEditProfil' . self::GROUP_MEMBER, $module::$userProfils[self::GROUP_MEMBER], [
<?php echo template::select('pageEditProfil' . self::GROUP_MEMBER, page::$userProfils[self::GROUP_MEMBER], [
'label' => 'Profil minimal pour accéder à la page',
'selected' => $this->getData(['page', $this->getUrl(2), 'profil']),
'help' => 'Les profils de niveau supérieur accèdent à la page.',
@ -372,7 +372,7 @@
</div>
<div class="pageEditGroupProfil displayNone"
id="pageEditGroupProfil<?php echo self::GROUP_EDITOR; ?>">
<?php echo template::select('pageEditProfil' . self::GROUP_EDITOR, $module::$userProfils[self::GROUP_EDITOR], [
<?php echo template::select('pageEditProfil' . self::GROUP_EDITOR, page::$userProfils[self::GROUP_EDITOR], [
'label' => 'Profil minimal pour accéder à la page',
'selected' => $this->getData(['page', $this->getUrl(2), 'profil']),
'help' => 'Les profils de niveau supérieur accèdent à la page.',

View File

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

View File

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

View File

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

View File

@ -30,28 +30,28 @@
]); ?>
</div>
</div>
<?php if ($module::$modulesInstalled): ?>
<?php if (plugin::$modulesInstalled): ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Sauvegarde'); ?>
</h4>
<?php echo template::table([2, 2, 1, 5, 1, 1], $module::$modulesInstalled, ['Module', 'Identifiant', 'Version', '', '', '']); ?>
<?php echo template::table([2, 2, 1, 5, 1, 1], plugin::$modulesInstalled, ['Module', 'Identifiant', 'Version', '', '', '']); ?>
</div>
</div>
</div>
<?php else: ?>
<?php echo template::speech('Aucun module installé.'); ?>
<?php endif; ?>
<?php if ($module::$modulesOrphan): ?>
<?php if (plugin::$modulesOrphan): ?>
<div class="row">
<div class="col12">
<div class="block">
<h4>
<?php echo helper::translate('Modules orphelins'); ?>
</h4>
<?php echo template::table([2, 2, 1, 6, 1], $module::$modulesOrphan, ['Module', 'Identifiant', 'Version', '', '']); ?>
<?php echo template::table([2, 2, 1, 6, 1], plugin::$modulesOrphan, ['Module', 'Identifiant', 'Version', '', '']); ?>
</div>
</div>
</div>

View File

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

View File

@ -2,33 +2,33 @@
<div class="col9">
<div class="row">
<div class="col12">
<?php echo $module::$storeItem['content']; ?>
<?php echo plugin::$storeItem['content']; ?>
</div>
</div>
</div>
<div class="row">
<div class="col12">
<?php
echo '<img class="downloadItemPicture" src="' . $module::BASEURL_STORE . 'site/file/source/' . $module::$storeItem['picture'] .
'" alt="' . $module::$storeItem['picture'] . '">';
echo '<img class="downloadItemPicture" src="' . plugin::BASEURL_STORE . 'site/file/source/' . plugin::$storeItem['picture'] .
'" alt="' . plugin::$storeItem['picture'] . '">';
?>
</div>
</div>
<div class="row">
<div class="col12 textAlignCenter">
<?php echo helper::translate('Version n°') . $module::$storeItem['fileVersion']; ?>
<?php echo helper::translate('Version n°') . plugin::$storeItem['fileVersion']; ?>
</div>
</div>
<div class="row">
<div class="col12 textAlignCenter">
&nbsp;<?php echo helper::translate('date') . '&nbsp;' . $module::$storeItem['fileDate']; ?>
&nbsp;<?php echo helper::translate('date') . '&nbsp;' . plugin::$storeItem['fileDate']; ?>
</div>
</div>
<div class="row">
<div class="col12 textAlignCenter">
<span>
<?php echo helper::translate('Auteur :'); ?>
<?php echo $module::$storeItem['fileAuthor']; ?>
<?php echo plugin::$storeItem['fileAuthor']; ?>
</span>
</div>
</div>
@ -37,7 +37,7 @@
<span>
<?php echo helper::translate('Licence'); ?>
&nbsp;
<?php echo $module::$storeItem['fileLicense']; ?>
<?php echo plugin::$storeItem['fileLicense']; ?>
</span>
</div>
</div>

View File

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

View File

@ -7,8 +7,8 @@
]); ?>
</div>
</div>
<?php if ($module::$storeList) : ?>
<?php echo template::table([2, 2, 1, 2, 2, 1], $module::$storeList, ['Catégorie', 'Module', 'Version', 'Date', 'Page', '']); ?>
<?php if (plugin::$storeList) : ?>
<?php echo template::table([2, 2, 1, 2, 2, 1], plugin::$storeList, ['Catégorie', 'Module', 'Version', 'Date', 'Page', '']); ?>
<?php else : ?>
<?php echo template::speech('Le catalogue est vide.'); ?>
<?php endif; ?>

View File

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

View File

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

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