diff --git a/agenda/agenda.php b/agenda/agenda.php index 5444d5f..f93ff0a 100644 --- a/agenda/agenda.php +++ b/agenda/agenda.php @@ -11,14 +11,15 @@ * @license GNU General Public License, version 3 * @link http://zwiicms.com/ */ - /** Module Zwii développé par Sylvain Lelièvre +/** Module Zwii développé par Sylvain Lelièvre * Utilise le package Fullcalendar * FullCalendar Core Package v4.3.1 * Docs & License: https://fullcalendar.io/ * (c) 2019 Adam Shaw */ -class agenda extends common { +class agenda extends common +{ public static $actions = [ 'add' => self::GROUP_VISITOR, @@ -32,20 +33,20 @@ class agenda extends common { 'index' => self::GROUP_VISITOR ]; - const VERSION = '4.7'; + const VERSION = '4.7'; const REALNAME = 'Agenda'; const DELETE = true; const UPDATE = '4.1'; - const DATADIRECTORY = self::DATA_DIR.'agenda/'; - + const DATADIRECTORY = self::DATA_DIR . 'agenda/'; + // Constantes utilisées pour les adresses des données externes - const DATAMODULE = self::DATA_DIR.'agenda/module/'; - const DATAFILE ='./site/file/source/agenda/'; - + const DATAMODULE = self::DATA_DIR . 'agenda/module/'; + const DATAFILE = './site/file/source/agenda/'; + // Gestion des catégories public static $tabCategories = []; public static $categorie = []; - + //Couleur du bandeau et du texte public static $couleur = [ 'black' => 'noir', @@ -57,14 +58,14 @@ class agenda extends common { 'green' => 'vert', 'white' => 'blanc' ]; - + public static $groupe = [ '0' => 'Visiteur', '1' => 'Membre', '2' => 'Editeur', '3' => 'Administrateur' ]; - + //Evenement public static $evenement = [ 'id' => 0, @@ -76,7 +77,7 @@ class agenda extends common { 'groupe_lire' => 0, 'groupe_mod' => 2 ]; - + //Largeur maximale de l'agenda public static $maxwidth = [ '400' => '400 pixels', @@ -88,7 +89,7 @@ class agenda extends common { '1130' => '1130 pixels', '10000' => '100%' ]; - + // Gestion des dates public static $datecreation = ''; public static $time_unix_deb = ''; @@ -96,56 +97,58 @@ class agenda extends common { public static $annee; public static $jour; public static $mois; - + public static $sujet_mailing = ''; - - public static $liste_adresses =[]; - + + public static $liste_adresses = []; + // Fichiers sauvegardés public static $savedFiles = []; public static $icsFiles = []; public static $csvFiles = []; - + //Pour choix de l'affichage mois / semaine dans configuration de l'agenda public static $vue_agenda = [ 'dayGridMonth' => 'Vue par mois', 'dayGridWeek' => 'Vue par semaine' ]; - /** - * Mise à jour du module - * Appelée par les fonctions index et config - */ - private function update() { + /** + * Mise à jour du module + * Appelée par les fonctions index et config + */ + private function update() + { // Initialisation ou mise à jour vers la version 4.5 - if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '4.5', '<') ) { + if (version_compare($this->getData(['module', $this->getUrl(0), 'config', 'versionData']), '4.5', '<')) { //Si mise à jour depuis une version <4.5 - if( is_dir('site/data/agenda/data')){ - $this->custom_copy( 'site/data/agenda/data', 'site/data/agenda/module/data'); + if (is_dir('site/data/agenda/data')) { + $this->custom_copy('site/data/agenda/data', 'site/data/agenda/module/data'); $this->deleteDir('site/data/agenda/data'); - $this->custom_copy( 'site/data/agenda/adresses', 'site/data/agenda/module/adresses'); + $this->custom_copy('site/data/agenda/adresses', 'site/data/agenda/module/adresses'); $this->deleteDir('site/data/agenda/adresses'); - $this->custom_copy( 'site/data/agenda/ics', 'site/data/agenda/module/ics'); + $this->custom_copy('site/data/agenda/ics', 'site/data/agenda/module/ics'); $this->deleteDir('site/data/agenda/ics'); - $this->custom_copy( 'site/data/agenda/categories', 'site/data/agenda/module/categories'); + $this->custom_copy('site/data/agenda/categories', 'site/data/agenda/module/categories'); $this->deleteDir('site/data/agenda/categories'); } - $this->setData(['module', $this->getUrl(0), 'config', 'versionData','4.5']); - } + $this->setData(['module', $this->getUrl(0), 'config', 'versionData', '4.5']); + } } - + /** * Configuration Paramètrage */ - public function config() { - + public function config() + { + // Mise à jour des données de module $this->update(); - + // Soumission du formulaire - if($this->isPost()) { + if ($this->isPost()) { $notification = 'Opérations enregistrées'; $state = true; $fichier_restaure = $this->getInput('config_restaure'); @@ -153,25 +156,25 @@ class agenda extends common { $droit_creation = $this->getInput('config_droit_creation'); $droit_limite = $this->getInput('config_droit_limite', helper::FILTER_BOOLEAN); $fichier_ics = $this->getInput('config_fichier_ics'); - $largeur_maxi = $this->getInput('config_MaxiWidth'); + $largeur_maxi = $this->getInput('config_MaxiWidth'); $fichier_csv_txt = $this->getInput('config_fichier_csv_txt'); - + //Sauvegarder l'agenda - if ($fichier_sauve !=''){ - $json_sauve = file_get_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json'); - file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve/'.$fichier_sauve.'.json', $json_sauve); + if ($fichier_sauve != '') { + $json_sauve = file_get_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json'); + file_put_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve/' . $fichier_sauve . '.json', $json_sauve); } - + //Charger un agenda sauvegardé - if (strpos($fichier_restaure,'.json') !== false){ - + if (strpos($fichier_restaure, '.json') !== false) { + //Remplacement par le fichier de restauration - $json_restaure = file_get_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve/'. $fichier_restaure); - file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json', $json_restaure); - + $json_restaure = file_get_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve/' . $fichier_restaure); + file_put_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json', $json_restaure); + //Sauvegarde dans data_sauve de l'agenda chargé $this->sauve($json_restaure); - + //Valeurs en sortie après prise en compte du formulaire $this->addOutput([ 'notification' => 'Agenda chargé', @@ -179,143 +182,141 @@ class agenda extends common { 'state' => true ]); } - + //Ajouter des évènements contenus dans le fichier ics - if (strpos($fichier_ics,'.ics') !== false){ - $tableau = $this->getIcsEventsAsArray(self::DATAFILE.'ics/'.$fichier_ics); - foreach($tableau as $key=>$value){ + if (strpos($fichier_ics, '.ics') !== false) { + $tableau = $this->getIcsEventsAsArray(self::DATAFILE . 'ics/' . $fichier_ics); + foreach ($tableau as $key => $value) { $evenement_texte = ''; $date_debut = ''; $date_fin = ''; $begin = ''; $end = ''; - $clef_fin =''; - foreach($value as $key2=>$value2){ - if($key2 == "BEGIN"){ + $clef_fin = ''; + foreach ($value as $key2 => $value2) { + if ($key2 == "BEGIN") { $begin = $value2; } - if($key2 == "SUMMARY"){ + if ($key2 == "SUMMARY") { $evenement_texte = $value2; } - if(strpos($key2,"DTSTART") !== false){ + if (strpos($key2, "DTSTART") !== false) { $date_debut = $value2; $clef_debut = $key2; } - if(strpos($key2,"DTEND") !== false){ + if (strpos($key2, "DTEND") !== false) { $date_fin = $value2; $clef_fin = $key2; } - if($key2 == "END"){ + if ($key2 == "END") { $end = $value2; } } - + //Si un évènement VEVENT est trouvé, avec summary et dtstart présents, on ajoute cet évènement à l'agenda - if ($evenement_texte != '' && strpos($begin,'VEVENT')!==false && $date_debut!=='' ){ - if($date_fin == '') { - $date_fin = $date_debut; + if ($evenement_texte != '' && strpos($begin, 'VEVENT') !== false && $date_debut !== '') { + if ($date_fin == '') { + $date_fin = $date_debut; $clef_fin = $clef_debut; } $evenement_texte = $this->modif_texte($evenement_texte); //Modifier date format ics yyyymmddThhmm... ou yyyymmdd vers format fullcalendar yyyy-mm-ddThh:mm $date_debut = $this->modif_date($date_debut, $clef_debut); $date_fin = $this->modif_date($date_fin, $clef_fin); - + //Valeurs par défaut pour l'import ics fond blanc, texte noir, lecture visiteur, modification éditeur - $this->nouvel_evenement($evenement_texte,$date_debut,$date_fin,'white','black','0','2', '0', '', '', ''); + $this->nouvel_evenement($evenement_texte, $date_debut, $date_fin, 'white', 'black', '0', '2', '0', '', '', ''); } } } - + // Ajouter un carnet d'adresses - if (strpos($fichier_csv_txt,'.csv') !== false || strpos($fichier_csv_txt,'.txt') !== false){ - $adresses = file_get_contents(self::DATAFILE.'adresses/'.$fichier_csv_txt); - if( strrchr($adresses, '@') && ! strrchr($adresses, ';')){ - copy(self::DATAFILE.'adresses/'.$fichier_csv_txt, self::DATAMODULE.'adresses/'.$fichier_csv_txt); - } - else{ + if (strpos($fichier_csv_txt, '.csv') !== false || strpos($fichier_csv_txt, '.txt') !== false) { + $adresses = file_get_contents(self::DATAFILE . 'adresses/' . $fichier_csv_txt); + if (strrchr($adresses, '@') && !strrchr($adresses, ';')) { + copy(self::DATAFILE . 'adresses/' . $fichier_csv_txt, self::DATAMODULE . 'adresses/' . $fichier_csv_txt); + } else { $notification = 'Le contenu du carnet d\'adresses est incorrect'; - $state = false; + $state = false; } } - + //Mise à jour des données de configuration liées aux droits et à l'affichage - $this->setData(['module', $this->getUrl(0), 'config', [ - 'droit_creation' => intval($droit_creation), - 'droit_limite' => $droit_limite, - 'maxiWidth' => $largeur_maxi, - 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) - ]]); - + $this->setData([ + 'module', + $this->getUrl(0), + 'config', + [ + 'droit_creation' => intval($droit_creation), + 'droit_limite' => $droit_limite, + 'maxiWidth' => $largeur_maxi, + 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) + ] + ]); + //Valeurs en sortie $this->addOutput([ 'notification' => $notification, 'redirect' => helper::baseUrl() . $this->getUrl(0), 'state' => $state ]); - } - else{ + } else { // Fichiers sauvegardés - if(is_dir(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve')) { - $dir=self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve'; + if (is_dir(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve')) { + $dir = self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve'; $values = scandir($dir); - self::$savedFiles=[]; + self::$savedFiles = []; $values[0] = 'Votre choix...'; unset($values[array_search('..', $values)]); - if (count($values) <= 1){ - self::$savedFiles = array(0 => 'Pas de fichier dans le dossier'. self::DATAMODULE.'/data'); - } - else{ + if (count($values) <= 1) { + self::$savedFiles = array(0 => 'Pas de fichier dans le dossier' . self::DATAMODULE . '/data'); + } else { //Modifier les clefs (qui sont les valeurs de retour du formulaire avec 'config_restaure') avec clef = valeur - self::$savedFiles = array_combine($values,$values); + self::$savedFiles = array_combine($values, $values); } - } - else { - self::$savedFiles = array(0 => 'Dossier'.self::DATAMODULE.'data inexistant'); + } else { + self::$savedFiles = array(0 => 'Dossier' . self::DATAMODULE . 'data inexistant'); } // Fichiers ics - if(is_dir(self::DATAFILE.'ics')) { - $dir=self::DATAFILE.'ics'; + if (is_dir(self::DATAFILE . 'ics')) { + $dir = self::DATAFILE . 'ics'; $values = scandir($dir); $values[0] = 'Votre choix...'; unset($values[array_search('..', $values)]); - if (count($values) <= 1){ - self::$icsFiles = array(0 => 'Pas de fichier dans le dossier '.self::DATAFILE.'ics'); - } - else{ + if (count($values) <= 1) { + self::$icsFiles = array(0 => 'Pas de fichier dans le dossier ' . self::DATAFILE . 'ics'); + } else { //Modifier les clefs (qui sont les valeurs de retour du formulaire avec 'config_fichier_ics') avec clef = valeur - self::$icsFiles = array_combine($values,$values); + self::$icsFiles = array_combine($values, $values); } - } - else { - self::$icsFiles = array(0 => 'Dossier '.self::DATAFILE.'ics non existant'); + } else { + self::$icsFiles = array(0 => 'Dossier ' . self::DATAFILE . 'ics non existant'); } // Fichiers csv ou txt - if(is_dir(self::DATAFILE.'adresses')) { - $dir=self::DATAFILE.'adresses'; + if (is_dir(self::DATAFILE . 'adresses')) { + $dir = self::DATAFILE . 'adresses'; $values = scandir($dir); $values[0] = 'Votre choix...'; unset($values[array_search('..', $values)]); // Supprimer les $values qui ne sont pas csv ou txt - for($i=2; $i <= count($values); $i++){ - if ( pathinfo($dir.'/'.$values[$i],PATHINFO_EXTENSION) !== 'txt' && pathinfo($dir.'/'.$values[$i],PATHINFO_EXTENSION) !== 'csv') unset($values[$i]); + for ($i = 2; $i <= count($values); $i++) { + if (pathinfo($dir . '/' . $values[$i], PATHINFO_EXTENSION) !== 'txt' && pathinfo($dir . '/' . $values[$i], PATHINFO_EXTENSION) !== 'csv') + unset($values[$i]); } - if (count($values) <= 1){ - self::$csvFiles = array(0 => 'Pas de fichier dans le dossier '.self::DATAFILE.'adresses'); - } - else{ + if (count($values) <= 1) { + self::$csvFiles = array(0 => 'Pas de fichier dans le dossier ' . self::DATAFILE . 'adresses'); + } else { //Modifier les clefs (qui sont les valeurs de retour du formulaire avec 'config_fichier_csv_txt') avec clef = valeur - self::$csvFiles = array_combine($values,$values); + self::$csvFiles = array_combine($values, $values); } + } else { + self::$csvFiles = array(0 => 'Dossier ' . self::DATAFILE . 'adresses non existant'); } - else { - self::$csvFiles = array(0 => 'Dossier '.self::DATAFILE.'adresses non existant'); - } - + // Copie des fichiers ics entre les dossiers self::DATAFILE.ics et self::DATAMODULE.ics pour export - $this->custom_copy(self::DATAFILE.'ics', self::DATAMODULE.'ics'); - $this->custom_copy(self::DATAMODULE.'ics', self::DATAFILE.'ics'); - + $this->custom_copy(self::DATAFILE . 'ics', self::DATAMODULE . 'ics'); + $this->custom_copy(self::DATAMODULE . 'ics', self::DATAFILE . 'ics'); + // Valeurs en sortie hors soumission du formulaire $this->addOutput([ 'showBarEditButton' => true, @@ -324,121 +325,122 @@ class agenda extends common { ]); } } - + /** * Liaison entre edition et suppression d'un évènement */ - public function deleteEvent() { - $json = file_get_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json'); + public function deleteEvent() + { + $json = file_get_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json'); $lid = $this->getUrl(2); $sauve = true; $this->delete($lid, $sauve, $json); } - + /** * Suppression d'un évènement */ - public function delete($lid, $sauve, $json) { + public function delete($lid, $sauve, $json) + { $json_initial = $json; //$pos1 et $pos2 sont les délimiteurs de la partie à supprimer - $pos1 = strpos($json, '{"id":'.$lid); + $pos1 = strpos($json, '{"id":' . $lid); // si $pos1 non trouvé pas d'effacement - if ( $pos1 !== false ){ + if ($pos1 !== false) { $pos2 = strpos($json, '}', $pos1); //Premier évènement ? if ($pos1 < 2) { //Premier ! et dernier évènement ? - if (strlen($json) < $pos2 + 4){ - $json ='[]'; - } - else{ - $json = substr_replace($json,'{},',$pos1, $pos2-$pos1+2); + if (strlen($json) < $pos2 + 4) { + $json = '[]'; + } else { + $json = substr_replace($json, '{},', $pos1, $pos2 - $pos1 + 2); } + } else { + $json = substr_replace($json, ',{}', $pos1 - 1, $pos2 - $pos1 + 2); } - else{ - $json = substr_replace($json,',{}',$pos1-1, $pos2-$pos1+2); - } - + //Enregistrer le nouveau fichier json //file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json', $json); - + //Enregistrer le json et sauvegarder dans data_sauve si suppression de l'évènement et non modification - if ($sauve == true){ - file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json', $json); + if ($sauve == true) { + file_put_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json', $json); $this->sauve($json); - + // Emission d'un mailing éventuel en récupérant les valeurs dans le $json initial $tableau = json_decode($json_initial, true); $mailing_val = '0'; $mailing_adresses = 'Votre choix...'; // Si la clef 'mailing_val' existe dans events.json (version >=3.0) lire mailing_val et mailing_adresses - if( isset( $tableau[$lid]['mailing_val'] )){ + if (isset($tableau[$lid]['mailing_val'])) { $mailing_val = $tableau[$lid]['mailing_val']; $mailing_adresses = $tableau[$lid]['mailing_adresses']; self::$sujet_mailing = 'Agenda - Suppression d\'un évènement'; } - $evenement_texte ='SUPPRIME'.$tableau[$lid]['title']; + $evenement_texte = 'SUPPRIME' . $tableau[$lid]['title']; $date_debut = $tableau[$lid]['start']; $date_fin = $tableau[$lid]['end']; - if( $mailing_val === '1') $this->mailing($evenement_texte, $date_debut, $date_fin, $mailing_val, $mailing_adresses); + if ($mailing_val === '1') + $this->mailing($evenement_texte, $date_debut, $date_fin, $mailing_val, $mailing_adresses); //Valeurs en sortie si suppression demandée et réalisée $this->addOutput([ - 'notification' => 'Evènement supprimé', - 'redirect' => helper::baseUrl() . $this->getUrl(0), - 'state' => true + 'notification' => 'Evènement supprimé', + 'redirect' => helper::baseUrl() . $this->getUrl(0), + 'state' => true ]); - } - else{ + } else { return $json; } - } - else{ + } else { return $json; } - + } - - + + /** * Suppression de tous les évènements */ - public function deleteall() { - + public function deleteall() + { + //Sauvegarde dans data de l'agenda actuel bien qu'il soit déjà sauvegardé dans data_sauve - $json = file_get_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json'); - file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events_'.date('YmdHis').'.json', $json); - + $json = file_get_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json'); + file_put_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events_' . date('YmdHis') . '.json', $json); + //Enregistrer le nouveau fichier json vide - $json='[]'; - file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json', $json); - + $json = '[]'; + file_put_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json', $json); + //Valeurs en sortie $this->addOutput([ - 'notification' => 'Suppression de tous les évènements', - 'redirect' => helper::baseUrl() . $this->getUrl(0), - 'state' => true + 'notification' => 'Suppression de tous les évènements', + 'redirect' => helper::baseUrl() . $this->getUrl(0), + 'state' => true ]); - + } - + /* - * Gestion des catégories - */ - public function category(){ + * Gestion des catégories + */ + public function category() + { // Soumission du formulaire - if($this->isPost()) { - + if ($this->isPost()) { + // Ajout ou modification d'une catégorie - if( $this->getInput('categorie_name') !== ''){ + if ($this->getInput('categorie_name') !== '') { $name = $this->getInput('categorie_name'); $fond = $this->getInput('categorie_couleur_fond'); $texte = $this->getInput('categorie_couleur_texte'); - $json = file_get_contents(self::DATAMODULE.'categories/categories.json'); - $tabcat = json_decode($json,true); + $json = file_get_contents(self::DATAMODULE . 'categories/categories.json'); + $tabcat = json_decode($json, true); $unsetkey = ''; - foreach($tabcat as $key=>$value){ - if($value['name'] === $name){ - unset( $value); + foreach ($tabcat as $key => $value) { + if ($value['name'] === $name) { + unset($value); $unsetkey = $key; } } @@ -447,38 +449,43 @@ class agenda extends common { $tabcat[$indice]['backgroundcolor'] = $fond; $tabcat[$indice]['textcolor'] = $texte; $tabcatjson = json_encode($tabcat); - file_put_contents(self::DATAMODULE.'categories/categories.json', $tabcatjson); + file_put_contents(self::DATAMODULE . 'categories/categories.json', $tabcatjson); } - + // Validation du choix par catégorie enregistré dans module.json $valcategories = $this->getInput('val_categories', helper::FILTER_BOOLEAN); //Mise à jour de la validation du choix des couleurs par catégorie - $this->setData(['module', $this->getUrl(0), 'categories', [ - 'valCategories' => $valcategories - ]]); - + $this->setData([ + 'module', + $this->getUrl(0), + 'categories', + [ + 'valCategories' => $valcategories + ] + ]); + //Valeurs en sortie $this->addOutput([ - 'notification' => 'Modifications des catégories enregistrées', - 'redirect' => helper::baseUrl() . $this->getUrl(), - 'state' => true + 'notification' => 'Modifications des catégories enregistrées', + 'redirect' => helper::baseUrl() . $this->getUrl(), + 'state' => true ]); } // Préparation du tableau d'affichage des catégories : nom, couleur du fond, couleur du texte - $json = file_get_contents(self::DATAMODULE.'categories/categories.json'); - $tabcat = json_decode($json,true); - foreach( $tabcat as $key=>$value ){ + $json = file_get_contents(self::DATAMODULE . 'categories/categories.json'); + $tabcat = json_decode($json, true); + foreach ($tabcat as $key => $value) { self::$tabCategories[] = [ $value['name'], $value['backgroundcolor'], $value['textcolor'], $value['name'] !== 'Défaut' ? - template::button('categorieDelete' . $key, [ - 'class' => 'buttonRed', - 'href' => helper::baseUrl() . $this->getUrl(0) . '/categorieDelete/' . $key, - 'value' => template::ico('cancel') - ]) - : '', + template::button('categorieDelete' . $key, [ + 'class' => 'buttonRed', + 'href' => helper::baseUrl() . $this->getUrl(0) . '/categorieDelete/' . $key, + 'value' => template::ico('cancel') + ]) + : '', ]; } // Valeurs en sortie hors soumission du formulaire @@ -491,208 +498,228 @@ class agenda extends common { 'view' => 'category' ]); } - + /* - * Suppression d'une catégorie - */ - public function categorieDelete(){ - - $json = file_get_contents(self::DATAMODULE.'categories/categories.json'); - $tabcat = json_decode($json,true); + * Suppression d'une catégorie + */ + public function categorieDelete() + { + + $json = file_get_contents(self::DATAMODULE . 'categories/categories.json'); + $tabcat = json_decode($json, true); $name = $tabcat[$this->getUrl(2)]['name']; unset($tabcat[$this->getUrl(2)]); $ii = 0; $tab = []; - foreach($tabcat as $key=>$value){ + foreach ($tabcat as $key => $value) { $tab[$ii] = $value; $ii++; - } + } $tabcatjson = json_encode($tab); - file_put_contents(self::DATAMODULE.'categories/categories.json', $tabcatjson); + file_put_contents(self::DATAMODULE . 'categories/categories.json', $tabcatjson); //Valeurs en sortie $this->addOutput([ - 'notification' => 'Catégorie '.$name.' supprimée', - 'redirect' => helper::baseUrl() . $this->getUrl(0).'/categories/', - 'state' => true + 'notification' => 'Catégorie ' . $name . ' supprimée', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/categories/', + 'state' => true ]); } - + /** * Création */ - public function add() { - + public function add() + { + // Soumission du formulaire - if($this->isPost()) { - + if ( + $this->getUser('permission', __CLASS__, __FUNCTION__) === true + && $this->isPost() + ) { + $categorie = ''; //lecture du formulaire - if( $this->getData(['module', $this->getUrl(0), 'categories', 'valCategories' ]) === true ){ + if ($this->getData(['module', $this->getUrl(0), 'categories', 'valCategories']) === true) { $categorie = $this->getInput('creation_categorie'); - $json = file_get_contents(self::DATAMODULE.'categories/categories.json'); - $tabcat = json_decode( $json, true ); + $json = file_get_contents(self::DATAMODULE . 'categories/categories.json'); + $tabcat = json_decode($json, true); $couleur_fond = $tabcat[$categorie]['backgroundcolor']; $couleur_texte = $tabcat[$categorie]['textcolor']; - } - else{ + } else { $couleur_fond = $this->getInput('creation_couleur_fond'); $couleur_texte = $this->getInput('creation_couleur_texte'); } - $evenement_texte = $this->getInput('creation_text',null); + $evenement_texte = $this->getInput('creation_text', null); $date_debut = $this->getInput('creation_date_debut'); $date_fin = $this->getInput('creation_date_fin'); $groupe_visible = $this->getInput('creation_groupe_lire'); $groupe_mod = $this->getInput('creation_groupe_mod'); $mailing_val = $this->getInput('creation_mailing_validation', helper::FILTER_BOOLEAN); $mailing_adresses = $this->getInput('creation_mailing_adresses'); - - if($mailing_val === false){ - $mailing_val='0'; - } - else{ - $mailing_val='1'; + + if ($mailing_val === false) { + $mailing_val = '0'; + } else { + $mailing_val = '1'; } //Modification de CR LF " { } dans le texte de l'évènement $evenement_texte = $this->modif_texte($evenement_texte); - + //Vérification que date fin > date debut - if ($this->verif_date($date_debut,$date_fin)){ + if ($this->verif_date($date_debut, $date_fin)) { self::$sujet_mailing = 'Agenda - Création d\'un évènement'; //Ajout et enregistrement de l'évènement - $json = file_get_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json'); - $this->nouvel_evenement($evenement_texte,$date_debut,$date_fin,$couleur_fond,$couleur_texte,$groupe_visible,$groupe_mod,$mailing_val,$mailing_adresses,$categorie,$json); - + $json = file_get_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json'); + $this->nouvel_evenement($evenement_texte, $date_debut, $date_fin, $couleur_fond, $couleur_texte, $groupe_visible, $groupe_mod, $mailing_val, $mailing_adresses, $categorie, $json); + //Valeurs en sortie après prise en compte du formulaire $this->addOutput([ 'notification' => 'Evènement enregistré', 'state' => true, 'redirect' => helper::baseUrl() . $this->getUrl(0) - ]); + ]); } //Valeurs saisies non correctes - else{ + else { $this->addOutput([ 'notification' => 'La date de fin précède la date de début !', 'view' => 'add', 'state' => false - ]); + ]); } - } - else{ - - // liste des emails des membres - if(! is_dir(self::DATAMODULE.'adresses')) mkdir(self::DATAMODULE.'adresses',0770,true); - // Liste des utilisateurs - $membres = ''; - $editeurs = ''; - $administrateurs = ''; - $inscrits = ''; - foreach($this->getData(['user']) as $userId => $arrayValues){ - if($userId != ''){ - $mail = $this->getData(['user',$userId,'mail']); - switch ($this->getData(['user',$userId,'group'])) { - case 1: - $membres .= $mail.','; - break; - case 2: - $editeurs .= $mail.','; - break; - case 3: - $administrateurs .= $mail.','; - break; - default : - break; + } else { + + // Clic sur un fond sans évènement + + // Le membre doit être connecté + if ($this->getUser('permission', __CLASS__, __FUNCTION__) === true) { + + // liste des emails des membres + if (!is_dir(self::DATAMODULE . 'adresses')) + mkdir(self::DATAMODULE . 'adresses', 0770, true); + // Liste des utilisateurs + $membres = ''; + $editeurs = ''; + $administrateurs = ''; + $inscrits = ''; + foreach ($this->getData(['user']) as $userId => $arrayValues) { + if ($userId != '') { + $mail = $this->getData(['user', $userId, 'mail']); + switch ($this->getData(['user', $userId, 'group'])) { + case 1: + $membres .= $mail . ','; + break; + case 2: + $editeurs .= $mail . ','; + break; + case 3: + $administrateurs .= $mail . ','; + break; + default: + break; + } + $inscrits .= $mail . ','; } - $inscrits .= $mail.','; } - } - //suppression de la dernière virgule - if( $membres != ''){$membres = substr($membres, 0, -1);} - if( $editeurs != ''){$editeurs = substr($editeurs, 0, -1);} - $administrateurs = substr($administrateurs, 0, -1); - $inscrits = substr($inscrits, 0, -1); - //Placer les listes dans un fichier txt et sauvegarder dans le dossier self::DATAMODULE.adresses - file_put_contents(self::DATAMODULE.'adresses/editeurs_administrateurs.txt', $editeurs.','.$administrateurs); - file_put_contents(self::DATAMODULE.'adresses/administrateurs.txt', $administrateurs); - file_put_contents(self::DATAMODULE.'adresses/tous_inscrits.txt', $inscrits); - - // Sélection du fichier destinataires - $dir=self::DATAMODULE.'adresses'; - self::$liste_adresses = scandir($dir); - self::$liste_adresses[0] = 'Votre choix...'; - unset(self::$liste_adresses[array_search('..', self::$liste_adresses)]); - unset(self::$liste_adresses[array_search('.htaccess', self::$liste_adresses)]); - if (count(self::$liste_adresses) <= 1){ - self::$liste_adresses = array(0 => 'Pas de fichier dans le dossier '.self::DATAMODULE.'adresses'); - } - else{ - self::$liste_adresses= array_combine(self::$liste_adresses,self::$liste_adresses); - } - $this->limite_groupes(); - // Tableau des catégories - if( is_file(self::DATAMODULE.'categories/categories.json') && $this->getData(['module', $this->getUrl(0), 'categories', 'valCategories' ]) ){ - $json = file_get_contents(self::DATAMODULE.'categories/categories.json'); - $tabcat = json_decode( $json, true ); - self::$categorie = []; - foreach( $tabcat as $key=>$value){ - self::$categorie[$key] = $tabcat[$key]['name']; + //suppression de la dernière virgule + if ($membres != '') { + $membres = substr($membres, 0, -1); } + if ($editeurs != '') { + $editeurs = substr($editeurs, 0, -1); + } + $administrateurs = substr($administrateurs, 0, -1); + $inscrits = substr($inscrits, 0, -1); + //Placer les listes dans un fichier txt et sauvegarder dans le dossier self::DATAMODULE.adresses + file_put_contents(self::DATAMODULE . 'adresses/editeurs_administrateurs.txt', $editeurs . ',' . $administrateurs); + file_put_contents(self::DATAMODULE . 'adresses/administrateurs.txt', $administrateurs); + file_put_contents(self::DATAMODULE . 'adresses/tous_inscrits.txt', $inscrits); + + // Sélection du fichier destinataires + $dir = self::DATAMODULE . 'adresses'; + self::$liste_adresses = scandir($dir); + self::$liste_adresses[0] = 'Votre choix...'; + unset(self::$liste_adresses[array_search('..', self::$liste_adresses)]); + unset(self::$liste_adresses[array_search('.htaccess', self::$liste_adresses)]); + if (count(self::$liste_adresses) <= 1) { + self::$liste_adresses = array(0 => 'Pas de fichier dans le dossier ' . self::DATAMODULE . 'adresses'); + } else { + self::$liste_adresses = array_combine(self::$liste_adresses, self::$liste_adresses); + } + $this->limite_groupes(); + // Tableau des catégories + if (is_file(self::DATAMODULE . 'categories/categories.json') && $this->getData(['module', $this->getUrl(0), 'categories', 'valCategories'])) { + $json = file_get_contents(self::DATAMODULE . 'categories/categories.json'); + $tabcat = json_decode($json, true); + self::$categorie = []; + foreach ($tabcat as $key => $value) { + self::$categorie[$key] = $tabcat[$key]['name']; + } + } + //Récupérer la date cliquée + $dateclic = self::$datecreation; + self::$annee = intval(substr($dateclic, 0, 4)); + self::$mois = intval(substr($dateclic, 5, 2)); + self::$jour = intval(substr($dateclic, 8, 2)); + //Conversion date au format unix (valeur 0 au 1/1/1970 00:00) + $date = new DateTime(); + //setDate(année, mois, jour) setTime(heure, minute) + $date->setDate(self::$annee, self::$mois, self::$jour); + $date->setTime(8, 00); + self::$time_unix_deb = $date->getTimestamp(); + $date->setTime(18, 00); + self::$time_unix_fin = $date->getTimestamp(); + // Valeurs en sortie hors soumission du formulaire + $this->addOutput([ + 'showBarEditButton' => true, + 'showPageContent' => false, + 'view' => 'add' + ]); + } else { + // Affichage de la page agenda + //Valeurs en sortie après prise en compte du formulaire + $this->addOutput([ + 'notification' => 'Vous n\'êtes pas connecté !', + 'state' => false, + 'redirect' => helper::baseUrl() . $this->getUrl(0) + ]); } - //Récupérer la date cliquée - $dateclic = self::$datecreation; - self::$annee = intval(substr($dateclic, 0, 4)); - self::$mois = intval(substr($dateclic, 5, 2)); - self::$jour= intval(substr($dateclic, 8, 2)); - //Conversion date au format unix (valeur 0 au 1/1/1970 00:00) - $date = new DateTime(); - //setDate(année, mois, jour) setTime(heure, minute) - $date->setDate(self::$annee, self::$mois, self::$jour); - $date->setTime(8, 00); - self::$time_unix_deb = $date->getTimestamp(); - $date->setTime(18, 00); - self::$time_unix_fin = $date->getTimestamp(); - // Valeurs en sortie hors soumission du formulaire - $this->addOutput([ - 'showBarEditButton' => true, - 'showPageContent' => false, - 'view' => 'add' - ]); } } - + /** * Edition, modification, suppression */ - public function edition($lid) { + public function edition($lid) + { //Préparation avant l'édition de l'évènement self::$evenement['id'] = $lid; - $json = file_get_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json'); + $json = file_get_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json'); $tableau = json_decode($json, true); self::$evenement['groupe_lire'] = $tableau[$lid]['groupe_lire']; self::$evenement['groupe_mod'] = $tableau[$lid]['groupe_mod']; self::$evenement['texte'] = $this->restaure_texte($tableau[$lid]['title']); self::$evenement['couleurfond'] = $tableau[$lid]['backgroundColor']; - self::$evenement['couleurtexte'] = $tableau[$lid]['textColor']; + self::$evenement['couleurtexte'] = $tableau[$lid]['textColor']; self::$evenement['categorie'] = $tableau[$lid]['categorie']; $dateclic = $tableau[$lid]['start']; - self::$evenement['datedebut'] = $this->conversion_date($dateclic); + self::$evenement['datedebut'] = $this->conversion_date($dateclic); $dateclic = $tableau[$lid]['end']; self::$evenement['datefin'] = $this->conversion_date($dateclic); - + //Soumission du formulaire - if($this->isPost()) { + if ($this->isPost()) { $categorie = $tableau[$lid]['categorie']; //lecture du formulaire - if( self::$evenement['categorie'] != '' ){ + if (self::$evenement['categorie'] != '') { $categorie = $this->getInput('edition_categorie'); - $jsone = file_get_contents(self::DATAMODULE.'categories/categories.json'); - $tabcat = json_decode( $jsone, true ); + $jsone = file_get_contents(self::DATAMODULE . 'categories/categories.json'); + $tabcat = json_decode($jsone, true); $couleur_fond = $tabcat[$categorie]['backgroundcolor']; $couleur_texte = $tabcat[$categorie]['textcolor']; - } - else{ + } else { $couleur_fond = $this->getInput('edition_couleur_fond'); $couleur_texte = $this->getInput('edition_couleur_texte'); } @@ -701,30 +728,29 @@ class agenda extends common { $date_fin = $this->getInput('edition_date_fin'); $groupe_visible = $this->getInput('edition_groupe_lire'); $groupe_mod = $this->getInput('edition_groupe_mod'); - + // Si la clef 'mailing_val' existe dans events.json (version >=3.0) lire mailing_val et mailing_adresses - if( isset( $tableau[$lid]['mailing_val'] )){ + if (isset($tableau[$lid]['mailing_val'])) { $mailing_val = $tableau[$lid]['mailing_val']; $mailing_adresses = $tableau[$lid]['mailing_adresses']; self::$sujet_mailing = 'Agenda - Modification d\'un évènement'; - } - else{ + } else { $mailing_val = '0'; $mailing_adresses = 'Votre choix...'; } //Modification de CR LF " { } dans le texte de l'évènement $evenement_texte = $this->modif_texte($evenement_texte); - + //Vérification que date fin > date debut - if ($this->verif_date($date_debut,$date_fin)){ - + if ($this->verif_date($date_debut, $date_fin)) { + //Effacer l'évènement sans sauvegarde dans data_sauve $sauve = false; $json = $this->delete($lid, $sauve, $json); - + //Ajout, enregistrement et sauvegarde de l'évènement - $this->nouvel_evenement($evenement_texte,$date_debut,$date_fin,$couleur_fond,$couleur_texte,$groupe_visible,$groupe_mod,$mailing_val,$mailing_adresses,$categorie,$json); + $this->nouvel_evenement($evenement_texte, $date_debut, $date_fin, $couleur_fond, $couleur_texte, $groupe_visible, $groupe_mod, $mailing_val, $mailing_adresses, $categorie, $json); //Valeurs en sortie après prise en compte du formulaire $this->addOutput([ @@ -735,21 +761,20 @@ class agenda extends common { } //Valeurs saisies non correctes - else{ + else { $this->addOutput([ 'notification' => 'La date de fin précède la date de début !', 'view' => 'edition', 'state' => false - ]); + ]); } - } - else{ + } else { // Traitement avant affichage - if( self::$evenement['categorie'] != '' ){ - $json = file_get_contents(self::DATAMODULE.'categories/categories.json'); - $tabcat = json_decode( $json, true ); + if (self::$evenement['categorie'] != '') { + $json = file_get_contents(self::DATAMODULE . 'categories/categories.json'); + $tabcat = json_decode($json, true); self::$categorie = []; - foreach( $tabcat as $key=>$value){ + foreach ($tabcat as $key => $value) { self::$categorie[$key] = $tabcat[$key]['name']; } } @@ -763,122 +788,135 @@ class agenda extends common { } } - + /** * Newname utilisé par la version 9 pour inscrire le nouveau nom de page dans le json du module */ - public function newname() { - $this->setData(['module',$this->getUrl(0),'name',$this->getUrl(0)]); - } - + public function newname() + { + $this->setData(['module', $this->getUrl(0), 'name', $this->getUrl(0)]); + } + /** * Accueil */ - public function index() { - + public function index() + { + // Mise à jour des données de module $this->update(); //Pour récupération des données ajax jquery date ou id $url = $_SERVER['REQUEST_URI']; - if (strpos($url,'/da:') !== false){ + + if (strpos($url, '/da:') !== false) { //Extraction des données de la chaîne url et détection de changement de vue - $dateclic = $this->vue_debut($url,'/da:'); + $dateclic = $this->vue_debut($url, '/da:'); self::$datecreation = $dateclic; //Vers la création d'un évènement $this->add(); - } - else{ - if (strpos($url,'/id:') !== false){ + } else { + if (strpos($url, '/id:') !== false) { //Extraction des données de la chaîne url et détection de changement de vue - $idclic = $this->vue_debut($url,'/id:'); + $idclic = $this->vue_debut($url, '/id:'); //Vers l'édition d'un évènement $this->edition($idclic); - } - else{ + } else { //Initialisations des paramètres de configuration du module et création des dossiers de sauvegarde - if( null === $this->getData(['module', $this->getUrl(0), 'vue'])) { + if (null === $this->getData(['module', $this->getUrl(0), 'vue'])) { // name est utilisé pour détecter un changement de nom de la page contenant le module - $this->setData(['module',$this->getUrl(0),[ - 'name' => $this->getUrl(0), - 'vue' => [ - 'vueagenda' => 'dayGridMonth', - 'debagenda' => date('Y-m-d') - ], - 'config' => [ - 'droit_creation' => 2, - 'droit_limite' => true, - 'maxiWidth' => '800', - 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) - ], - 'categories' => [ - 'valCategories' => false + $this->setData([ + 'module', + $this->getUrl(0), + [ + 'name' => $this->getUrl(0), + 'vue' => [ + 'vueagenda' => 'dayGridMonth', + 'debagenda' => date('Y-m-d') + ], + 'config' => [ + 'droit_creation' => 2, + 'droit_limite' => true, + 'maxiWidth' => '800', + 'versionData' => $this->getData(['module', $this->getUrl(0), 'config', 'versionData']) + ], + 'categories' => [ + 'valCategories' => false + ] ] - ]]); - - //Création des dossiers de sauvegarde de l'agenda - if(! is_dir(self::DATAMODULE.'data')) mkdir(self::DATAMODULE.'data',0770,true); - if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve'))mkdir(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve'); - if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0).'_visible')) mkdir(self::DATAMODULE.'data/'.$this->getUrl(0).'_visible'); - if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0))) mkdir(self::DATAMODULE.'data/'.$this->getUrl(0)); - if(! is_dir(self::DATAFILE.'ics')) mkdir(self::DATAFILE.'ics'); - if(! is_dir(self::DATAFILE.'categories')) mkdir(self::DATAFILE.'categories'); - if(! is_dir(self::DATAMODULE.'ics')) mkdir(self::DATAMODULE.'ics'); - if(! is_dir(self::DATAMODULE.'adresses')) mkdir(self::DATAMODULE.'adresses'); + ]); + + //Création des dossiers de sauvegarde de l'agenda + if (!is_dir(self::DATAMODULE . 'data')) + mkdir(self::DATAMODULE . 'data', 0770, true); + if (!is_dir(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve')) + mkdir(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve'); + if (!is_dir(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_visible')) + mkdir(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_visible'); + if (!is_dir(self::DATAMODULE . 'data/' . $this->getUrl(0))) + mkdir(self::DATAMODULE . 'data/' . $this->getUrl(0)); + if (!is_dir(self::DATAFILE . 'ics')) + mkdir(self::DATAFILE . 'ics'); + if (!is_dir(self::DATAFILE . 'categories')) + mkdir(self::DATAFILE . 'categories'); + if (!is_dir(self::DATAMODULE . 'ics')) + mkdir(self::DATAMODULE . 'ics'); + if (!is_dir(self::DATAMODULE . 'adresses')) + mkdir(self::DATAMODULE . 'adresses'); + - $this->addOutput([ - 'notification' => 'Initialisations effectuées, vous devez valider une configuration.', - 'redirect' => helper::baseUrl() . $this->getUrl(0).'/config/', - 'state' => true - ]); - } - else{ + 'notification' => 'Initialisations effectuées, vous devez valider une configuration.', + 'redirect' => helper::baseUrl() . $this->getUrl(0) . '/config/', + 'state' => true + ]); + } else { //le module existe dans le json, détection du changement de nom de la page pour renommer les dossiers - if(! is_dir(self::DATAMODULE.'data/'.$this->getUrl(0))){ + if (!is_dir(self::DATAMODULE . 'data/' . $this->getUrl(0))) { $oldname = $this->getData(['module', $this->getUrl(0), 'name']); $newname = $this->getUrl(0); - rename( self::DATAMODULE.'data/'.$oldname, self::DATAMODULE.'data/'.$newname); - rename( self::DATAMODULE.'data/'.$oldname.'_visible' , self::DATAMODULE.'data/'.$newname.'_visible'); - rename( self::DATAMODULE.'data/'.$oldname.'_sauve' , self::DATAMODULE.'data/'.$newname.'_sauve'); + rename(self::DATAMODULE . 'data/' . $oldname, self::DATAMODULE . 'data/' . $newname); + rename(self::DATAMODULE . 'data/' . $oldname . '_visible', self::DATAMODULE . 'data/' . $newname . '_visible'); + rename(self::DATAMODULE . 'data/' . $oldname . '_sauve', self::DATAMODULE . 'data/' . $newname . '_sauve'); $this->addOutput([ - 'notification' => 'Modification des dossiers de sauvegarde', - 'state' => true - ]); + 'notification' => 'Modification des dossiers de sauvegarde', + 'state' => true + ]); //Fonctionne avec Zwii 10.0.044 mais sans effet avec version 9.2.27, pourquoi ? //$this->setData(['module',$newname,'name',$newname]); //avec une version 9 on passe par une fonction pour réaliser cette mise à jour $this->newname(); - + } - } - //Si le fichier events.json n'existe pas ou si sa taille est inférieure à 2 on le crée vide - if( is_file(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json') === false || - ( is_file(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json') === true && filesize(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json')<2)){ - file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json', '[]'); } - + //Si le fichier events.json n'existe pas ou si sa taille est inférieure à 2 on le crée vide + if ( + is_file(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json') === false || + (is_file(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json') === true && filesize(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json') < 2) + ) { + file_put_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json', '[]'); + } + //Création d'une copie d'events.json visible en fonction des droits - $json = file_get_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json'); + $json = file_get_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json'); $tableau = json_decode($json, true); - foreach($tableau as $key=>$value){ - if( isset($value['groupe_lire'])){ - if($value['groupe_lire'] > $this->getUser('group')){ - $json = $this->delete_visible($json,$key); - } - else{ - if( isset ($value['title'])){ + foreach ($tableau as $key => $value) { + if (isset($value['groupe_lire'])) { + if ($value['groupe_lire'] > $this->getUser('group')) { + $json = $this->delete_visible($json, $key); + } else { + if (isset($value['title'])) { $newvalues = html_entity_decode($value['title']); $newvalue = strip_tags($newvalues); //Modification de CR LF " { } dans le texte de l'évènement $newvalue = $this->modif_texte($newvalue); - $json = str_replace($value['title'], $newvalue, $json); + $json = str_replace($value['title'], $newvalue, $json); } } } } - file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'_visible/events.json',$json); - + file_put_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_visible/events.json', $json); + // Affichage de la page agenda $this->addOutput([ 'showBarEditButton' => true, @@ -888,23 +926,24 @@ class agenda extends common { ], 'view' => 'index' ]); - + } } } - + /* - /*Fonctions privées - */ - + /*Fonctions privées + */ + /* Conversion date au format unix (valeur 0 au 1/1/1970 00:00) - */ - private function conversion_date($dateclic){ + */ + private function conversion_date($dateclic) + { $annee = intval(substr($dateclic, 0, 4)); $mois = intval(substr($dateclic, 5, 2)); - $jour= intval(substr($dateclic, 8, 2)); + $jour = intval(substr($dateclic, 8, 2)); $heure = intval(substr($dateclic, 11, 2)); $minute = intval(substr($dateclic, 14, 2)); $date = new DateTime(); @@ -912,242 +951,264 @@ class agenda extends common { $date->setTime($heure, $minute); return $date->getTimestamp(); } - - + + /* Vérification que $datedebut précède $datefin - */ - private function verif_date($datedebut, $datefin){ + */ + private function verif_date($datedebut, $datefin) + { $result = false; $date[0] = $datedebut; $date[1] = $datefin; - for($key = 0; $key <2; $key++){ - $annee = substr($date[$key],0,4); - $mois = substr($date[$key],5,2); - $jour = substr($date[$key],8,2); - $heure = substr($date[$key],11,2); - $minute = substr($date[$key],14,2); - $valdate[$key] = intval($annee.$mois.$jour.$heure.$minute); + for ($key = 0; $key < 2; $key++) { + $annee = substr($date[$key], 0, 4); + $mois = substr($date[$key], 5, 2); + $jour = substr($date[$key], 8, 2); + $heure = substr($date[$key], 11, 2); + $minute = substr($date[$key], 14, 2); + $valdate[$key] = intval($annee . $mois . $jour . $heure . $minute); + } + if ($valdate[0] <= $valdate[1]) { + $result = true; } - if ($valdate[0] <= $valdate[1]){ $result = true;} return $result; } - + /*Modifier date format ics yyyymmddThhmm... ou yyyymmdd vers format fullcalendar yyyy-mm-ddThh:mm ou yyyy-mm-dd - */ - private function modif_date($datein, $clef){ - if (strpos($clef, 'VALUE=DATE') !== false){ - $dateout = substr($datein, 0, 4).'-'.substr($datein, 4, 2).'-'.substr($datein, 6, 2); - } - else{ - $dateout = substr($datein, 0, 4).'-'.substr($datein, 4, 2).'-'.substr($datein, 6, 5).':'.substr($datein, 11, 2); + */ + private function modif_date($datein, $clef) + { + if (strpos($clef, 'VALUE=DATE') !== false) { + $dateout = substr($datein, 0, 4) . '-' . substr($datein, 4, 2) . '-' . substr($datein, 6, 2); + } else { + $dateout = substr($datein, 0, 4) . '-' . substr($datein, 4, 2) . '-' . substr($datein, 6, 5) . ':' . substr($datein, 11, 2); } return $dateout; } - - - + + + /* Modification de CR LF " ' { } dans le texte de l'évènement - */ - private function modif_texte($evenement_texte){ - $evenement_texte = str_replace(CHR(13)," ",$evenement_texte); - $evenement_texte = str_replace(CHR(10)," ",$evenement_texte); - $evenement_texte = str_replace('"','"',$evenement_texte); - $evenement_texte = str_replace("'","'",$evenement_texte); - $evenement_texte = str_replace('}','}',$evenement_texte); - $evenement_texte = str_replace('{','{',$evenement_texte); + */ + private function modif_texte($evenement_texte) + { + $evenement_texte = str_replace(CHR(13), " ", $evenement_texte); + $evenement_texte = str_replace(CHR(10), " ", $evenement_texte); + $evenement_texte = str_replace('"', '"', $evenement_texte); + $evenement_texte = str_replace("'", "'", $evenement_texte); + $evenement_texte = str_replace('}', '}', $evenement_texte); + $evenement_texte = str_replace('{', '{', $evenement_texte); return $evenement_texte; } - + /* Restauration des CR LF " ' { } dans le texte de l'évènement - */ - private function restaure_texte($evenement_texte){ - $evenement_texte = str_replace(" ",CHR(13),$evenement_texte); - $evenement_texte = str_replace(" ",CHR(10),$evenement_texte); - $evenement_texte = str_replace('"','"',$evenement_texte); - $evenement_texte = str_replace("'","'",$evenement_texte); - $evenement_texte = str_replace('}','}',$evenement_texte); - $evenement_texte = str_replace('{','{',$evenement_texte); + */ + private function restaure_texte($evenement_texte) + { + $evenement_texte = str_replace(" ", CHR(13), $evenement_texte); + $evenement_texte = str_replace(" ", CHR(10), $evenement_texte); + $evenement_texte = str_replace('"', '"', $evenement_texte); + $evenement_texte = str_replace("'", "'", $evenement_texte); + $evenement_texte = str_replace('}', '}', $evenement_texte); + $evenement_texte = str_replace('{', '{', $evenement_texte); return $evenement_texte; } - + /* Ajout et enregistrement d'un évènement sur création ou édition, émission de mail si mailing_val = '1' - */ - private function nouvel_evenement($evenement_texte,$date_debut,$date_fin,$couleur_fond,$couleur_texte,$groupe_visible,$groupe_mod,$mailing_val, $mailing_adresses, $categorie, $json){ + */ + private function nouvel_evenement($evenement_texte, $date_debut, $date_fin, $couleur_fond, $couleur_texte, $groupe_visible, $groupe_mod, $mailing_val, $mailing_adresses, $categorie, $json) + { //Changement du format des dates yyyy-mm-dd hh:mm:0 vers format fullcalendar yyyy-mm-ddThh:mm - $date_debut = str_replace(' ','T',$date_debut); - $date_fin = str_replace(' ','T',$date_fin); - + $date_debut = str_replace(' ', 'T', $date_debut); + $date_fin = str_replace(' ', 'T', $date_fin); + //Limitation à 16 caractères - $date_debut = substr($date_debut,0,16); - $date_fin = substr($date_fin,0,16); - + $date_debut = substr($date_debut, 0, 16); + $date_fin = substr($date_fin, 0, 16); + //Ouverture et décodage du fichier json - if($json == ''){$json = file_get_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json');} + if ($json == '') { + $json = file_get_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json'); + } $tableau = json_decode($json, true); $keynew = count($tableau); - + //Chaîne à ajouter de type ,{"id":"2","title":"...","start":"...","end":"...","backgroundColor":"...","textColor":"...","groupe":"..."} etc... ] //Sans la virgule initiale si c'est le premier évènement - if (strlen($json) > 2){ - $new = ',{"id":'.$keynew.',"title":"'.$evenement_texte.'","start":"'.$date_debut.'","end":"' - .$date_fin.'","backgroundColor":"'.$couleur_fond.'","textColor":"'.$couleur_texte.'","groupe_lire":"'.$groupe_visible.'","groupe_mod":"' - .$groupe_mod.'","mailing_val":"'.$mailing_val.'","mailing_adresses":"'.$mailing_adresses.'","categorie":"'.$categorie.'"}]'; + if (strlen($json) > 2) { + $new = ',{"id":' . $keynew . ',"title":"' . $evenement_texte . '","start":"' . $date_debut . '","end":"' + . $date_fin . '","backgroundColor":"' . $couleur_fond . '","textColor":"' . $couleur_texte . '","groupe_lire":"' . $groupe_visible . '","groupe_mod":"' + . $groupe_mod . '","mailing_val":"' . $mailing_val . '","mailing_adresses":"' . $mailing_adresses . '","categorie":"' . $categorie . '"}]'; + } else { + $new = '{"id":' . $keynew . ',"title":"' . $evenement_texte . '","start":"' . $date_debut . '","end":"' + . $date_fin . '","backgroundColor":"' . $couleur_fond . '","textColor":"' . $couleur_texte . '","groupe_lire":"' . $groupe_visible . '","groupe_mod":"' + . $groupe_mod . '","mailing_val":"' . $mailing_val . '","mailing_adresses":"' . $mailing_adresses . '","categorie":"' . $categorie . '"}]'; } - else{ - $new = '{"id":'.$keynew.',"title":"'.$evenement_texte.'","start":"'.$date_debut.'","end":"' - .$date_fin.'","backgroundColor":"'.$couleur_fond.'","textColor":"'.$couleur_texte.'","groupe_lire":"'.$groupe_visible.'","groupe_mod":"' - .$groupe_mod.'","mailing_val":"'.$mailing_val.'","mailing_adresses":"'.$mailing_adresses.'","categorie":"'.$categorie.'"}]'; - } - $json = str_replace(']',$new,$json); - + $json = str_replace(']', $new, $json); + //Enregistrement dans le fichier json et sauvegarde pour restauration par "Agenda précédent" - file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'/events.json', $json); + file_put_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '/events.json', $json); $this->sauve($json); - if($mailing_val === '1') $this->mailing($evenement_texte, $date_debut, $date_fin, $mailing_val, $mailing_adresses); + if ($mailing_val === '1') + $this->mailing($evenement_texte, $date_debut, $date_fin, $mailing_val, $mailing_adresses); } - + /* Sauvegarde automatique de l'agenda sous une forme datée après chaque création, modification, suppression d'un évènement - * ou chargement d'un nouvel agenda, seuls les 10 derniers agendas sont sauvegardés - */ - private function sauve($sauve_json) { + * ou chargement d'un nouvel agenda, seuls les 10 derniers agendas sont sauvegardés + */ + private function sauve($sauve_json) + { //Sauvegarde du fichier json actuel - file_put_contents(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve/events_'.date('YmdHis').'.json', $sauve_json); - + file_put_contents(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve/events_' . date('YmdHis') . '.json', $sauve_json); + //Effacement du plus ancien fichier de sauvegarde auto si le nombre de fichiers dépasse 10 - $dir=self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve'; + $dir = self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve'; $nom_fichier = scandir($dir); //Comptage du nombre de fichiers de sauvegarde auto $nb_sauve_auto = 0; $plus_ancien_clef = 0; - foreach($nom_fichier as $key=>$value){ - if(strpos($value,'events_') !== false && strlen($value) == 26){ - if ($nb_sauve_auto == 0) { $plus_ancien_clef = $key;} + foreach ($nom_fichier as $key => $value) { + if (strpos($value, 'events_') !== false && strlen($value) == 26) { + if ($nb_sauve_auto == 0) { + $plus_ancien_clef = $key; + } $nb_sauve_auto++; } } - if ($nb_sauve_auto > 10){ - $handle = opendir(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve'); - unlink(self::DATAMODULE.'data/'.$this->getUrl(0).'_sauve/'.$nom_fichier[$plus_ancien_clef]); + if ($nb_sauve_auto > 10) { + $handle = opendir(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve'); + unlink(self::DATAMODULE . 'data/' . $this->getUrl(0) . '_sauve/' . $nom_fichier[$plus_ancien_clef]); closedir($handle); } } - + /* Suppression d'évènements dans le json public ( visible) en fonction des droits - */ - private function delete_visible($json,$lid) { + */ + private function delete_visible($json, $lid) + { //$pos1 et $pos2 sont les délimiteurs de la partie à supprimer - $pos1 = strpos($json, '{"id":'.$lid); + $pos1 = strpos($json, '{"id":' . $lid); $pos2 = strpos($json, '}', $pos1); //Premier évènement ? if ($pos1 < 2) { //Premier ! et dernier évènement ? - if (strlen($json) < $pos2 + 4){ - $json ='[]'; + if (strlen($json) < $pos2 + 4) { + $json = '[]'; + } else { + $json = substr_replace($json, '{},', $pos1, $pos2 - $pos1 + 2); } - else{ - $json = substr_replace($json,'{},',$pos1, $pos2-$pos1+2); - } - } - else{ - $json = substr_replace($json,',{}',$pos1-1, $pos2-$pos1+2); + } else { + $json = substr_replace($json, ',{}', $pos1 - 1, $pos2 - $pos1 + 2); } return $json; } /* Limitation des choix pour les groupes lecture et modification avant création ou édition - */ - private function limite_groupes() { + */ + private function limite_groupes() + { //Modification du tableau self::$groupe si case cochée en configuration - if ($this->getData(['module', $this->getUrl(0), 'config', 'droit_limite']) - && $this->getUser('group') >= self::$evenement['groupe_mod']){ - switch ($this->getUser('group')) { - case 0 : - array_splice(self::$groupe,1); + if ( + $this->getData(['module', $this->getUrl(0), 'config', 'droit_limite']) + && $this->getUser('group') >= self::$evenement['groupe_mod'] + ) { + switch ($this->getUser('group')) { + case 0: + array_splice(self::$groupe, 1); break; - case 1 : - array_splice(self::$groupe,2); + case 1: + array_splice(self::$groupe, 2); break; - case 2 : - array_splice(self::$groupe,3); + case 2: + array_splice(self::$groupe, 3); break; - } + } } } - + /* - * Extraction des données de la chaîne url et détection de changement de vue - */ - private function vue_debut($url,$idda) { - $pos1 = strpos($url,$idda); - $pos2 = strpos($url,'vue:'); - $pos3 = strpos($url,'deb:'); - $iddaclic = substr($url,$pos1 + 4, $pos2-($pos1+4)); - $grid = substr($url,$pos2 + 4, $pos3-($pos2+4)); - $deb = substr($url,$pos3 + 4, 10); - $gridold = $this->getData(['module', $this->getUrl(0), 'vue','vueagenda']); - $debold = $this->getData(['module', $this->getUrl(0), 'vue','debagenda']); - if($grid != $gridold || $deb != $debold){ - $this->setData(['module', $this->getUrl(0), 'vue', [ - 'vueagenda' => $grid, - 'debagenda' => $deb - ]]); + * Extraction des données de la chaîne url et détection de changement de vue + */ + private function vue_debut($url, $idda) + { + $pos1 = strpos($url, $idda); + $pos2 = strpos($url, 'vue:'); + $pos3 = strpos($url, 'deb:'); + $iddaclic = substr($url, $pos1 + 4, $pos2 - ($pos1 + 4)); + $grid = substr($url, $pos2 + 4, $pos3 - ($pos2 + 4)); + $deb = substr($url, $pos3 + 4, 10); + $gridold = $this->getData(['module', $this->getUrl(0), 'vue', 'vueagenda']); + $debold = $this->getData(['module', $this->getUrl(0), 'vue', 'debagenda']); + if ($grid != $gridold || $deb != $debold) { + $this->setData([ + 'module', + $this->getUrl(0), + 'vue', + [ + 'vueagenda' => $grid, + 'debagenda' => $deb + ] + ]); $this->addOutput([ 'notification' => 'Modification de vue enregistrée', 'state' => true - ]); + ]); } return $iddaclic; } - + /* Function is to get all the contents from ics and explode all the datas according to the events and its sections */ /* de https://www.apptha.com/blog/import-google-calendar-events-in-php/ */ - function getIcsEventsAsArray($file) { - $icalString = file_get_contents ( $file ); - $icsDates = array (); - /* Explode the ICs Data to get datas as array according to string ‘BEGIN:’ */ - $icsData = explode ( "BEGIN:", $icalString ); - /* Iterating the icsData value to make all the start end dates as sub array */ - foreach ( $icsData as $key => $value ) { - $icsDatesMeta [$key] = explode ( "\n", $value ); - } - /* Itearting the Ics Meta Value */ - foreach ( $icsDatesMeta as $key => $value ) { - foreach ( $value as $subKey => $subValue ) { - /* to get ics events in proper order */ - $icsDates = $this->getICSDates ( $key, $subKey, $subValue, $icsDates ); - } - } - return $icsDates; - } - - /* funcion is to avaid the elements wich is not having the proper start, end and summary informations */ - /* de https://www.apptha.com/blog/import-google-calendar-events-in-php/ */ - function getICSDates($key, $subKey, $subValue, $icsDates) { - if ($key != 0 && $subKey == 0) { - $icsDates [$key] ["BEGIN"] = $subValue; - } else { - $subValueArr = explode ( ":", $subValue, 2 ); - if (isset ( $subValueArr [1] )) { - $icsDates [$key] [$subValueArr [0]] = $subValueArr [1]; - } - } - return $icsDates; - } - + function getIcsEventsAsArray($file) + { + $icalString = file_get_contents($file); + $icsDates = array(); + /* Explode the ICs Data to get datas as array according to string ‘BEGIN:’ */ + $icsData = explode("BEGIN:", $icalString); + /* Iterating the icsData value to make all the start end dates as sub array */ + foreach ($icsData as $key => $value) { + $icsDatesMeta[$key] = explode("\n", $value); + } + /* Itearting the Ics Meta Value */ + foreach ($icsDatesMeta as $key => $value) { + foreach ($value as $subKey => $subValue) { + /* to get ics events in proper order */ + $icsDates = $this->getICSDates($key, $subKey, $subValue, $icsDates); + } + } + return $icsDates; + } + + /* funcion is to avaid the elements wich is not having the proper start, end and summary informations */ + /* de https://www.apptha.com/blog/import-google-calendar-events-in-php/ */ + function getICSDates($key, $subKey, $subValue, $icsDates) + { + if ($key != 0 && $subKey == 0) { + $icsDates[$key]["BEGIN"] = $subValue; + } else { + $subValueArr = explode(":", $subValue, 2); + if (isset($subValueArr[1])) { + $icsDates[$key][$subValueArr[0]] = $subValueArr[1]; + } + } + return $icsDates; + } + /* Fonction mailing($evenement_texte, $date_debut, $date_fin, $mailing_val, $mailing_adresses) - /* - */ - private function mailing($evenement_texte, $date_debut, $date_fin, $mailing_val, $mailing_adresses){ - $adresses = file_get_contents(self::DATAMODULE.'adresses/'.$mailing_adresses); - if( strpos( $adresses, '@' ) !== false){ + /* + */ + private function mailing($evenement_texte, $date_debut, $date_fin, $mailing_val, $mailing_adresses) + { + $adresses = file_get_contents(self::DATAMODULE . 'adresses/' . $mailing_adresses); + if (strpos($adresses, '@') !== false) { // Conversion $adresses en tableau - $to=[]; - $to = explode(',',$adresses); + $to = []; + $to = explode(',', $adresses); //filtrage des éléments du tableau $to qui ne contiennent pas @ pour fichiers txt ou csv $num = count($to); - for ($c=0; $c < $num; $c++) { - if (strrchr($to[$c], '@') === false){ + for ($c = 0; $c < $num; $c++) { + if (strrchr($to[$c], '@') === false) { unset($to[$c]); } } @@ -1155,22 +1216,22 @@ class agenda extends common { $date_debut = $this->change_date($date_debut); $date_fin = $this->change_date($date_fin); $subject = self::$sujet_mailing; - $content = 'Evènement '.$evenement_texte.'
Début -> '.$date_debut.'

