* @copyright 2010 Tela-Botanica * @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL * @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL * @version SVN: $Id$ */ abstract class aControleur extends Controleur { const FMT_DATE = '%d/%m/%Y';// Supporte les formats de dates non valides (1989-00-00) const FMT_DATE_TXT = '%A %d %B %Y'; const FMT_DATE_HEURE = '%d/%m/%Y %H:%i:%s';// Supporte les formats de dates non valides (1989-00-00 00:00:00) const FMT_DATE_HEURE_TXT = '%A %d %B %Y à %H:%M'; const META_TITRE = 'titre'; const META_DESCRIPTION = 'description'; const META_TAGS = 'tags'; const RENDU_TETE = 'tete'; const RENDU_CORPS = 'corps'; const RENDU_PIED = 'pied'; const TYPE_AUTRE = 'AUTRE'; const TYPE_TOTAL = 'TOTAL'; const SEPARATEUR_TYPE_VALEUR = '##'; const SEPARATEUR_VALEURS = ';;'; const SEPARATEUR_DONNEES = '||'; const VALEUR_NULL = 'NC'; private $sortie = array(); private $parametres = array(); // FIXME : voir s'il est plus intéressant d'utiliser une méthode dans les classes filles protected $url = null; protected $registre = array(); public function __construct() { $this->registre = Registre::getInstance(); $this->parametres = $this->registre->get('parametres'); $this->url = $this->parametres['url']; parent::__construct(); } /** * Attribue une position de sortie à un contenu. */ protected function setSortie($position, $contenu, $fusionner = false) { if ($this->verifierExistenceTypeSortie($position)) { if ($fusionner) { $this->sortie[$position] .= $contenu; } else { $this->sortie[$position] = $contenu; } } } /** * Vérifie l'existence du type de sortie indiqué pour son utilisation dans le tableau de sortie. * @param string le type de sortie à tester. * @return bool true si le type de sortie est valide, sinon false. */ private function verifierExistenceTypeSortie($type) { $existe = true; if ($type != self::RENDU_TETE && $type != self::RENDU_CORPS && $type != self::RENDU_PIED && $type != self::META_TITRE && $type != self::META_DESCRIPTION && $type != self::META_TAGS) { trigger_error("Le type de sortie '$type' n'est pas une valeur prédéfinie.", E_USER_WARNING); $existe = false; } return $existe; } /** * Retourne le tableau de sortie à utiliser dans le controleur principal de l'application. */ public function getSortie() { return $this->sortie; } /** * Execute l'action d'un module donnée et fusionne le résultat avec le tableau de sortie. */ protected function executerAction($ClasseModule, $action) { $module = new $ClasseModule(); $module->$action(); $this->fusionnerSortie($module->getSortie()); } /** * Fusionne un tableau de sortie par défaut avec le tableau passé en paramêtre. * @param array le tableau à fusionner */ private function fusionnerSortie($sortie) { $this->sortie = array_merge($this->sortie, $sortie); } protected function construireTxtTruckSimple($chaine_a_analyser) { return $this->construireTxtTruck($chaine_a_analyser, false, false); } protected function construireTxtTruckSansMajuscule($chaine_a_analyser) { return $this->construireTxtTruck($chaine_a_analyser, false, true); } protected function construireTxtTruckSansPointFinal($chaine_a_analyser) { return $this->construireTxtTruck($chaine_a_analyser, true, false); } protected function construireTxtTruck($chaine_a_analyser, $majuscule = true, $point_final = true) { $termes = $this->traiterTxtTruck($chaine_a_analyser); $chaine_a_retourner = $this->formaterTableauDeTxt($termes, $majuscule, $point_final); return $chaine_a_retourner; } protected function traiterTxtTruck($chaine_a_analyser) { $termes = array(); if ((!is_null($chaine_a_analyser)) && (trim($chaine_a_analyser) != '')) { $valeurs = explode(self::SEPARATEUR_VALEURS, $chaine_a_analyser); $nbre_valeurs = count($valeurs); if ($nbre_valeurs > 0) { for ($i = 0; $i < $nbre_valeurs; $i++) { $valeur = trim($valeurs[$i]); if ($valeur != '') { $valeur_formatee = $this->formaterValeurTruck($valeur); $termes[] = $valeur_formatee; } } } } return $termes; } protected function getTxtTruckParPosition($chaine_a_analyser, $position = 1) { $retour = ''; if ((!is_null($chaine_a_analyser)) && (trim($chaine_a_analyser) != '')) { $valeurs = explode(self::SEPARATEUR_VALEURS, $chaine_a_analyser); $nbre_valeurs = count($valeurs); if ($nbre_valeurs > 0) { $position = $position - 1; $valeur = trim($valeurs[$position]); if ($valeur != '') { $retour = $this->formaterValeurTruck($valeur); } } } return $retour; } protected function getTableauTruck($chaine_a_analyser) { $tableau_retour = array(); if ((!is_null($chaine_a_analyser)) && (trim($chaine_a_analyser) != '')) { $valeurs = explode(self::SEPARATEUR_VALEURS, $chaine_a_analyser); $nbre_valeurs = count($valeurs); if ($nbre_valeurs > 0) { for ($i = 0; $i < $nbre_valeurs; $i++) { $valeur = trim($valeurs[$i]); if ($valeur != '') { $tableau_retour[] = $valeur; } } } } return $tableau_retour; } private function formaterValeurTruck($valeur) { $chaine_a_retourner = ''; if (preg_match('/^[^#]+##[^$]+$/', $valeur)) { $cle_valeur = explode(self::SEPARATEUR_TYPE_VALEUR, $valeur); $chaine_a_retourner = (($cle_valeur[1] == '' || $cle_valeur[1] == 'null') ? self::VALEUR_NULL : $cle_valeur[1]); $chaine_a_retourner .= ' '.$this->formaterParenthese($cle_valeur[0]); } else if ($valeur != '') { $chaine_a_retourner = $valeur; } else { trigger_error("Valeur truck posant problème :$valeur", E_USER_NOTICE); } return $chaine_a_retourner; } protected function formaterParenthese($chaine_a_afficher) { if ($chaine_a_afficher != '') { $chaine_a_afficher = '('.$chaine_a_afficher.')'; } return $chaine_a_afficher; } protected function formaterSautDeLigne($chaine_a_formater) { $txt_a_retourner = preg_replace('/\n/', '
', $chaine_a_formater); return $txt_a_retourner; } protected function formaterTableauDeTxt($tableau_de_txt, $majuscule = true, $point_final = true) { $chaine_a_afficher = ''; $taille_du_tableau = count($tableau_de_txt); if ($taille_du_tableau > 0) { $index_avt_dernier = $taille_du_tableau - 1; for ($i = 0; $i < $taille_du_tableau; $i++) { $mot = $tableau_de_txt[$i]; if ($i != $index_avt_dernier) { $chaine_a_afficher .= $mot.', '; } else { $chaine_a_afficher .= $this->nettoyerPointFinal($mot); if ($point_final) { $chaine_a_afficher .= '.'; } } } } if ($majuscule) { $chaine_a_afficher = ucfirst($chaine_a_afficher); } return $chaine_a_afficher; } protected function formaterAutre($chaine_a_afficher) { if ($chaine_a_afficher != '') { $chaine_a_afficher = ' [Autre : '.$chaine_a_afficher.']'; } return $chaine_a_afficher; } protected function formaterOuiNon($chaine_a_formater) { $txt_a_retourner = ''; if ($chaine_a_formater == '0') { $txt_a_retourner = 'non'; } else if ($chaine_a_formater == '1') { $txt_a_retourner = 'oui'; } return $txt_a_retourner; } protected function formaterDate($date, $format = self::FMT_DATE_HEURE, $chaineSiVide = 'Inconnue') { if ($date == '' || $date == '0000-00-00' || $date == '0000-00-00 00:00:00') { $date = $chaineSiVide; } else { if (preg_match('/^([0-9]{4})-([0-9]{2})-([0-9]{2})(?: ([0-9]{2}):([0-9]{2}):([0-9]{2})|)$/', $date, $match)) {// Date Heure $annee = $match[1]; $mois = $match[2]; $jour = $match[3]; $heure = (isset($match[4])) ? $match[4] : '00'; $minute = (isset($match[5])) ? $match[5] : '00'; $seconde = (isset($match[6])) ? $match[6] : '00'; if ($format == self::FMT_DATE && $jour == '00' && $mois == '00') { $date = $annee; } else if ($format == self::FMT_DATE && $jour == '00') { $date = strftime('%b', mktime(0, 0, 0, $mois, 1)).' '.$annee; } else { $timestamp = strtotime($date); if ($timestamp !== false) { $date = strftime($format, $timestamp); } } } else { $e = "La chaine '$date' n'est pas reconnue."; trigger_error($e, E_USER_WARNING); } } return $date; } protected function formaterCourriels($courriels) { $fmt_courriels = ''; if (!empty($courriels)) { $courriels = (is_array($courriels)) ? $courriels : array($courriels); foreach ($courriels as $cle => $courriel) { $fmt = array(); $courriel = preg_replace('/@/', ' [arrobase] ', $courriel); $courriel = preg_replace('/[.]([^.]+)$/', " [point] $1", $courriel); $fmt[] = $this->getVue('courriel', array('courriel' => $courriel)); } $fmt_courriels = implode(', ', $fmt); } return $fmt_courriels; } protected function nettoyerPointFinal($mot) { $mot = preg_replace('/[.]$/', '', $mot); return $mot; } public function construireTxtListeOntologie($chaineAAnalyser, $valeurEstOntologie = true, $typeEstOntologie = true, $donneeEstOntologie = false) { $termes = array(); $autres = array(); $chaineAAnalyser = trim($chaineAAnalyser); if ($chaineAAnalyser != '') { $valeurs = explode(self::SEPARATEUR_VALEURS, $chaineAAnalyser); $nbreValeurs = count($valeurs); if ($nbreValeurs > 0) { for ($i = 0; $i < $nbreValeurs; $i++) { $valeur = $valeurs[$i]; // VALEUR SANS TYPE // La valeur sans type est une entrée de l'ontologie if ($valeurEstOntologie && preg_match('/^[0-9]+$/u', $valeur)) { if ($valeur == '0') { $valeur = ''; } else { $valeurOntologie = Ontologie::getValeur($valeur); if ($valeurOntologie != '') { $valeur = $valeurOntologie['nom']; } } } // VALEUR AVEC TYPE // Type : AUTRE $valeurTypeAutre = self::TYPE_AUTRE.self::SEPARATEUR_TYPE_VALEUR; if (preg_match('/^'.$valeurTypeAutre.'.+$/u', $valeur)) { $txtAutre = preg_replace('/^'.$valeurTypeAutre.'/u', '', $valeur); if ($txtAutre != '') { $autres[] = $txtAutre; } $valeur = ''; } // Type correspondant à une entrée de l'ontologie if ($typeEstOntologie) { $valeurTypeOntologie = '([0-9]+)'.self::SEPARATEUR_TYPE_VALEUR; $valeurTypeAutre = '([[:alnum:]]+)'.self::SEPARATEUR_TYPE_VALEUR; if (preg_match('/^'.$valeurTypeOntologie.'.*$/u', $valeur, $match)) {// Cas type : réf. numérique $type = $match[1]; $valeurOntologieNom = Ontologie::getValeurNom($type); if ($valeurOntologieNom !== false) { $valeurOntologieNom .= ' : '; $valeur = preg_replace('/^'.$type.'/u', $valeurOntologieNom, $valeur); } } else if (preg_match('/^'.$valeurTypeAutre.'.*$/u', $valeur, $match)) {// Cas type : AUTRE $type = $match[1]; $valeur = preg_replace('/^'.$type.'/u', $type.' : ', $valeur); } } // Donnée correspondant à une entrée de l'ontologie if ($donneeEstOntologie) { $donneeOntologie = self::SEPARATEUR_TYPE_VALEUR.'([0-9]+)'; if (preg_match('/^.+'.$donneeOntologie.'$/u', $valeur, $match)) { $donnee = $match[1]; $donnee = str_replace(self::SEPARATEUR_TYPE_VALEUR, '', $donnee); $valeurOntologieNom = Ontologie::getValeurNom($donnee); if ($valeurOntologieNom !== false) { $valeur = preg_replace('/'.$donnee.'$/u', $valeurOntologieNom, $valeur); } } } // Nettoyage final $valeur = preg_replace('/'.self::SEPARATEUR_TYPE_VALEUR.'/', '', $valeur); if ($valeur != '') { $termes[] = $valeur; } } } } $chaineTermes = $this->formaterTableauDeTxt($termes); $chaineAutres = $this->formaterTableauDeTxt($autres); $chaineARetourner = $chaineTermes.$this->formaterAutre($chaineAutres); return $chaineARetourner; } protected function obtenirUrlRecherche($txt = null) { $this->url->setRequete(false); if (!is_null($this->registre->get('contexte'))) { $this->url->setVariableRequete('contexte', $this->registre->get('contexte')); } $this->url->setVariableRequete('module', 'Recherche'); $this->url->setVariableRequete('action', 'rechercher'); if (!is_null($txt)) { $this->url->setVariableRequete('recherche', $txt); } $url = $this->url->getURL(); $this->url->unsetVariablesRequete(array('module', 'action', 'recherche')); return $url; } protected function obtenirUrlFicheStructure($id_structure) { $url = $this->obtenirObjetUrlFicheStructure($id_structure); return $url->getURL(); } protected function obtenirObjetUrlFicheStructure($id_structure) { $this->url->setRequete(false); if (!is_null($this->registre->get('contexte'))) { $this->url->setVariableRequete('contexte', $this->registre->get('contexte')); } $this->url->setVariableRequete('module', 'FicheStructure'); $this->url->setVariableRequete('id', $id_structure); $url = clone $this->url; $this->url->unsetVariablesRequete(array('module', 'id')); return $url; } protected function obtenirUrlFicheCollection($id_collection) { $url = $this->obtenirObjetUrlFicheCollection($id_collection); return $url->getURL(); } protected function obtenirObjetUrlFicheCollection($id_collection) { $this->url->setRequete(false); if (!is_null($this->registre->get('contexte'))) { $this->url->setVariableRequete('contexte', $this->registre->get('contexte')); } $this->url->setVariableRequete('module', 'FicheCollection'); $this->url->setVariableRequete('id', $id_collection); $url = clone $this->url; $this->url->unsetVariablesRequete(array('module', 'id')); return $url; } protected function obtenirUrlFichePersonne($id_personne) { $url = $this->obtenirObjetUrlFichePersonne($id_personne); return $url->getURL(); } protected function obtenirObjetUrlFichePersonne($id_personne) { $this->url->setRequete(false); if (!is_null($this->registre->get('contexte'))) { $this->url->setVariableRequete('contexte', $this->registre->get('contexte')); } $this->url->setVariableRequete('module', 'FichePersonne'); $this->url->setVariableRequete('id', $id_personne); $url = clone $this->url; $this->url->unsetVariablesRequete(array('module', 'id')); return $url; } protected function obtenirPermalienGuid($guid) { $url = Config::get('url_base_permalien'); $url .= (substr($url, -1, 1) == '/') ? '' : '/'; $url .= $guid; return $url; } protected function postraiterDonnees(&$tableau) { if (count($tableau) > 0) { foreach ($tableau as $cle => &$valeur) { // ajout d'un nbsp pour ne pas fausser l'affichage du template // afin que les
et
aient la même largeur if ($valeur == '') { $valeur = ' '; } else if (is_string($valeur)) { $valeur = $this->remplacerEsperluette($valeur); } else if (is_array($valeur)) { $this->postraiterDonnees($valeur); } } } } private function remplacerEsperluette($txt) { $txt = preg_replace('/&(?!([a-z]+|#[0-9]+|#x[0-9a-f]+);)/i', '&', $txt, -1); return $txt; } protected function chargerPiedDePage() { $donnees['appli'] = Application::getInfo(); $donnees['url_base_widget_remarques'] = Config::get('url_base_widget_remarques'); $this->setSortie(self::RENDU_PIED, $this->getVue('pied', $donnees)); } }