projet = chaine [par défaut : Biodiversite34] * Indique quel projet nous voulons charger * * @author Jean-Pascal MILCENT * @license GPL v3 * @license CECILL v2 * @version $Id$ * @copyright Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org) */ class Saisie extends WidgetCommun { const DS = DIRECTORY_SEPARATOR; const PROJET_DEFAUT = 'defaut'; const WS_SAISIE = "CelWidgetSaisie"; const WS_NOM = "noms"; const NS_PROJET = "bdtfx"; const NS_PROJET_VERSION = "1.01"; const EFLORE_API_VERSION = "0.1"; private $projet = null; private $configProjet = null; /** * Méthode appelée par défaut pour charger ce widget. */ public function executer() { $retour = null; extract($this->parametres); $this->projet = isset($projet) ? $projet : self::PROJET_DEFAUT; $this->chargerConfigProjet(); $service = isset($service) ? $service : 'widget'; $methode = $this->traiterNomMethodeExecuter($service); if (method_exists($this, $methode)) { $retour = $this->$methode(); } else { $this->messages[] = "Ce type de service '$methode' n'est pas disponible."; } $contenu = null; $mime = null; if (is_array($retour) && array_key_exists('squelette', $retour)) { $ext = (isset($retour['squelette_ext'])) ? $retour['squelette_ext'] : '.tpl.html'; $squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$this->projet.self::DS.$retour['squelette'].$ext; $contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']); $mime = isset($retour['mime']) ? $retour['mime'] : null; } else { if (count($this->messages) == 0) { $this->messages[] = "La méthode du sous-service ne renvoie pas les données dans le bon format."; } $contenu = 'Un problème est survenu : '.print_r($this->messages, true); } $this->envoyer($contenu, $mime); } private function chargerConfigProjet() { $fichier_config = dirname(__FILE__).self::DS.'configurations'.self::DS.$this->projet.'.ini'; if (file_exists($fichier_config)) { if (!$this->configProjet = parse_ini_file($fichier_config)) { $this->messages[] = "Le fichier ini '$fichier_config' du projet n'a pu être chargé."; } } else { $this->debug[] = "Le fichier ini '$fichier_config' du projet n'existe pas."; } } public function executerWidget() { $widget['squelette'] = $this->projet; $widget['donnees'] = array(); $widget['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], ''); $widget['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE); if ($this->projet == 'defaut') { $urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl']; $urlWsNs = sprintf($urlWsNsTpl, self::EFLORE_API_VERSION, self::NS_PROJET, self::WS_NOM); $widget['donnees']['url_ws_autocompletion_ns'] = $urlWsNs; $widget['donnees']['ns_referentiel'] = self::NS_PROJET.':'.self::NS_PROJET_VERSION; $widget['donnees']['ns_version'] = self::NS_PROJET_VERSION; } else { $widget['donnees']['taxons'] = $this->recupererListeTaxon(); $widget['donnees']['milieux'] = $this->parserMilieux(); } return $widget; } public function executerTaxons() { $widget['squelette'] = $this->projet.'_taxons'; $widget['squelette_ext'] = '.tpl.js'; $widget['donnees'] = array(); $taxons = $this->recupererListeTaxon(); $taxons_tries = array(); foreach ($taxons as $taxon) { $taxons_tries[$taxon['num_nom_sel']] = $taxon; } $widget['donnees']['taxons'] = json_encode($taxons_tries); return $widget; } private function recupererListeTaxon() { $taxons = null; $fichier_tsv = dirname(__FILE__).self::DS.'configurations'.self::DS.$this->projet.'_taxons.tsv'; if (file_exists($fichier_tsv) && is_readable($fichier_tsv)) { $taxons = $this->decomposerFichierTsv($fichier_tsv); $taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC)); } else { $this->debug[] = "Impossible d'ouvrir le fichier '$fichier_tsv'."; } return $taxons; } private function decomposerFichierTsv($fichier, $delimiter = "\t"){ $header = NULL; $data = array(); if (($handle = fopen($fichier, 'r')) !== FALSE) { while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) { if (!$header) { $header = $row; } else { $data[] = array_combine($header, $row); } } fclose($handle); } return $data; } private function parserMilieux() { $infosMilieux = array(); $milieux = explode('|', $this->configProjet['milieux']); foreach ($milieux as $milieu) { $details = explode(';', $milieu); if (isset($details[1])) { $infosMilieux[$details[0]] = $details[1]; } else { $infosMilieux[$details[0]] = ''; } } ksort($infosMilieux); return $infosMilieux; } public function executerUploadImage() { $retour = array( 'squelette' => $this->projet.'_image', 'squelette_ext' => '.tpl.xml', 'mime' => 'text/xml', 'donnees' => array( 'urlMiniature' => '', 'imageNom' => '', 'message' => '', 'debogage' => '')); $message = ''; $debogage = ''; if ($_FILES['fichier']['error'] == UPLOAD_ERR_OK) { if (is_uploaded_file($_FILES['fichier']['tmp_name'])) { if ($_FILES['fichier']['type'] == 'image/jpeg') { $dossierStockage = $this->config['chemins']['imagesTempDossier']; $nomFichierOriginal = preg_replace('/[.](jpeg|jpg)$/i', '.jpg', strtolower($_FILES['fichier']['name'])); $originalChemin = $dossierStockage.$nomFichierOriginal; $deplacementOk = move_uploaded_file($_FILES['fichier']['tmp_name'], $originalChemin); if ($deplacementOk === true) { $miniatureFichier = str_replace('.jpg', '_min.jpg', $nomFichierOriginal); $miniatureChemin = $dossierStockage.$miniatureFichier; // Parametres $largeurIdeale = 100; $hauteurIdeale = 100; $qualite = 85; // Calcul de la hauteur et de la largeur optimale de la miniature $taillesImgOriginale = getimagesize($originalChemin); $largeurOrigine = $taillesImgOriginale[0]; $hauteurOrigine = $taillesImgOriginale[1]; $largeurMin = $largeurIdeale; $hauteurMin = (int) ($hauteurOrigine * ($largeurIdeale / $largeurOrigine)); if ($hauteurMin > $hauteurIdeale) { $hauteurMin = $hauteurIdeale; $largeurMin = (int)($largeurOrigine * ($hauteurMin / $hauteurOrigine)); } // Création de la miniature $imageOriginale = imagecreatefromjpeg($originalChemin); $imageMiniature = imagecreatetruecolor($largeurMin, $hauteurMin); $couleurFond = imagecolorallocate($imageMiniature, 255, 255, 255); imagefill($imageMiniature, 0, 0, $couleurFond); imagecopyresized($imageMiniature, $imageOriginale, 0, 0, 0, 0, $largeurMin, $hauteurMin, $largeurOrigine, $hauteurOrigine); imagejpeg($imageMiniature, $miniatureChemin, $qualite); imagedestroy($imageMiniature); imagedestroy($imageOriginale); // Retour des infos $retour['donnees']['urlMiniature'] = sprintf($this->config['chemins']['imagesTempUrlTpl'], $miniatureFichier); $retour['donnees']['imageNom'] = $nomFichierOriginal; } else { $message = "L'image n'a pu être déplacé sur le serveur."; } } else { $message = "L'image n'est pas au format JPEG."; } } else { $message = "L'image n'a pu être téléversée."; $debogage = $message.print_r($_FILES, true); } } else { if ($_FILES['fichier']['error'] == UPLOAD_ERR_FORM_SIZE) { $message = "L'image téléversée excède la taille maximum autorisée.". "Veuillez modifier votre image avant de la téléverser à nouveau."; } else { $message = "Une erreur de transfert a eu lieu (téléversement interrompu)."; } $debogage = "Code erreur : {$_FILES['fichier']['error']}. ". "Voir : http://php.net/manual/fr/features.file-upload.errors.php"; } // Retour des infos $retour['donnees']['message'] = $message; $retour['donnees']['debogage'] = $debogage; return $retour; } } ?>