/trunk/jrest/lib/Cel.php |
---|
New file |
0,0 → 1,768 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* Classe mère abstraite contenant les méthodes génériques des services. |
* Encodage en entrée : utf8 |
* Encodage en sortie : utf8 |
* |
* @author Jean-Pascal MILCENT <jpm@clapas.org> |
* @author Aurélien Peronnet <aurelien@tela-botanica.org> |
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt> |
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt> |
* @version $Id$ |
* @copyright © 2012, Tela Botanica |
*/ |
// TODO : supprimer la méthode protegerRequete() |
abstract class Cel { |
const TYPE_OBS = 'observation'; |
const TYPE_IMG = 'image'; |
const SQL_MODE_ASSOC = PDO::FETCH_ASSOC; |
const SQL_MODE_OBJET = PDO::FETCH_OBJ; |
const SQL_RETOUR_COMPLET = 'All'; |
const SQL_RETOUR_LIGNE = 'Row'; |
const SQL_RETOUR_COLONNE = 'Column'; |
const SQL_RETOUR_BRUT = 'Raw'; |
public $config; |
private $ressources; |
protected $parametres = array(); |
protected $bdd; |
protected $messages = array(); |
protected $debug = array(); |
public function __construct($config) { |
@session_start(); |
// Tableau contenant la config de Jrest |
$this->config = $config; |
// Réglages de PHP |
setlocale(LC_ALL, $this->config['settings']['locale']); |
date_default_timezone_set($this->config['settings']['fuseauHoraire']); |
// Connection à la base de données |
$this->bdd = $this->connecterPDO($this->config, 'database_cel'); |
// Nettoyage du _GET (sécurité) |
$this->collecterParametres();// Récupération de tous les parametres de _GET, nettoyage et mise dans $this->parametres |
$this->recupererParametresUrl();// Vidage de _GET et création d'attribut de la classe |
$this->definirParametresUrlParDefaut(); |
// Définition de variable générale dans la config |
$this->config['settings']['baseURLAbsoluDyn'] = 'http://'.$_SERVER['SERVER_NAME'].$this->config['settings']['baseURL'].'%s'; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION de la BASE de DONNÉES |
protected function connecterPDO($config, $base = 'database_cel') { |
$cfg = $config[$base]; |
// ATTENTION : la connexin à la bdd peut échouer si l'host vaut localhost. Utiliser 127.0.0.1 à la place. |
$dsn = $cfg['phptype'].':dbname='.$cfg['database'].';host='.$cfg['hostspec']; |
try { |
// Création de la connexion en UTF-8 à la BDD |
$PDO = new PDO($dsn, $cfg['username'], $cfg['password'], array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'")); |
// Affiche les erreurs détectées par PDO (sinon mode silencieux => aucune erreur affiché) |
$PDO->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); |
} catch (PDOException $e) { |
echo 'La connexion à la base de donnée via PDO a échouée : ' .$dsn. $e->getMessage(); |
} |
return $PDO; |
} |
/** |
* Protège automatiquement toutes les chaines comprises entre deux caractères '|'. |
* Puis execute la requete. |
* @see protegerRequete() |
* @param unknown_type $requete |
*/ |
protected function requeter($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) { |
$requete = $this->protegerRequete($requete); |
return $this->executerRequete($requete, $retour, $mode); |
} |
/** |
* Protège automatiquement toutes les chaines comprises entre deux caractères '|'. |
* @see protegerRequete() |
* @param unknown_type $requete |
*/ |
protected function executer($requete) { |
$requete = $this->protegerRequete($requete); |
return $this->executerRequeteSimple($requete); |
} |
/** |
* Méthode permettant de rechercher dans une requete SQL sous forme de chaine (String) les chaines |
* à protéger. Cela évite de protéger chaque variable avant de l'insérer dans une requete SQL. |
* Par contre, il est important que les chaine à protéger ne contiennent pas le caractère '|'. |
* |
* @param $requete |
*/ |
protected function protegerRequete($requete) { |
if (substr_count($requete, '|') % 2 === 0) { |
if (preg_match_all('/\|([^|]*)\|/', $requete, $correspondances, PREG_SET_ORDER)) { |
foreach ($correspondances as $chaine) { |
$chaine_protegee = $this->bdd->quote($chaine[1]); |
$requete = str_replace($chaine[0], $chaine_protegee, $requete); |
} |
} |
} else { |
$this->messages[] = "La requête a protéger contient un nombre impair de caractère de protection '|'."; |
$requete = false; |
} |
return $requete; |
} |
protected function proteger($chaine) { |
return $this->bdd->quote($chaine); |
} |
protected function protegerTableau(Array $tableau) { |
foreach ($tableau as $id => $val) { |
$tableau[$id] = $this->proteger($val); |
} |
return $tableau; |
} |
/** |
* @deprecated utiliser executer() à la place |
* @see executer() |
*/ |
protected function executerRequeteSimple($requete) { |
$resultat = false; |
try { |
$resultat = $this->bdd->exec($requete); |
if ($resultat === false) { |
$this->debug[] = "La requête a échoué : $requete"; |
} |
} catch (PDOException $e) { |
$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete); |
} |
return $resultat; |
} |
/** |
* @deprecated utiliser requeter() à la place |
* @see requeter() |
*/ |
protected function executerRequete($requete, $retour = self::SQL_RETOUR_COMPLET, $mode = PDO::FETCH_ASSOC) { |
$resultat = false; |
try { |
switch ($retour) { |
case self::SQL_RETOUR_COMPLET : |
$resultat = $this->bdd->query($requete)->fetchAll($mode);// Retourne toutes les lignes |
break; |
case self::SQL_RETOUR_LIGNE : |
$resultat = $this->bdd->query($requete)->fetch($mode);// Retourne la première ligne |
break; |
case self::SQL_RETOUR_COLONNE : |
$resultat = $this->bdd->query($requete)->fetchColumn();// Retourne la première colonne de la première ligne |
break; |
case self::SQL_RETOUR_BRUT : |
$resultat = $this->bdd->query($requete);// Retourne l'objet brut pour être utilisé dans une boucle de type foreach |
break; |
default: |
$this->debug[] = "Le type de retour '$retour' est inconnu."; |
} |
if ($resultat === false) { |
$this->debug[] = "La requête a retourné aucun résultat : $requete"; |
} |
} catch (PDOException $e) { |
$this->debug[] = sprintf($this->getTxt('sql_erreur_requete'), $e->getFile(), $e->getLine(), $e->getMessage(), $requete); |
} |
return $resultat; |
} |
protected function getTxt($id) { |
$sortie = ''; |
switch ($id) { |
case 'sql_erreur' : $sortie = 'Requête echec. Fichier : "%s". Ligne : "%s". Message : %s'; break; |
case 'sql_erreur_requete' : $sortie = "Requête echec.\nFichier : %s.\nLigne : %s.\nMessage : %s.\nRequête : %s"; break; |
default : $sortie = $id; |
} |
return $sortie; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// TRAITEMENT des URLs et des PARAMÊTRES |
private function collecterParametres() { |
if (isset($_GET) && $_GET != '') { |
foreach ($_GET as $cle => $valeur) { |
$this->parametres[$cle] = rawurldecode($this->verifierSecuriteParametreUrl($valeur)); |
} |
} |
} |
private function recupererParametresUrl() { |
if (isset($_GET)) { |
$get_params = array('orderby', 'distinct', 'start', 'limit', 'formatRetour'); |
foreach ($get_params as $get) { |
if (isset($_GET[$get])) { |
$_GET[$get] = $this->verifierSecuriteParametreUrl($_GET[$get]); |
if ($_GET[$get] != '') { |
if (!isset($this->$get)) { |
$this->$get = $_GET[$get]; |
} else { |
$e = "Impossible d'ajouter l'attribut $get à la classe du service car elle possède déjà un attribut nommé : $get"; |
trigger_error($e, E_USER_WARNING); |
} |
} else { |
$_GET[$get] = null; |
} |
} |
} |
} |
} |
protected function verifierSecuriteParametreUrl($param) { |
$verifier = array('NULL', "\n", "\r", "\\", "'", '"', "\x00", "\x1a", ';'); |
$param = strip_tags(str_replace($verifier, '', $param)); |
return $param; |
} |
private function definirParametresUrlParDefaut() { |
if (!isset($this->start)) { |
$this->start = 0; |
} |
if (!isset($this->limit)) { |
$this->limit = 150; |
} |
} |
protected function traiterParametres($params_attendu, $params, $pourBDD = true) { |
$sortie = array(); |
foreach ($params_attendu as $num => $nom) { |
if (isset($params[$num]) && $params[$num] != '*') { |
if ($pourBDD) { |
$params[$num] = $this->bdd->quote($params[$num]); |
} |
$sortie[$nom] = $params[$num]; |
} |
} |
return $sortie; |
} |
protected function traiterNomMethodeGet($nom) { |
$methode = 'get'; |
$methode .= str_replace(' ', '', ucwords(str_replace('-', ' ', strtolower($nom)))); |
return $methode; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION de l'ENVOIE au NAVIGATEUR |
protected function envoyerJson($donnees, $encodage = 'utf-8') { |
$encodage_json = true; |
$this->envoyer($donnees, 'application/json', $encodage, $encodage_json); |
} |
protected function envoyerJsonVar($variable, $donnees = null, $encodage = 'utf-8') { |
$contenu = "var $variable = ".json_encode($donnees); |
$this->envoyer($contenu, 'text/html', $encodage); |
} |
protected function envoyerJsonp($donnees = null, $encodage = 'utf-8') { |
$contenu = $this->parametres['callback'].'('.json_encode($donnees).');'; |
$this->envoyer($contenu, 'text/html', $encodage); |
} |
protected function envoyer($donnees = null, $mime = 'text/html', $encodage = 'utf-8', $json = false) { |
// Traitements des messages d'erreurs et données |
if (count($this->messages) != 0) { |
header('HTTP/1.1 500 Internal Server Error'); |
$mime = 'application/json'; |
$json = true; |
$sortie = $this->messages; |
} else { |
$sortie = $donnees; |
if (is_null($donnees)) { |
$sortie = 'OK'; |
} |
} |
// Gestion de l'envoie du déboguage |
$this->envoyerDebogage(); |
// Encodage au format et JSON et envoie sur la sortie standard |
$contenu = $json ? json_encode($sortie) : $sortie; |
$this->envoyerContenu($encodage, $mime, $contenu); |
} |
private function envoyerDebogage() { |
if (!is_array($this->debug)) { |
$this->debug[] = $this->debug; |
} |
if (count($this->debug) != 0) { |
foreach ($this->debug as $cle => $val) { |
if (is_array($val)) { |
$this->debug[$cle] = print_r($val, true); |
} |
} |
header('X-DebugJrest-Data:'.json_encode($this->debug)); |
} |
} |
private function envoyerContenu($encodage, $mime, $contenu) { |
if (!is_null($mime) && !is_null($encodage)) { |
header("Content-Type: $mime; charset=$encodage"); |
} else if (!is_null($mime) && is_null($encodage)) { |
header("Content-Type: $mime"); |
} |
print $contenu; |
} |
private function envoyerAuth($message_accueil, $message_echec) { |
header('HTTP/1.0 401 Unauthorized'); |
header('WWW-Authenticate: Basic realm="'.mb_convert_encoding($message_accueil, 'ISO-8859-1', 'UTF-8').'"'); |
header('Content-type: text/plain; charset=UTF-8'); |
print $message_echec; |
exit(0); |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DES CLASSES CHARGÉES À LA DEMANDE |
protected function getRestClient() { |
if (!isset($this->restClient)) { |
$this->restClient = new CelRestClient(); |
} |
return $this->restClient; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DE L'IDENTIFICATION |
protected function getAuthIdentifiant() { |
$id = (isset($_SERVER['PHP_AUTH_USER'])) ? $_SERVER['PHP_AUTH_USER'] : null; |
return $id; |
} |
protected function getAuthMotDePasse() { |
$mdp = (isset($_SERVER['PHP_AUTH_PW'])) ? $_SERVER['PHP_AUTH_PW'] : null; |
return $mdp; |
} |
public function authentifierAdmin() { |
$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica."; |
$message_echec = "Accès limité aux administrateurs du CEL.\n". |
"Votre tentative d'identification a échoué.\n". |
"Actualiser la page pour essayer à nouveau si vous êtes bien inscrit comme administrateur."; |
return $this->authentifier($message_accueil, $message_echec, 'Admin'); |
} |
public function authentifierUtilisateur() { |
$message_accueil = "Veuillez vous identifier avec votre compte Tela Botanica."; |
$message_echec = "Accès limité aux utilisateur du CEL.\n". |
"Inscrivez vous http://www.tela-botanica.org/page:inscription pour le devenir.\n". |
"Votre tentative d'identification a échoué.\n". |
"Actualiser la page pour essayer à nouveau si vous êtes déjà inscrit ou contacter 'accueil@tela-botanica.org'."; |
return $this->authentifier($message_accueil, $message_echec, 'Utilisateur'); |
} |
public function isAdmin($id) { |
$admins = $this->config['jrest_admin']['admin']; |
$admin_tab = explode(',',$admins); |
if (in_array($id,$admin_tab)) { |
return true; |
} else { |
return false; |
} |
} |
public function controleUtilisateur($id) { |
if (isset($_SESSION['user']) && isset($_SESSION['user']['name']) && $_SESSION['user']['name'] == '') { |
//cas de la session temporaire, on ne fait rien de particulier |
} else { |
if (isset($_SESSION['user']) && isset($_SESSION['user']['name']) && !$this->isAdmin($_SESSION['user']['name']) && $_SESSION['user']['name'] != $id) { |
// cas d'usurpation d'identité |
print 'Accès interdit'; |
exit(); |
} |
} |
} |
public function logger($index,$chaine) { |
if(!class_exists('Log')) { |
Log::getInstance(); |
} |
Log::setCheminLog($this->config['log']['cheminlog']); |
Log::setTimeZone($this->config['log']['timezone']); |
Log::setTailleMax($this->config['log']['taillemax']); |
Log::ajouterEntree($index,$chaine); |
} |
private function authentifier($message_accueil, $message_echec, $type) { |
$id = $this->getAuthIdentifiant(); |
if (!isset($id)) { |
$this->envoyerAuth($message_accueil, $message_echec); |
} else { |
if ($type == 'Utilisateur' && $this->getAuthMotDePasse() == 'debug') { |
$autorisation = true; |
} else { |
$methodeAutorisation = "etre{$type}Autorise"; |
$autorisation = $this->$methodeAutorisation(); |
} |
if ($autorisation == false) { |
$this->envoyerAuth($message_accueil, $message_echec); |
} |
} |
return true; |
} |
public function etreUtilisateurAutorise() { |
$identifiant = $this->getAuthIdentifiant(); |
$mdp = md5($this->getAuthMotDePasse()); |
$service = "TestLoginMdp/$identifiant/$mdp"; |
$url = sprintf($this->config['settings']['baseURLServicesAnnuaireTpl'], $service); |
$json = $this->getRestClient()->consulter($url); |
$existe = json_decode($json); |
$autorisation = (isset($existe) && $existe) ? true :false; |
return $autorisation; |
} |
public function etreAdminAutorise() { |
$identifiant = $this->getAuthIdentifiant(); |
$autorisation = ($this->etreUtilisateurAutorise() && $this->etreAdminCel($identifiant)) ? true : false; |
return $autorisation; |
} |
public function etreAdminCel($courriel) { |
$admins = $this->config['jrest_admin']['admin']; |
$courriels_autorises = explode(',', $admins); |
$autorisation = (in_array($courriel, $courriels_autorises)) ? true : false ; |
return $autorisation; |
} |
public function getInfosComplementairesUtilisateur($id_utilisateur) { |
$infos_utilisateur = array('prenom' => $id_utilisateur, 'nom' => $id_utilisateur, 'courriel' => $id_utilisateur); |
if(is_numeric($id_utilisateur)) { |
$requete_infos_utilisateur = 'SELECT prenom, nom, courriel FROM cel_utilisateurs '. |
'WHERE id_utilisateur = '.$this->proteger($id_utilisateur); |
$resultat_infos_utilisateur = $this->requeter($requete_infos_utilisateur); |
if($resultat_infos_utilisateur && is_array($resultat_infos_utilisateur) && count($resultat_infos_utilisateur) > 0) { |
$infos_utilisateur = $resultat_infos_utilisateur[0]; |
} |
} |
return $infos_utilisateur; |
} |
public function getInfosComplementairesUtilisateurPourMail($mail_utilisateur) { |
$infos_utilisateur = array('prenom' => $mail_utilisateur, 'nom' => $mail_utilisateur, 'courriel' => $mail_utilisateur); |
$requete_infos_utilisateur = 'SELECT id, prenom, nom FROM cel_utilisateurs '. |
'WHERE courriel = '.$this->proteger($mail_utilisateur); |
$resultat_infos_utilisateur = $this->requeter($requete_infos_utilisateur); |
if($resultat_infos_utilisateur && is_array($resultat_infos_utilisateur) && count($resultat_infos_utilisateur) > 0) { |
$infos_utilisateur = $resultat_infos_utilisateur; |
} |
return $infos_utilisateur; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DE MÉTHODES COMMUNES ENTRE LES SERVICES |
protected function denullifierTableauValeurCel($tableau) { |
// Denullifiage |
foreach($tableau as $k=>$v) { |
if (($v=="null") || ($v=="000null")) { |
$row[$k]=""; |
} |
else { |
$row[$k]=utf8_decode($v); |
} |
} |
return $tableau; |
} |
protected function getUrlImage($id, $format = 'L') { |
$url_tpl = $this->config['settings']['celImgUrlTpl']; |
$id = sprintf('%09s', $id).$format; |
$url = sprintf($url_tpl, $id); |
return $url; |
} |
/** |
* Prend en paramêtre un tableau de courriels et retourne après avoir interrogé un service de l'annuaire |
* une tableau avec en clé le courriel et en valeur l'intitulé de la personne à afficher. |
* |
* @param array $courriels un tableau de courriels pour lesquels il faut rechercher les infos d'identité |
*/ |
protected function creerAuteurs(Array $courriels) { |
$auteurs = array(); |
if ($identites = $this->recupererUtilisateursIdentite($courriels)) { |
foreach ($identites as $courriel => $infos) { |
$auteurs[$courriel] = $infos['intitule']; |
} |
} |
return $auteurs; |
} |
protected function recupererUtilisateursIdentite(Array $courriels) { |
// Récupération des données au format Json |
$service = "utilisateur/identite-par-courriel/".implode(',', $courriels); |
$url = sprintf($this->config['settings']['baseURLServicesAnnuaireTpl'], $service); |
$json = file_get_contents($url); |
$utilisateurs = json_decode($json); |
$noms = array(); |
foreach ($courriels as $courriel) { |
$info = array('id' => null, 'intitule' => ''); |
if (isset($utilisateurs->$courriel)) { |
$info['intitule'] = $utilisateurs->$courriel->intitule; |
$info['id'] = $utilisateurs->$courriel->id; |
} else { |
$info['intitule'] = $this->tronquerCourriel($courriel); |
} |
$noms[$courriel] = $info; |
} |
return $noms; |
} |
protected function tronquerCourriel($courriel) { |
$courriel = preg_replace('/[^@]+$/i', '...', $courriel); |
return $courriel; |
} |
protected function nettoyerTableau(Array $tableau) { |
foreach ($tableau as $cle => $valeur) { |
if (is_array($valeur)) { |
$valeur = $this->nettoyerTableau($valeur); |
} else { |
$valeur = $this->nettoyerTexte($valeur); |
} |
$tableau[$cle] = $valeur; |
} |
return $tableau; |
} |
/** |
* Fonction nettoyant les caractères spéciaux (&,<) et les valeurs nulles du CEL dans un texte comprenant du HTML. |
*/ |
protected function nettoyerTexte($txt) { |
$txt = preg_replace('/&(?!([a-z]+|#[0-9]+|#x[0-9][a-f]+);)/i', '&', $txt); |
// TODO : trouver une regexp qui permet de remplacer les symboles < et > isolés |
//$txt = preg_replace('/<(?!([a-z][a-z0-9]*)\b[^>]*>(.*?)<\/\1>|\/\s*([a-z][a-z0-9]*)\s*>)/i', '<', $txt); |
//$txt = preg_replace('/(?!<([a-z][a-z0-9]*)\b[^>]*)>(?!(.*?)<\/\1>)/i', '>', $txt); |
$txt = preg_replace('/(?:000null|null)/i', '', $txt); |
return $txt; |
} |
/** |
* Fonction nettoyant les caractères spéciaux HTML pour les champs de saisie libre du CEL. |
*/ |
protected function protegerCaracteresHtmlDansChamps($donnees) { |
$champs = array('mots_cles_texte', 'commentaire', |
'zone_geo', 'lieudit', 'station', 'milieu', 'commentaire', 'nom_sel'); |
foreach ($champs as $champ) { |
if (isset($donnees[$champ])) { |
$donnees[$champ] = htmlspecialchars($donnees[$champ]); |
} |
} |
return $donnees; |
} |
protected function convertirDateHeureMysqlEnTimestamp($date_heure_mysql){ |
$val = explode(' ', $date_heure_mysql); |
$date = explode('-', $val[0]); |
$heure = explode(':', $val[1]); |
return mktime((int) $heure[0], (int) $heure[1], (int) $heure[2], (int) $date[1], (int) $date[2], (int) $date[0]); |
} |
protected function etreNull($valeur) { |
$etre_null = false; |
if ($valeur == '' || $valeur == null || $valeur == '000null' || $valeur == 'null' || $valeur == '*') { |
$etre_null = true; |
} |
return $etre_null; |
} |
protected function formaterDate($date_heure_mysql, $format = '%A %d %B %Y à %H:%M') { |
$date_formatee = ''; |
if (!$this->etreNull($date_heure_mysql)) { |
$timestamp = $this->convertirDateHeureMysqlEnTimestamp($date_heure_mysql); |
$date_formatee = strftime($format, $timestamp); |
} |
return $date_formatee; |
} |
protected function convertirCodeZoneGeoVersDepartement($code_zone_geo) { |
$code_departement = ''; |
if($this->estUnCodeInseeDepartement($code_zone_geo)) { |
$code_departement = substr(ltrim($code_zone_geo,'INSEE-C:'),0,2); |
} |
return $code_departement; |
} |
protected function estUnCodeInseeDepartement($code_a_tester) { |
return preg_match('/^INSEE-C:[0-9]{5}/',$code_a_tester); |
} |
protected function convertirCodeZoneGeoVersCodeInsee($code_zone_geo) { |
$code_departement = ''; |
if($this->estUnCodeInseeDepartement($code_zone_geo)) { |
$code_departement = ltrim($code_zone_geo,'INSEE-C:'); |
} |
return $code_departement; |
} |
protected function convertirCodeInseeVersCodeZoneGeo($code_insee) { |
return 'INSEE-C:'.$code_insee; |
} |
protected function obtenirCodeInseeCommunePourNomEtDepartement($nom_commune, $dpt) { |
$code_insee = $dpt; |
$requete = 'SELECT id_zone_geo FROM cel_zones_geo '. |
'WHERE nom LIKE '.$this->proteger($nom_commune).' '. |
'AND id_zone_geo LIKE "INSEE-C:'.$dpt.'%"'; |
$resultat = $this->requeter($requete); |
if(is_array($resultat) && count($resultat) > 0) { |
$code_insee = $resultat[0]['id_zone_geo']; |
} |
return $code_insee; |
} |
protected function encoderMotCle($mot_cle) { |
return md5(mb_strtolower(trim($mot_cle))); |
} |
protected function decoderMotsClesObs($utilisateur_id, $mots_cles) { |
return $this->decoderMotsCles($utilisateur_id, $mots_cles, self::TYPE_OBS); |
} |
protected function decoderMotsClesImg($utilisateur_id, $mots_cles) { |
return $this->decoderMotsCles($utilisateur_id, $mots_cles, self::TYPE_IMG); |
} |
private function decoderMotsCles($utilisateur_id, $mots_cles, $type) { |
$mots = array(); |
if (! $this->etreNull($mots_cles)) { |
$utilisateur_id = $this->bdd->quote($utilisateur_id); |
$mots_cles = $this->protegerMotsCles($mots_cles, $type); |
if (! $this->etreNull($mots_cles)) { |
$table = ($type == self::TYPE_IMG) ? 'cel_mots_cles_images' : 'cel_mots_cles_obs' ; |
$requete = 'SELECT cmc_mot_cle as mot_cle '. |
"FROM $table ". |
"WHERE cmc_id_mot_cle_utilisateur IN ($mots_cles) ". |
"AND cmc_id_proprietaire = $utilisateur_id "; |
$elements = $this->executerRequete($requete); |
if (is_array($elements)) { |
foreach ($elements as $mot) { |
$mots[] = $mot['mot_cle']; |
} |
} |
} |
} |
return $mots; |
} |
private function protegerMotsCles($mots_cles, $type) { |
$separateur = ($type == self::TYPE_IMG) ? ',' : ';' ; |
$mots_cles = $this->traiterValeursMultiples($mots_cles, $separateur); |
return $mots_cles; |
} |
protected function traiterValeursMultiples($valeurs, $separateur_entree = ',' , $separateur_sortie = ',') { |
if (! $this->etreNull($valeurs)) { |
$valeurs_a_proteger = explode($separateur_entree,trim(trim($valeurs), $separateur_entree)); |
foreach ($valeurs_a_proteger as $valeur) { |
$valeurs_protegees[] = $this->bdd->quote($valeur); |
} |
$valeurs = implode($separateur_sortie, $valeurs_protegees); |
} |
return ($this->etreNull($valeurs)) ? null : $valeurs; |
} |
//+----------------------------------------------------------------------------------------------------------------+ |
// GESTION DES SQUELETTES PHP |
/** |
* Méthode prenant en paramètre un chemin de fichier squelette et un tableau associatif de données, |
* en extrait les variables, charge le squelette et retourne le résultat des deux combinés. |
* |
* @param String $fichier le chemin du fichier du squelette |
* @param Array $donnees un tableau associatif contenant les variables a injecter dans le squelette. |
* |
* @return boolean false si le squelette n'existe pas, sinon la chaine résultat. |
*/ |
public static function traiterSquelettePhp($fichier, Array $donnees = array()) { |
$sortie = false; |
if (file_exists($fichier)) { |
// Extraction des variables du tableau de données |
extract($donnees); |
// Démarage de la bufferisation de sortie |
ob_start(); |
// Si les tags courts sont activés |
if ((bool) @ini_get('short_open_tag') === true) { |
// Simple inclusion du squelette |
include $fichier; |
} else { |
// Sinon, remplacement des tags courts par la syntaxe classique avec echo |
$html_et_code_php = self::traiterTagsCourts($fichier); |
// Pour évaluer du php mélangé dans du html il est nécessaire de fermer la balise php ouverte par eval |
$html_et_code_php = '?>'.$html_et_code_php; |
// Interprétation du html et du php dans le buffer |
echo eval($html_et_code_php); |
} |
// Récupèration du contenu du buffer |
$sortie = ob_get_contents(); |
// Suppression du buffer |
@ob_end_clean(); |
} else { |
$msg = "Le fichier du squelette '$fichier' n'existe pas."; |
trigger_error($msg, E_USER_WARNING); |
} |
// Retourne le contenu |
return $sortie; |
} |
/** |
* Fonction chargeant le contenu du squelette et remplaçant les tags court php (<?= ...) par un tag long avec echo. |
* |
* @param String $chemin_squelette le chemin du fichier du squelette |
* |
* @return string le contenu du fichier du squelette php avec les tags courts remplacés. |
*/ |
private static function traiterTagsCourts($chemin_squelette) { |
$contenu = file_get_contents($chemin_squelette); |
// Remplacement de tags courts par un tag long avec echo |
$contenu = str_replace('<?=', '<?php echo ', $contenu); |
// Ajout systématique d'un point virgule avant la fermeture php |
$contenu = preg_replace("/;*\s*\?>/", "; ?>", $contenu); |
return $contenu; |
} |
} |
?> |
/trunk/jrest/scripts/MigrationObs.php |
---|
New file |
0,0 → 1,635 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Script de migration des Observations de la version 1 de la base de données du CEL à la v2. |
* |
* @category php 5.2 |
* @package Cel/Scripts |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) |
* @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 $Id$ |
*/ |
class MigrationObs extends Cel { |
const truncate = true; //Doit on vider les tables de destination ? |
const dry_run = false; |
const PATTERN_LAT = '/^[+-]?(?:[1-9][0-9]|[0-9])(?:[.][0-9]+|)$/'; |
const PATTERN_LNG = '/^[+-]?(?:1[0-8][0-9]|[1-9][0-9]|[0-9])(?:[.][0-9]+|)$/'; |
public static $bdd_cel_migration; |
public static $bdd_utilisateurs; |
private $communesOubliees = array(); |
private $tableau_utilisateurs = array(); |
private $tableau_mots_cles = array(); |
private $tableau_zones_geo = array(); |
/** Tableau associatif permettant de stocker l'avancement dans une boucle. |
* La clé est un md5 du message à afficher au démarrage de la boucle. |
* @var array |
*/ |
private static $avancement = array(); |
private $tableau_nouveau_ancien = array( |
'id_observation' => 'id', |
'ordre' => 'ordre', |
'ce_utilisateur' => 'traiterIdentifiantUtilisateur', |
'prenom_utilisateur' => 'traiterPrenomUtilisateur', |
'nom_utilisateur' => 'traiterNomUtilisateur', |
'courriel_utilisateur' => 'identifiant', |
'nom_sel' => 'nom_sel', |
'nom_sel_nn' => 'num_nom_sel', |
'nom_ret' => 'nom_ret', |
'nom_ret_nn' => 'num_nom_ret', |
'nt' => 'num_taxon', |
'famille' => 'famille', |
'nom_referentiel' => 'traiterReferentiel', |
'ce_zone_geo' => 'traiterIdentifiantZoneGeo', |
'zone_geo' => 'location', |
'lieudit' => 'lieudit', |
'station' => 'station', |
'milieu' => 'milieu', |
'latitude' => 'traiterLat', |
'longitude' => 'traiterLng', |
'geodatum' => 'traiterGeodatum', |
'date_observation' => 'date_observation', |
'mots_cles_texte' => 'traiterMotsClesTexte', |
'commentaire' => 'commentaire', |
'transmission' => 'transmission', |
'date_creation' => 'date_creation', |
'date_modification' => 'date_modification', |
'date_transmission' => 'date_transmission' |
); |
private $tableau_ancien_nouveau = array( |
'id' => 'id_observation', |
'identifiant' => '', |
'prenom_utilisateur' => 'prenom_utilisateur', |
'nom_utilisateur' => 'nom_utilisateur', |
'ordre' => 'ordre', |
'nom_sel' => 'nom_sel', |
'num_nom_sel' => 'nom_sel_nn', |
'nom_ret' => 'nom_ret', |
'num_nom_ret' => 'nom_ret_nn', |
'num_taxon' => 'nt', |
'famille' => 'famille', |
'location' => '', |
'id_location' => '', |
'date_observation' => 'date_observation', |
'lieu_dit' => 'lieudit', |
'station' => 'station', |
'milieu' => 'milieu', |
'commentaire' => 'commentaire', |
'transmission' => 'transmission', |
'date_creation' => 'date_creation', |
'date_modification' => 'date_modification', |
'date_transmission' => 'date_transmission', |
'mots_cles' => '', |
'coord_x' => 'latitude', |
'coord_y' => 'longitude', |
'ref_geo' => 'geodatum' |
); |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params) { |
if(!isset($this->config['database_cel']['database_migration']) || $this->config['database_cel']['database_migration'] == '') { |
echo 'Attention la variable de configuration database_migration dans la section database_cel, contenant la base de données d\'arrivée, doit être remplie '."\n"; |
exit; |
} |
if(!isset($this->config['database_ident']['database']) || $this->config['database_ident']['database'] == '') { |
echo 'Attention la variable de configuration database dans la section database_ident, contenant la base de données utilisateurs, doit être remplie '."\n"; |
exit; |
} |
self::$bdd_cel_migration = $this->config['database_cel']['database_migration']; |
self::$bdd_utilisateurs = $this->config['database_ident']['database']; |
echo "--MIGRATION DES OBSERVATIONS --------------------------------------\n"; |
//1. TEMPORAIRE : vider les tables de destinations |
if (self::truncate) { |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 0. Vider les tables ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$nouvellesTables = array('cel_obs', 'cel_utilisateurs_infos', 'cel_zones_geo'); |
foreach ($nouvellesTables as $nomTable) { |
echo 'Vider la table '.$nomTable.'...'; |
$requeteTruncate = 'TRUNCATE TABLE '.self::$bdd_cel_migration.'.'.$nomTable; |
$resultatTruncate = $this->executerRequete($requeteTruncate); |
echo "ok \n"; |
} |
echo "\n---------------------------------------------------------------- OK\n\n"; |
} |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 1. Paramétrage ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->getUtilisateurs(); |
$this->getMotsCles(); |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 2. Migration des utilisateurs ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->migrerUtilisateurs(); |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 3. Migration des zone géographiques ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->migrerZonesGeo(); |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 4. Migration des observations ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->migrerObs(); |
$this->ordonnerObs(); |
echo "\n"."\n"."\n"; |
} |
public function executerRequeteSimple($requete) { |
// Fonction de commodité pour afficher les requetes au lieu de les executer |
if (self::dry_run) { |
echo str_replace('),','),'."\n", $requete); |
return true; |
} else { |
return parent::executerRequeteSimple($requete); |
} |
} |
private function getUtilisateurs() { |
echo "\n-------------------------------------------------------------------\n"; |
echo "--SELECTION DES UTILISATEURS---------------------------------------\n\n"; |
$requete = 'SELECT DISTINCT u_id AS id, u_mail AS mail, u_name AS nom, u_surname AS prenom, u_passwd AS pass '. |
'FROM cel_inventory INNER JOIN '.self::$bdd_utilisateurs.'.annuaire_tela ON (u_mail = identifiant) '; |
$tableau_utilisateurs = $this->executerRequete($requete); |
foreach( $tableau_utilisateurs as &$utilisateur) { |
$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur; |
} |
echo sizeof($this->tableau_utilisateurs)." utilisateurs sélectionnés"; |
echo "\n-----------------------------------------------------------------OK\n"; |
} |
private function getMotsCles() { |
echo "\n-------------------------------------------------------------------\n"; |
echo "--SELECTION DES MOTS-CLES -----------------------------------------\n\n"; |
$requete = 'SELECT cmc_id_proprietaire as id_utilisateur, cmc_id_mot_cle_utilisateur as id_mot_cle, '. |
'cmc_mot_cle as mot_cle '. |
'FROM cel_mots_cles_obs '; |
$tableau_mots_cles = $this->executerRequete($requete); |
foreach( $tableau_mots_cles as &$mot_cle) { |
$this->tableau_mots_cles[$mot_cle['id_utilisateur']][$mot_cle['id_mot_cle']] = $mot_cle; |
} |
echo sizeof($this->tableau_mots_cles)." mots-clés sélectionnés"; |
echo "\n-----------------------------------------------------------------OK\n"; |
} |
/** |
* Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué. |
* Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle. |
* |
* @param string le message d'information. |
* @param int le nombre de départ à afficher. |
* @return void le message est affiché dans la console. |
*/ |
protected function afficherAvancement($message, $depart = 0) { |
if (! isset(self::$avancement[$message])) { |
self::$avancement[$message] = $depart; |
echo "$message : "; |
$actuel =& self::$avancement[$message]; |
echo $actuel++; |
} else { |
$actuel =& self::$avancement[$message]; |
// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères) |
$passage = 0; |
if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) { |
$passage = 1; |
} |
echo str_repeat(chr(8), (strlen((string) $actuel) - $passage)); |
echo $actuel++; |
} |
} |
private function migrerUtilisateurs() { |
$requete = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_utilisateurs_infos '. |
'(id_utilisateur) '. |
'VALUES '; |
$sous_requete = array(); |
foreach ($this->tableau_utilisateurs as $id => &$utilisateur) { |
$sous_requete[] = '('.$this->proteger($utilisateur['id']).')'; |
} |
$requete .= implode(',', $sous_requete); |
$migration_utilisateurs = $this->executerRequeteSimple($requete); |
if ($migration_utilisateurs) { |
echo "Migration utilisateurs : ".count($sous_requete); |
} else { |
exit('Erreur lors de la migration des utilisateurs '."\n"); |
} |
echo "\n---------------------------------------------------------------- OK\n\n"; |
} |
private function migrerZonesGeo() { |
$pas = 5000; |
//SELECTIONNER LE NOMBRE DE ZONE GEO |
$requete_nombreZonesGeo = 'SELECT count(*) as nb FROM locations'; |
$resultatNbZonesGeo = $this->executerRequete($requete_nombreZonesGeo); |
$nbZones = (int) $resultatNbZonesGeo[0]['nb']; |
$nbTotal = 0; |
for($i = 0; $i <= $nbZones ; $i += $pas) { |
$requete_selection_zones_geo = 'SELECT * FROM locations LIMIT '.$i.', '.$pas; |
$zones_geo = $this->executerRequete($requete_selection_zones_geo); |
$requete_insertion_nouvelles_zones_geo = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_zones_geo '. |
'(id_zone_geo, code, nom, utm_secteur, utm_x, utm_y, wgs84_latitude, wgs84_longitude, date_modification) '. |
'VALUES '; |
$sous_requete_insertion_valeurs = ''; |
if(count($zones_geo) > 0) { |
foreach($zones_geo as $zone_geo) { |
$zone_geo['nouveau_code_geo'] = 'INSEE-C:'.$zone_geo['insee_code']; |
$lat_long = $this->convertirUtmVersLatLong($zone_geo['x_utm'],$zone_geo['y_utm'],$zone_geo['sector']); |
$indice_tableau_localites = $this->construireIndiceTableauLocalites($zone_geo['name'], $zone_geo['insee_code']); |
$this->tableau_zones_geo[$indice_tableau_localites] = $zone_geo; |
$sous_requete_insertion_valeurs .= '('.$this->proteger($zone_geo['nouveau_code_geo']).','. |
$this->proteger($zone_geo['insee_code']).','. |
$this->proteger($zone_geo['name']).','. |
$this->proteger($zone_geo['sector']).','. |
$this->proteger($zone_geo['x_utm']).','. |
$this->proteger($zone_geo['y_utm']).','. |
$this->proteger($lat_long['lat']).','. |
$this->proteger($lat_long['long']).','. |
$this->proteger($zone_geo['update_date']). |
'),'; |
} |
$sous_requete_insertion_valeurs = rtrim($sous_requete_insertion_valeurs,','); |
$requete_insertion_nouvelles_zones_geo .= $sous_requete_insertion_valeurs; |
$migration_zones_geo = $this->executerRequeteSimple($requete_insertion_nouvelles_zones_geo); |
} else { |
echo 'Fin de migration des zones géo '."\n"; |
return; |
} |
if ($migration_zones_geo) { |
$nbTotal ++; |
$this->afficherAvancement('Migration des zones (par '.$pas.')', $nbTotal); |
} else { |
exit('Erreur lors de la migration des zones géo '.$i.' à '.($i+$pas)."\n"); |
} |
} |
echo "\n---------------------------------------------------------------- OK\n\n"; |
} |
private function convertirUtmVersLatLong($x, $y, $sector) { |
$lat_long = array(); |
$convertisseur = new gPoint(); |
$convertisseur->setUTM($x, $y, $sector); |
$convertisseur->convertTMtoLL(); |
$lat_long['lat'] = str_replace(',','.',$convertisseur->Lat()); |
$lat_long['long'] = str_replace(',','.',$convertisseur->Long()); |
return $lat_long; |
} |
private function migrerObs() { |
$debut = 0; |
$pas = 1000; |
$nbTotal = 0; |
//Selectionner le nombre d'observations |
$requeteNbObs = "SELECT COUNT(*) as nb FROM cel_inventory"; |
$resultatNbObs = $this->executerRequete($requeteNbObs); |
$fin = $resultatNbObs[0]['nb']; |
for ($i = $debut; $i < $fin ; $i += $pas) { |
$requete_selection_obs = 'SELECT * FROM cel_inventory '. |
'ORDER BY identifiant LIMIT '.$i.','.$pas; |
$observations = $this->requeter($requete_selection_obs); |
$requete_insertion_observations = 'INSERT IGNORE INTO '.self::$bdd_cel_migration.'.cel_obs ('; |
foreach ($this->tableau_nouveau_ancien as $nouveau_champ => $ancien_champ) { |
$requete_insertion_observations .= $nouveau_champ.','; |
} |
$requete_insertion_observations = rtrim($requete_insertion_observations, ','); |
$requete_insertion_observations = $requete_insertion_observations.') VALUES '; |
if (count($observations) > 0) { |
foreach($observations as $observation) { |
$nouvelle_observation = $this->traiterLigneObservation($observation); |
$nouvelle_observation = array_map(array($this, 'protegerSiNonNull'), $nouvelle_observation); |
$requete_insertion_observations .= '('.join(',', array_values($nouvelle_observation)).'),'; |
} |
$requete_insertion_observations = rtrim($requete_insertion_observations, ','); |
$migration_observations = $this->executerRequeteSimple($requete_insertion_observations); |
} else { |
echo 'Fin de migration des observations '."\n"."\n"; |
return; |
} |
if ($migration_observations) { |
$nbTotal ++; |
$this->afficherAvancement('Migration des observations (par '.$pas.')', $nbTotal); |
} else { |
exit('Erreur lors de la migration des observation de '.$i.' à '.($i+$pas)."\n"); |
} |
} |
if (sizeof($this->communesOubliees) > 0) { |
echo "\nxxxxxxxxx communes oubliées : ".sizeof($this->communesOubliees)." xxxxxxxxx \\n"; |
} |
echo "\n---------------------------------------------------------------- OK\n\n"; |
} |
private function ordonnerObs() { |
$requete = 'ALTER TABLE '.self::$bdd_cel_migration.'.cel_obs ORDER BY id_observation'; |
$this->executerRequeteSimple($requete); |
} |
private function traiterLigneObservation($obs) { |
$nouvelle_obs = array(); |
foreach($this->tableau_nouveau_ancien as $nouveau_champ_obs => $ancien_champ_obs) { |
if ($this->estUnChampATraiter($ancien_champ_obs)) { |
if (method_exists($this, $ancien_champ_obs)) { |
$nouvelle_obs[$nouveau_champ_obs] = $this->$ancien_champ_obs($obs); |
} else { |
$nouvelle_obs[$nouveau_champ_obs] = ''; |
} |
} else { |
if ($obs[$ancien_champ_obs] == '000null' || $obs[$ancien_champ_obs] == 'null' || trim($obs[$ancien_champ_obs]) == '') { |
$obs[$ancien_champ_obs] = 'NULL'; |
} |
if (($ancien_champ_obs == 'coord_x' || $ancien_champ_obs == 'coord_y') && ($obs[$ancien_champ_obs] == '0' || $obs[$ancien_champ_obs] == 0)) { |
$obs[$ancien_champ_obs] = 'NULL'; |
} |
$nouvelle_obs[$nouveau_champ_obs] = $obs[$ancien_champ_obs]; |
} |
} |
return $nouvelle_obs; |
} |
private function protegerSiNonNull($valeur) { |
if ($valeur != 'NULL') { |
$valeur = $this->proteger($valeur); |
} |
return $valeur; |
} |
private function estUnChampATraiter($champ) { |
return strpos($champ,'traiter') !== false; |
} |
private function traiterReferentiel($observation) { |
$retour = 'NULL'; |
if ($observation['num_nom_sel'] != '' && $observation['num_nom_sel'] != '0') { |
$retour = 'bdnff:4.02'; |
} |
return $retour; |
} |
private function traiterLat(&$observation) { |
if ($this->etreNull($observation['coord_x'])) { |
$observation['coord_x'] = 'NULL'; |
} else if (preg_match(self::PATTERN_LAT, $observation['coord_x']) == false) { |
$latNote = 'Latitude éronnée : '.$observation['coord_x']; |
if ($this->etreNull($observation['commentaire'])) { |
$observation['commentaire'] = $latNote; |
} else { |
$observation['commentaire'] .= "\n".$latNote; |
} |
$observation['coord_x'] = 'NULL'; |
} |
$retour = $observation['coord_x']; |
return $retour; |
} |
private function traiterLng(&$observation) { |
if ($this->etreNull($observation['coord_y'])) { |
$observation['coord_y'] = 'NULL'; |
} else if (preg_match(self::PATTERN_LNG, $observation['coord_y']) == false) { |
$lngNote = 'Longitude éronnée : '.$observation['coord_y']; |
if ($this->etreNull($observation['commentaire'])) { |
$observation['commentaire'] = $lngNote; |
} else { |
$observation['commentaire'] .= "\n".$lngNote; |
} |
$observation['coord_y'] = 'NULL'; |
} |
$retour = $observation['coord_y']; |
return $retour; |
} |
private function traiterGeodatum($observation) { |
$retour = 'NULL'; |
if ($observation['coord_x'] != 'NULL' && $observation['coord_y'] != 'NULL') { |
$retour = 'WGS84'; |
} |
return $retour; |
} |
private function traiterMotsClesTexte($ligne_observation) { |
$mail_observation = $ligne_observation['identifiant']; |
$retour = $ligne_observation['mots_cles']; |
if (isset($this->tableau_mots_cles[$mail_observation])) { |
$mots_cles_tableau = $this->parserMotsCles($mail_observation, $ligne_observation['mots_cles'], ';'); |
$retour = join(',', $mots_cles_tableau); |
$retour = ltrim($retour, ',,') ; |
} |
return $retour; |
} |
private function parserMotsCles($utilisateur, $mot_cles, $separateur = ',') { |
$tableau_mots_cles = explode($separateur,$mot_cles); |
$tableau_mots_cles_formates = array(); |
foreach ($tableau_mots_cles as $mot_cle) { |
$mot_cle = str_replace($separateur.$separateur,'',$mot_cle); |
$mot_cle = str_replace('null','',$mot_cle); |
if ($this->estUnIdentifiantMotCle($mot_cle)) { |
// certains mots clés mal formatés contiennent des virgules |
if (strpos($mot_cle,',') !== false) { |
$tab_mot_cle_mal_formate = explode(',',$mot_cle); |
foreach ($tab_mot_cle_mal_formate as $mot_cle_mal_formate) { |
if ($this->estUnIdentifiantMotCle($mot_cle_mal_formate)) { |
$tableau_mots_cles_formates[$mot_cle_mal_formate] = $this->tableau_mots_cles[$utilisateur][$mot_cle_mal_formate]['mot_cle']; |
} |
} |
} else { |
// on met le mot clé dans sa propre case afin d'éviter |
// facilement les doublons provoqués par de mauvais formatages |
if (isset($this->tableau_mots_cles[$utilisateur][$mot_cle]) && trim($this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle']) != '') { |
$tableau_mots_cles_formates[$mot_cle] = $this->tableau_mots_cles[$utilisateur][$mot_cle]['mot_cle']; |
} |
} |
} |
} |
return $tableau_mots_cles_formates; |
} |
private function estUnIdentifiantMotCle($chaine) { |
return trim($chaine) != '' && preg_match('/[0-9A-Z]+\.[0-9A-Z]+/i', $chaine) ; |
} |
private function traiterIdentifiantUtilisateur($ligne_observation) { |
$mail_observation = $ligne_observation['identifiant']; |
$retour = $this->renvoyerIdPourMigration($mail_observation); |
return $retour; |
} |
private function traiterPrenomUtilisateur($ligne_observation) { |
$mail_observation = $ligne_observation['identifiant']; |
$retour = ''; |
if (isset($this->tableau_utilisateurs[$mail_observation])) { |
$prenom = $this->tableau_utilisateurs[$mail_observation]['prenom']; |
$retour = self::formaterMotPremiereLettreChaqueMotEnMajuscule($prenom); |
} |
return $retour; |
} |
private function traiterNomUtilisateur($ligne_observation) { |
$mail_observation = $ligne_observation['identifiant']; |
$retour = ''; |
if (isset($this->tableau_utilisateurs[$mail_observation])) { |
$nom = $this->tableau_utilisateurs[$mail_observation]['nom']; |
$retour = self::formaterMotEnMajuscule($nom); |
} |
return $retour; |
} |
public static function formaterMotPremiereLettreChaqueMotEnMajuscule($chaine, $encodage= 'UTF-8') { |
$chaine = str_replace('-', ' - ', $chaine); |
$chaine = mb_strtolower($chaine, $encodage); |
$chaine = mb_convert_case($chaine, MB_CASE_TITLE, $encodage); |
$chaine = str_replace(' - ', '-', $chaine); |
return $chaine; |
} |
public static function formaterMotEnMajuscule($chaine, $encodage= 'UTF-8') { |
return mb_convert_case($chaine, MB_CASE_UPPER, $encodage); |
} |
private function traiterZoneGeo($ligne_observation) { |
$zone_geo = $ligne_observation['location']; |
if ($ligne_observation['id_location'] != null && !is_numeric($ligne_observation['id_location']) && $ligne_observation['id_location'] != '000null') { |
$id_zone_geo_ancienne = $ligne_observation['id_location']; |
if ($zone_geo != '') { |
$id_zone_geo_ancienne = '('.$id_zone_geo_ancienne.')'; |
} |
$zone_geo .= $id_zone_geo_ancienne; |
} else if ($ligne_observation['location'] == null || $ligne_observation['location'] == "" || $ligne_observation['location'] == "000null") { |
if ($ligne_observation['id_location'] != '' && $ligne_observation['id_location'] != '000null') { |
$id_zone_geo_ancienne = $ligne_observation['id_location']; |
$id_zone_geo_ancienne = $id_zone_geo_ancienne; |
$zone_geo = $id_zone_geo_ancienne; |
} else { |
$zones_geo = 'NULL'; |
} |
} |
return $zone_geo; |
} |
private function traiterIdentifiantZoneGeo($ligne_observation) { |
$id_zone_geo = ''; |
if ($ligne_observation['id_location'] != '' && $ligne_observation['id_location'] != '000null') { |
$indice = $this->construireIndiceTableauLocalites($ligne_observation['location'], $ligne_observation['id_location']); |
if (isset($this->tableau_zones_geo[$indice])) { |
$id_zone_geo = $this->tableau_zones_geo[$indice]['nouveau_code_geo']; |
} else { |
if ($ligne_observation['location'] != "000null") { |
$this->communesOubliees[$indice] = false; |
} |
} |
} else { |
$id_zone_geo = 'NULL'; |
} |
return $id_zone_geo; |
} |
private function construireIndiceTableauLocalites($nom, $id) { |
$nom = htmlentities($nom, ENT_NOQUOTES, 'UTF-8'); |
$nom = preg_replace('#&([A-za-z])(?:acute|cedil|circ|grave|orn|ring|slash|th|tilde|uml);#', '\1', $nom); |
$nom = preg_replace('#&([A-za-z]{2})(?:lig);#', '\1', $nom); // pour les ligatures e.g. 'œ' |
$nom = preg_replace('#&[^;]+;#', '', $nom); // supprime les autres caractères |
$nom = str_replace("'",'_',$nom); |
$nom = str_replace(' ','_',$nom); |
$nom = str_replace('-','_',$nom); |
$nom = str_replace(' ','_',$nom); |
$indice = strtolower($nom).substr($id,0,2); |
return $indice; |
} |
// Par défaut, on garde l'utilisateur tel quel (cas de la chaine de session des utilisateur anonymes) |
private function renvoyerIdPourMigration($utilisateur) { |
$retour = $utilisateur; |
// si le mail correspond a un utilisateur de la bdd |
if (isset($this->tableau_utilisateurs[$utilisateur])) { |
// on renvoie son id |
$retour = $this->tableau_utilisateurs[$utilisateur]['id']; |
} else if ($utilisateur != '') { |
// sinon si c'est un mail inconnu, on garde le md5 |
if ($this->mailValide($utilisateur)) { |
$retour = md5($utilisateur); |
} |
} |
return $retour; |
} |
public function mailValide($mail) { |
// vérification bidon mais ça suffit pour ici |
return !(strpos('@', $mail) === false); |
} |
} |
/trunk/jrest/scripts/MigrationImages.php |
---|
New file |
0,0 → 1,1057 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Script de migration des Images de la version 1 de la base de données du CEL à la v2. |
* |
* @category php 5.2 |
* @package Cel/Scripts |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) |
* @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 $Id$ |
*/ |
class MigrationImages extends Cel { |
const dry_run = false; |
const truncate = true; //Doit on vider les tables de destination ? |
const separateur_champs_metadonnees = ';'; |
const separateur_valeurs_metadonnees = ':'; |
public static $bdd_cel_migration; |
public static $bdd_utilisateurs; |
private $cle_id_metadonnees = array(); |
private $tableau_utilisateurs = array(); |
private $tableau_observations = array(); |
private $tableau_mots_cles = array(); |
/** Tableau associatif permettant de stocker l'avancement dans une boucle. |
* La clé est un md5 du message à afficher au démarrage de la boucle. |
* @var array |
*/ |
private static $avancement = array(); |
private $tableau_nouveau_ancien = array( |
'id_image' => 'ci_id_image', |
'ordre' =>'ci_ordre', |
'ce_utilisateur' => 'traiterIdentifiantUtilisateur', |
'prenom_utilisateur' => 'traiterPrenomUtilisateur', |
'nom_utilisateur' => 'traiterNomUtilisateur', |
'courriel_utilisateur' => 'ci_ce_utilisateur', |
'hauteur' => 'ci_meta_height', |
'largeur' => 'ci_meta_width', |
'appareil_fabriquant' => 'ci_meta_make', |
'appareil_modele' => 'ci_meta_model', |
'date_prise_de_vue' => 'ci_meta_date_time', |
'note_qualite' => 'traiterNoteImage', |
'mots_cles_texte' => 'ci_meta_mots_cles', |
'commentaire' => 'ci_meta_comment', |
'nom_original' => 'ci_nom_original', |
'md5' => 'ci_md5', |
'meta_exif' => 'traiterExif', |
'meta_iptc' => 'traiterIptc', |
'meta_xmp' => 'traiterXmp', |
'meta_makernote' => 'traiterMakernote', |
'date_modification' => 'ci_meta_date', |
'date_creation' => 'ci_meta_date_ajout' |
); |
private $champs_exifs_non_gardes = array( |
'ci_meta_x_resolution', |
'ci_meta_y_resolution', |
'ci_meta_gps', |
'ci_meta_user_comment', |
'ci_meta_exif_exposure_time', |
'ci_meta_exif_f_number', |
'ci_meta_exif_exif_version', |
'ci_meta_exif_compressed_bits_per_pixel', |
'ci_meta_exif_shutter_speed_value', |
'ci_meta_exif_aperture_value', |
'ci_meta_exif_exposure_bias_value', |
'ci_meta_exif_max_aperture_value', |
'ci_meta_exif_metering_mode', |
'ci_meta_exif_light_source', |
'ci_meta_exif_flash', |
'ci_meta_exif_focal_length', |
'ci_meta_exif_flash_pix_version', |
'ci_meta_exif_color_space', |
'ci_meta_exif_interoperability_offset', |
'ci_meta_exif_focal_plane_x_resolution', |
'ci_meta_exif_focal_plane_y_resolution', |
'ci_meta_exif_focal_plane_resolution_unit', |
'ci_meta_exif_sensing_method', |
'ci_meta_exif_file_source', |
'ci_meta_exif_custom_rendered', |
'ci_meta_exif_exposure_mode', |
'ci_meta_exif_white_balance', |
'ci_meta_exif_digital_zoom_ratio', |
'ci_meta_exif_scene_capture_type', |
'ci_meta_exif_gain_control', |
'ci_meta_exif_contrast', |
'ci_meta_exif_saturation', |
'ci_meta_exif_sharpness', |
'ci_meta_exif_subject_distance_range' |
); |
private $champs_iptc_non_gardes = array( |
'ci_meta_iptc_category', |
'ci_meta_iptc_by_line', |
'ci_meta_iptc_by_line_title', |
'ci_meta_iptc_city', |
'ci_meta_iptc_sub_location', |
'ci_meta_iptc_province_state', |
'ci_meta_iptc_country_primary_location_code', |
'ci_meta_iptc_country_name', |
'ci_meta_iptc_headline', |
'ci_meta_iptc_credit', |
'ci_meta_iptc_copyright_notice', |
'ci_meta_iptc_contact' |
); |
private $champs_divers_non_gardes = array( |
'ci_publiable_eflore', |
'ci_meta_mots_cles' |
); |
private $ids_tags_exif = array( |
'InteropIndex' => array('id' => '1', 'tag' => 'InteropIndex', 'categorie' => 'InteropIFD'), |
'InteropVersion' => array('id' => '2', 'tag' => 'InteropVersion', 'categorie' => 'InteropIFD'), |
'ProcessingSoftware' => array('id' => '11', 'tag' => 'ProcessingSoftware', 'categorie' => 'IFD0'), |
'SubfileType' => array('id' => '254', 'tag' => 'SubfileType', 'categorie' => 'IFD0'), |
'OldSubfileType' => array('id' => '255', 'tag' => 'OldSubfileType', 'categorie' => 'IFD0'), |
'ImageWidth' => array('id' => '256', 'tag' => 'ImageWidth', 'categorie' => 'IFD0'), |
'ImageLength' => array('id' => '257', 'tag' => 'ImageHeight', 'categorie' => 'IFD0'), |
'BitsPerSample' => array('id' => '258', 'tag' => 'BitsPerSample', 'categorie' => 'IFD0'), |
'Compression' => array('id' => '259', 'tag' => 'Compression', 'categorie' => 'IFD0'), |
'PhotometricInterpretation' => array('id' => '262', 'tag' => 'PhotometricInterpretation', 'categorie' => 'IFD0'), |
'Thresholding' => array('id' => '263', 'tag' => 'Thresholding', 'categorie' => 'IFD0'), |
'CellWidth' => array('id' => '264', 'tag' => 'CellWidth', 'categorie' => 'IFD0'), |
'CellLength' => array('id' => '265', 'tag' => 'CellLength', 'categorie' => 'IFD0'), |
'FillOrder' => array('id' => '266', 'tag' => 'FillOrder', 'categorie' => 'IFD0'), |
'DocumentName' => array('id' => '269', 'tag' => 'DocumentName', 'categorie' => 'IFD0'), |
'ImageDescription' => array('id' => '270', 'tag' => 'ImageDescription', 'categorie' => 'IFD0'), |
'Make' => array('id' => '271', 'tag' => 'Make', 'categorie' => 'IFD0'), |
'Model' => array('id' => '272', 'tag' => 'Model', 'categorie' => 'IFD0'), |
'StripOffsets' => array('id' => '273', 'tag' => 'StripOffsets', 'categorie' => 'IFD0'), |
'Orientation' => array('id' => '274', 'tag' => 'Orientation', 'categorie' => 'IFD0'), |
'SamplesPerPixel' => array('id' => '277', 'tag' => 'SamplesPerPixel', 'categorie' => 'IFD0'), |
'RowsPerStrip' => array('id' => '278', 'tag' => 'RowsPerStrip', 'categorie' => 'IFD0'), |
'StripByteCounts' => array('id' => '279', 'tag' => 'StripByteCounts', 'categorie' => 'IFD0'), |
'MinSampleValue' => array('id' => '280', 'tag' => 'MinSampleValue', 'categorie' => 'IFD0'), |
'MaxSampleValue' => array('id' => '281', 'tag' => 'MaxSampleValue', 'categorie' => 'IFD0'), |
'XResolution' => array('id' => '282', 'tag' => 'XResolution', 'categorie' => 'IFD0'), |
'YResolution' => array('id' => '283', 'tag' => 'YResolution', 'categorie' => 'IFD0'), |
'PlanarConfiguration' => array('id' => '284', 'tag' => 'PlanarConfiguration', 'categorie' => 'IFD0'), |
'PageName' => array('id' => '285', 'tag' => 'PageName', 'categorie' => 'IFD0'), |
'XPosition' => array('id' => '286', 'tag' => 'XPosition', 'categorie' => 'IFD0'), |
'YPosition' => array('id' => '287', 'tag' => 'YPosition', 'categorie' => 'IFD0'), |
'FreeOffsets' => array('id' => '288', 'tag' => 'FreeOffsets', 'categorie' => 'Unknown'), |
'FreeByteCounts' => array('id' => '289', 'tag' => 'FreeByteCounts', 'categorie' => 'Unknown'), |
'GrayResponseUnit' => array('id' => '290', 'tag' => 'GrayResponseUnit', 'categorie' => 'IFD0'), |
'GrayResponseCurve' => array('id' => '291', 'tag' => 'GrayResponseCurve', 'categorie' => 'Unknown'), |
'T4Options' => array('id' => '292', 'tag' => 'T4Options', 'categorie' => 'Unknown'), |
'T6Options' => array('id' => '293', 'tag' => 'T6Options', 'categorie' => 'Unknown'), |
'ResolutionUnit' => array('id' => '296', 'tag' => 'ResolutionUnit', 'categorie' => 'IFD0'), |
'PageNumber' => array('id' => '297', 'tag' => 'PageNumber', 'categorie' => 'IFD0'), |
'ColorResponseUnit' => array('id' => '300', 'tag' => 'ColorResponseUnit', 'categorie' => 'Unknown'), |
'TransferFunction' => array('id' => '301', 'tag' => 'TransferFunction', 'categorie' => 'IFD0'), |
'Software' => array('id' => '305', 'tag' => 'Software', 'categorie' => 'IFD0'), |
'ModifyDate' => array('id' => '306', 'tag' => 'ModifyDate', 'categorie' => 'IFD0'), |
'DateTime' => array('id' => '306', 'tag' => 'ModifyDate', 'categorie' => 'IFD0'), |
'Artist' => array('id' => '315', 'tag' => 'Artist', 'categorie' => 'IFD0'), |
'HostComputer' => array('id' => '316', 'tag' => 'HostComputer', 'categorie' => 'IFD0'), |
'Predictor' => array('id' => '317', 'tag' => 'Predictor', 'categorie' => 'IFD0'), |
'WhitePoint' => array('id' => '318', 'tag' => 'WhitePoint', 'categorie' => 'IFD0'), |
'PrimaryChromaticities' => array('id' => '319', 'tag' => 'PrimaryChromaticities', 'categorie' => 'IFD0'), |
'ColorMap' => array('id' => '320', 'tag' => 'ColorMap', 'categorie' => 'Unknown'), |
'HalftoneHints' => array('id' => '321', 'tag' => 'HalftoneHints', 'categorie' => 'IFD0'), |
'TileWidth' => array('id' => '322', 'tag' => 'TileWidth', 'categorie' => 'IFD0'), |
'TileLength' => array('id' => '323', 'tag' => 'TileLength', 'categorie' => 'IFD0'), |
'TileOffsets' => array('id' => '324', 'tag' => 'TileOffsets', 'categorie' => 'Unknown'), |
'TileByteCounts' => array('id' => '325', 'tag' => 'TileByteCounts', 'categorie' => 'Unknown'), |
'BadFaxLines' => array('id' => '326', 'tag' => 'BadFaxLines', 'categorie' => 'Unknown'), |
'CleanFaxData' => array('id' => '327', 'tag' => 'CleanFaxData', 'categorie' => 'Unknown'), |
'ConsecutiveBadFaxLines' => array('id' => '328', 'tag' => 'ConsecutiveBadFaxLines', 'categorie' => 'Unknown'), |
'SubIFD' => array('id' => '330', 'tag' => 'SubIFD', 'categorie' => 'Unknown'), |
'InkSet' => array('id' => '332', 'tag' => 'InkSet', 'categorie' => 'IFD0'), |
'InkNames' => array('id' => '333', 'tag' => 'InkNames', 'categorie' => 'Unknown'), |
'NumberofInks' => array('id' => '334', 'tag' => 'NumberofInks', 'categorie' => 'Unknown'), |
'DotRange' => array('id' => '336', 'tag' => 'DotRange', 'categorie' => 'IFD0'), |
'TargetPrinter' => array('id' => '337', 'tag' => 'TargetPrinter', 'categorie' => 'Unknown'), |
'ExtraSamples' => array('id' => '338', 'tag' => 'ExtraSamples', 'categorie' => 'Unknown'), |
'SampleFormat' => array('id' => '339', 'tag' => 'SampleFormat', 'categorie' => 'Unknown'), |
'SMinSampleValue' => array('id' => '340', 'tag' => 'SMinSampleValue', 'categorie' => 'Unknown'), |
'SMaxSampleValue' => array('id' => '341', 'tag' => 'SMaxSampleValue', 'categorie' => 'Unknown'), |
'TransferRange' => array('id' => '342', 'tag' => 'TransferRange', 'categorie' => 'Unknown'), |
'ClipPath' => array('id' => '343', 'tag' => 'ClipPath', 'categorie' => 'Unknown'), |
'XClipPathUnits' => array('id' => '344', 'tag' => 'XClipPathUnits', 'categorie' => 'Unknown'), |
'YClipPathUnits' => array('id' => '345', 'tag' => 'YClipPathUnits', 'categorie' => 'Unknown'), |
'Indexed' => array('id' => '346', 'tag' => 'Indexed', 'categorie' => 'Unknown'), |
'JPEGTables' => array('id' => '347', 'tag' => 'JPEGTables', 'categorie' => 'Unknown'), |
'OPIProxy' => array('id' => '351', 'tag' => 'OPIProxy', 'categorie' => 'Unknown'), |
'GlobalParametersIFD' => array('id' => '400', 'tag' => 'GlobalParametersIFD', 'categorie' => 'Unknown'), |
'ProfileType' => array('id' => '401', 'tag' => 'ProfileType', 'categorie' => 'Unknown'), |
'FaxProfile' => array('id' => '402', 'tag' => 'FaxProfile', 'categorie' => 'Unknown'), |
'CodingMethods' => array('id' => '403', 'tag' => 'CodingMethods', 'categorie' => 'Unknown'), |
'VersionYear' => array('id' => '404', 'tag' => 'VersionYear', 'categorie' => 'Unknown'), |
'ModeNumber' => array('id' => '405', 'tag' => 'ModeNumber', 'categorie' => 'Unknown'), |
'Decode' => array('id' => '433', 'tag' => 'Decode', 'categorie' => 'Unknown'), |
'DefaultImageColor' => array('id' => '434', 'tag' => 'DefaultImageColor', 'categorie' => 'Unknown'), |
'T82Options' => array('id' => '435', 'tag' => 'T82Options', 'categorie' => 'Unknown'), |
'JPEGProc' => array('id' => '512', 'tag' => 'JPEGProc', 'categorie' => 'Unknown'), |
'ThumbnailOffset' => array('id' => '513', 'tag' => 'ThumbnailOffset', 'categorie' => 'IFD1'), |
'ThumbnailLength' => array('id' => '514', 'tag' => 'ThumbnailLength', 'categorie' => 'IFD1'), |
'JPEGRestartInterval' => array('id' => '515', 'tag' => 'JPEGRestartInterval', 'categorie' => 'Unknown'), |
'JPEGLosslessPredictors' => array('id' => '517', 'tag' => 'JPEGLosslessPredictors', 'categorie' => 'Unknown'), |
'JPEGPointTransforms' => array('id' => '518', 'tag' => 'JPEGPointTransforms', 'categorie' => 'Unknown'), |
'JPEGQTables' => array('id' => '519', 'tag' => 'JPEGQTables', 'categorie' => 'Unknown'), |
'JPEGDCTables' => array('id' => '520', 'tag' => 'JPEGDCTables', 'categorie' => 'Unknown'), |
'JPEGACTables' => array('id' => '521', 'tag' => 'JPEGACTables', 'categorie' => 'Unknown'), |
'YCbCrCoefficients' => array('id' => '529', 'tag' => 'YCbCrCoefficients', 'categorie' => 'IFD0'), |
'YCbCrSubSampling' => array('id' => '530', 'tag' => 'YCbCrSubSampling', 'categorie' => 'IFD0'), |
'YCbCrPositioning' => array('id' => '531', 'tag' => 'YCbCrPositioning', 'categorie' => 'IFD0'), |
'ReferenceBlackWhite' => array('id' => '532', 'tag' => 'ReferenceBlackWhite', 'categorie' => 'IFD0'), |
'StripRowCounts' => array('id' => '559', 'tag' => 'StripRowCounts', 'categorie' => 'Unknown'), |
'ApplicationNotes' => array('id' => '700', 'tag' => 'ApplicationNotes', 'categorie' => 'ExifIFD'), |
'USPTOMiscellaneous' => array('id' => '999', 'tag' => 'USPTOMiscellaneous', 'categorie' => 'Unknown'), |
'RelatedImageFileFormat' => array('id' => '4096', 'tag' => 'RelatedImageFileFormat', 'categorie' => 'InteropIFD'), |
'RelatedImageWidth' => array('id' => '4097', 'tag' => 'RelatedImageWidth', 'categorie' => 'InteropIFD'), |
'RelatedImageHeight' => array('id' => '4098', 'tag' => 'RelatedImageHeight', 'categorie' => 'InteropIFD'), |
'RelatedImageLength' => array('id' => '4098', 'tag' => 'RelatedImageHeight', 'categorie' => 'InteropIFD'), |
'Rating' => array('id' => '18246', 'tag' => 'Rating', 'categorie' => 'IFD0'), |
'XP_DIP_XML' => array('id' => '18247', 'tag' => 'XP_DIP_XML', 'categorie' => 'Unknown'), |
'StitchInfo' => array('id' => '18248', 'tag' => 'StitchInfo', 'categorie' => 'Unknown'), |
'RatingPercent' => array('id' => '18249', 'tag' => 'RatingPercent', 'categorie' => 'IFD0'), |
'ImageID' => array('id' => '32781', 'tag' => 'ImageID', 'categorie' => 'Unknown'), |
'WangTag1' => array('id' => '32931', 'tag' => 'WangTag1', 'categorie' => 'Unknown'), |
'WangAnnotation' => array('id' => '32932', 'tag' => 'WangAnnotation', 'categorie' => 'Unknown'), |
'WangTag3' => array('id' => '32933', 'tag' => 'WangTag3', 'categorie' => 'Unknown'), |
'WangTag4' => array('id' => '32934', 'tag' => 'WangTag4', 'categorie' => 'Unknown'), |
'Matteing' => array('id' => '32995', 'tag' => 'Matteing', 'categorie' => 'Unknown'), |
'DataType' => array('id' => '32996', 'tag' => 'DataType', 'categorie' => 'Unknown'), |
'ImageDepth' => array('id' => '32997', 'tag' => 'ImageDepth', 'categorie' => 'Unknown'), |
'TileDepth' => array('id' => '32998', 'tag' => 'TileDepth', 'categorie' => 'Unknown'), |
'Model2' => array('id' => '33405', 'tag' => 'Model2', 'categorie' => 'Unknown'), |
'CFARepeatPatternDim' => array('id' => '33421', 'tag' => 'CFARepeatPatternDim', 'categorie' => 'Unknown'), |
'CFAPattern2' => array('id' => '33422', 'tag' => 'CFAPattern2', 'categorie' => 'Unknown'), |
'BatteryLevel' => array('id' => '33423', 'tag' => 'BatteryLevel', 'categorie' => 'Unknown'), |
'KodakIFD' => array('id' => '33424', 'tag' => 'KodakIFD', 'categorie' => 'Unknown'), |
'Copyright' => array('id' => '33432', 'tag' => 'Copyright', 'categorie' => 'IFD0'), |
'ExposureTime' => array('id' => '33434', 'tag' => 'ExposureTime', 'categorie' => 'ExifIFD'), |
'FNumber' => array('id' => '33437', 'tag' => 'FNumber', 'categorie' => 'ExifIFD'), |
'MDFileTag' => array('id' => '33445', 'tag' => 'MDFileTag', 'categorie' => 'Unknown'), |
'MDScalePixel' => array('id' => '33446', 'tag' => 'MDScalePixel', 'categorie' => 'Unknown'), |
'MDColorTable' => array('id' => '33447', 'tag' => 'MDColorTable', 'categorie' => 'Unknown'), |
'MDLabName' => array('id' => '33448', 'tag' => 'MDLabName', 'categorie' => 'Unknown'), |
'MDSampleInfo' => array('id' => '33449', 'tag' => 'MDSampleInfo', 'categorie' => 'Unknown'), |
'MDPrepDate' => array('id' => '33450', 'tag' => 'MDPrepDate', 'categorie' => 'Unknown'), |
'MDPrepTime' => array('id' => '33451', 'tag' => 'MDPrepTime', 'categorie' => 'Unknown'), |
'MDFileUnits' => array('id' => '33452', 'tag' => 'MDFileUnits', 'categorie' => 'Unknown'), |
'PixelScale' => array('id' => '33550', 'tag' => 'PixelScale', 'categorie' => 'Unknown'), |
'AdventScale' => array('id' => '33589', 'tag' => 'AdventScale', 'categorie' => 'Unknown'), |
'AdventRevision' => array('id' => '33590', 'tag' => 'AdventRevision', 'categorie' => 'Unknown'), |
'UIC1Tag' => array('id' => '33628', 'tag' => 'UIC1Tag', 'categorie' => 'Unknown'), |
'UIC2Tag' => array('id' => '33629', 'tag' => 'UIC2Tag', 'categorie' => 'Unknown'), |
'UIC3Tag' => array('id' => '33630', 'tag' => 'UIC3Tag', 'categorie' => 'Unknown'), |
'UIC4Tag' => array('id' => '33631', 'tag' => 'UIC4Tag', 'categorie' => 'Unknown'), |
'IPTC-NAA' => array('id' => '33723', 'tag' => 'IPTC-NAA', 'categorie' => 'IFD0'), |
'IntergraphPacketData' => array('id' => '33918', 'tag' => 'IntergraphPacketData', 'categorie' => 'Unknown'), |
'IntergraphFlagRegisters' => array('id' => '33919', 'tag' => 'IntergraphFlagRegisters', 'categorie' => 'Unknown'), |
'IntergraphMatrix' => array('id' => '33920', 'tag' => 'IntergraphMatrix', 'categorie' => 'Unknown'), |
'INGRReserved' => array('id' => '33921', 'tag' => 'INGRReserved', 'categorie' => 'Unknown'), |
'ModelTiePoint' => array('id' => '33922', 'tag' => 'ModelTiePoint', 'categorie' => 'Unknown'), |
'Site' => array('id' => '34016', 'tag' => 'Site', 'categorie' => 'Unknown'), |
'ColorSequence' => array('id' => '34017', 'tag' => 'ColorSequence', 'categorie' => 'Unknown'), |
'IT8Header' => array('id' => '34018', 'tag' => 'IT8Header', 'categorie' => 'Unknown'), |
'RasterPadding' => array('id' => '34019', 'tag' => 'RasterPadding', 'categorie' => 'Unknown'), |
'BitsPerRunLength' => array('id' => '34020', 'tag' => 'BitsPerRunLength', 'categorie' => 'Unknown'), |
'BitsPerExtendedRunLength' => array('id' => '34021', 'tag' => 'BitsPerExtendedRunLength', 'categorie' => 'Unknown'), |
'ColorTable' => array('id' => '34022', 'tag' => 'ColorTable', 'categorie' => 'Unknown'), |
'ImageColorIndicator' => array('id' => '34023', 'tag' => 'ImageColorIndicator', 'categorie' => 'Unknown'), |
'BackgroundColorIndicator' => array('id' => '34024', 'tag' => 'BackgroundColorIndicator', 'categorie' => 'Unknown'), |
'ImageColorValue' => array('id' => '34025', 'tag' => 'ImageColorValue', 'categorie' => 'Unknown'), |
'BackgroundColorValue' => array('id' => '34026', 'tag' => 'BackgroundColorValue', 'categorie' => 'Unknown'), |
'PixelIntensityRange' => array('id' => '34027', 'tag' => 'PixelIntensityRange', 'categorie' => 'Unknown'), |
'TransparencyIndicator' => array('id' => '34028', 'tag' => 'TransparencyIndicator', 'categorie' => 'Unknown'), |
'ColorCharacterization' => array('id' => '34029', 'tag' => 'ColorCharacterization', 'categorie' => 'Unknown'), |
'HCUsage' => array('id' => '34030', 'tag' => 'HCUsage', 'categorie' => 'Unknown'), |
'TrapIndicator' => array('id' => '34031', 'tag' => 'TrapIndicator', 'categorie' => 'Unknown'), |
'CMYKEquivalent' => array('id' => '34032', 'tag' => 'CMYKEquivalent', 'categorie' => 'Unknown'), |
'SEMInfo' => array('id' => '34118', 'tag' => 'SEMInfo', 'categorie' => 'IFD0'), |
'AFCP_IPTC' => array('id' => '34152', 'tag' => 'AFCP_IPTC', 'categorie' => 'Unknown'), |
'PixelMagicJBIGOptions' => array('id' => '34232', 'tag' => 'PixelMagicJBIGOptions', 'categorie' => 'Unknown'), |
'ModelTransform' => array('id' => '34264', 'tag' => 'ModelTransform', 'categorie' => 'Unknown'), |
'WB_GRGBLevels' => array('id' => '34306', 'tag' => 'WB_GRGBLevels', 'categorie' => 'Unknown'), |
'LeafData' => array('id' => '34310', 'tag' => 'LeafData', 'categorie' => 'Unknown'), |
'PhotoshopSettings' => array('id' => '34377', 'tag' => 'PhotoshopSettings', 'categorie' => 'Unknown'), |
'ExifIFDPointer' => array('id' => '34665', 'tag' => 'ExifOffset', 'categorie' => 'Unknown'), |
'ICC_Profile' => array('id' => '34675', 'tag' => 'ICC_Profile', 'categorie' => 'Unknown'), |
'TIFF_FXExtensions' => array('id' => '34687', 'tag' => 'TIFF_FXExtensions', 'categorie' => 'Unknown'), |
'MultiProfiles' => array('id' => '34688', 'tag' => 'MultiProfiles', 'categorie' => 'Unknown'), |
'SharedData' => array('id' => '34689', 'tag' => 'SharedData', 'categorie' => 'Unknown'), |
'T88Options' => array('id' => '34690', 'tag' => 'T88Options', 'categorie' => 'Unknown'), |
'ImageLayer' => array('id' => '34732', 'tag' => 'ImageLayer', 'categorie' => 'Unknown'), |
'GeoTiffDirectory' => array('id' => '34735', 'tag' => 'GeoTiffDirectory', 'categorie' => 'Unknown'), |
'GeoTiffDoubleParams' => array('id' => '34736', 'tag' => 'GeoTiffDoubleParams', 'categorie' => 'Unknown'), |
'GeoTiffAsciiParams' => array('id' => '34737', 'tag' => 'GeoTiffAsciiParams', 'categorie' => 'Unknown'), |
'ExposureProgram' => array('id' => '34850', 'tag' => 'ExposureProgram', 'categorie' => 'ExifIFD'), |
'SpectralSensitivity' => array('id' => '34852', 'tag' => 'SpectralSensitivity', 'categorie' => 'ExifIFD'), |
'GPSIFDPointer' => array('id' => '34853', 'tag' => 'GPSInfo', 'categorie' => 'Unknown'), |
'ISO' => array('id' => '34855', 'tag' => 'ISO', 'categorie' => 'ExifIFD'), |
'ISOSpeedRatings' => array('id' => '34855', 'tag' => 'ISO', 'categorie' => 'ExifIFD'), |
'PhotographicSensitivity' => array('id' => '34855', 'tag' => 'ISO', 'categorie' => 'ExifIFD'), |
'Opto-ElectricConvFactor' => array('id' => '34856', 'tag' => 'Opto-ElectricConvFactor', 'categorie' => 'Unknown'), |
'OECF' => array('id' => '34856', 'tag' => 'Opto-ElectricConvFactor', 'categorie' => 'Unknown'), |
'Interlace' => array('id' => '34857', 'tag' => 'Interlace', 'categorie' => 'Unknown'), |
'TimeZoneOffset' => array('id' => '34858', 'tag' => 'TimeZoneOffset', 'categorie' => 'ExifIFD'), |
'SelfTimerMode' => array('id' => '34859', 'tag' => 'SelfTimerMode', 'categorie' => 'ExifIFD'), |
'SensitivityType' => array('id' => '34864', 'tag' => 'SensitivityType', 'categorie' => 'ExifIFD'), |
'StandardOutputSensitivity' => array('id' => '34865', 'tag' => 'StandardOutputSensitivity', 'categorie' => 'ExifIFD'), |
'RecommendedExposureIndex' => array('id' => '34866', 'tag' => 'RecommendedExposureIndex', 'categorie' => 'ExifIFD'), |
'ISOSpeed' => array('id' => '34867', 'tag' => 'ISOSpeed', 'categorie' => 'ExifIFD'), |
'ISOSpeedLatitudeyyy' => array('id' => '34868', 'tag' => 'ISOSpeedLatitudeyyy', 'categorie' => 'ExifIFD'), |
'ISOSpeedLatitudezzz' => array('id' => '34869', 'tag' => 'ISOSpeedLatitudezzz', 'categorie' => 'ExifIFD'), |
'FaxRecvParams' => array('id' => '34908', 'tag' => 'FaxRecvParams', 'categorie' => 'Unknown'), |
'FaxSubAddress' => array('id' => '34909', 'tag' => 'FaxSubAddress', 'categorie' => 'Unknown'), |
'FaxRecvTime' => array('id' => '34910', 'tag' => 'FaxRecvTime', 'categorie' => 'Unknown'), |
'LeafSubIFD' => array('id' => '34954', 'tag' => 'LeafSubIFD', 'categorie' => 'Unknown'), |
'ExifVersion' => array('id' => '36864', 'tag' => 'ExifVersion', 'categorie' => 'ExifIFD'), |
'DateTimeOriginal' => array('id' => '36867', 'tag' => 'DateTimeOriginal', 'categorie' => 'ExifIFD'), |
'CreateDate' => array('id' => '36868', 'tag' => 'CreateDate', 'categorie' => 'ExifIFD'), |
'DateTimeDigitized' => array('id' => '36868', 'tag' => 'CreateDate', 'categorie' => 'ExifIFD'), |
'ComponentsConfiguration' => array('id' => '37121', 'tag' => 'ComponentsConfiguration', 'categorie' => 'ExifIFD'), |
'CompressedBitsPerPixel' => array('id' => '37122', 'tag' => 'CompressedBitsPerPixel', 'categorie' => 'ExifIFD'), |
'ShutterSpeedValue' => array('id' => '37377', 'tag' => 'ShutterSpeedValue', 'categorie' => 'ExifIFD'), |
'ApertureValue' => array('id' => '37378', 'tag' => 'ApertureValue', 'categorie' => 'ExifIFD'), |
'BrightnessValue' => array('id' => '37379', 'tag' => 'BrightnessValue', 'categorie' => 'ExifIFD'), |
'ExposureBiasValue' => array('id' => '37380', 'tag' => 'ExposureCompensation', 'categorie' => 'ExifIFD'), |
'MaxApertureValue' => array('id' => '37381', 'tag' => 'MaxApertureValue', 'categorie' => 'ExifIFD'), |
'SubjectDistance' => array('id' => '37382', 'tag' => 'SubjectDistance', 'categorie' => 'ExifIFD'), |
'MeteringMode' => array('id' => '37383', 'tag' => 'MeteringMode', 'categorie' => 'ExifIFD'), |
'LightSource' => array('id' => '37384', 'tag' => 'LightSource', 'categorie' => 'ExifIFD'), |
'Flash' => array('id' => '37385', 'tag' => 'Flash', 'categorie' => 'ExifIFD'), |
'FocalLength' => array('id' => '37386', 'tag' => 'FocalLength', 'categorie' => 'ExifIFD'), |
'FlashEnergy' => array('id' => '37387', 'tag' => 'FlashEnergy', 'categorie' => 'Unknown'), |
'SpatialFrequencyResponse' => array('id' => '37388', 'tag' => 'SpatialFrequencyResponse', 'categorie' => 'Unknown'), |
'Noise' => array('id' => '37389', 'tag' => 'Noise', 'categorie' => 'Unknown'), |
'FocalPlaneXResolution' => array('id' => '37390', 'tag' => 'FocalPlaneXResolution', 'categorie' => 'Unknown'), |
'FocalPlaneYResolution' => array('id' => '37391', 'tag' => 'FocalPlaneYResolution', 'categorie' => 'Unknown'), |
'FocalPlaneResolutionUnit' => array('id' => '37392', 'tag' => 'FocalPlaneResolutionUnit', 'categorie' => 'Unknown'), |
'ImageNumber' => array('id' => '37393', 'tag' => 'ImageNumber', 'categorie' => 'ExifIFD'), |
'SecurityClassification' => array('id' => '37394', 'tag' => 'SecurityClassification', 'categorie' => 'ExifIFD'), |
'ImageHistory' => array('id' => '37395', 'tag' => 'ImageHistory', 'categorie' => 'ExifIFD'), |
'SubjectArea' => array('id' => '37396', 'tag' => 'SubjectArea', 'categorie' => 'ExifIFD'), |
'ExposureIndex' => array('id' => '37397', 'tag' => 'ExposureIndex', 'categorie' => 'Unknown'), |
'TIFF-EPStandardID' => array('id' => '37398', 'tag' => 'TIFF-EPStandardID', 'categorie' => 'Unknown'), |
'SensingMethod' => array('id' => '37399', 'tag' => 'SensingMethod', 'categorie' => 'Unknown'), |
'CIP3DataFile' => array('id' => '37434', 'tag' => 'CIP3DataFile', 'categorie' => 'Unknown'), |
'CIP3Sheet' => array('id' => '37435', 'tag' => 'CIP3Sheet', 'categorie' => 'Unknown'), |
'CIP3Side' => array('id' => '37436', 'tag' => 'CIP3Side', 'categorie' => 'Unknown'), |
'StoNits' => array('id' => '37439', 'tag' => 'StoNits', 'categorie' => 'Unknown'), |
'MakerNote' => array('id' => '37500', 'tag' => 'MakerNote', 'categorie' => 'ExifIFD'), |
'UserComment' => array('id' => '37510', 'tag' => 'UserComment', 'categorie' => 'ExifIFD'), |
'SubSecTime' => array('id' => '37520', 'tag' => 'SubSecTime', 'categorie' => 'ExifIFD'), |
'SubSecTimeOriginal' => array('id' => '37521', 'tag' => 'SubSecTimeOriginal', 'categorie' => 'ExifIFD'), |
'SubSecTimeDigitized' => array('id' => '37522', 'tag' => 'SubSecTimeDigitized', 'categorie' => 'ExifIFD'), |
'MSDocumentText' => array('id' => '37679', 'tag' => 'MSDocumentText', 'categorie' => 'Unknown'), |
'MSPropertySetStorage' => array('id' => '37680', 'tag' => 'MSPropertySetStorage', 'categorie' => 'Unknown'), |
'MSDocumentTextPosition' => array('id' => '37681', 'tag' => 'MSDocumentTextPosition', 'categorie' => 'Unknown'), |
'ImageSourceData' => array('id' => '37724', 'tag' => 'ImageSourceData', 'categorie' => 'IFD0'), |
'XPTitle' => array('id' => '40091', 'tag' => 'XPTitle', 'categorie' => 'IFD0'), |
'XPComment' => array('id' => '40092', 'tag' => 'XPComment', 'categorie' => 'IFD0'), |
'XPAuthor' => array('id' => '40093', 'tag' => 'XPAuthor', 'categorie' => 'IFD0'), |
'XPKeywords' => array('id' => '40094', 'tag' => 'XPKeywords', 'categorie' => 'IFD0'), |
'XPSubject' => array('id' => '40095', 'tag' => 'XPSubject', 'categorie' => 'IFD0'), |
'FlashPixVersion' => array('id' => '40960', 'tag' => 'FlashpixVersion', 'categorie' => 'ExifIFD'), |
'ColorSpace' => array('id' => '40961', 'tag' => 'ColorSpace', 'categorie' => 'ExifIFD'), |
'ExifImageWidth' => array('id' => '40962', 'tag' => 'ExifImageWidth', 'categorie' => 'ExifIFD'), |
'PixelXDimension' => array('id' => '40962', 'tag' => 'ExifImageWidth', 'categorie' => 'ExifIFD'), |
'ExifImageHeight' => array('id' => '40963', 'tag' => 'ExifImageHeight', 'categorie' => 'ExifIFD'), |
'PixelYDimension' => array('id' => '40963', 'tag' => 'ExifImageHeight', 'categorie' => 'ExifIFD'), |
'RelatedSoundFile' => array('id' => '40964', 'tag' => 'RelatedSoundFile', 'categorie' => 'ExifIFD'), |
'InteroperabilityOffset' => array('id' => '40965', 'tag' => 'InteropOffset', 'categorie' => 'Unknown'), |
'SubjectLocation' => array('id' => '41492', 'tag' => 'SubjectLocation', 'categorie' => 'ExifIFD'), |
'FileSource' => array('id' => '41728', 'tag' => 'FileSource', 'categorie' => 'ExifIFD'), |
'SceneType' => array('id' => '41729', 'tag' => 'SceneType', 'categorie' => 'ExifIFD'), |
'CFAPattern' => array('id' => '41730', 'tag' => 'CFAPattern', 'categorie' => 'ExifIFD'), |
'CustomRendered' => array('id' => '41985', 'tag' => 'CustomRendered', 'categorie' => 'ExifIFD'), |
'ExposureMode' => array('id' => '41986', 'tag' => 'ExposureMode', 'categorie' => 'ExifIFD'), |
'WhiteBalance' => array('id' => '41987', 'tag' => 'WhiteBalance', 'categorie' => 'ExifIFD'), |
'DigitalZoomRatio' => array('id' => '41988', 'tag' => 'DigitalZoomRatio', 'categorie' => 'ExifIFD'), |
'FocalLengthIn35mmFormat' => array('id' => '41989', 'tag' => 'FocalLengthIn35mmFormat', 'categorie' => 'ExifIFD'), |
'FocalLengthIn35mmFilm' => array('id' => '41989', 'tag' => 'FocalLengthIn35mmFormat', 'categorie' => 'ExifIFD'), |
'SceneCaptureType' => array('id' => '41990', 'tag' => 'SceneCaptureType', 'categorie' => 'ExifIFD'), |
'GainControl' => array('id' => '41991', 'tag' => 'GainControl', 'categorie' => 'ExifIFD'), |
'Contrast' => array('id' => '41992', 'tag' => 'Contrast', 'categorie' => 'ExifIFD'), |
'Saturation' => array('id' => '41993', 'tag' => 'Saturation', 'categorie' => 'ExifIFD'), |
'Sharpness' => array('id' => '41994', 'tag' => 'Sharpness', 'categorie' => 'ExifIFD'), |
'DeviceSettingDescription' => array('id' => '41995', 'tag' => 'DeviceSettingDescription', 'categorie' => 'Unknown'), |
'SubjectDistanceRange' => array('id' => '41996', 'tag' => 'SubjectDistanceRange', 'categorie' => 'ExifIFD'), |
'ImageUniqueID' => array('id' => '42016', 'tag' => 'ImageUniqueID', 'categorie' => 'ExifIFD'), |
'OwnerName' => array('id' => '42032', 'tag' => 'OwnerName', 'categorie' => 'ExifIFD'), |
'CameraOwnerName' => array('id' => '42032', 'tag' => 'OwnerName', 'categorie' => 'ExifIFD'), |
'SerialNumber' => array('id' => '42033', 'tag' => 'SerialNumber', 'categorie' => 'ExifIFD'), |
'BodySerialNumber' => array('id' => '42033', 'tag' => 'SerialNumber', 'categorie' => 'ExifIFD'), |
'LensInfo' => array('id' => '42034', 'tag' => 'LensInfo', 'categorie' => 'ExifIFD'), |
'LensSpecification' => array('id' => '42034', 'tag' => 'LensInfo', 'categorie' => 'ExifIFD'), |
'LensMake' => array('id' => '42035', 'tag' => 'LensMake', 'categorie' => 'ExifIFD'), |
'LensModel' => array('id' => '42036', 'tag' => 'LensModel', 'categorie' => 'ExifIFD'), |
'LensSerialNumber' => array('id' => '42037', 'tag' => 'LensSerialNumber', 'categorie' => 'ExifIFD'), |
'GDALMetadata' => array('id' => '42112', 'tag' => 'GDALMetadata', 'categorie' => 'Unknown'), |
'GDALNoData' => array('id' => '42113', 'tag' => 'GDALNoData', 'categorie' => 'Unknown'), |
'Gamma' => array('id' => '42240', 'tag' => 'Gamma', 'categorie' => 'ExifIFD'), |
'ExpandSoftware' => array('id' => '44992', 'tag' => 'ExpandSoftware', 'categorie' => 'Unknown'), |
'ExpandLens' => array('id' => '44993', 'tag' => 'ExpandLens', 'categorie' => 'Unknown'), |
'ExpandFilm' => array('id' => '44994', 'tag' => 'ExpandFilm', 'categorie' => 'Unknown'), |
'ExpandFilterLens' => array('id' => '44995', 'tag' => 'ExpandFilterLens', 'categorie' => 'Unknown'), |
'ExpandScanner' => array('id' => '44996', 'tag' => 'ExpandScanner', 'categorie' => 'Unknown'), |
'ExpandFlashLamp' => array('id' => '44997', 'tag' => 'ExpandFlashLamp', 'categorie' => 'Unknown'), |
'PixelFormat' => array('id' => '48129', 'tag' => 'PixelFormat', 'categorie' => 'Unknown'), |
'Transformation' => array('id' => '48130', 'tag' => 'Transformation', 'categorie' => 'Unknown'), |
'Uncompressed' => array('id' => '48131', 'tag' => 'Uncompressed', 'categorie' => 'Unknown'), |
'ImageType' => array('id' => '48132', 'tag' => 'ImageType', 'categorie' => 'Unknown'), |
'ImageHeight' => array('id' => '48257', 'tag' => 'ImageHeight', 'categorie' => 'Unknown'), |
'WidthResolution' => array('id' => '48258', 'tag' => 'WidthResolution', 'categorie' => 'Unknown'), |
'HeightResolution' => array('id' => '48259', 'tag' => 'HeightResolution', 'categorie' => 'Unknown'), |
'ImageOffset' => array('id' => '48320', 'tag' => 'ImageOffset', 'categorie' => 'Unknown'), |
'ImageByteCount' => array('id' => '48321', 'tag' => 'ImageByteCount', 'categorie' => 'Unknown'), |
'AlphaOffset' => array('id' => '48322', 'tag' => 'AlphaOffset', 'categorie' => 'Unknown'), |
'AlphaByteCount' => array('id' => '48323', 'tag' => 'AlphaByteCount', 'categorie' => 'Unknown'), |
'ImageDataDiscard' => array('id' => '48324', 'tag' => 'ImageDataDiscard', 'categorie' => 'Unknown'), |
'AlphaDataDiscard' => array('id' => '48325', 'tag' => 'AlphaDataDiscard', 'categorie' => 'Unknown'), |
'OceScanjobDesc' => array('id' => '50215', 'tag' => 'OceScanjobDesc', 'categorie' => 'Unknown'), |
'OceApplicationSelector' => array('id' => '50216', 'tag' => 'OceApplicationSelector', 'categorie' => 'Unknown'), |
'OceIDNumber' => array('id' => '50217', 'tag' => 'OceIDNumber', 'categorie' => 'Unknown'), |
'OceImageLogic' => array('id' => '50218', 'tag' => 'OceImageLogic', 'categorie' => 'Unknown'), |
'Annotations' => array('id' => '50255', 'tag' => 'Annotations', 'categorie' => 'Unknown'), |
'PrintIM' => array('id' => '50341', 'tag' => 'PrintIM', 'categorie' => 'IFD0'), |
'USPTOOriginalContentType' => array('id' => '50560', 'tag' => 'USPTOOriginalContentType', 'categorie' => 'Unknown'), |
'DNGVersion' => array('id' => '50706', 'tag' => 'DNGVersion', 'categorie' => 'IFD0'), |
'DNGBackwardVersion' => array('id' => '50707', 'tag' => 'DNGBackwardVersion', 'categorie' => 'IFD0'), |
'UniqueCameraModel' => array('id' => '50708', 'tag' => 'UniqueCameraModel', 'categorie' => 'IFD0'), |
'LocalizedCameraModel' => array('id' => '50709', 'tag' => 'LocalizedCameraModel', 'categorie' => 'IFD0'), |
'CFAPlaneColor' => array('id' => '50710', 'tag' => 'CFAPlaneColor', 'categorie' => 'Unknown'), |
'CFALayout' => array('id' => '50711', 'tag' => 'CFALayout', 'categorie' => 'Unknown'), |
'LinearizationTable' => array('id' => '50712', 'tag' => 'LinearizationTable', 'categorie' => 'SubIFD'), |
'BlackLevelRepeatDim' => array('id' => '50713', 'tag' => 'BlackLevelRepeatDim', 'categorie' => 'SubIFD'), |
'BlackLevel' => array('id' => '50714', 'tag' => 'BlackLevel', 'categorie' => 'SubIFD'), |
'BlackLevelDeltaH' => array('id' => '50715', 'tag' => 'BlackLevelDeltaH', 'categorie' => 'Unknown'), |
'BlackLevelDeltaV' => array('id' => '50716', 'tag' => 'BlackLevelDeltaV', 'categorie' => 'Unknown'), |
'WhiteLevel' => array('id' => '50717', 'tag' => 'WhiteLevel', 'categorie' => 'SubIFD'), |
'DefaultScale' => array('id' => '50718', 'tag' => 'DefaultScale', 'categorie' => 'SubIFD'), |
'DefaultCropOrigin' => array('id' => '50719', 'tag' => 'DefaultCropOrigin', 'categorie' => 'SubIFD'), |
'DefaultCropSize' => array('id' => '50720', 'tag' => 'DefaultCropSize', 'categorie' => 'SubIFD'), |
'ColorMatrix1' => array('id' => '50721', 'tag' => 'ColorMatrix1', 'categorie' => 'IFD0'), |
'ColorMatrix2' => array('id' => '50722', 'tag' => 'ColorMatrix2', 'categorie' => 'IFD0'), |
'CameraCalibration1' => array('id' => '50723', 'tag' => 'CameraCalibration1', 'categorie' => 'IFD0'), |
'CameraCalibration2' => array('id' => '50724', 'tag' => 'CameraCalibration2', 'categorie' => 'IFD0'), |
'ReductionMatrix1' => array('id' => '50725', 'tag' => 'ReductionMatrix1', 'categorie' => 'IFD0'), |
'ReductionMatrix2' => array('id' => '50726', 'tag' => 'ReductionMatrix2', 'categorie' => 'IFD0'), |
'AnalogBalance' => array('id' => '50727', 'tag' => 'AnalogBalance', 'categorie' => 'IFD0'), |
'AsShotNeutral' => array('id' => '50728', 'tag' => 'AsShotNeutral', 'categorie' => 'IFD0'), |
'AsShotWhiteXY' => array('id' => '50729', 'tag' => 'AsShotWhiteXY', 'categorie' => 'IFD0'), |
'BaselineExposure' => array('id' => '50730', 'tag' => 'BaselineExposure', 'categorie' => 'IFD0'), |
'BaselineNoise' => array('id' => '50731', 'tag' => 'BaselineNoise', 'categorie' => 'IFD0'), |
'BaselineSharpness' => array('id' => '50732', 'tag' => 'BaselineSharpness', 'categorie' => 'IFD0'), |
'BayerGreenSplit' => array('id' => '50733', 'tag' => 'BayerGreenSplit', 'categorie' => 'SubIFD'), |
'LinearResponseLimit' => array('id' => '50734', 'tag' => 'LinearResponseLimit', 'categorie' => 'IFD0'), |
'CameraSerialNumber' => array('id' => '50735', 'tag' => 'CameraSerialNumber', 'categorie' => 'IFD0'), |
'DNGLensInfo' => array('id' => '50736', 'tag' => 'DNGLensInfo', 'categorie' => 'IFD0'), |
'ChromaBlurRadius' => array('id' => '50737', 'tag' => 'ChromaBlurRadius', 'categorie' => 'SubIFD'), |
'AntiAliasStrength' => array('id' => '50738', 'tag' => 'AntiAliasStrength', 'categorie' => 'SubIFD'), |
'ShadowScale' => array('id' => '50739', 'tag' => 'ShadowScale', 'categorie' => 'IFD0'), |
'SR2Private' => array('id' => '50740', 'tag' => 'SR2Private', 'categorie' => 'Unknown'), |
'MakerNoteSafety' => array('id' => '50741', 'tag' => 'MakerNoteSafety', 'categorie' => 'IFD0'), |
'RawImageSegmentation' => array('id' => '50752', 'tag' => 'RawImageSegmentation', 'categorie' => 'Unknown'), |
'CalibrationIlluminant1' => array('id' => '50778', 'tag' => 'CalibrationIlluminant1', 'categorie' => 'IFD0'), |
'CalibrationIlluminant2' => array('id' => '50779', 'tag' => 'CalibrationIlluminant2', 'categorie' => 'IFD0'), |
'BestQualityScale' => array('id' => '50780', 'tag' => 'BestQualityScale', 'categorie' => 'SubIFD'), |
'RawDataUniqueID' => array('id' => '50781', 'tag' => 'RawDataUniqueID', 'categorie' => 'IFD0'), |
'AliasLayerMetadata' => array('id' => '50784', 'tag' => 'AliasLayerMetadata', 'categorie' => 'Unknown'), |
'OriginalRawFileName' => array('id' => '50827', 'tag' => 'OriginalRawFileName', 'categorie' => 'IFD0'), |
'OriginalRawFileData' => array('id' => '50828', 'tag' => 'OriginalRawFileData', 'categorie' => 'IFD0'), |
'ActiveArea' => array('id' => '50829', 'tag' => 'ActiveArea', 'categorie' => 'SubIFD'), |
'MaskedAreas' => array('id' => '50830', 'tag' => 'MaskedAreas', 'categorie' => 'SubIFD'), |
'AsShotICCProfile' => array('id' => '50831', 'tag' => 'AsShotICCProfile', 'categorie' => 'IFD0'), |
'AsShotPreProfileMatrix' => array('id' => '50832', 'tag' => 'AsShotPreProfileMatrix', 'categorie' => 'IFD0'), |
'CurrentICCProfile' => array('id' => '50833', 'tag' => 'CurrentICCProfile', 'categorie' => 'IFD0'), |
'CurrentPreProfileMatrix' => array('id' => '50834', 'tag' => 'CurrentPreProfileMatrix', 'categorie' => 'IFD0'), |
'ColorimetricReference' => array('id' => '50879', 'tag' => 'ColorimetricReference', 'categorie' => 'IFD0'), |
'PanasonicTitle' => array('id' => '50898', 'tag' => 'PanasonicTitle', 'categorie' => 'IFD0'), |
'PanasonicTitle2' => array('id' => '50899', 'tag' => 'PanasonicTitle2', 'categorie' => 'IFD0'), |
'CameraCalibrationSig' => array('id' => '50931', 'tag' => 'CameraCalibrationSig', 'categorie' => 'IFD0'), |
'ProfileCalibrationSig' => array('id' => '50932', 'tag' => 'ProfileCalibrationSig', 'categorie' => 'IFD0'), |
'ProfileIFD' => array('id' => '50933', 'tag' => 'ProfileIFD', 'categorie' => 'Unknown'), |
'AsShotProfileName' => array('id' => '50934', 'tag' => 'AsShotProfileName', 'categorie' => 'IFD0'), |
'NoiseReductionApplied' => array('id' => '50935', 'tag' => 'NoiseReductionApplied', 'categorie' => 'SubIFD'), |
'ProfileName' => array('id' => '50936', 'tag' => 'ProfileName', 'categorie' => 'IFD0'), |
'ProfileHueSatMapDims' => array('id' => '50937', 'tag' => 'ProfileHueSatMapDims', 'categorie' => 'IFD0'), |
'ProfileHueSatMapData1' => array('id' => '50938', 'tag' => 'ProfileHueSatMapData1', 'categorie' => 'IFD0'), |
'ProfileHueSatMapData2' => array('id' => '50939', 'tag' => 'ProfileHueSatMapData2', 'categorie' => 'IFD0'), |
'ProfileToneCurve' => array('id' => '50940', 'tag' => 'ProfileToneCurve', 'categorie' => 'IFD0'), |
'ProfileEmbedPolicy' => array('id' => '50941', 'tag' => 'ProfileEmbedPolicy', 'categorie' => 'IFD0'), |
'ProfileCopyright' => array('id' => '50942', 'tag' => 'ProfileCopyright', 'categorie' => 'IFD0'), |
'ForwardMatrix1' => array('id' => '50964', 'tag' => 'ForwardMatrix1', 'categorie' => 'IFD0'), |
'ForwardMatrix2' => array('id' => '50965', 'tag' => 'ForwardMatrix2', 'categorie' => 'IFD0'), |
'PreviewApplicationName' => array('id' => '50966', 'tag' => 'PreviewApplicationName', 'categorie' => 'IFD0'), |
'PreviewApplicationVersion' => array('id' => '50967', 'tag' => 'PreviewApplicationVersion', 'categorie' => 'IFD0'), |
'PreviewSettingsName' => array('id' => '50968', 'tag' => 'PreviewSettingsName', 'categorie' => 'IFD0'), |
'PreviewSettingsDigest' => array('id' => '50969', 'tag' => 'PreviewSettingsDigest', 'categorie' => 'IFD0'), |
'PreviewColorSpace' => array('id' => '50970', 'tag' => 'PreviewColorSpace', 'categorie' => 'IFD0'), |
'PreviewDateTime' => array('id' => '50971', 'tag' => 'PreviewDateTime', 'categorie' => 'IFD0'), |
'RawImageDigest' => array('id' => '50972', 'tag' => 'RawImageDigest', 'categorie' => 'IFD0'), |
'OriginalRawFileDigest' => array('id' => '50973', 'tag' => 'OriginalRawFileDigest', 'categorie' => 'IFD0'), |
'SubTileBlockSize' => array('id' => '50974', 'tag' => 'SubTileBlockSize', 'categorie' => 'Unknown'), |
'RowInterleaveFactor' => array('id' => '50975', 'tag' => 'RowInterleaveFactor', 'categorie' => 'Unknown'), |
'ProfileLookTableDims' => array('id' => '50981', 'tag' => 'ProfileLookTableDims', 'categorie' => 'IFD0'), |
'ProfileLookTableData' => array('id' => '50982', 'tag' => 'ProfileLookTableData', 'categorie' => 'IFD0'), |
'OpcodeList1' => array('id' => '51008', 'tag' => 'OpcodeList1', 'categorie' => 'Unknown'), |
'OpcodeList2' => array('id' => '51009', 'tag' => 'OpcodeList2', 'categorie' => 'Unknown'), |
'OpcodeList3' => array('id' => '51022', 'tag' => 'OpcodeList3', 'categorie' => 'Unknown'), |
'NoiseProfile' => array('id' => '51041', 'tag' => 'NoiseProfile', 'categorie' => 'Unknown'), |
'Padding' => array('id' => '59932', 'tag' => 'Padding', 'categorie' => 'ExifIFD'), |
'OffsetSchema' => array('id' => '59933', 'tag' => 'OffsetSchema', 'categorie' => 'ExifIFD'), |
'Lens' => array('id' => '65002', 'tag' => 'Lens', 'categorie' => 'ExifIFD'), |
'KDC_IFD' => array('id' => '65024', 'tag' => 'KDC_IFD', 'categorie' => 'Unknown'), |
'RawFile' => array('id' => '65100', 'tag' => 'RawFile', 'categorie' => 'ExifIFD'), |
'Converter' => array('id' => '65101', 'tag' => 'Converter', 'categorie' => 'ExifIFD'), |
'Exposure' => array('id' => '65105', 'tag' => 'Exposure', 'categorie' => 'ExifIFD'), |
'Shadows' => array('id' => '65106', 'tag' => 'Shadows', 'categorie' => 'ExifIFD'), |
'Brightness' => array('id' => '65107', 'tag' => 'Brightness', 'categorie' => 'ExifIFD'), |
'Sharpness:65110' => array('id' => '65110', 'tag' => 'Sharpness', 'categorie' => 'ExifIFD'), |
'Smoothness' => array('id' => '65111', 'tag' => 'Smoothness', 'categorie' => 'ExifIFD'), |
'MoireFilter' => array('id' => '65112', 'tag' => 'MoireFilter', 'categorie' => 'ExifIFD'), |
'FileName' => array('id' => 'php:1', 'tag' => 'FileName', 'categorie' => 'PhpFile'), |
'FileDateTime' => array('id' => 'php:2', 'tag' => 'FileDateTime', 'categorie' => 'PhpFile'), |
'FileSize' => array('id' => 'php:3', 'tag' => 'FileSize', 'categorie' => 'PhpFile'), |
'FileType' => array('id' => 'php:4', 'tag' => 'FileType', 'categorie' => 'PhpFile'), |
'MimeType' => array('id' => 'php:5', 'tag' => 'MimeType', 'categorie' => 'PhpFile'), |
'SectionsFound' => array('id' => 'php:6', 'tag' => 'SectionsFound', 'categorie' => 'PhpFile'), |
'JPEGInterchangeFormat' => array('id' => 'php:7', 'tag' => 'JPEGInterchangeFormat', 'categorie' => 'PhpThumbail'), |
'JPEGInterchangeFormatLength' => array('id' => 'php:8', 'tag' => 'JPEGInterchangeFormatLength', 'categorie' => 'PhpThumbail'), |
'Thumbnail.FileType' => array('id' => 'php:9', 'tag' => 'ThumbnailFileType', 'categorie' => 'PhpThumbail'), |
'Thumbnail.MimeType' => array('id' => 'php:10', 'tag' => 'ThumbnailMimeType', 'categorie' => 'PhpThumbail'), |
'Html' => array('id' => 'php:11', 'tag' => 'Html', 'categorie' => 'PhpComputed'), |
'IsColor' => array('id' => 'php:12', 'tag' => 'IsColor', 'categorie' => 'PhpComputed'), |
'ByteOrderMotorola' => array('id' => 'php:13', 'tag' => 'ByteOrderMotorola', 'categorie' => 'PhpComputed'), |
'ApertureFNumber' => array('id' => 'php:14', 'tag' => 'ApertureFNumber', 'categorie' => 'PhpComputed'), |
'UserCommentEncoding' => array('id' => 'php:15', 'tag' => 'UserCommentEncoding', 'categorie' => 'PhpComputed'), |
'ExifImageLength' => array('id' => 'php:16', 'tag' => 'ExifImageLength', 'categorie' => 'PhpComputed'), |
'InterOperabilityIndex' => array('id' => 'php:17', 'tag' => 'InterOperabilityIndex', 'categorie' => 'PhpComputed'), |
'InterOperabilityVersion' => array('id' => 'php:18', 'tag' => 'InterOperabilityVersion', 'categorie' => 'PhpComputed'), |
'SpecialMode' => array('id' => 'php:19', 'tag' => 'SpecialMode', 'categorie' => 'PhpComputed'), |
'JPEGQuality' => array('id' => 'php:20', 'tag' => 'JPEGQuality', 'categorie' => 'PhpComputed'), |
'Macro' => array('id' => 'php:21', 'tag' => 'Macro ', 'categorie' => 'PhpComputed'), |
'DigitalZoom' => array('id' => 'php:22', 'tag' => 'DigitalZoom', 'categorie' => 'PhpComputed'), |
'SoftwareRelease' => array('id' => 'php:23', 'tag' => 'SoftwareRelease', 'categorie' => 'PhpComputed'), |
'PictureInfo' => array('id' => 'php:24', 'tag' => 'PictureInfo', 'categorie' => 'PhpComputed'), |
'CameraId' => array('id' => 'php:25', 'tag' => 'CameraId', 'categorie' => 'PhpComputed'), |
'Gps' => array('id' => 'php:26', 'tag' => 'Gps', 'categorie' => 'PhpComputed'), |
'ACDComment' => array('id' => 'php:27', 'tag' => 'ACDComment', 'categorie' => 'PhpComputed'), |
'NewSubFile' => array('id' => 'php:28', 'tag' => 'NewSubFile', 'categorie' => 'PhpComputed'), |
'Comments' => array('id' => 'php:29', 'tag' => 'Comments', 'categorie' => 'PhpComputed'), |
'TIFF/EPStandardID' => array('id' => 'php:30', 'tag' => 'TIFFEPStandardID', 'categorie' => 'PhpComputed'), |
'ModeArray' => array('id' => 'php:31', 'tag' => 'ModeArray', 'categorie' => 'PhpComputed'), |
'ImageInfo' => array('id' => 'php:32', 'tag' => 'ImageInfo', 'categorie' => 'PhpComputed'), |
'FirmwareVersion' => array('id' => 'php:33', 'tag' => 'FirmwareVersion', 'categorie' => 'PhpComputed'), |
'Camera' => array('id' => 'php:34', 'tag' => 'Camera', 'categorie' => 'PhpComputed'), |
'CustomFunctions' => array('id' => 'php:35', 'tag' => 'CustomFunctions', 'categorie' => 'PhpComputed'), |
'CCDWidth' => array('id' => 'php:36', 'tag' => 'CCDWidth', 'categorie' => 'PhpComputed'), |
'FocusDistance' => array('id' => 'php:37', 'tag' => 'FocusDistance', 'categorie' => 'PhpComputed'), |
'Keywords' => array('id' => 'php:38', 'tag' => 'Keywords', 'categorie' => 'PhpComputed'), |
'GPSVersion' => array('id' => 'php:39', 'tag' => 'GPSVersion', 'categorie' => 'PhpComputed') |
); |
private $ids_tags_iptc = array( |
'1#000' => array('id' => '0', 'tag' => 'ApplicationRecordVersion', 'categorie' => 'EnvelopeRecord'), |
'1#090' => array('id' => '90', 'tag' => 'CodedCharacterSet', 'categorie' => 'EnvelopeRecord'), |
'2#003' => array('id' => '3', 'tag' => 'ObjectTypeReference', 'categorie' => 'ApplicationRecord'), |
'2#004' => array('id' => '4', 'tag' => 'ObjectAttributeReference', 'categorie' => 'ApplicationRecord'), |
'2#005' => array('id' => '5', 'tag' => 'ObjectName', 'categorie' => 'ApplicationRecord'), |
'2#007' => array('id' => '7', 'tag' => 'EditStatus', 'categorie' => 'ApplicationRecord'), |
'2#008' => array('id' => '8', 'tag' => 'EditorialUpdate', 'categorie' => 'ApplicationRecord'), |
'2#010' => array('id' => '10', 'tag' => 'Urgency', 'categorie' => 'ApplicationRecord'), |
'2#012' => array('id' => '12', 'tag' => 'SubjectReference', 'categorie' => 'ApplicationRecord'), |
'Category' => array('id' => '15', 'tag' => 'Category', 'categorie' => 'ApplicationRecord'), |
'2#015' => array('id' => '15', 'tag' => 'Category', 'categorie' => 'ApplicationRecord'), |
'2#020' => array('id' => '20', 'tag' => 'SupplementalCategories', 'categorie' => 'ApplicationRecord'), |
'2#022' => array('id' => '22', 'tag' => 'FixtureIdentifier', 'categorie' => 'ApplicationRecord'), |
'MotsCles' => array('id' => '25', 'tag' => 'Keywords', 'categorie' => 'ApplicationRecord'), |
'2#026' => array('id' => '26', 'tag' => 'ContentLocationCode', 'categorie' => 'ApplicationRecord'), |
'2#027' => array('id' => '27', 'tag' => 'ContentLocationName', 'categorie' => 'ApplicationRecord'), |
'2#030' => array('id' => '30', 'tag' => 'ReleaseDate', 'categorie' => 'ApplicationRecord'), |
'2#035' => array('id' => '35', 'tag' => 'ReleaseTime', 'categorie' => 'ApplicationRecord'), |
'2#037' => array('id' => '37', 'tag' => 'ExpirationDate', 'categorie' => 'ApplicationRecord'), |
'2#038' => array('id' => '38', 'tag' => 'ExpirationTime', 'categorie' => 'ApplicationRecord'), |
'2#040' => array('id' => '40', 'tag' => 'SpecialInstructions', 'categorie' => 'ApplicationRecord'), |
'2#042' => array('id' => '42', 'tag' => 'ActionAdvised', 'categorie' => 'ApplicationRecord'), |
'2#045' => array('id' => '45', 'tag' => 'ReferenceService', 'categorie' => 'ApplicationRecord'), |
'2#047' => array('id' => '47', 'tag' => 'ReferenceDate', 'categorie' => 'ApplicationRecord'), |
'2#050' => array('id' => '50', 'tag' => 'ReferenceNumber', 'categorie' => 'ApplicationRecord'), |
'2#055' => array('id' => '55', 'tag' => 'DateCreated', 'categorie' => 'ApplicationRecord'), |
'2#060' => array('id' => '60', 'tag' => 'TimeCreated', 'categorie' => 'ApplicationRecord'), |
'2#062' => array('id' => '62', 'tag' => 'DigitalCreationDate', 'categorie' => 'ApplicationRecord'), |
'2#063' => array('id' => '63', 'tag' => 'DigitalCreationTime', 'categorie' => 'ApplicationRecord'), |
'2#065' => array('id' => '65', 'tag' => 'OriginatingProgram', 'categorie' => 'ApplicationRecord'), |
'2#070' => array('id' => '70', 'tag' => 'ProgramVersion', 'categorie' => 'ApplicationRecord'), |
'2#075' => array('id' => '75', 'tag' => 'ObjectCycle', 'categorie' => 'ApplicationRecord'), |
'ByLine' => array('id' => '80', 'tag' => 'By-line', 'categorie' => 'ApplicationRecord'), |
'ByLineTitle' => array('id' => '85', 'tag' => 'By-lineTitle', 'categorie' => 'ApplicationRecord'), |
'City' => array('id' => '90', 'tag' => 'City', 'categorie' => 'ApplicationRecord'), |
'SubLocation' => array('id' => '92', 'tag' => 'Sub-location', 'categorie' => 'ApplicationRecord'), |
'ProvinceState' => array('id' => '95', 'tag' => 'Province-State', 'categorie' => 'ApplicationRecord'), |
'CountryPrimaryLocationCode' => array('id' => '100', 'tag' => 'Country-PrimaryLocationCode', 'categorie' => 'ApplicationRecord'), |
'CountryName' => array('id' => '101', 'tag' => 'Country-PrimaryLocationName', 'categorie' => 'ApplicationRecord'), |
'2#103' => array('id' => '103', 'tag' => 'OriginalTransmissionReference', 'categorie' => 'ApplicationRecord'), |
'Headline' => array('id' => '105', 'tag' => 'Headline', 'categorie' => 'ApplicationRecord'), |
'Credit' => array('id' => '110', 'tag' => 'Credit', 'categorie' => 'ApplicationRecord'), |
'2#115' => array('id' => '115', 'tag' => 'Source', 'categorie' => 'ApplicationRecord'), |
'CopyrightNotice' => array('id' => '116', 'tag' => 'CopyrightNotice', 'categorie' => 'ApplicationRecord'), |
'Contact' => array('id' => '118', 'tag' => 'Contact', 'categorie' => 'ApplicationRecord'), |
'2#120' => array('id' => '120', 'tag' => 'Caption-Abstract', 'categorie' => 'ApplicationRecord'), |
'2#121' => array('id' => '121', 'tag' => 'LocalCaption', 'categorie' => 'ApplicationRecord'), |
'2#122' => array('id' => '122', 'tag' => 'Writer-Editor', 'categorie' => 'ApplicationRecord'), |
'2#125' => array('id' => '125', 'tag' => 'RasterizedCaption', 'categorie' => 'ApplicationRecord'), |
'2#130' => array('id' => '130', 'tag' => 'ImageType', 'categorie' => 'ApplicationRecord'), |
'2#131' => array('id' => '131', 'tag' => 'ImageOrientation', 'categorie' => 'ApplicationRecord'), |
'2#135' => array('id' => '135', 'tag' => 'LanguageIdentifier', 'categorie' => 'ApplicationRecord'), |
'2#150' => array('id' => '150', 'tag' => 'AudioType', 'categorie' => 'ApplicationRecord'), |
'2#151' => array('id' => '151', 'tag' => 'AudioSamplingRate', 'categorie' => 'ApplicationRecord'), |
'2#152' => array('id' => '152', 'tag' => 'AudioSamplingResolution', 'categorie' => 'ApplicationRecord'), |
'2#153' => array('id' => '153', 'tag' => 'AudioDuration', 'categorie' => 'ApplicationRecord'), |
'2#154' => array('id' => '154', 'tag' => 'AudioOutcue', 'categorie' => 'ApplicationRecord'), |
'2#184' => array('id' => '184', 'tag' => 'JobID', 'categorie' => 'ApplicationRecord'), |
'2#185' => array('id' => '185', 'tag' => 'MasterDocumentID', 'categorie' => 'ApplicationRecord'), |
'2#186' => array('id' => '186', 'tag' => 'ShortDocumentID', 'categorie' => 'ApplicationRecord'), |
'2#187' => array('id' => '187', 'tag' => 'UniqueDocumentID', 'categorie' => 'ApplicationRecord'), |
'2#188' => array('id' => '188', 'tag' => 'OwnerID', 'categorie' => 'ApplicationRecord'), |
'2#200' => array('id' => '200', 'tag' => 'ObjectPreviewFileFormat', 'categorie' => 'ApplicationRecord'), |
'2#201' => array('id' => '201', 'tag' => 'ObjectPreviewFileVersion', 'categorie' => 'ApplicationRecord'), |
'2#202' => array('id' => '202', 'tag' => 'ObjectPreviewData', 'categorie' => 'ApplicationRecord'), |
'2#221' => array('id' => '221', 'tag' => 'Prefs', 'categorie' => 'ApplicationRecord'), |
'2#225' => array('id' => '225', 'tag' => 'ClassifyState', 'categorie' => 'ApplicationRecord'), |
'2#228' => array('id' => '228', 'tag' => 'SimilarityIndex', 'categorie' => 'ApplicationRecord'), |
'2#230' => array('id' => '230', 'tag' => 'DocumentNotes', 'categorie' => 'ApplicationRecord'), |
'2#231' => array('id' => '231', 'tag' => 'DocumentHistory', 'categorie' => 'ApplicationRecord'), |
'2#232' => array('id' => '232', 'tag' => 'ExifCameraInfo', 'categorie' => 'ApplicationRecord'), |
'2#242' => array('id' => '242', 'tag' => 'Unknown242', 'categorie' => 'Unknown'), |
'2#254' => array('id' => '254', 'tag' => 'Unknown254', 'categorie' => 'Unknown'), |
'2#255' => array('id' => '255', 'tag' => 'CatalogSets', 'categorie' => 'ApplicationRecord') |
); |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params) { |
if (!isset($this->config['database_cel']['database_migration']) || $this->config['database_cel']['database_migration'] == '') { |
echo 'Attention la variable de configuration database_migration dans la section database_cel, contenant la base de données d\'arrivée, doit être remplie '."\n"; |
exit; |
} |
if (!isset($this->config['database_ident']['database']) || $this->config['database_ident']['database'] == '') { |
echo 'Attention la variable de configuration database dans la section database_ident, contenant la base de données utilisateurs, doit être remplie '."\n"; |
exit; |
} |
self::$bdd_cel_migration = $this->config['database_cel']['database_migration']; |
self::$bdd_utilisateurs = $this->config['database_ident']['database']; |
$this->cle_id_metadonnees = array_merge($this->ids_tags_exif, $this->ids_tags_iptc); |
echo "--MIGRATION DES IMAGES --------------------------------------\n"; |
//1. TEMPORAIRE : vider les tables de destinations |
if (self::truncate) { |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 0. Vider les tables ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$nouvellesTables = array('cel_images', 'cel_obs_images'); |
foreach ($nouvellesTables as $nomTable) { |
echo 'Vider la table '.$nomTable.'...'; |
$requeteTruncate = 'TRUNCATE TABLE '.self::$bdd_cel_migration.'.'.$nomTable; |
$resultatTruncate = $this->executerRequete($requeteTruncate); |
echo "ok \n"; |
} |
echo "\n---------------------------------------------------------------- OK\n\n"; |
} |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 1. Paramétrage ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->getUtilisateurs(); |
$this->getObservations(); |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 2. Migration des images ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->migrerImages(); |
$this->ordonnerImages(); |
echo "\n"."\n"."\n"; |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 3. migration des liaisons obs images ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->migrerLiaisonsObsImages(); |
echo "\n"."\n"."\n"; |
} |
private function getUtilisateurs() { |
echo "\n-------------------------------------------------------------------\n"; |
echo "--SELECTION DES UTILISATEURS---------------------------------------\n\n"; |
$requete = 'SELECT U_ID as id, U_MAIL as mail, U_NAME as nom, U_SURNAME as prenom, U_PASSWD as pass '. |
'FROM '.self::$bdd_utilisateurs.'.annuaire_tela'; |
$tableau_utilisateurs = $this->executerRequete($requete); |
foreach ($tableau_utilisateurs as &$utilisateur) { |
$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur; |
} |
echo sizeof($this->tableau_utilisateurs)." utilisateurs sélectionnés"; |
echo "\n-----------------------------------------------------------------OK\n"; |
} |
private function getObservations() { |
$pas = 5000; |
$nObs = 'SELECT COUNT(*) AS nb FROM cel_inventory'; |
$resultatNbObs = $this->executerRequete($nObs); |
$nbObs = $resultatNbObs[0]['nb']; |
$maxLimite = $nbObs + $pas; |
for ($i = 0; $i < $maxLimite; $i += $pas ) { |
$requete_selection_observations = 'SELECT id, ordre, identifiant FROM cel_inventory LIMIT '.$i.", $pas"; |
$tableau_observations = $this->executerRequete($requete_selection_observations); |
foreach ($tableau_observations as &$obs) { |
$this->tableau_observations[$obs['identifiant']][$obs['ordre']] = $obs['id']; |
} |
$this->afficherAvancement('Selection des observations (par '.$pas.' )'); |
} |
echo "\n\n"; |
} |
private function migrerImages() { |
$debut = 0; |
$pas = 100; |
//Selectionner le nombre d'images |
$requeteNbImg = "SELECT COUNT(*) as nb FROM cel_images"; |
$resultatNbImg = $this->executerRequete($requeteNbImg); |
$fin = $resultatNbImg[0]['nb']; |
$maxLimite = $fin + $pas; |
for ($i = $debut; $i <= $maxLimite ; $i += $pas) { |
$requete = 'SELECT * '. |
'FROM cel_images '. |
'ORDER BY ci_id_image ASC LIMIT '.$i.','.$pas; |
$images = @$this->requeter($requete); |
$requete = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_images ('; |
foreach ($this->tableau_nouveau_ancien as $nouveau_champ => $ancien_champ) { |
$requete .= $nouveau_champ.','; |
} |
$requete = rtrim($requete, ',').') VALUES '; |
if (is_array($images)) { |
$nb_images_a_traiter = count($images); |
foreach ($images as $image) { |
$nouvelle_image = $this->traiterLigneImage($image); |
$nouvelle_image = array_map(array($this, 'protegerSiNonNull'), $nouvelle_image); |
$requete .= '('.join(',', array_values($nouvelle_image)).'),'; |
} |
$requete = rtrim($requete, ','); |
$migration_images = $this->executerRequeteSimple($requete); |
if (!$migration_images) { |
echo 'la migration des images '.$i.' à '.($i + $nb_images_a_traiter).' a échoué '."\n"; |
file_put_contents('/home/jpm/requete.sql', $requete); |
} else { |
$this->afficherAvancement('Migration des images (par '.$pas.' )'); |
} |
} |
if (count($images) < $pas) { |
echo "\n---------------------------------------------------------------- OK\n\n"; |
return; |
} |
} |
} |
/** |
* Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué. |
* Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle. |
* |
* @param string le message d'information. |
* @param int le nombre de départ à afficher. |
* @return void le message est affiché dans la console. |
*/ |
protected function afficherAvancement($message, $depart = 0) { |
if (! isset(self::$avancement[$message])) { |
self::$avancement[$message] = $depart; |
echo "$message : "; |
$actuel =& self::$avancement[$message]; |
echo $actuel++; |
} else { |
$actuel =& self::$avancement[$message]; |
// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères) |
$passage = 0; |
if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) { |
$passage = 1; |
} |
echo str_repeat(chr(8), (strlen((string) $actuel) - $passage)); |
echo $actuel++; |
} |
} |
private function ordonnerImages() { |
$requete = 'ALTER TABLE '.self::$bdd_cel_migration.'.cel_images ORDER BY id_image'; |
$this->executerRequeteSimple($requete); |
} |
public function executerRequeteSimple($requete) { |
// Fonction de commodité pour afficher les requetes au lieu de les executer |
if (self::dry_run) { |
echo str_replace('),','),'."\n", $requete)."\n"; |
return true; |
} else { |
return parent::executerRequeteSimple($requete); |
} |
} |
private function traiterLigneImage($image) { |
$nouvelle_image = array(); |
foreach ($this->tableau_nouveau_ancien as $nouveau_champ_image => $ancien_champ_image) { |
if ($this->estUnChampATraiter($ancien_champ_image)) { |
if (method_exists($this,$ancien_champ_image)) { |
$nouvelle_image[$nouveau_champ_image] = $this->$ancien_champ_image($image); |
} else { |
echo 'methode manquante : '.$ancien_champ_image."\n"; |
$nouvelle_image[$nouveau_champ_image] = ''; |
} |
} else { |
$nouvelle_image[$nouveau_champ_image] = $image[$ancien_champ_image]; |
} |
} |
return $nouvelle_image; |
} |
private function estUnChampATraiter($champ) { |
return strpos($champ, 'traiter') !== false; |
} |
private function protegerSiNonNull($valeur) { |
if ($valeur != 'NULL') { |
$valeur = $this->proteger($valeur); |
} |
return $valeur; |
} |
private function traiterIdentifiantUtilisateur($ligne_image) { |
$mail_image = $ligne_image['ci_ce_utilisateur']; |
$retour = $this->renvoyerIdPourMigration($mail_image); |
return $retour; |
} |
private function renvoyerIdPourMigration($utilisateur) { |
// si tout les test suivant échouent, on garde l'utilisateur tel quel (cas de la chaine de session des utilisateur anonymes) |
$retour = $utilisateur; |
// si le mail correspond a un utilisateur de la bdd |
if (isset($this->tableau_utilisateurs[$utilisateur])) { |
// on renvoie son id |
$retour = $this->tableau_utilisateurs[$utilisateur]['id']; |
} else { |
// sinon si c'est un mail inconnu, on garde le md5 |
if($this->mailValide($utilisateur)) { |
$retour = md5($utilisateur); |
} |
} |
return $retour; |
} |
public function mailValide($mail) { |
// vérification bidon mais ça suffit pour ici |
return !(strpos('@',$mail) === false); |
} |
private function traiterPrenomUtilisateur($ligne_image) { |
$mail_image = $ligne_image['ci_ce_utilisateur']; |
$retour = $mail_image; |
if (isset($this->tableau_utilisateurs[$mail_image])) { |
$retour = self::formaterMotPremiereLettreChaqueMotEnMajuscule($this->tableau_utilisateurs[$mail_image]['prenom']); |
} else { |
$retour = ''; |
} |
return $retour; |
} |
public static function formaterMotPremiereLettreChaqueMotEnMajuscule($chaine, $encodage= 'UTF-8') { |
$chaine = str_replace('-', ' - ', $chaine); |
$chaine = mb_strtolower($chaine, $encodage); |
$chaine = mb_convert_case($chaine, MB_CASE_TITLE, $encodage); |
$chaine = str_replace(' - ', '-', $chaine); |
return $chaine; |
} |
private function traiterNomUtilisateur($ligne_image) { |
$mail_image = $ligne_image['ci_ce_utilisateur']; |
$retour = $mail_image; |
if (isset($this->tableau_utilisateurs[$mail_image])) { |
$retour = self::formaterMotEnMajuscule($this->tableau_utilisateurs[$mail_image]['nom']); |
} else { |
$retour = ''; |
} |
return $retour; |
} |
public static function formaterMotEnMajuscule($chaine, $encodage= 'UTF-8') { |
return mb_convert_case($chaine, MB_CASE_UPPER, $encodage); |
} |
private function traiterNoteImage($image) { |
$retour = $image['ci_note_image']; |
if ($image['ci_note_image'] == '-1') { |
$retour = 'NULL'; |
} |
return $retour; |
} |
private function traiterExif($ligne_image) { |
$metadonnees_autres = $this->decoderTableauMetaDonnees($ligne_image['ci_meta_exif_autres']); |
$metadonnees = array_intersect_key($ligne_image, array_flip($this->champs_exifs_non_gardes))+$metadonnees_autres; |
$retour = 'NULL'; |
if ($xml = $this->convertirTableauMetadonneesEnXml($metadonnees)) { |
$retour = '<?xml version="1.0" encoding="UTF-8" ?>'."\n". |
'<exif>'."\n".$xml.'</exif>'; |
} |
return $retour; |
} |
private function traiterIptc($ligne_image) { |
$metadonnees_autres = $this->decoderTableauMetaDonnees($ligne_image['ci_meta_iptc_autres']); |
$metadonnees = array_intersect_key($ligne_image, array_flip($this->champs_iptc_non_gardes)) + $metadonnees_autres; |
$retour = 'NULL'; |
if ($xml = $this->convertirTableauMetadonneesEnXml($metadonnees)) { |
$retour = '<?xml version="1.0" encoding="UTF-8" ?>'."\n". |
'<iptc>'."\n".$xml.'</iptc>'; |
} |
return $retour; |
} |
private function traiterXmp($ligne_image) { |
$retour = 'NULL'; |
return $retour; |
} |
private function traiterMakernote($ligne_image) { |
$retour = 'NULL'; |
return $retour; |
} |
private function decoderTableauMetaDonnees($chaine) { |
$tableau_valeurs_decodees = array(); |
if (trim($chaine) != '') { |
$tableau_meta = explode(self::separateur_champs_metadonnees, $chaine); |
foreach ($tableau_meta as &$chaine_meta) { |
if (strpos($chaine_meta, 'UndefinedTag:') !== false) { |
$chaine_meta = str_replace('UndefinedTag:', 'UndefinedTag', $chaine_meta); |
} |
$cle_valeur = explode(self::separateur_valeurs_metadonnees, $chaine_meta, 2); |
if (is_array($cle_valeur) && count($cle_valeur) == 2) { |
$cle = ltrim($cle_valeur[0], ' '); |
$tableau_valeurs_decodees[$cle] = $cle_valeur[1]; |
} |
} |
} |
return $tableau_valeurs_decodees; |
} |
private function convertirTableauMetadonneesEnXml($tableau) { |
$xml = ''; |
foreach ($tableau as $cle => $valeur) { |
$cle = str_replace('ci_meta_exif_', '', $cle); |
$cle = str_replace('ci_meta_iptc_', '', $cle); |
$cle = str_replace('ci_meta_', '', $cle); |
$cle = str_replace('_', ' ', $cle); |
$cle = ucwords($cle); |
$cle = str_replace(' ', '', $cle); |
$valeur = str_replace("\0", '', $valeur); |
if (isset($this->cle_id_metadonnees[$cle])) { |
$id = $this->cle_id_metadonnees[$cle]['id']; |
$tag = $this->cle_id_metadonnees[$cle]['tag']; |
$categorie = $this->cle_id_metadonnees[$cle]['categorie']; |
$xml .= '<'.$tag.' id="'.$id.'" categorie="'.$categorie.'">'.$valeur.'</'.$tag.'>'."\n"; |
} else { |
$xml .= '<'.$cle.' categorie="Undefined">'.$valeur.'</'.$cle.'>'."\n"; |
} |
} |
return $xml; |
} |
private function migrerLiaisonsObsImages() { |
$debut = 0; |
$pas = 500; |
$liaisons_obs_inexistantes = 0; |
//Selectionner le nombre de liaisons |
$requeteNbImgObs = "SELECT COUNT(*) AS nb FROM cel_obs_images"; |
$resultatNbImgObs = $this->executerRequete($requeteNbImgObs); |
$fin = $resultatNbImgObs[0]['nb']; |
for ($i = $debut; $i <= $fin ; $i += $pas) { |
$requete = 'SELECT * FROM cel_obs_images LIMIT '.$i.','.$pas; |
$tableau_liaisons = $this->executerRequete($requete); |
if (is_array($tableau_liaisons)) { |
$requete = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_obs_images '. |
'(id_image, id_observation, date_liaison) '. |
'VALUES '; |
$sous_requete = array(); |
foreach ($tableau_liaisons as &$liaison) { |
$mail_utilisateur = $liaison['coi_ce_utilisateur']; |
$id_obs = $liaison['coi_ce_observation']; |
if (isset($this->tableau_observations[$mail_utilisateur][$id_obs])) { |
$id_obs = $this->tableau_observations[$mail_utilisateur][$id_obs]; |
$sous_requete[] = '('.$this->proteger($liaison['coi_ce_image']).','. |
$this->proteger($id_obs).','. |
$this->proteger($liaison['coi_date_liaison']). |
')'; |
} else { |
// cas d'une observation inexistante, la liaison est ignorée |
$liaisons_obs_inexistantes++; |
} |
} |
$sous_requete = implode(',', $sous_requete); |
$requete .= $sous_requete; |
$migration_liaison = $this->executerRequeteSimple($requete); |
if (!$migration_liaison) { |
echo 'La migration des liaisons obs images de '.$i.' à '.($i+$pas).' a échoué ! '."\n<br />"; |
} else { |
$this->afficherAvancement('Migration des liaisons obs images (par '.$pas.' )'); |
} |
} |
} |
echo "\n\n"; |
echo $liaisons_obs_inexistantes ? $liaisons_obs_inexistantes." liaisons image obs ont été ignorées car les obs sont absentes" : '' ; |
echo "\n"; |
echo "\n---------------------------------------------------------------- OK\n\n"; |
} |
} |
/trunk/jrest/scripts/InventoryMaintenance.php |
---|
New file |
0,0 → 1,268 |
<?php |
// ATTENTION ! Classe compatible uniquement avec nouveau format de bdd du cel // |
/** |
* PHP Version 5 |
* |
* @category PHP |
* @package jrest |
* @author aurelien <aurelien@tela-botanica.org> |
* @copyright 2009 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @version SVN: <svn_id> |
* @link /doc/jrest/ |
*/ |
class InventoryMaintenance extends Cel { |
private $nb_fichiers_orphelins = 0; |
private $espace_libere = 0; |
function getElement($uid) { |
if ($this->authentifierAdmin()) { |
if($uid[0] == "dates_images") { |
$this->reparerDatesImages(); |
} |
if($uid[0] == "suppression_images_orphelines") { |
$this->suppressionFichiersImagesOrphelins(); |
} |
} |
} |
private function reparerDatesImages() { |
// TODO : effectuer une réexctraction de la date grâce au metadonnées |
// pas urgent |
/*$query = 'UPDATE cel_images SET date_prise_de_vue = ci_meta_date_time '; |
'WHERE ci_meta_date IS NULL AND ci_meta_date_time IS NOT NULL' ; |
$DB = $this->connectDB($this->config,'cel_db'); |
$res =& $DB->query($query); |
if (PEAR::isError($res)) { |
logger('InventoryMaintenance','Erreur lors de la réparation des dates '.$query); |
die($res->getMessage()); |
} |
header('content-type: text/html charset=utf-8'); |
print "Réparation des dates effectuées"; |
exit() ;*/ |
} |
private function suppressionFichiersImagesOrphelins() { |
header("content-type: text/html") ; |
$header_html = ' |
<head> |
<title>Maintenance</title> |
<style type="text/css"> |
h1 { |
color: blue; |
} |
h2 { |
color: green; |
} |
.titre_dossier { |
cursor: pointer; |
} |
li { |
list-style-type: none; |
} |
.liste_profondeur_1 { |
border: 1px solid blue; |
background-color: #DFDFFF; |
} |
.liste_profondeur_2 { |
border: 1px solid green; |
background-color: #E1FFDF; |
width: 1500px; |
} |
.liste_profondeur_3 { |
border: 1px solid yellow; |
background-color: #FFFCDF; |
width: 1200px; |
} |
.attention { |
border: 1px solid red; |
background-color: white; |
width: 600px; |
} |
</style> |
<script src="http://162.38.234.9/cel_consultation/squelettes/js/jquery-1.4.2.min.js" type="text/javascript"></script> |
<script type="text/javascript" language="javascript"> |
//<![CDATA[ |
function initialiserElementsPliables() { |
$(\'.titre_dossier\').bind(\'click\', function() { |
$(this).siblings(\'li\').toggle(); |
return false; |
}); |
} |
$(document).ready(function() { |
initialiserElementsPliables(); |
}); |
//]]> |
</script> ';' |
</head>'; |
echo $header_html; |
$chemin_base_images = $this->config['cel_db']['chemin_images']; |
$profondeur = 1; |
echo '<ul id="liste_profondeur_0">'; |
$this->itererRecursivement($chemin_base_images, $profondeur); |
echo '</ul>'; |
print '<p class="resultat">Suppression des images orphelines effectuées </p><br />' ; |
print '<p class="resultat">'.$this->nb_fichiers_orphelins.' fichiers orphelins ont été détectés et supprimés</p>'; |
print '<p class="resultat">'.$this->convertir_poid($this->espace_libere).' d\'espace disque ont été économisé </p>'; |
exit() ; |
} |
private function itererRecursivement($dossier, $profondeur) { |
foreach (new DirectoryIterator($dossier) as $fichier_ou_dossier) { |
if ($fichier_ou_dossier->isDot()) { |
continue; |
} |
$dossiers_autorises = array('L','M','S'); |
if ($fichier_ou_dossier->getBasename() == 'export') { |
continue; |
} |
echo '<li>'; |
if ($fichier_ou_dossier->isDir()) { |
$profondeur_dossier_fils = $profondeur + 1; |
echo '<ul class="liste_profondeur_'.$profondeur.'"> <h'.$profondeur.' class="titre_dossier"> analyse du dossier '.$fichier_ou_dossier->getPathname().'</h'.$profondeur.'>' ; |
$this->itererRecursivement($fichier_ou_dossier->getPathname(), $profondeur_dossier_fils); |
echo '</ul><br /><br />'; |
} else { |
$nom_fichier = $fichier_ou_dossier->getFilename(); |
$this->verifierImageSurDDExisteDansBaseDeDonnees($nom_fichier); |
} |
echo '</li>'; |
} |
} |
private function verifierImageSurDDExisteDansBaseDeDonnees($nom_fichier) { |
$nom_fichier_sans_extension = trim($nom_fichier, '.jpg'); |
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_L'); |
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_M'); |
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_S'); |
$id_image = str_replace('_', '', $nom_fichier_sans_extension); |
// suppression des 0 devant |
$id_image += 0; |
$requete_id_image_existe = 'SELECT COUNT(id_image) as image_existe FROM cel_images WHERE id_image = '.$id_image; |
$image_existe = $this->executerRequete($requete_id_image_existe); |
if ($image_existe[0]['image_existe'] < 1) { |
echo $nom_fichier.' Image introuvable dans la base de données'; |
$this->supprimerImage($id_image); |
} |
} |
private function supprimerImage($id) { |
$chemin_sur_serveur = $this->config['cel_db']['chemin_images']; |
$id = sprintf('%09s', $id); |
$id = wordwrap($id, 3 , '_', true); |
$id_fichier = "$id.jpg"; |
$niveauDossier = explode('_', $id); |
$dossierNiveau1 = $niveauDossier[0]; |
$dossierNiveau2 = $niveauDossier[1]; |
$fichier_s = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/S/'.$id.'_S.jpg'; |
$fichier_m = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/M/'.$id.'_M.jpg'; |
$fichier_l = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/L/'.$id.'_L.jpg'; |
$erreur = false; |
echo '<ul class="liste_suppression">'; |
if(file_exists($fichier_s)) { |
$this->espace_libere += filesize($fichier_s); |
$suppression_s = true; |
//$suppression_s = unlink($fichier_s) ; |
if (!$suppression_s) { |
$erreur = '<li> probleme durant la suppression de l\'image '.$fichier_s.' </li>' ; |
echo $erreur; |
} else { |
// $this->nb_fichiers_orphelins++; |
} |
} else { |
$erreur = '<li> probleme : l\'image '.$fichier_s.' n\'existe pas </li>' ; |
echo $erreur; |
}// Si le fichier existe |
if (file_exists($fichier_m)) { |
$this->espace_libere += filesize($fichier_m); |
$suppression_m = true; |
//$suppression_m = unlink($fichier_m) ; |
if (!$suppression_m) { |
$erreur = '<li> probleme durant la suppression de l\'image '.$fichier_m.' </li>' ; |
$this->logger('CEL_images_bugs',$erreur); |
} else { |
// $this->nb_fichiers_orphelins++; |
} |
} else { |
$erreur = '<li> probleme : l\'image '.$fichier_m.' n\'existe pas </li>' ; |
echo $erreur; |
} // Si le fichier existe |
if (file_exists($fichier_l)) { |
$this->espace_libere += filesize($fichier_l); |
$suppression_l = true; |
//$suppression_l = unlink($fichier_l) ; |
if(!$suppression_l) { |
$erreur = '<li> probleme durant la suppression de l\'image '.$fichier_l.' </li>' ; |
echo $erreur; |
} else { |
// $this->nb_fichiers_orphelins++; |
} |
} else { |
$erreur = '<li> probleme : l\'image '.$fichier_l.' n\'existe pas </li>' ; |
echo $erreur; |
} // Si le fichier existe |
if (!$erreur) { |
echo '<p class="attention">Suppression dans tous les formats de l\'image '.$id.' effectuee </p>'; |
$this->nb_fichiers_orphelins++; |
} |
echo '</ul>'; |
echo '<br />'; |
} |
private function convertir_poid($size) { |
$units = array(' B', ' KB', ' MB', ' GB', ' TB'); |
for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024; |
return round($size, 2).$units[$i]; |
} |
} |
?> |
/trunk/jrest/scripts/MigrationMotsCles.php |
---|
New file |
0,0 → 1,391 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* Script de migration des Mots Clés de la version 1 de la base de données du CEL à la v2. |
* |
* @category php 5.2 |
* @package Cel/Scripts |
* @author Aurélien PERONNET <aurelien@tela-botanica.org> |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright Copyright (c) 2012, Tela Botanica (accueil@tela-botanica.org) |
* @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 $Id$ |
*/ |
class MigrationMotsCles extends Cel { |
const SEPARATEUR_MOT_CLE_TEXTE = ','; |
const truncate = true; //Doit on vider les tables de destination ? |
const dry_run = false; |
private $nouvellesTables = array('cel_mots_cles_obs', 'cel_mots_cles_images', 'cel_images_mots_cles', 'cel_obs_mots_cles'); |
public static $bdd_cel_migration; |
public static $bdd_utilisateurs; |
private $tableau_utilisateurs = array(); |
/** Tableau associatif permettant de stocker l'avancement dans une boucle. |
* La clé est un md5 du message à afficher au démarrage de la boucle. |
* @var array |
*/ |
private static $avancement = array(); |
/** |
* Méthode appelée avec une requête de type GET. |
*/ |
public function getElement($params) { |
if (!isset($this->config['database_cel']['database_migration']) || $this->config['database_cel']['database_migration'] == '') { |
echo 'Attention la variable de configuration database_migration dans la section database_cel, contenant la base de données d\'arrivée, doit être remplie '."\n"; |
exit; |
} |
if (!isset($this->config['database_ident']['database']) || $this->config['database_ident']['database'] == '') { |
echo 'Attention la variable de configuration database dans la section database_ident, contenant la base de données utilisateurs, doit être remplie '."\n"; |
exit; |
} |
self::$bdd_cel_migration = $this->config['database_cel']['database_migration']; |
self::$bdd_utilisateurs = $this->config['database_ident']['database']; |
echo "--MIGRATION DES MOTS CLES --------------------------------------\n"; |
if (self::truncate) { |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 0. Vider les tables ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->viderTables(); |
echo "\n---------------------------------------------------------------- OK\n\n"; |
} |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 1. Paramétrage ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->getUtilisateurs(); |
echo "\n"."\n"."\n"; |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 2. Migration des mots clés ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->migrerTableMotsClesObs(); |
echo "\n---------------------------------------------------------------- OK\n\n"; |
$this->migrerTableMotsClesImages(); |
echo "\n"."\n"."\n"; |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 3. Migration des liaisons mots clés ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->migrerLiaisonsMotsClesObs(); |
$this->migrerLiaisonsMotsClesImages(); |
echo "\n"."\n"."\n"; |
echo "-------------------------------------------------------------------\n\n"; |
echo " ETAPE 4. Génération des index des mots clés ... \n\n"; |
echo "-------------------------------------------------------------------\n\n"; |
$this->genererIndexTexteMotsClesObs(); |
$this->genererIndexTexteMotsClesImages(); |
echo "\n"."\n"."\n"; |
} |
private function viderTables() { |
foreach ($this->nouvellesTables as $nomTable) { |
echo 'Vider la table '.$nomTable.'...'; |
$requete = 'TRUNCATE TABLE '.self::$bdd_cel_migration.'.'.$nomTable; |
$resultat = $this->executerRequete($requete); |
echo "ok \n"; |
} |
} |
public function executerRequeteSimple($requete) { |
// Fonction de commodité pour afficher les requetes au lieu de les executer |
if (self::dry_run) { |
echo str_replace('),','),'."\n", $requete); |
return true; |
} else { |
return parent::executerRequeteSimple($requete); |
} |
} |
private function getUtilisateurs() { |
echo "\n-------------------------------------------------------------------\n"; |
echo "--SELECTION DES UTILISATEURS---------------------------------------\n\n"; |
$requete = 'SELECT U_ID as id, U_MAIL as mail, U_NAME as nom, U_SURNAME as prenom, U_PASSWD as pass '. |
'FROM '.self::$bdd_utilisateurs.'.annuaire_tela'; |
$tableau_utilisateurs = $this->executerRequete($requete); |
foreach( $tableau_utilisateurs as &$utilisateur) { |
$this->tableau_utilisateurs[$utilisateur['mail']] = $utilisateur; |
} |
echo sizeof($this->tableau_utilisateurs)." utilisateurs sélectionnés"; |
echo "\n-----------------------------------------------------------------OK\n"; |
} |
private function migrerTableMotsClesObs() { |
$this->migrerTableMotsCles('obs'); |
} |
private function migrerTableMotsClesImages() { |
$this->migrerTableMotsCles('images'); |
} |
private function migrerTableMotsCles($image_ou_obs) { |
echo "--MIGRATION DES MOTS CLES $image_ou_obs ---------------------------------\n"; |
$pas = 1; |
//limite des mots clés |
$requeteNbMotsCles = 'SELECT count(*) as nb FROM cel_mots_cles_'.$image_ou_obs; |
$resultatNbMotsCles = $this->executerRequete($requeteNbMotsCles); |
$nbMotsCles = (int) $resultatNbMotsCles[0]['nb']; |
for ($i = 0; $i < $nbMotsCles; $i += $pas) { |
$requete = 'SELECT * '. |
'FROM cel_mots_cles_'.$image_ou_obs.' '. |
'ORDER BY cmc_niveau '. |
"LIMIT $i,$pas "; |
$arbres_mots_cles = $this->executerRequete($requete); |
if (count($arbres_mots_cles) > 0) { |
$champ_parent = ($image_ou_obs == "obs") ? 'ce_mot_cle_obs_parent' : 'ce_mot_cle_image_parent'; |
$champ_id = ($image_ou_obs == "obs") ? 'id_mot_cle_obs' : 'id_mot_cle_image'; |
$requete = 'INSERT INTO '.self::$bdd_cel_migration.".cel_mots_cles_$image_ou_obs ". |
"($champ_id, id_utilisateur, mot_cle, md5, bg, bd, niveau, $champ_parent) ". |
'VALUES '; |
$sous_requete = array(); |
foreach ($arbres_mots_cles as $arbre_mot_cle) { |
$sous_requete[] = $this->construireSousRequeteInsertionArbresMotsCles('cmc_', $arbre_mot_cle); |
} |
$sous_requete = implode(',', $sous_requete); |
$requete .= $sous_requete; |
$migration = $this->executerRequeteSimple($requete); |
if (!$migration) { |
echo "La migration des mots cles $image_ou_obs a échoué ! "."\n"; |
} else { |
$this->afficherAvancement("Migration des mots clés $image_ou_obs (par $pas)"); |
} |
} |
} |
} |
/** |
* Utiliser cette méthode dans une boucle pour afficher un message suivi du nombre de tour de boucle effectué. |
* Vous devrez vous même gérer le retour à la ligne à la sortie de la boucle. |
* |
* @param string le message d'information. |
* @param int le nombre de départ à afficher. |
* @return void le message est affiché dans la console. |
*/ |
protected function afficherAvancement($message, $depart = 0) { |
if (! isset(self::$avancement[$message])) { |
self::$avancement[$message] = $depart; |
echo "$message : "; |
$actuel =& self::$avancement[$message]; |
echo $actuel++; |
} else { |
$actuel =& self::$avancement[$message]; |
// Cas du passage de 99 (= 2 caractères) à 100 (= 3 caractères) |
$passage = 0; |
if (strlen((string) ($actuel - 1)) < strlen((string) ($actuel))) { |
$passage = 1; |
} |
echo str_repeat(chr(8), (strlen((string) $actuel) - $passage)); |
echo $actuel++; |
} |
} |
private function construireSousRequeteInsertionArbresMotsCles($prefixe, $ligne) { |
$id_proprietaire_mot_cle = $ligne[$prefixe.'id_proprietaire']; |
$id_proprietaire_mot_cle = $this->renvoyerIdPourMigration($id_proprietaire_mot_cle); |
$sous_requete = '('.$this->proteger($ligne[$prefixe.'id_mot_cle_utilisateur']).','. |
$this->proteger($id_proprietaire_mot_cle).','. |
$this->proteger($ligne[$prefixe.'mot_cle']).','. |
$this->proteger($ligne[$prefixe.'id_mot_cle_general']).','. |
$this->proteger($ligne[$prefixe.'bg']).','. |
$this->proteger($ligne[$prefixe.'bd']).','. |
$this->proteger($ligne[$prefixe.'niveau']).','. |
$this->proteger($ligne[$prefixe.'id_parent']). |
')'; |
return $sous_requete; |
} |
private function renvoyerIdPourMigration($utilisateur) { |
// si tout les test suivant échouent, on garde l'utilisateur tel quel |
// (cas de la chaine de session des utilisateur anonymes) |
$retour = $utilisateur; |
// si le mail correspond a un utilisateur de la bdd |
if (isset($this->tableau_utilisateurs[$utilisateur])) { |
// on renvoie son id |
$retour = $this->tableau_utilisateurs[$utilisateur]['id']; |
} else { |
// sinon si c'est un mail inconnu, on garde le md5 |
if ($this->mailValide($utilisateur)) { |
$retour = md5($utilisateur); |
} |
} |
return $retour; |
} |
public function mailValide($mail) { |
// vérification bidon mais ça suffit pour ici |
return !(strpos('@',$mail) === false); |
} |
private function migrerLiaisonsMotsClesObs() { |
$requete = 'SELECT mots_cles AS mots_cles, id AS id, identifiant AS id_utilisateur '. |
'FROM cel_inventory '. |
'WHERE mots_cles != "" '. |
' AND mots_cles IS NOT NULL '. |
'ORDER BY identifiant '; |
$mots_cles_obs = $this->executerRequete($requete); |
$requete = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_obs_mots_cles '. |
'(id_observation, id_mot_cle_obs, id_utilisateur) '. |
'VALUES '. |
$this->construireSousRequeteInsertionLiaisons($mots_cles_obs, ';'); |
$insertion = $this->executerRequeteSimple($requete); |
if (!$insertion) { |
echo 'La migration des mots cles obs a échoué ! '."\n"; |
} else { |
echo "Migration des mots cles obs : OK\n\n"; |
} |
} |
private function migrerLiaisonsMotsClesImages() { |
$requete = 'SELECT ci_meta_mots_cles AS mots_cles, ci_id_image AS id, ci_ce_utilisateur AS id_utilisateur '. |
'FROM cel_images '. |
'WHERE ci_meta_mots_cles != "" '. |
' AND ci_meta_mots_cles IS NOT NULL '. |
'ORDER BY ci_ce_utilisateur'; |
$mots_cles_images = $this->executerRequete($requete); |
$requete = 'INSERT INTO '.self::$bdd_cel_migration.'.cel_images_mots_cles '. |
'(id_image, id_mot_cle_image, id_utilisateur) '. |
'VALUES '. |
$this->construireSousRequeteInsertionLiaisons($mots_cles_images, ','); |
$insertion = $this->executerRequeteSimple($requete); |
if (!$insertion) { |
echo 'La migration des mots cles images a échoué ! '."\n"; |
} else { |
echo "Migration des mots cles images : OK\n\n"; |
} |
} |
private function construireSousRequeteInsertionLiaisons($tableau_mots_cles, $separateur) { |
$sous_requete = array(); |
foreach ($tableau_mots_cles as $element) { |
$mots_cles_ids = $this->parserMotsCles($element['mots_cles'], $separateur); |
foreach ($mots_cles_ids as $mot_cle_id) { |
$id = $this->proteger($element['id']); |
$id_mot_cle = $this->proteger($mot_cle_id); |
$id_utilisateur = $this->proteger($this->renvoyerIdPourMigration($element['id_utilisateur'])); |
$sous_requete[] = "($id, $id_mot_cle, $id_utilisateur)"; |
} |
} |
$sous_requete_chaine = implode(',', $sous_requete); |
return $sous_requete_chaine; |
} |
private function parserMotsCles($mot_cles, $separateur = ',') { |
$tableau_mots_cles = explode($separateur, $mot_cles); |
$tableau_mots_cles_formates = array(); |
foreach ($tableau_mots_cles as $mot_cle) { |
$mot_cle = str_replace($separateur.$separateur, '', $mot_cle); |
$mot_cle = str_replace('null', '', $mot_cle); |
if ($this->estUnIdentifiantMotCle($mot_cle)) { |
// certains mots clés mal formatés contiennent des virgules |
if (strpos($mot_cle, ',') !== false) { |
$tab_mot_cle_mal_formate = explode(',', $mot_cle); |
foreach ( $tab_mot_cle_mal_formate as $mot_cle_mal_formate) { |
if ($this->estUnIdentifiantMotCle($mot_cle_mal_formate)) { |
$tableau_mots_cles_formates[$mot_cle_mal_formate] = $mot_cle_mal_formate; |
} |
} |
} else { |
// on met le mot clé dans sa propre case afin d'éviter |
// facilement les doublons provoqués par de mauvais formatages |
$tableau_mots_cles_formates[$mot_cle] = $mot_cle; |
} |
} |
} |
return $tableau_mots_cles_formates; |
} |
private function estUnIdentifiantMotCle($chaine) { |
return trim($chaine) != '' && preg_match('/^(?:[0-9]+\.[0-9]+|[-_a-z0-9]+(?:[.][-_a-z0-9]+)*)$/i', $chaine); |
} |
private function genererIndexTexteMotsClesObs() { |
$requete_selection_obs = 'SELECT DISTINCT id_observation, ce_utilisateur '. |
'FROM '.self::$bdd_cel_migration.'.cel_obs '. |
'WHERE id_observation IN (SELECT DISTINCT id_observation FROM '.self::$bdd_cel_migration.'.cel_mots_cles_obs) '; |
$obs_a_mots_cles = $this->requeter($requete_selection_obs); |
foreach ($obs_a_mots_cles as $obs) { |
$mots_cles_texte = $this->obtenirMotsClesTexte($obs['id_observation'], $obs['ce_utilisateur'], 'obs'); |
if (is_array($mots_cles_texte) && count($mots_cles_texte) > 0) { |
$mots_cles_texte_chaine = implode(',', $mots_cles_texte); |
$mise_a_jour_index = $this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine,$obs['id_observation'], $obs['ce_utilisateur'], 'obs'); |
$this->afficherAvancement('Génération des index mots clés obs (par 1)'); |
} |
} |
echo "\n-----------------------------------------------------------------OK\n"; |
} |
private function genererIndexTexteMotsClesImages() { |
$requete_selection_images = 'SELECT DISTINCT id_image, ce_utilisateur '. |
'FROM '.self::$bdd_cel_migration.'.cel_images '. |
'WHERE id_image IN (SELECT DISTINCT id_image FROM '.self::$bdd_cel_migration.'.cel_mots_cles_images) '; |
$images_a_mots_cles = $this->requeter($requete_selection_images); |
foreach ($images_a_mots_cles as $image) { |
$mots_cles_texte = $this->obtenirMotsClesTexte($image['id_image'], $image['ce_utilisateur'], 'images'); |
$mots_cles_texte_chaine = ''; |
if (is_array($mots_cles_texte) && count($mots_cles_texte) > 0) { |
$mots_cles_texte_chaine = implode(',', $mots_cles_texte); |
$mise_a_jour_index = $this->executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine,$image['id_image'], $image['ce_utilisateur'], 'images'); |
$this->afficherAvancement('Génération des index mots clés images (par 1)'); |
} |
} |
echo "\n-----------------------------------------------------------------OK\n"; |
} |
private function executerRequeteMiseAJourMotCleTexte($mots_cles_texte_chaine, $id_image_ou_obs, $id_utilisateur, $mode_image_ou_obs) { |
$requete = 'UPDATE '.self::$bdd_cel_migration.'.'.(($mode_image_ou_obs == 'obs') ? 'cel_obs' : 'cel_images').' '. |
'SET mots_cles_texte = '.$this->proteger($mots_cles_texte_chaine).' '. |
'WHERE '.(($mode_image_ou_obs == 'obs') ? 'id_observation' : 'id_image').' = '.$this->proteger($id_image_ou_obs).' '. |
' AND ce_utilisateur = '.$this->proteger($id_utilisateur); |
return $this->executer($requete); |
} |
private function obtenirMotsClesTexte($id_image_ou_obs, $id_utilisateur, $mode_image_ou_obs) { |
$champ_id = ($mode_image_ou_obs == 'obs') ? 'id_mot_cle_obs' : 'id_mot_cle_image'; |
$requete = 'SELECT mot_cle '. |
'FROM '.self::$bdd_cel_migration.'.cel_mots_cles_'.$mode_image_ou_obs.' '. |
"WHERE $champ_id IN ". |
'('. |
"SELECT $champ_id ". |
'FROM '.self::$bdd_cel_migration.'.cel_'.$mode_image_ou_obs.'_mots_cles '. |
'WHERE '.(($mode_image_ou_obs == 'obs') ? 'id_observation' : 'id_image').' = '.$this->proteger($id_image_ou_obs). |
')'. |
' AND id_utilisateur = '.$this->proteger($id_utilisateur); |
$resultats = $this->requeter($requete); |
$mots_cles = array(); |
foreach ($resultats as $resultat) { |
$mots_cles[] = $resultat['mot_cle']; |
} |
return $mots_cles; |
} |
} |
/trunk/jrest/cli.php |
---|
1,8 → 1,7 |
<?php |
/** |
* Script d'appel aux fonctions de jrest par ligne de commande, pour le moment ne supporte pas |
* correctement les méthodes ayant des paramètres |
* |
* Script principal d'appel aux script de jrest par ligne de commande. |
* Pour le moment ne supporte pas correctement les méthodes ayant des paramètres. |
*/ |
14,13 → 13,12 |
*@param string le nom de la classe appelée. |
*@return void le fichier contenant la classe doit être inclu par la fonction. |
*/ |
function __autoload($classe) |
{ |
function __autoload($classe) { |
if (class_exists($classe)) { |
return null; |
} |
$chemins = array('', 'services/', 'services/include/', 'lib/'); |
$chemins = array('', 'scripts/', 'lib/'); |
foreach ($chemins as $chemin) { |
$chemin = $chemin.$classe.'.php'; |
if (file_exists($chemin)) { |
29,42 → 27,42 |
} |
} |
if(php_sapi_name() == 'cli') { |
if ($_SERVER['argc'] < 2){ |
trigger_error("Erreur: vous n'avez pas indiqué le nom du service à appeler."); |
exit; |
} |
// suppression du premier paramètre qui est le nom du script |
array_shift($argv); |
$nom_service = array_shift($argv); |
if ($_SERVER['argc'] < 2){ |
trigger_error("Erreur: vous n'avez pas indiqué le nom de la méthode"); |
exit; |
} |
$nom_methode = array_shift($argv); |
$params = $argv; |
$_SERVER['SERVER_NAME'] = 'localhost'; |
$config = parse_ini_file('jrest.ini.php', TRUE); |
$service = new $nom_service($config); |
if(!is_callable(array($service, $nom_methode))) { |
trigger_error("Erreur: la méthode ".$nom_methode." n'existe pas ou n'est pas accessible"); |
exit; |
} |
// exécution de la méthode |
$service->$nom_methode($params); |
exit; |
} else { |
trigger_error("Erreur: ce fichier est destiné a être appelé en ligne de commande."); |
exit; |
try { |
if (php_sapi_name() == 'cli') { |
if ($_SERVER['argc'] < 2){ |
$message = "Erreur: vous n'avez pas indiqué le nom du script à appeler."; |
throw new Exception($message, 'ERREUR'); |
} |
// suppression du premier paramètre qui est le nom du script |
array_shift($argv); |
$nom_script = array_shift($argv); |
if ($_SERVER['argc'] < 2){ |
$message = "Erreur: vous n'avez pas indiqué le nom de la méthode"; |
throw new Exception($message, 'ERREUR'); |
} |
$nom_methode = array_shift($argv); |
$params = $argv; |
$_SERVER['SERVER_NAME'] = 'localhost'; |
$config = parse_ini_file('jrest.ini.php', TRUE); |
$script = new $nom_script($config); |
if (!is_callable(array($script, $nom_methode))) { |
$message = "Erreur: la méthode '$nom_methode' du script '$nom_script' n'existe pas ou n'est pas accessible"; |
throw new Exception($message, 'ERREUR'); |
} |
$script->$nom_methode($params); |
} else { |
$message = "Erreur: ce fichier est destiné a être appelé en ligne de commande."; |
throw new Exception($message, 'ERREUR'); |
} |
} catch (Exception $e) { |
echo $e->getCode().' : '.$e->getMessage(); |
} |
exit; |
?> |
/trunk/jrest/index.php |
---|
1,5 → 1,4 |
<?php |
/** |
* La fonction __autoload() charge dynamiquement les classes trouvées dans le code. |
* |
8,13 → 7,12 |
*@param string le nom de la classe appelée. |
*@return void le fichier contenant la classe doit être inclu par la fonction. |
*/ |
function __autoload($classe) |
{ |
function __autoload($classe) { |
if (class_exists($classe)) { |
return null; |
} |
$chemins = array('', 'services/', 'services/include/', 'lib/'); |
$chemins = array('', 'services/', 'lib/'); |
foreach ($chemins as $chemin) { |
$chemin = $chemin.$classe.'.php'; |
if (file_exists($chemin)) { |
/trunk/jrest/services/MigrationImages.php |
---|
File deleted |
\ No newline at end of file |
/trunk/jrest/services/MigrationObs.php |
---|
File deleted |
\ No newline at end of file |
/trunk/jrest/services/InventoryMaintenance.php |
---|
File deleted |
/trunk/jrest/services/Cel.php |
---|
File deleted |
\ No newline at end of file |
/trunk/jrest/services/MigrationMotsCles.php |
---|
File deleted |
\ No newline at end of file |