Rev 112 | Rev 144 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?php// declare(encoding='UTF-8');/*** Classe Controleur générale de l'application Collection.** @category php5.2* @package Collection* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>* @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: aControleur.php 114 2010-06-28 09:49:51Z jpm $*/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 fillesprotected $url = null;public function __construct() {$registre = Registre::getInstance();$this->parametres = $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/', '<br />', $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) {if ($date == '' || $date == '0000-00-00' || $date == '0000-00-00 00:00:00') {$date = 'Inconnue';} 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) {$courriel = preg_replace('/@/', ' [arrobase] ', $courriel);$courriel = preg_replace('/[.]([^.]+)$/', " [point] $1", $courriel);$fmt_courriels[] = $this->getVue('courriel', array('courriel' => $courriel));}$fmt_courriels = implode(', ', $fmt_courriels);}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'ontologieif ($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'ontologieif ($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'ontologieif ($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);$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) {$this->url->setRequete(false);$this->url->setVariableRequete('module', 'FicheStructure');$this->url->setVariableRequete('id', $id_structure);$url = $this->url->getURL();$this->url->unsetVariablesRequete(array('module', 'id'));return $url;}protected function obtenirUrlFicheCollection($id_collection) {$this->url->setRequete(false);$this->url->setVariableRequete('module', 'FicheCollection');$this->url->setVariableRequete('id', $id_collection);$url = $this->url->getURL();$this->url->unsetVariablesRequete(array('module', 'id'));return $url;}protected function obtenirUrlFichePersonne($id_personne) {$this->url->setRequete(false);$this->url->setVariableRequete('module', 'FichePersonne');$this->url->setVariableRequete('id', $id_personne);$url = $this->url->getURL();$this->url->unsetVariablesRequete(array('module', 'id'));return $url;}protected function postraiterDonnees(&$tableau) {if (count($tableau) > 0) {foreach ($tableau as $cle => &$valeur) {if ($valeur == '') {$valeur = ' ';} else if (is_string($valeur)) {$valeur = preg_replace('/&(?!amp;)/i', '&', $valeur, -1);} else if (is_array($valeur)) {$this->postraiterDonnees($valeur);}}}}protected function chargerPiedDePage() {$donnees['appli'] = Application::getInfo();$this->setSortie(self::RENDU_PIED, $this->getVue('pied', $donnees));}}