ZwiiCMS/module/agenda/agenda.php
2024-08-13 08:33:33 +02:00

285 lines
6.9 KiB
PHP

<?php
/**
* This file is part of Zwii.
*
* For full copyright and license information, please see the LICENSE
* file that was distributed with this source code.
*
* @author Rémi Jean <remi.jean@outlook.com>
* @copyright Copyright (C) 2008-2018, Rémi Jean
* @author Frédéric Tempez <frederic.tempez@outlook.com>
* @copyright Copyright (C) 2018-2024, Frédéric Tempez
* @license CC Attribution-NonCommercial-NoDerivatives 4.0 International
* @link http://zwiicms.fr/
*/
class agenda extends common
{
const VERSION = '0.1';
const REALNAME = 'Agenda';
const DATA_DIRECTORY = self::DATA_DIR . 'agenda/';
const SORT_ASC = 'SORT_ASC';
const SORT_DSC = 'SORT_DSC';
const SORT_HAND = 'SORT_HAND';
public static $agendas = [];
public static $agendasId = [];
public static $agendasCenter = [];
public static $actions = [
'config' => self::GROUP_EDITOR,
'delete' => self::GROUP_EDITOR,
'dirs' => self::GROUP_EDITOR,
'add' => self::GROUP_EDITOR,
'edit' => self::GROUP_EDITOR,
'index' => self::GROUP_VISITOR
];
/**
* Mise à jour du module
* Appelée par les fonctions index et config
*/
private function update()
{
//$versionData = $this->getData(['module', $this->getUrl(0), 'config', 'versionData']);
}
/**
* Configuration
*/
public function config()
{
// Soumission du formulaire
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true
) {
$agendas = $this->getData(['module', $this->getUrl(0), 'content']);
if (is_null($agendas)) {
$this->setData(['module', $this->getUrl(0), 'content', []]);
} elseif (!empty($agendas)) {
foreach ($agendas as $agendaId => $agendaData) {
self::$agendas[] = [
$agendaData['eventName'],
helper::dateUTF8('%d %m %Y | %H:%M', $agendaData['date'], self::$i18nUI),
template::button('agendaConfigEdit' . $agendaId, [
'href' => helper::baseUrl() . $this->getUrl(0) . '/edit/' . $agendaId,
'value' => template::ico('pencil'),
'help' => 'Configuration'
]),
template::button('galleryConfigDelete' . $agendaId, [
'class' => 'galleryConfigDelete buttonRed',
'href' => helper::baseUrl() . $this->getUrl(0) . '/delete/' . $agendaId,
'value' => template::ico('trash'),
'help' => 'Supprimer'
])
];
}
}
}
// Valeurs en sortie
$this->addOutput([
'showBarEditButton' => true,
'title' => helper::translate('Configuration'),
'view' => 'config'
]);
}
/**
* Ajout d'une événement
*/
public function add()
{
// Soumission du formulaire d'ajout d'une galerie
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
$agendaId = uniqid();
// Concaténer la date et l'heure
$this->setData([
'module',
$this->getUrl(0),
'content',
$agendaId,
[
'eventName' => $this->getInput('agendaAddEventName', null, true),
'date' => $this->getInput('agendaAddDate', null, true),
'time' => $this->getInput('agendaAddTime', null),
'className' => $this->getInput('agendaAddClass', null),
'dateColor' => $this->getInput('agendaAddDateColor', null),
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Modifications enregistrées'),
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Nouvel événement'),
'view' => 'add',
'vendor' => [
'tinycolorpicker'
],
]);
}
/**
* Ajout d'une événement
*/
public function edit()
{
// Soumission du formulaire d'ajout d'une galerie
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) === true &&
$this->isPost()
) {
$description = $this->getInput('agendaEditDescription', helper::FILTER_STRING_SHORT, true);
// Protége les slashs pour la génération du JSON
$description = addslashes($description);
// Supprime les caractères de contrôle
$description = preg_replace('/[\x00-\x1F\x7F]/u', '', $description);
$this->setData([
'module',
$this->getUrl(0),
'content',
$this->getUrl(2),
[
'name' => $this->getInput('agendaEditName', null, true),
'description' => $description,
'lat' => $this->getInput('agendaEditLat', helper::FILTER_FLOAT, true),
'long' => $this->getInput('agendaEditLong', helper::FILTER_FLOAT, true)
]
]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Nouvel événement créé'),
'state' => true
]);
}
// Valeurs en sortie
$this->addOutput([
'title' => helper::translate('Edition'),
'view' => 'edit',
'vendor' => [
'tinycolorpicker'
],
]);
}
/**
* Suppression
*/
public function delete()
{
// La galerie n'existe pas
if (
$this->getUser('permission', __CLASS__, __FUNCTION__) !== true ||
$this->getData(['module', $this->getUrl(0), 'content', $this->getUrl(2)]) === null
) {
// Valeurs en sortie
$this->addOutput([
'access' => false
]);
}
// Suppression
else {
$this->deleteData(['module', $this->getUrl(0), 'content', $this->getUrl(2)]);
// Valeurs en sortie
$this->addOutput([
'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config',
'notification' => helper::translate('Evenement effacé'),
'state' => true
]);
}
}
/**
* Accueil (deux affichages en un pour éviter une url à rallonge)
*/
public function index()
{
// Mise à jour des données de module
$this->update();
$agendas = $this->getData(['module', $this->getUrl(0), 'content']);
// Affichage du template si les données sont disponibles
if (is_null($agendas)) {
$this->setData(['module', $this->getUrl(0), 'content', []]);
// Initialise la feuille de style
$this->initCss();
} elseif (!empty($agendas)) {
// Lecture des données
foreach ($agendas as $agendasId => $data) {
// Ajouter l'horaire
if (!empty($data['time'])) {
$data['date'] = $data['date'] . 'T' . $data['time'];
}
//unset($data['time']);
self::$agendas[] = $data;
}
}
// Valeurs en sortie
$this->addOutput([
'showBarEditButton' => true,
'showPageContent' => true,
'view' => 'index',
'vendor' => [
'animated-calendar'
],
]);
}
// Page de module vide
private function initCss()
{
if (empty($this->getData(['page', $this->getUrl(0), 'css']))) {
// Feuille de styles
$cssContent =
'.textRed {
padding: 2px;
border-radius: 5px;
color: red;
background-color: lightgrey;
}
.textGreen {
border-radius: 5px;
padding: 2px;
color: lightgreen;
background-color: darkgrey;
}
.textOrange {
padding: 2px;
border-radius: 5px;
color: orange;
background-color: green;
}';
$this->setData(['page', $this->getUrl(0), 'css', $cssContent]);
}
}
}