Fin -> '.$date_fin; + $content = 'Evènement ' . $evenement_texte . '
Début -> ' . $date_debut . '

Fin -> ' . $date_fin; $mode = 'bcc'; $this->envoyerMail($to, $subject, $content, $mode); } } - - + + /* Fonction envoyerMail($to, $subject, $content, $mode) - /* Copie de la fonction sendMail() de core.php avec en plus l'argument $mode pour cacher ou non les destinataires*/ - private function envoyerMail($to, $subject, $content, $mode){ + /* Copie de la fonction sendMail() de core.php avec en plus l'argument $mode pour cacher ou non les destinataires*/ + private function envoyerMail($to, $subject, $content, $mode) + { // Utilisation de PHPMailer version 6.0.6 avec zwii 9.x.x ou 10.x.x - if($this->getData(['core', 'dataVersion']) < 10000) { + if ($this->getData(['core', 'dataVersion']) < 10000) { require_once "core/vendor/phpmailer/phpmailer.php"; require_once "core/vendor/phpmailer/exception.php"; - } - else{ + } else { //require_once "core/class/phpmailer/phpmailer.class.php"; //require_once "core/class/phpmailer/exception.class.php"; } @@ -1179,27 +1240,24 @@ class agenda extends common { include './core/layout/mail.php'; $layout = ob_get_clean(); // Mail - try{ + try { $mail = new PHPMailer\PHPMailer\PHPMailer; $mail->CharSet = 'UTF-8'; $host = str_replace('www.', '', $_SERVER['HTTP_HOST']); $mail->setFrom('no-reply@' . $host, $this->getData(['config', 'title'])); $mail->addReplyTo('no-reply@' . $host, $this->getData(['config', 'title'])); - if(is_array($to)) { - foreach($to as $userMail) { - if ( $mode == 'bcc' ){ - $mail->addBCC($userMail); - } - else{ - $mail->addAddress($userMail); - } + if (is_array($to)) { + foreach ($to as $userMail) { + if ($mode == 'bcc') { + $mail->addBCC($userMail); + } else { + $mail->addAddress($userMail); } - } - else { - if ( $mode == 'bcc' ){ - $mail->addBCC($to); } - else{ + } else { + if ($mode == 'bcc') { + $mail->addBCC($to); + } else { $mail->addAddress($to); } } @@ -1207,11 +1265,10 @@ class agenda extends common { $mail->Subject = $subject; $mail->Body = $layout; $mail->AltBody = strip_tags($content); - if($mail->send()) { - return true; - } - else { - return $mail->ErrorInfo; + if ($mail->send()) { + return true; + } else { + return $mail->ErrorInfo; } } catch (phpmailerException $e) { return $e->errorMessage(); @@ -1219,25 +1276,27 @@ class agenda extends common { return $e->getMessage(); } } - + /* - ** Fonction change_date($date) Modification de l'aspect des dates : 2020-12-04T08:00 vers 04/12/2020 à 08:00 - */ - private function change_date( $date ){ + ** Fonction change_date($date) Modification de l'aspect des dates : 2020-12-04T08:00 vers 04/12/2020 à 08:00 + */ + private function change_date($date) + { $jour = substr($date, 8, 2); $mois = substr($date, 5, 2); $annee = substr($date, 0, 4); $heure = substr($date, 11, 2); $minute = substr($date, 14, 2); - $date = $jour.'/'.$mois.'/'.$annee.' à '.$heure.':'.$minute; + $date = $jour . '/' . $mois . '/' . $annee . ' à ' . $heure . ':' . $minute; return $date; } - - /* - * Copie récursive de dossiers - * - */ - private function custom_copy($src, $dst) { + + /* + * Copie récursive de dossiers + * + */ + private function custom_copy($src, $dst) + { // open the source directory $dir = opendir($src); // Make the destination directory if not exist @@ -1245,14 +1304,13 @@ class agenda extends common { mkdir($dst); } // Loop through the files in source directory - while( $file = readdir($dir) ) { - if (( $file != '.' ) && ( $file != '..' )) { - if ( is_dir($src . '/' . $file) ){ + while ($file = readdir($dir)) { + if (($file != '.') && ($file != '..')) { + if (is_dir($src . '/' . $file)) { // Recursively calling custom copy function // for sub directory - $this -> custom_copy($src . '/' . $file, $dst . '/' . $file); - } - else { + $this->custom_copy($src . '/' . $file, $dst . '/' . $file); + } else { copy($src . '/' . $file, $dst . '/' . $file); } } diff --git a/agenda/view/add/add.php b/agenda/view/add/add.php index ea7fde1..ab3bff3 100644 --- a/agenda/view/add/add.php +++ b/agenda/view/add/add.php @@ -8,10 +8,10 @@ 'value' => 'Retour' ]); ?> - getUser('group') >= $this->getData(['module', $this->getUrl(0), 'config', 'droit_creation']) ){ - echo ''; - echo ''; - if( $this->getUser('group') >= 2){ + getUser('group') >= $this->getData(['module', $this->getUrl(0), 'config', 'droit_creation'])): ?> + ' + ' + getUser('group') >= 2){ echo ''; } else{ @@ -125,18 +125,7 @@ - - - - - - -
-

Vous n'avez pas accès à la création d'évènements, connectez-vous.

-
- - +
Version n°