* @copyright Copyright (C) 2008-2018, Rémi Jean * @author Frédéric Tempez * @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]); } } }