Subversion Repositories eFlore/Applications.cel

Compare Revisions

No changes between revisions

Ignore whitespace Rev 3666 → Rev 3667

/branches/v3.00-serfouette/scripts/cli.php
New file
0,0 → 1,37
<?php
// Encodage : UTF-8
// +-------------------------------------------------------------------------------------------------------------------+
/**
* Initialise le chargement et l'exécution des scripts
*
* Lancer ce fichier en ligne de commande avec :
* <code>/opt/lampp/bin/php cli.php mon_script -a test</code>
*
* @category CEL
* @package Scripts
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
 
// Le fichier Framework.php du Framework de Tela Botanica doit être appelée avant tout autre chose dans l'application.
// Sinon, rien ne sera chargé.
// Chemin du fichier chargeant le framework requis
$framework = dirname(__FILE__).DIRECTORY_SEPARATOR.'framework.php';
if (!file_exists($framework)) {
$e = "Veuillez paramétrer l'emplacement et la version du Framework dans le fichier $framework";
trigger_error($e, E_USER_ERROR);
} else {
// Inclusion du Framework
require_once $framework;
 
// Ajout d'information concernant cette application
Framework::setCheminAppli(__FILE__);// Obligatoire
Framework::setInfoAppli(Config::get('info'));
 
// Initialisation et lancement du script appelé en ligne de commande
Cli::executer();
}
/branches/v3.00-serfouette/scripts/tb_cel.sh
New file
0,0 → 1,54
#!/bin/sh
 
### BEGIN INIT INFO
# Provides: tb_cel
# Required-Start: $local_fs $remote_fs
# Required-Stop: $local_fs $remote_fs
# Should-Start: $all
# Should-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop scripts maintenance CEL
# Description: Start/stop les scripts de maintenance de CEL.
### END INIT INFO
 
#/etc/rc.d/init.d/
#
# Aurélien PERONNET [17 avril 2013]
# Service de lancement des scripts de maintenance du CEL
#
case "$1" in
 
start)
 
echo "Demarrage de code_insee_commune :"
nohup /usr/local/sbin/code_insee_commune.sh 1>/dev/null 2>/dev/null &
 
;;
 
stop)
 
echo "Arret de code_insee_commune"
PID=`ps -eaf | grep code_insee_commune | grep -v grep | tr -s ' ' | cut -d' ' -f2 | head -n1`
kill -9 ${PID}
 
;;
 
status)
 
echo -n "Voici les PID du processus code_insee_commune :"
PID=`ps -eaf | grep code_insee_commune | grep -v grep | tr -s ' ' | cut -d' ' -f2 | head -n1`
echo ${PID}
 
;;
 
 
*)
 
echo "Usage: {start|stop|status}"
 
exit 1
 
;;
 
esac
Property changes:
Added: svn:executable
+*
\ No newline at end of property
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v3.00-serfouette/scripts/modules/code_zone_geo/CodeZoneGeo.php
New file
0,0 → 1,312
<?php
// declare(encoding='UTF-8');
/**
* Traitement des codes INSEE et des codes pays de la base de données CEL
* Permet d'affecter des codes INSEE et des codes pays aux obs possédant des coordonnées mais pas de commune ou de pays.
*
* Utilisation :
* - Pour ? : <code>/opt/lamp/bin/php cli.php code_zone_geo -a tout</code>
* - Pour ? : <code>/opt/lamp/bin/php cli.php code_zone_geo -a colonne</code>
* - Pour ? : <code>/opt/lamp/bin/php cli.php code_zone_geo -a payssanscorrespondance</code>
* - Pour ? : <code>/opt/lamp/bin/php cli.php code_zone_geo -a codeinseesanscorrespondance</code>
*
* @category CEL
* @package Scripts
* @subpackage Zones Geo
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
include_once dirname(__FILE__).'/bibliotheque/Dao.php';
 
class CodeZoneGeo extends Script {
 
protected $tableauTaxon;
protected $dao;
protected $observations;
protected $url_service_geo_tpl;
protected $url_service_pays_tpl;
 
protected $mode_verbeux = false;
 
// Paramêtres autorisées lors de l'appel au script en ligne de commande
protected $parametres_autorises = array(
'-n' => array(true, true, 'Nom du fichier ou du dossier à traiter'));
 
public function executer() {
$this->url_service_geo_tpl = Config::get('urlZoneGeoTpl');
$this->url_service_pays_tpl = Config::get('urlPaysTpl');
 
$this->dao = new Dao();
// Récupération de paramétres
// Lancement de l'action demandée
$cmd = $this->getParametre('a');
$this->mode_verbeux = $this->getParametre('v');
 
switch ($cmd) {
case 'tout' :
// à effectuer manuellement au premier lancement du script
$this->creerColonne();
$this->calculerToutSansCorrespondanceDepuisLeDebut();
break;
case 'colonne' :
$this->creerColonne();
break;
case 'codeinseesanscorrespondance' :
$this->calculerCodesInseeSansCorrespondance();
break;
case 'codeinseesanscorrespondancedepuisledebut' :
$this->calculerCodesInseeSansCorrespondanceDepuisLeDebut();
break;
case 'payssanscorrespondance' :
$this->calculerPaysSansCorrespondance();
break;
case 'payssanscorrespondancedepuisledebut' :
$this->calculerPaysSansCorrespondanceDepuisLeDebut();
break;
case 'toutsanscorrespondance' :
// devrait être être l'option utilisée dans le cron quotidien (avec l'option -v 0)
$this->calculerToutSansCorrespondance();
break;
case 'toutsanscorrespondancedepuisledebut' :
$this->calculerToutSansCorrespondanceDepuisLeDebut();
break;
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
}
 
protected function creerColonne() {
$this->dao->creerColonneCodeInseeCalcule();
}
 
protected function calculerCodesInseeSansCorrespondance() {
$liste_coordonnees = $this->dao->rechercherCoordonneesFrancaisesSansCorrespondances();
$this->traiterCoordonnees($liste_coordonnees);
}
protected function calculerCodesInseeSansCorrespondanceDepuisLeDebut() {
$liste_coordonnees = $this->dao->rechercherCoordonneesFrancaisesSansCorrespondanceDepuisLeDebut();
$this->traiterCoordonnees($liste_coordonnees);
}
protected function calculerPaysSansCorrespondance() {
$liste_coordonnees = $this->dao->rechercherPaysSansCorrespondance();
$this->traiterCoordonnees($liste_coordonnees);
}
protected function calculerPaysSansCorrespondanceDepuisLeDebut() {
$liste_coordonnees = $this->dao->rechercherPaysSansCorrespondanceDepuisLeDebut();
$this->traiterCoordonnees($liste_coordonnees);
}
protected function calculerToutSansCorrespondance() {
$this->affecterPaysFranceAuxCommunes();
$liste_coordonnees = $this->dao->rechercherToutSansCorrespondance();
$this->traiterCoordonnees($liste_coordonnees);
}
 
protected function calculerToutSansCorrespondanceDepuisLeDebut() {
$this->affecterPaysFranceAuxCommunes();
$liste_coordonnees = $this->dao->rechercherSansCorrespondanceDepuisLeDebut();
$this->traiterCoordonnees($liste_coordonnees);
}
protected function affecterPaysFranceAuxCommunes() {
if ($this->mode_verbeux) {
echo "-------------------------------------------------------------------\n";
echo " Affectation du pays France aux communes ayant un code INSEE mais pas de pays ... ";
}
$maj = $this->dao->affecterPaysFranceAuxCommunesRenseignees();
if ($this->mode_verbeux) {
echo "OK \n";
echo " ".$maj." commune".($maj > 1 ? 's' : '')." affectée".($maj > 1 ? 's' : '')."\n";
echo "-------------------------------------------------------------------\n";
}
}
 
private function traiterCoordonnees($liste_coordonnees) {
$debut = microtime(true);
$nb_coordonnees_modifiees = 0;
$nb_coordonnees_ignorees = 0;
$total = count($liste_coordonnees);
 
if ($this->mode_verbeux) {
echo "-------------------------------------------------------------------\n";
echo " Calcul des codes INSEE, du code pays et modification (".count($liste_coordonnees)." coordonnées en tout) ... \n";
echo " Enrichissement des champs zone geo et ce_zone_geo vides ... \n";
echo "-------------------------------------------------------------------\n";
}
 
foreach ($liste_coordonnees as $coordonnees) {
$infos_coord = $this->obtenirInfosPourCoordonnees($coordonnees);
if ($infos_coord != null) {
// Le type renvoyé permet de connaitre ce qu'on peut modifier
if($infos_coord['type'] == 'france') {
// Cas d'une commune française
$coordonnee_a_traiter = array(
'latitude' => $coordonnees['latitude'],
'longitude' => $coordonnees['longitude'],
'code_insee' => $infos_coord['code_insee'],
'nom' => $infos_coord['nom']
);
$this->dao->modifierCodeInseeEtZoneGeo($coordonnee_a_traiter);
} else if($infos_coord['type'] == 'pays') {
// Cas d'un lieu à l'étranger
$coordonnee_a_traiter = array(
'latitude' => $coordonnees['latitude'],
'longitude' => $coordonnees['longitude'],
'code_pays' => $infos_coord['code_pays'],
'nom' => $infos_coord['nom']
);
$this->dao->modifierPays($coordonnee_a_traiter);
}
$nb_coordonnees_modifiees++;
} else {
$nb_coordonnees_ignorees++;
}
if ($this->mode_verbeux) {
$this->afficherAvancement(' Coordonnées traitées ', $nb_coordonnees_modifiees);
}
}
 
$fin = microtime(true);
if ($this->mode_verbeux) {
echo "\n";
echo "-------------------------------------------------------------------\n";
echo " Fin de la mise à jour des codes INSEE calculés, du pays et de l'enrichissement, \n";
echo " ".($fin - $debut)." secondes écoulées \n";
echo " ".$nb_coordonnees_modifiees." code insee calculés et modifiés \n";
echo " ".$nb_coordonnees_ignorees." coordonnées ignorées \n";
echo "-------------------------------------------------------------------\n";
echo "\n";
}
}
 
private function obtenirInfosPourCoordonnees($coordonnees) {
$infos_coord = null;
// Test facile qui permet d'abord de tenter une localisation bien plus rapide si les coordonnées
// sont dans la bounding box approximative de la France
if($this->testerCoordonneesWgsFrance($coordonnees['latitude'], $coordonnees['longitude'])) {
$infos_coord = $this->chercherInfosCommune('osm', $coordonnees['latitude'], $coordonnees['longitude']);
if ($infos_coord == null) {
// Sinon recherche par pays
$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
}
} else {
// Recherche par pays immédiate si en dehors de la bouding box française
$infos_coord = $this->chercherInfosPays($coordonnees['latitude'], $coordonnees['longitude']);
}
return $infos_coord;
}
 
private function chercherInfosCommune($projet, $latitude, $longitude) {
$noms_params = array('{projet}', '{latitude}', '{longitude}');
$valeurs_params = array($projet, $latitude, $longitude);
$url_service = str_replace($noms_params, $valeurs_params, $this->url_service_geo_tpl);
$url_service = str_replace(',', '.', $url_service);
 
$ch = curl_init($url_service);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$reponse = curl_exec($ch);
 
$infos_coord = $this->traiterReponseServiceCommune($reponse);
curl_close($ch);
 
return $infos_coord;
}
private function chercherInfosPays($latitude, $longitude) {
$noms_params = array('{latitude}', '{longitude}');
$valeurs_params = array($latitude, $longitude);
$url_service = str_replace($noms_params, $valeurs_params, $this->url_service_pays_tpl);
$url_service = str_replace(',', '.', $url_service);
 
$ch = curl_init($url_service);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$reponse = curl_exec($ch);
$res = json_decode($reponse, true);
$retour = null;
if(!empty($res)) {
// Cas où l'on a recherché des coordonnées en France
// On en profite pour remplir plus de données
// que le simple pays si elles sont présentes
if(isset($res[8]) && isset($res[8]['codeInsee'])) {
$retour = array(
'code_insee' => $res[8]['codeInsee'],
'nom' => $res[8]['intitule'],
'type' => 'france'
);
} else {
// Cas de la recherche en dehors de France
// La zone de plus haut niveau est toujours un pays
// (car le niveau de zone est limité à 2)
$infos_pays = $res[min(array_keys($res))];
// La zone de niveau le plus bas est la "localité"
// la plus précise qu'on a pu trouver
$infos_localite = $res[max(array_keys($res))];
// Cas où l'on a trouvé un code pays
if(!empty($infos_pays['codeIso31661'])) {
$retour = array(
'code_pays' => $infos_pays['codeIso31661'],
'nom' => ''
);
} elseif(!empty($infos_pays['codeIso31662'])) {
// Quelquefois la zone de plus haut niveau est une région ou une province
// heureusement son code est de forme XX-YY ou XX est le code iso du pays !
$retour = array(
'code_pays' => substr($infos_pays['codeIso31662'], 0, 2),
'nom' => ''
);
}
// Pas de sens de prendre un nom de localité si on a pas de pays
if(!empty($retour['code_pays'])) {
// Type sert à savoir quelle fonction de mise à jour on appellera
$retour['type'] = 'pays';
$retour['nom'] = $infos_localite['intitule'];
}
}
}
return $retour;
}
 
private function traiterReponseServiceCommune($reponse) {
$retour = null;
$reponse = json_decode($reponse);
// cas du service lion 1906 qui peut renvoyer plusieurs communes (on prend la première)
if (is_array($reponse)) {
$reponse = $reponse[0];
}
if (isset($reponse->codeINSEE)) {
// Type sert à savoir quelle fonction de mise à jour on appellera
$retour = array('code_insee' => $reponse->codeINSEE,
'nom' => $reponse->nom,
'type' => 'france');
}
return $retour;
}
private function testerCoordonneesWgsFrance($latitude, $longitude) {
$coord_france = false;
if ($latitude != '' && $longitude != '') {
if ($latitude < 51.071667 && $latitude > 41.316667) {
if ($longitude < 9.513333 && $longitude > -5.140278) {
$coord_france = true;
}
}
}
return $coord_france;
}
}
/branches/v3.00-serfouette/scripts/modules/code_zone_geo/code_zone_geo.sh
New file
0,0 → 1,12
#!/bin/bash
#
# /usr/local/sbin/code_zone_geo.sh : traitement du calcul des codes INSEE et pays du cel
# Aurélien Peronnet [11 avril 2013]
#
while true
do
logger "Lancement script cel::code_zone_geo"
sudo -u apitela /usr/local/bin/php-cli-56 -f /home/apitela/www/scripts/cel/cli.php code_zone_geo -a toutsanscorrespondance -v 0
logger "Arret script cel::code_zone_geo"
sleep 86400
done
Property changes:
Added: svn:executable
+*
\ No newline at end of property
Added: svn:eol-style
+native
\ No newline at end of property
/branches/v3.00-serfouette/scripts/modules/code_zone_geo/bibliotheque/Dao.php
New file
0,0 → 1,197
<?php
class Dao extends Bdd {
 
private $temps_derniere_requete = 0;
 
public function rechercherCoordonnees($conditions = array()) {
if(!empty($conditions)) {
$where = 'WHERE '.implode(' AND ', $conditions);
}
$requete = "SELECT longitude, latitude ".
"FROM cel_obs ".
$where.
"GROUP BY longitude , latitude ";
$resultat = $this->recupererTous($requete);
$this->reinitialiserTempsDerniereRequete();
return $resultat;
}
 
public function rechercherCoordonneesFrancaisesSansCorrespondances() {
$conditions = array(
$this->getConditionCoordonneesValides(),
$this->getConditionInfosGeoIncompletes(),
$this->getConditionlimiteeALaFrance(),
$this->getConditionModifObsRecente()
);
return $this->rechercherCoordonnees($conditions);
}
public function rechercherCoordonneesFrancaisesSansCorrespondanceDepuisLeDebut() {
$conditions = array(
$this->getConditionCoordonneesValides(),
$this->getConditionInfosGeoIncompletes(),
$this->getConditionlimiteeALaFrance()
);
return $this->rechercherCoordonnees($conditions);
}
public function rechercherPaysSansCorrespondance() {
$conditions = array(
$this->getConditionCoordonneesValides(),
$this->getConditionSansPays(),
$this->getConditionModifObsRecente()
);
return $this->rechercherCoordonnees($conditions);
}
public function rechercherPaysSansCorrespondanceDepuisLeDebut() {
$conditions = array(
$this->getConditionCoordonneesValides(),
$this->getConditionSansPays()
);
return $this->rechercherCoordonnees($conditions);
}
public function rechercherToutSansCorrespondance() {
$conditions = array(
$this->getConditionCoordonneesValides(),
'('.
$this->getConditionInfosGeoIncompletes().' OR '.
$this->getConditionSansPays().
') ',
$this->getConditionModifObsRecente()
);
return $this->rechercherCoordonnees($conditions);
}
public function rechercherSansCorrespondanceDepuisLeDebut() {
$conditions = array(
$this->getConditionCoordonneesValides(),
'('.
$this->getConditionInfosGeoIncompletes().' OR '.
$this->getConditionSansPays().
') '
);
return $this->rechercherCoordonnees($conditions);
}
private function getConditionModifObsRecente() {
$condition = 'DATE_ADD(date_modification, INTERVAL 25 HOUR) >= CURDATE() ';
return $condition;
}
private function getConditionInfosGeoIncompletes() {
$condition = '('.
'ce_zone_geo IS NULL OR ce_zone_geo = "" OR '.
'zone_geo IS NULL OR zone_geo = "" '.
') ';
return $condition;
}
private function getConditionlimiteeALaFrance() {
$condition = '('.
'(latitude <= 51.071667 AND latitude >= 41.316667) AND '.
'(longitude <= 9.513333 AND longitude >= -5.140278) '.
') ';
return $condition;
}
private function getConditionSansPays() {
$condition = '(pays IS NULL OR pays = "XX" OR pays = "")';
return $condition;
}
private function getConditionCoordonneesValides() {
$condition = '(latitude IS NOT NULL AND longitude IS NOT NULL '.
' AND latitude != 0 AND latitude != "" '.
' AND longitude != 0 AND longitude != "" '.
' AND latitude >= -90 AND latitude <= 90 '.
' AND longitude >= -180 AND longitude <= 180) ';
return $condition;
}
 
public function creerColonneCodeInseeCalcule() {
$create = 'ALTER TABLE cel_obs '.
'ADD code_insee_calcule VARCHAR(5) NOT NULL ';
$this->requeter($create);
$this->reinitialiserTempsDerniereRequete();
}
 
public function ajouterCodeInseeCalcule($latitude, $longitude, $code_insee) {
$insert = 'UPDATE cel_obs '.
"SET ".
"code_insee_calcule = ".$this->proteger($code_insee)." ".
"WHERE latitude = ".$this->proteger($latitude)." ".
" AND longitude = ".$this->proteger($longitude)." ";
$this->requeter($insert);
$this->reinitialiserTempsDerniereRequete();
}
public function affecterPaysFranceAuxCommunesRenseignees() {
$update = "UPDATE cel_obs SET pays = 'FR' ".
"WHERE ".
"ce_zone_geo LIKE 'INSEE-C:_____' AND ".
"zone_geo != '' AND ".
"zone_geo IS NOT NULL AND ".
"(pays IS NULL OR pays = '') ";
return $this->executer($update);
}
 
public function modifierCodeInseeEtZoneGeo($coordonnees) {
$codeP = $this->proteger($coordonnees['code_insee']);
$codeInseeP = $this->proteger('INSEE-C:'.$coordonnees['code_insee']);
$nomP = $this->proteger($coordonnees['nom']);
$update = "UPDATE cel_obs ".
"SET ".
"pays = 'FR', ".
"code_insee_calcule = ".$codeP.", ".
"ce_zone_geo = ".$codeInseeP.", ".
"zone_geo = IF(zone_geo = '' OR zone_geo = NULL, ".$nomP.", zone_geo) ".
"WHERE ".
" latitude = ".$this->proteger($coordonnees['latitude'])." ".
" AND longitude = ".$this->proteger($coordonnees['longitude'])." ";
$this->requeter($update);
$this->reinitialiserTempsDerniereRequete();
}
public function modifierPays($coordonnees) {
$codePaysP = $this->proteger($coordonnees['code_pays']);
$nomP = $this->proteger($coordonnees['nom']);
$update = "UPDATE cel_obs ".
"SET ".
"pays = ".$codePaysP.", ".
"zone_geo = IF(zone_geo = '' OR zone_geo = NULL, ".$nomP.", zone_geo) ".
"WHERE ".
" latitude = ".$this->proteger($coordonnees['latitude'])." ".
" AND longitude = ".$this->proteger($coordonnees['longitude'])." ";
$this->requeter($update);
$this->reinitialiserTempsDerniereRequete();
}
 
// Il peut se passer assez de temps sans qu'aucune requete ne soit effectuée
// (cas d'un grand nombre d'enregistrements à la suite pour lesquels on ne trouve
// aucun département). Pour éviter cela on teste régulièrement la connection
public function testerActiviteConnection() {
$temps_courant = microtime(true);
$temps_depuis_derniere_requete = $temps_courant - $this->temps_derniere_requete;
if($temps_depuis_derniere_requete >= 18) {
$this->ping();
$this->reinitialiserTempsDerniereRequete();
}
}
 
private function reinitialiserTempsDerniereRequete() {
$this->temps_derniere_requete = microtime(true);
}
}
/branches/v3.00-serfouette/scripts/modules/migrat2019/Migrat2019.php
New file
0,0 → 1,206
<?php
// declare(encoding='UTF-8');
/**
* Migration des données CEL vers la base 2019 après avoir lancer le script nettoyage
*
* Utilisation :
* - migrer les mots-clés obs : <code>/opt/lamp/bin/php cli.php migration_mots_cles -a obs</code>
* - migrer les mots-clés images : <code>/opt/lamp/bin/php cli.php migration_mots_cles -a images</code>
*
* @category CEL
* @package Scripts
* @subpackage Migration : Mots-Clés
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
 
class Migrat2019 extends Script {
 
private $mode;
private $bd_new_cel = "tb_new_cel";
public function __construct($script_nom, $parametres_cli) {
parent::__construct($script_nom, $parametres_cli);
$this->bdd = new Bdd();
$this->bd_new_cel = Config::get('nettoyage.cel_new');
$this->bd_cel = Config::get('nettoyage.cel_nettoye');
}
 
public function executer() {
$cmd = $this->getParametre('a');
$this->mode_verbeux = $this->getParametre('v');
 
switch($cmd) {
case 'tout' :
$this->migrerObservations();
$this->migrerProjet();
$this->migrerObsEtendusChampsUtilisateur();
$this->migrerObsEtendusUtilisateur();
$this->migrerObsEtendusProjet();
$this->migrerMotsClesObs();
$this->migrerMotsClesObsLiaison();
$this->migrerImages();
$this->migrerMotsClesImages();
$this->migrerMotsClesImagesLiaison();
$this->ajouterIdProjet();
break;
case 'obs':
$this->migrerObservations();
break;
case 'projet':
$this->migrerProjet();
break;
case 'obs_etendus':
$this->migrerObsEtendusChampsUtilisateur();
$this->migrerObsEtendusUtilisateur();
$this->migrerObsEtendusProjet();
break;
case 'obs_mots_cles':
$this->migrerMotsClesObs();
$this->migrerMotsClesObsLiaison();
break;
case 'images':
$this->migrerImages();
break;
case 'images_tag':
$this->migrerMotsClesImages();
$this->migrerMotsClesImagesLiaison();
break;
case 'projet_id':
$this->ajouterIdProjet();
break;
default:
echo 'Méthode inconnue, les méthodes possibles sont obs et images'."\n";
}
}
 
private function migrerObservations() {
$requete = "ALTER TABLE ".$this->bd_new_cel.".`occurrence` ADD IF NOT EXISTS project varchar(50);";
$this->bdd->requeter($requete);
$requete = "INSERT INTO ".$this->bd_new_cel.".`occurrence`
(id, project, user_id, user_email, user_pseudo, date_observed, date_created, date_updated, date_published, user_sci_name, user_sci_name_id, accepted_sci_name, accepted_sci_name_id, family, certainty, annotation, coef, phenology, input_source, is_public, is_visible_in_cel, geometry, elevation, geodatum, locality, locality_insee_code, sublocality, environment, locality_consistency, station, published_location, osm_country, taxo_repo)
SELECT id_observation, CASE WHEN `mots_cles_texte` like '%sauvages%' then 'sauvages' WHEN `mots_cles_texte` like '%missions-flore%' then 'missions-flore' WHEN `mots_cles_texte` like '%arbres-tetards%' then 'arbres-tetards' WHEN `mots_cles_texte` like '%arbres-remarquables%' then 'arbres-remarquables' WHEN `mots_cles_texte` like '%bellesdemarue%' then 'bellesdemarue' WHEN `mots_cles_texte` like '%biodiversite34%' then 'biodiversite34' WHEN `mots_cles_texte` like '%messicoles%' then 'messicoles' WHEN `mots_cles_texte` like '%florileges%' then 'florileges' END,
ce_utilisateur, courriel_utilisateur, concat (prenom_utilisateur, ' ', nom_utilisateur), date_observation, date_creation, date_modification, date_transmission, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, famille, certitude, commentaire, abondance, phenologie, input_source, transmission, 1,
CONCAT('{\"type\":\"Point\",\"coordinates\":[', longitude, ',', latitude,']}'), altitude, geodatum, zone_geo, ce_zone_geo, lieudit, milieu, locality_consistency, station, published_location, pays, nom_referentiel
FROM ".$this->bd_cel.".`cel_obs`";
 
$this->bdd->requeter($requete);
}
private function migrerObsEtendusChampsUtilisateur() {
$requete = "ALTER TABLE ".$this->bd_new_cel.".`user_custom_field` ADD IF NOT EXISTS `field_id` VARCHAR(500) NOT NULL AFTER `default_value`;";
$this->bdd->requeter($requete);
$requete = "INSERT INTO ".$this->bd_new_cel.".`user_custom_field`
(name, data_type, default_value, field_id)
SELECT label, 'Texte', '', cle
FROM ".$this->bd_cel.".`cel_catalogue_champs_etendus`
WHERE `cle` not in (SELECT `champ` FROM ".$this->bd_cel.".`cel_catalogue_champs_etendus_liaison`)";
$this->bdd->requeter($requete);
}
private function migrerObsEtendusUtilisateur() {
$requete = "INSERT INTO ".$this->bd_new_cel.".`user_custom_field_occurrence`
(`occurrence_id`, `user_custom_field_id`, `value`)
SELECT `id_observation`, id, `valeur`
FROM ".$this->bd_cel.".`cel_obs_etendues`
RIGHT JOIN ".$this->bd_new_cel.".`user_custom_field` ON field_id = cle
WHERE id_observation in (select id FROM ".$this->bd_new_cel.".`occurrence`)";
$this->bdd->requeter($requete);
}
private function migrerObsEtendusProjet() {
$requete = "INSERT INTO ".$this->bd_new_cel.".`extended_field_occurrence`
(`occurrence_id`, `extended_field_id`, `value`)
SELECT `id_observation`, id, `valeur`
FROM ".$this->bd_cel.".`cel_obs_etendues`
RIGHT JOIN ".$this->bd_new_cel.".`extended_field` ON field_id = cle
WHERE id_observation in (select id FROM ".$this->bd_new_cel.".`occurrence`)";
$this->bdd->requeter($requete);
}
private function migrerProjet() {
$requete = "INSERT INTO ".$this->bd_new_cel.".`project_settings` (`id`, `project_id`, `project`, `language`, `title`, `logo`, `description`, `type`, `is_type`, `css_style`, `image_font`, `date_created`, `date_updated`, `taxo_restriction_type`, `taxo_restriction_value`, `location_type`, `location`, `published_location`, `environment`, `project_tag_name`, `info`)
SELECT * FROM ".$this->bd_cel.".`project_settings`";
$this->bdd->requeter($requete);
$requete = "INSERT INTO ".$this->bd_new_cel.".`extended_field` (`id`, `project_id`, `field_id`, `project`, `data_type`, `is_visible`, `is_mandatory`, `min_value`, `max_value`, `regexp`, `unit`)
SELECT * FROM ".$this->bd_cel.".`extended_field`";
$this->bdd->requeter($requete);
$requete = "INSERT INTO ".$this->bd_new_cel.".`extendedfield_translation`(`id`, `extended_field_id`, `project`, `label`, `description`, `default_value`, `error_message`, `language_iso_code`, `help`)
SELECT * FROM ".$this->bd_cel.".`extendedfield_translation`";
$this->bdd->requeter($requete);
}
private function migrerMotsClesObs() {
$requete = "INSERT INTO ".$this->bd_new_cel.".user_occurrence_tag
(id, user_id, name, path)
SELECT id_mot_cle, id_utilisateur, mot_cle, chemin
FROM ".$this->bd_cel.".`cel_arbre_mots_cles_obs`";
$this->bdd->requeter($requete);
}
private function migrerMotsClesObsLiaison() {
$requete = "INSERT INTO ".$this->bd_new_cel.".occurrence_user_occurrence_tag
(occurrence_id, user_occurrence_tag_id)
SELECT `id_element_lie`, `id_mot_cle` FROM ".$this->bd_cel.".`cel_mots_cles_obs_liaison`";
$this->bdd->requeter($requete);
}
private function migrerImages() {
$requete = "INSERT INTO ".$this->bd_new_cel.".photo
(id, occurrence_id, user_id, user_pseudo, user_email, date_shot, original_name, mime_type,
date_updated, date_created, date_linked_to_occurrence, content_url, size, url)
SELECT id_image, ce_observation, ce_utilisateur, prenom_utilisateur,
courriel_utilisateur, date_prise_de_vue, nom_original,'' , date_modification,
date_creation, date_liaison, '', '6444444',concat('https://api.tela-botanica.org/img:',
lpad(`id_image`, 9, '0'), 'O')
FROM ".$this->bd_cel.".cel_images";
$this->bdd->requeter($requete);
$requete_jpg = 'UPDATE `photo` SET `mime_type` = "image/jpeg", `content_url`= concat('.Config::get('nettoyage.chemin_photo').
',substr(lpad(id, 9, "0"),1,3),"/",substr(lpad(id, 9, "0"),4,3),"/O/",substr(lpad(id, 9, "0"),1,3),"_",substr(lpad(id, 9, "0"),4,3),"_",substr(lpad(id, 9, "0"),7,3),"_O",substr(`original_name` , char_length(`original_name`) - locate('.', reverse(`original_name`)) +1, locate('.', reverse(`original_name`))))
WHERE `original_name` like "%.jp%" and content_url = ""';
$this->bdd->requeter($requete_jpg);
$requete_png = 'UPDATE `photo` SET `mime_type` = "image/png", `content_url`= concat('.Config::get('nettoyage.chemin_photo').
',substr(lpad(id, 9, "0"),1,3),"/",substr(lpad(id, 9, "0"),4,3),"/O/",substr(lpad(id, 9, "0"),1,3),"_",substr(lpad(id, 9, "0"),4,3),"_",substr(lpad(id, 9, "0"),7,3),"_O",substr(`original_name` , char_length(`original_name`) - locate('.', reverse(`original_name`)) +1, locate('.', reverse(`original_name`))))
WHERE `original_name` like "%.png" and content_url = ""';
$this->bdd->requeter($requete_png);
'UPDATE `photo` SET `mime_type` = "image/jpeg", `content_url`= concat('.Config::get('nettoyage.chemin_photo').
',substr(lpad(id, 9, "0"),1,3),"/",substr(lpad(id, 9, "0"),4,3),"/O/",substr(lpad(id, 9, "0"),1,3),"_",substr(lpad(id, 9, "0"),4,3),"_",substr(lpad(id, 9, "0"),7,3),"_O.jpg")
WHERE content_url = "" and (`original_name` != "" or `original_name` is null)';
}
 
private function migrerMotsClesImages() {
$requete = "INSERT INTO ".$this->bd_new_cel.".photo_tag
(id, user_id, name, path)
SELECT id_mot_cle, id_utilisateur, mot_cle, chemin
FROM ".$this->bd_cel.".`cel_arbre_mots_cles_images`";
$this->bdd->requeter($requete);
}
private function migrerMotsClesImagesLiaison() {
$requete = "INSERT INTO ".$this->bd_new_cel.".photo_tag_photo
(photo_id, photo_tag_id)
SELECT `id_element_lie`, `id_mot_cle` FROM ".$this->bd_cel.".`cel_mots_cles_images_liaison`";
$this->bdd->requeter($requete);
}
private function ajouterIdProjet() {
$requete = "UPDATE ".$this->bd_new_cel.".`project_settings` SET `project_id` = `id`";
$this->bdd->requeter($requete);
$requete = "INSERT INTO ".$this->bd_new_cel.".`tb_project`(`id`, `label`, `is_private`) SELECT `id`, `project`, '0' FROM ".$this->bd_new_cel.".`project_settings` ";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_new_cel.".`extended_field` f right join ".$this->bd_new_cel.".`project_settings` s on
s.`project` = f.`project` SET f.`project_id` = s.`project_id`";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_new_cel.".`occurrence` o right join ".$this->bd_new_cel.".`project_settings` s on
s.`project` = o.`project` SET o.`project_id` = s.`project_id`";
$this->bdd->requeter($requete);
}
 
 
}
/branches/v3.00-serfouette/scripts/modules/nettoyage/Nettoyage.php
New file
0,0 → 1,951
<?php
// declare(encoding='UTF-8');
/**
* Classe de nettoyage de la base de données du CEL.
* Suppression des antislash
* Remplacement des chaines vides par des NULL
* Unifier les référentiels : pas de nom de version, majuscule...
* Unifier les certitudes
* Supprimer les INSEE-C: non rempli, les dates 0000-00
*
* Utilisation :
* - <code>/opt/lamp/bin/php cli.php nettoyage -a (voir méthode executer)</code>
*
* @category CEL
* @package Scripts
* @subpackage Nettoyage
* @author Delphine CAUQUIL <delphine@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>
* @copyright 1999-2016 Tela Botanica <accueil@tela-botanica.org>
*/
class Nettoyage extends Script {
 
protected $bdd;
protected $colonnes;
protected $bd_cel = "tb_nettoye_cel";
protected $bd_del = "tb_del";
protected $bd_flore = "tb_eflore";
 
 
public function __construct($script_nom, $parametres_cli) {
parent::__construct($script_nom, $parametres_cli);
$this->bdd = new Bdd();
$this->bd_cel = Config::get('nettoyage.cel_nettoye');
$this->bd_del = Config::get('nettoyage.del');
$this->bd_flore = Config::get('nettoyage.flore');
}
 
public function executer() {
$cmd = $this->getParametre('a');
$requete_colonnes = "SELECT column_name FROM information_schema.columns WHERE table_name = 'cel_obs' AND table_schema='".$this->bd_cel."';";
$this->colonnes = $this->bdd->recupererTous($requete_colonnes);
try {
switch ($cmd) {
case 'tout' :
$this->supprimerRetourLigne();
$this->supprimerAntislash();
$this->supprimerGuillemet();
$this->unifierNull();
$this->unifierNomReferentiel();
$this->unifierCertitude();
//$this->supprimerCertitudeAutre();
$this->unifierUtilisateur();
$this->unifierPhenologie();
$this->verifierCodeInsee();
$this->verifierGeodatum();
$this->supprimerInfosLiesObsInexistante();
$this->supprimerImagesetTagAnonymes();
$this->analyserMotsCles();
$this->changerSensible();
$this->unifierNull();
break;
case 'supprimerRetourLigne' :
$this->supprimerRetourLigne();
break;
case 'supprimerAntislash' :
$this->supprimerAntislash();
break;
case 'supprimerGuillemet' :
$this->supprimerGuillemet();
break;
case 'unifierNomReferentiel' :
$this->unifierNomReferentiel();
break;
case 'unifierCertitude' :
$this->unifierCertitude();
break;
case 'supprimerCertitudeAutre' : // après unifier certitude si les autres valeurs sont bien à supprimer
$this->supprimerCertitudeAutre();
break;
case 'analyserMotsCles' : // après unifier certitude si les autres valeurs sont bien à supprimer
$this->analyserMotsCles();
break;
case 'verifierGeodatum' :
$this->verifierGeodatum();
break;
case 'verifierCodeInsee' :
$this->verifierCodeInsee();
break;
case 'sensible' :
$this->changerSensible();
break;
case 'unifierNull' : // lancer en dernier pour bien réussir
$this->unifierNull();
break;
case 'supprimerImagesetTagAnonymes' :
$this->supprimerImagesetTagAnonymes();
break;
case 'supprimerInfosLiesObsInexistante' :
$this->supprimerInfosLiesObsInexistante();
break;
case 'unifierUtilisateur' :
$this->unifierUtilisateur();
break;
case 'unifierInfosEspece' :
$this->unifierInfosEspeces();
break;
case 'unifierPhenologie' :
$this->unifierPhenologie();
break;
default :
$msg = "Erreur : la commande '$cmd' n'existe pas!\n".
"Commandes existantes : regenererMotsClesTexteObs, regenererMotsClesTexteImages"
. ", regenererMotsClesTexteObsTout, regenererMotsClesTexteImagesTout"
. ", viderMotsClesTexteImagesSansMotsCles, viderMotsClesTexteObsSansMotsCles"
. ", regenererChampsTailleImage, reparerLiaisonsOublieesObs, reparerLiaisonsOublieesImages"
. ", reparerLiaisonsObsParMotsClesTexte, reductionMotsClesImages, reductionMotsClesImagesUtil"
. ", reduireEtNormaliserMotsClesImagesUtil, reduireEtNormaliserMotsClesImages"
. ", reductionMotsClesObs, reductionMotsClesObsUtil, reduireEtNormaliserMotsClesObsUtil"
. ", reduireEtNormaliserMotsClesObs";
throw new Exception($msg);
}
} catch (Exception $e) {
$this->traiterErreur($e->getMessage());
}
}
 
private function supprimerRetourLigne() {
foreach ($this->colonnes as $id=>$colonne) {
echo "Suppression des retour ligne dans la colonne ".$colonne['column_name']." ...";
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].', "\n", "")';
$this->bdd->requeter($requete);
echo "effectuée \n";
}
}
private function supprimerAntislash() {
foreach ($this->colonnes as $id=>$colonne) {
echo "Suppression des antislash dans la colonne ".$colonne['column_name']." ...";
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].', "\\\", "")';
$this->bdd->requeter($requete);
echo "effectuée \n";
}
}
private function supprimerGuillemet() {
foreach ($this->colonnes as $id=>$colonne) {
echo "Suppression des guillements dans la colonne ".$colonne['column_name']." ...";
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET ".$colonne['column_name']." = REPLACE(".$colonne['column_name'].',"\"", "")';
$this->bdd->requeter($requete);
echo "effectuée \n";
}
}
private function unifierNull() {
foreach ($this->colonnes as $id=>$colonne) {
echo "Suppression des vides dans la colonne ".$colonne['column_name']." ...";
$dsl = array( 'transmission', 'altitude');
if (isset($dsl[$colonne['column_name']])) {
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET ".$colonne['column_name']." = NULL WHERE trim(".$colonne['column_name'].") = '' and ".$colonne['column_name']." != '0'";
} else {
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET ".$colonne['column_name']." = NULL WHERE trim(".$colonne['column_name'].") = '' OR ".$colonne['column_name']." IN ('INSEE-C:', '0000-00-00 00:00:00', '0.00000')";
}
$this->bdd->requeter($requete);
echo "effectuée \n";
}
}
private function unifierCertitude() {
echo "Uniformisation du champ certitude/identification";
$certitude = array("A déterminer" => "à déterminer",
"À déterminer, voir photo" => "à déterminer",
"A déterminer" => "à déterminer",
"aDeterminer" => "à déterminer",
"déterminer" => "à déterminer",
"Inconnue" => "à déterminer",
"Ceraine" => "certain",
"certain" => "certain",
"Certainaaua" => "certain",
"Certaine" => "certain",
"Certaine K- rhizines blanche" => "certain",
"Certaine ( mais voir notes)" => "certain",
"Certaine (à 99%)" => "certain",
"Certaine Anett" => "certain",
"Certaine Anette" => "certain",
"Certaine Valériane officinale" => "certain",
"Certaine, Faite et confirmée par JM BERAUD" => "certain",
"Certaine, par Jean Lebail" => "certain",
"Certaine, subsp. minus" => "certain",
"Certainea" => "certain",
"Certaineanno" => "certain",
"Certainearia n" => "certain",
"Certainee" => "certain",
"Certainej" => "certain",
"Certainel" => "certain",
"CertaineNom de travai" => "certain",
"CertaineNom de travail" => "certain",
"Certainesites" => "certain",
"Certainesous-bois de feuillus en versant sud à sud-ouest" => "certain",
"Certaineu" => "certain",
"sure" => "certain",
"validée sur forum Naturalistes de l'ouest" => "certain",
"à confirmer" => "douteux",
"à approfondir" => "douteux",
"à cofirmer" => "douteux",
"À confiermer" => "douteux",
"A confirlmer" => "douteux",
"A confirmer" => "douteux",
"à confirmer vs. pumilum" => "douteux",
"à conirmer" => "douteux",
"à vérifier" => "douteux",
"douteuse" => "douteux",
"Douteuse (canadensis ?)" => "douteux",
"Douteuse ?" => "douteux",
"Douteuse à confirmer" => "douteux",
"Douteuse peut-être cordata" => "douteux",
"Douteuse, fleurs rouges" => "douteux",
"douteux" => "douteux",
"espèce bisannuelle mais non bien déterminée" => "douteux",
"Incertaine" => "douteux",
"Pavot douteux" => "douteux",
"Potentille ansérine, supposé" => "douteux",
"presque certaine" => "douteux",
"Quasi Certaine" => "douteux",
"ssp déterminer" => "douteux",
"subsp à vérifier" => "douteux",
"subsp. microphyllum ?" => "douteux",
"très douteuse" => "douteux",
"Très probable" => "douteux");
foreach ($certitude as $valeur=>$saisie) {
$requete = 'UPDATE '.$this->bd_cel.'.cel_obs SET commentaire = concat(commentaire, " Certitude : ", certitude), certitude = "'.$saisie.'" WHERE certitude ="'.$valeur.'"';
$this->bdd->requeter($requete);
echo "effectuée \n";
}
$requete_verif = "SELECT certitude FROM ".$this->bd_cel.".cel_obs WHERE certitude NOT IN ('douteux', 'certain', 'à déterminer', '') and certitude is not NULL";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
}
private function supprimerCertitudeAutre() {
echo "suppression des valeurs non compréhensible du champ certitude/identification";
$requete = "UPDATE ".$this->bd_cel.".cel_obs
SET commentaire = case isnull(commentaire) when 1 THEN certitude ELSE concat(commentaire, ' Certitude : ', certitude) END,
certitude = '' WHERE `certitude` NOT IN ('douteux', 'certain', 'à déterminer', '') and certitude is not NULL";
$this->bdd->requeter($requete);
echo "effectuée \n";
$requete_verif = "SELECT certitude FROM ".$this->bd_cel.".cel_obs WHERE certitude NOT IN ('douteux', 'certain', 'à déterminer', '') and certitude is not NULL";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
}
private function unifierPhenologie() {
echo "Uniformisation du champ phenologie";
$phenologie = array("2" => "00-09: germination, développement des bourgeons",
"5" => "00-09: germination, développement des bourgeons",
"5" => "00-09: germination, développement des bourgeons",
"8" => "00-09: germination, développement des bourgeons",
"8" => "00-09: germination, développement des bourgeons",
"9" => "00-09: germination, développement des bourgeons",
"00-09" => "00-09: germination, développement des bourgeons",
"Germination, développement des bourgeons" => "00-09: germination, développement des bourgeons",
"10" => "10-19: développement des feuilles",
"11" => "10-19: développement des feuilles",
"12" => "10-19: développement des feuilles",
"14" => "10-19: développement des feuilles",
"15" => "10-19: développement des feuilles",
"16" => "10-19: développement des feuilles",
"17" => "10-19: développement des feuilles",
"18" => "10-19: développement des feuilles",
"19" => "10-19: développement des feuilles",
"10-19" => "10-19: développement des feuilles",
"10-19: développement des feui" => "10-19: développement des feuilles",
"10-19: développement des feuilles" => "10-19: développement des feuilles",
"15: environ % des feuilles épanouies" => "10-19: développement des feuilles",
"19 environ 50% des feuilles épanouies" => "10-19: développement des feuilles",
"en feuilles" => "10-19: développement des feuilles",
"Feuille" => "10-19: développement des feuilles",
"feuille peu dvt, a confirmer" => "10-19: développement des feuilles",
"feuilles seulement" => "10-19: développement des feuilles",
"20" => "20-29: formation de pousses latérales, tallage",
"Formation de pousses latérales, tallage" => "20-29: formation de pousses latérales, tallage",
"30" => "30-39: développement des tiges, croissance des rosettes",
"35" => "30-39: développement des tiges, croissance des rosettes",
"36" => "30-39: développement des tiges, croissance des rosettes",
"38" => "30-39: développement des tiges, croissance des rosettes",
"39" => "30-39: développement des tiges, croissance des rosettes",
"3: développement des tiges, croissance des rosettes" => "30-39: développement des tiges, croissance des rosettes",
"Développement des tiges, croissance des rosettes" => "30-39: développement des tiges, croissance des rosettes",
"40" => "40-49: développement des organes de propagation végétative",
"43" => "40-49: développement des organes de propagation végétative",
"45" => "40-49: développement des organes de propagation végétative",
"46" => "40-49: développement des organes de propagation végétative",
"48" => "40-49: développement des organes de propagation végétative",
"49" => "40-49: développement des organes de propagation végétative",
"40-49" => "40-49: développement des organes de propagation végétative",
"40-49: développement des organes de propagation végétative" => "40-49: développement des organes de propagation végétative",
"40-49: développement des organes de propagation végétativegt" => "40-49: développement des organes de propagation végétative",
"40-49: développement des organes de propagation végétativepas d'inflorescence" => "40-49: développement des organes de propagation végétative",
"50" => "50-59 : apparition de l’inflorescence",
"56" => "50-59 : apparition de l’inflorescence",
"57" => "50-59 : apparition de l’inflorescence",
"58" => "50-59 : apparition de l’inflorescence",
"59" => "50-59 : apparition de l’inflorescence",
"10x En bouton" => "50-59 : apparition de l’inflorescence",
"14x En bouton" => "50-59 : apparition de l’inflorescence",
"20x En bouton" => "50-59 : apparition de l’inflorescence",
"30-39" => "50-59 : apparition de l’inflorescence",
"50-59" => "50-59 : apparition de l’inflorescence",
"50-59: apparition de l'inflorescence, épiais" => "50-59 : apparition de l’inflorescence",
"50-59: apparition de l'inflorescence, épiaison" => "50-59 : apparition de l’inflorescence",
"59: apparition de l'inflorescence, épiaison" => "50-59 : apparition de l’inflorescence",
"8x En bouton" => "50-59 : apparition de l’inflorescence",
"60" => "60-69 : floraison",
"62" => "60-69 : floraison",
"63" => "60-69 : floraison",
"64" => "60-69 : floraison",
"66" => "60-69 : floraison",
"67" => "60-69 : floraison",
"68" => "60-69 : floraison",
"69" => "60-69 : floraison",
" floraison " => "60-69 : floraison",
"-69: floraison" => "60-69 : floraison",
"10x Fin de floraison" => "60-69 : floraison",
"12x Pleine floraison" => "60-69 : floraison",
"14x Début de floraison" => "60-69 : floraison",
"150x Pleine floraison" => "60-69 : floraison",
"17x Fin de floraison" => "60-69 : floraison",
"1x Début de floraison" => "60-69 : floraison",
"1x En fleur" => "60-69 : floraison",
"1x Fin de floraison" => "60-69 : floraison",
"1x Pleine floraison" => "60-69 : floraison",
"20x Début de floraison" => "60-69 : floraison",
"20x Pleine floraison" => "60-69 : floraison",
"25x Pleine floraison" => "60-69 : floraison",
"27x En fleur" => "60-69 : floraison",
"30x Fin de floraison" => "60-69 : floraison",
"35x Début de floraison" => "60-69 : floraison",
"35x Fin de floraison" => "60-69 : floraison",
"35x Pleine floraison" => "60-69 : floraison",
"3x Fin de floraison" => "60-69 : floraison",
"3x Pleine floraison" => "60-69 : floraison",
"40x Début de floraison" => "60-69 : floraison",
"44x Pleine floraison" => "60-69 : floraison",
"48x Pleine floraison" => "60-69 : floraison",
"4x Pleine floraison" => "60-69 : floraison",
"50x Pleine floraison" => "60-69 : floraison",
"5x Pleine floraison" => "60-69 : floraison",
"6: floraison" => "60-69 : floraison",
"60 : floraison en amorce, pétales jaunes, corolle non ouverte encore" => "60-69 : floraison",
"60-" => "60-69 : floraison",
"60-6: floraison" => "60-69 : floraison",
"60-65" => "60-69 : floraison",
"60-69" => "60-69 : floraison",
"60-69 floraison" => "60-69 : floraison",
"60-69 floraison +70-79: fructification" => "60-69 : floraison",
"60-69: florai" => "60-69 : floraison",
"60-69: florais" => "60-69 : floraison",
"60-69: floraison" => "60-69 : floraison",
"60-69: floraison - fructification" => "60-69 : floraison",
"60-69: floraison (8" => "60-69 : floraison",
"60-69: floraison 1 individu fleuri sur une trentaine" => "60-69 : floraison",
"60-69: floraison à 50 pour" => "60-69 : floraison",
"60-69: floraison Fleurs déjà fanées ou en cours de l'être" => "60-69 : floraison",
"60-69: floraison floraison" => "60-69 : floraison",
"60-69: floraison pour le 09/04/2019" => "60-69 : floraison",
"60-69: floraison5" => "60-69 : floraison",
"60-69: floraison6" => "60-69 : floraison",
"60-69: floraisondi" => "60-69 : floraison",
"60-69: floraisonentre les pierres du mur des quai" => "60-69 : floraison",
"60-69: floraisonfleurs et fruit" => "60-69 : floraison",
"60-69: floraisonl" => "60-69 : floraison",
"60-69: floraisonvi" => "60-69 : floraison",
"60-69: fructification" => "60-69 : floraison",
"60: floraison" => "60-69 : floraison",
"63: floraison" => "60-69 : floraison",
"63: environ 3% des fleurs épanouies" => "60-69 : floraison",
"64: floraison" => "60-69 : floraison",
"66, avec quelques fruits" => "60-69 : floraison",
"66: floraison" => "60-69 : floraison",
"67 : floraison" => "60-69 : floraison",
"67 Nbses fleurs épanouies," => "60-69 : floraison",
"67: floraison" => "60-69 : floraison",
"67: environ 70% des fleurs épanouies + formation de gousses." => "60-69 : floraison",
"68: environ 0% des fleurs épanouies" => "60-69 : floraison",
"68: floraison" => "60-69 : floraison",
"68: environ 50% des fleurs épanouies" => "60-69 : floraison",
"68: environ 80% des fleurs épanouies + formation des gousses." => "60-69 : floraison",
"68floraison" => "60-69 : floraison",
"69 (floraison de toutes fleurs)" => "60-69 : floraison",
"69-70" => "60-69 : floraison",
"69-70: fin de floraisonfructification" => "60-69 : floraison",
"69-70n" => "60-69 : floraison",
"69: 100% des fleurs épanouies" => "60-69 : floraison",
"69s" => "60-69 : floraison",
"82x Pleine floraison" => "60-69 : floraison",
"9: floraison" => "60-69 : floraison",
"début de ffloraison" => "60-69 : floraison",
"début floraison" => "60-69 : floraison",
"en fleurs" => "60-69 : floraison",
"environ 30% des fleurs épanouies" => "60-69 : floraison",
"environ 950% des fleurs épanouies" => "60-69 : floraison",
"fin d floraison" => "60-69 : floraison",
"fin de floraison" => "60-69 : floraison",
"fin floraison" => "60-69 : floraison",
"fl" => "60-69 : floraison",
"fl2" => "60-69 : floraison",
"fleur" => "60-69 : floraison",
"Fleurs" => "60-69 : floraison",
"fleurs épanouies; fin" => "60-69 : floraison",
"floraison" => "60-69 : floraison",
"Nombreux plants en début de floraison" => "60-69 : floraison",
"61" => "61: environ 10% des fleurs épanouies",
"10% des fleurs épanouies" => "61: environ 10% des fleurs épanouies",
"61 :" => "61: environ 10% des fleurs épanouies",
"61 : environ 10% des fleurs épanouies" => "61: environ 10% des fleurs épanouies",
"61: début defloraison" => "61: environ 10% des fleurs épanouies",
"61: floraison" => "61: environ 10% des fleurs épanouies",
"61: environ 10% des fleurs épanouie" => "61: environ 10% des fleurs épanouies",
"61: environ 10% des fleurs épanouies" => "61: environ 10% des fleurs épanouies",
"61: environ 10% des fleurs épanouies63" => "61: environ 10% des fleurs épanouies",
"61: environ 10% des fleurs épanouies68" => "61: environ 10% des fleurs épanouies",
"61: environ 2% des fleurs épanouies" => "61: environ 10% des fleurs épanouies",
"61: environ20% des fleurs épanouies" => "61: environ 10% des fleurs épanouies",
"Fleurs (environ 10% des fleurs épanouies)" => "61: environ 10% des fleurs épanouies",
"65" => "65: environ 50% des fleurs épanouies",
"65" => "65: environ 50% des fleurs épanouies",
"6: environ 50% des fleurs épanouies" => "65: environ 50% des fleurs épanouies",
"65 , avec quelques fruits" => "65: environ 50% des fleurs épanouies",
"65 : environ 80% des fleurs épanouies" => "65: environ 50% des fleurs épanouies",
"65 : environ 10% des fleurs ép" => "65: environ 50% des fleurs épanouies",
"65 : environ 50% des fleurs épa" => "65: environ 50% des fleurs épanouies",
"65 : environ 50% des fleurs épanouies" => "65: environ 50% des fleurs épanouies",
"65 : environ 50% des fleurs épanouies-75" => "65: environ 50% des fleurs épanouies",
"65-6: floraison" => "65: environ 50% des fleurs épanouies",
"65-69: floraison" => "65: environ 50% des fleurs épanouies",
"65-7: floraison" => "65: environ 50% des fleurs épanouies",
"65-72" => "65: environ 50% des fleurs épanouies",
"65:" => "65: environ 50% des fleurs épanouies",
"65: floraison" => "65: environ 50% des fleurs épanouies",
"65: environ 10% des fleurs épanouies" => "65: environ 50% des fleurs épanouies",
"65: environ 50% des fleurs épanoui" => "65: environ 50% des fleurs épanouies",
"65: environ 50% des fleurs épanouie6" => "65: environ 50% des fleurs épanouies",
"65: environ 50% des fleurs épanouies" => "65: environ 50% des fleurs épanouies",
"65: environ 50% des fleurs épanouies et fructification" => "65: environ 50% des fleurs épanouies",
"65: environ 50% des fleurs épanouies75" => "65: environ 50% des fleurs épanouies",
"65: environ 50% des fleurs épanouies78" => "65: environ 50% des fleurs épanouies",
"65:-70" => "65: environ 50% des fleurs épanouies",
"65:-75" => "65: environ 50% des fleurs épanouies",
"avec quelques fruits, 65" => "65: environ 50% des fleurs épanouies",
"nviron 50% des fleurs épanouies" => "65: environ 50% des fleurs épanouies",
"70" => "70-79: fructification",
"71" => "70-79: fructification",
"72" => "70-79: fructification",
"73" => "70-79: fructification",
"74" => "70-79: fructification",
"75" => "70-79: fructification",
"76" => "70-79: fructification",
"77" => "70-79: fructification",
"78" => "70-79: fructification",
"79" => "70-79: fructification",
"7: fructification" => "70-79: fructification",
"70-: fructification" => "70-79: fructification",
"70-71" => "70-79: fructification",
"70-79" => "70-79: fructification",
"70-79: floraison" => "70-79: fructification",
"70-79: fructification" => "70-79: fructification",
"70-79: fructification ?" => "70-79: fructification",
"70-79: fructification +floraison" => "70-79: fructification",
"70-79: fructification Entre autre" => "70-79: fructification",
"70-79: fructification, mais fruits verts" => "70-79: fructification",
"70-79: fructificationfleurs et fruit" => "70-79: fructification",
"70-79:fin floraison fructification" => "70-79: fructification",
"709: fructification" => "70-79: fructification",
"75: fructification" => "70-79: fructification",
"Début de ruits" => "70-79: fructification",
"fin floraison et fructification" => "70-79: fructification",
"fleur, fruit" => "70-79: fructification",
"fleurs e fructification" => "70-79: fructification",
"Fleurs et début fruits" => "70-79: fructification",
"Fleurs et début ruits" => "70-79: fructification",
"Fleurs et fructification" => "70-79: fructification",
"floraison - fructification" => "70-79: fructification",
"floraison zet fructification" => "70-79: fructification",
"Floraison, fructification" => "70-79: fructification",
"floraison(fin) fructification" => "70-79: fructification",
"floraison+ ou - finie" => "70-79: fructification",
"fr1" => "70-79: fructification",
"quelques fruits rares" => "70-79: fructification",
"stérile70-79: fructification" => "70-79: fructification",
"toutes les fleurs épanouies et début fructification" => "70-79: fructification",
"fleurs et fruits" => "70-79: fructification",
"Fleurs et jeunes fruits" => "70-79: fructification",
"floraison + fructification" => "70-79: fructification",
"Fructificaiton" => "70-79: fructification",
"fleurs et quelques fruits" => "70-79: fructification",
"Fleurs et surtout début defruits" => "70-79: fructification",
"floraison et fructification" => "70-79: fructification",
"fructification" => "70-79: fructification",
"Fleurs/fruits" => "70-79: fructification",
"fructification ?" => "70-79: fructification",
"80" => "80-89: maturité des fruits et des graines",
"81" => "80-89: maturité des fruits et des graines",
"82" => "80-89: maturité des fruits et des graines",
"83" => "80-89: maturité des fruits et des graines",
"84" => "80-89: maturité des fruits et des graines",
"86" => "80-89: maturité des fruits et des graines",
"87" => "80-89: maturité des fruits et des graines",
"88" => "80-89: maturité des fruits et des graines",
"89" => "80-89: maturité des fruits et des graines",
"-89: maturité des fruits et des graines" => "80-89: maturité des fruits et des graines",
"80-89" => "80-89: maturité des fruits et des graines",
"80-89: maturité des fruits et des graines" => "80-89: maturité des fruits et des graines",
"80-89: maturité des fruits et des graines,début sénescence" => "80-89: maturité des fruits et des graines",
"80-95" => "80-89: maturité des fruits et des graines",
"88 maturité des fruits et des graines" => "80-89: maturité des fruits et des graines",
"89: maturité des fruits et des graines" => "80-89: maturité des fruits et des graines",
"floraison et fructification, graines mûres" => "80-89: maturité des fruits et des graines",
"floraison et maturation des graines" => "80-89: maturité des fruits et des graines",
"fructification passée" => "80-89: maturité des fruits et des graines",
"Fruit" => "80-89: maturité des fruits et des graines",
"Fruits" => "80-89: maturité des fruits et des graines",
"85" => "85: 50% des fruits matures",
"50% des fruits matures (fructification d'Août)î" => "85: 50% des fruits matures",
"85, mais avec encore des fleurs" => "85: 50% des fruits matures",
"85:" => "85: 50% des fruits matures",
"85: fruits matures 20" => "85: 50% des fruits matures",
"85: 50% des fruits mature8" => "85: 50% des fruits matures",
"85: 50% des fruits matures" => "85: 50% des fruits matures",
"85: 50% des fruits matures0" => "85: 50% des fruits matures",
"85: 50% des fruits matures56" => "85: 50% des fruits matures",
"85: 50% des fruits matures88" => "85: 50% des fruits matures",
"88: 50% des fruits matures" => "85: 50% des fruits matures",
"90" => "90-99: sénescence et dormance",
"91" => "90-99: sénescence et dormance",
"92" => "90-99: sénescence et dormance",
"94" => "90-99: sénescence et dormance",
"95" => "90-99: sénescence et dormance",
"97" => "90-99: sénescence et dormance",
"98" => "90-99: sénescence et dormance",
"99" => "90-99: sénescence et dormance",
"100% de feuilles jaunes" => "90-99: sénescence et dormance",
"80% feuillage d'automne" => "90-99: sénescence et dormance",
"90-99" => "90-99: sénescence et dormance",
"90-99: sénescence et dormance" => "90-99: sénescence et dormance",
"95: environ 9% des feuilles jaunes" => "90-99: sénescence et dormance"
);
foreach ($phenologie as $valeur=>$saisie) {
$requete = 'UPDATE '.$this->bd_cel.'.cel_obs SET commentaire = concat(commentaire, " Certitude : ", certitude), phenologie = "'.$saisie.'" WHERE phenologie ="'.$valeur.'"';
$this->bdd->requeter($requete);
echo "effectuée \n";
}
$requete_verif = "SELECT certitude FROM ".$this->bd_cel.".cel_obs WHERE certitude NOT IN ('douteux', 'certain', 'à déterminer', '') and certitude is not NULL";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
}
private function unifierUtilisateur() {
echo "vérification de la présence de l'annuaire \n";
$requete = "SELECT * FROM ".$this->bd_cel.".`users`;";
$result = $this->bdd->requeter($requete);
if ($result === NULL) {echo $requete;
echo "Il manque la table annuaire (à recopier de telaorg users\n";
exit;
}
echo "suppression de le colonne ordre \n";
$requete = "ALTER TABLE ".$this->bd_cel.".cel_obs DROP INDEX id_obs;";
$this->bdd->requeter($requete);
$requete = "ALTER TABLE ".$this->bd_cel.".cel_obs DROP INDEX ordre;";
$this->bdd->requeter($requete);
$requete = "ALTER TABLE ".$this->bd_cel.".`cel_obs` DROP IF EXISTS `ordre`;";
$this->bdd->requeter($requete);
$requete = "ALTER TABLE ".$this->bd_cel.".`cel_obs` ADD IF NOT EXISTS pseudo varchar(250);";
$this->bdd->requeter($requete);
echo "modification des observations ayant une adresse mail en identifiant";
$requete_annu_mail = "UPDATE ".$this->bd_cel.".`cel_obs` right join ".$this->bd_cel.".`users` ON `user_email` = ce_utilisateur SET `ce_utilisateur` = `ID`, pseudo = user_nicename,
`courriel_utilisateur` = `user_email` WHERE ce_utilisateur like '%@%'";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "modification des observations ayant une adresse mail mais pas d'identifiant";
$requete_annu_mail = "UPDATE ".$this->bd_cel.".`cel_obs` join ".$this->bd_cel.".`users` ON `user_email` = courriel_utilisateur SET `ce_utilisateur` = `ID`, pseudo = user_nicename,
`courriel_utilisateur` = `user_email` WHERE (ce_utilisateur IS NULL OR CHAR_LENGTH(ce_utilisateur) > 6
OR ce_utilisateur = 0) and courriel_utilisateur like '%@%'";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "modification des observations ayant un identifiant";
$requete_annu_mail = "UPDATE ".$this->bd_cel.".`cel_obs` join ".$this->bd_cel.".`users` ON ID = ce_utilisateur SET pseudo = user_nicename,
`courriel_utilisateur` = `user_email` WHERE (ce_utilisateur IS NULL OR char_length(ce_utilisateur) > 6) and (courriel_utilisateur is null or courriel_utilisateur='')";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "suppression des autres valeurs ce_utilisateur";
$requete_annu_mail = "UPDATE ".$this->bd_cel.".`cel_obs` SET ce_utilisateur = NULL, courriel_utilisateur = if (ce_utilisateur like '%@%'and (courriel_utilisateur is null or courriel_utilisateur='') , ce_utilisateur, courriel_utilisateur) WHERE ce_utilisateur IS NOT NULL AND char_length(ce_utilisateur) > 6";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "suppression des obs anonymes";
$requete_anonyme = "DELETE FROM ".$this->bd_cel.".`cel_obs` WHERE (ce_utilisateur IS NULL OR char_length(ce_utilisateur) > 6
OR ce_utilisateur = 0) and (`courriel_utilisateur` is null or `courriel_utilisateur` not like '%@%')";
$this->bdd->requeter($requete_anonyme);
$requete_verif = "SELECT `ce_utilisateur`, `prenom_utilisateur`, `nom_utilisateur`, `courriel_utilisateur` FROM ".$this->bd_cel.".cel_obs
WHERE ce_utilisateur IS NOT NULL OR char_length(ce_utilisateur) > 6";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
echo "effectuée \n";
$this->unifierUtilisateurTag("cel_arbre_mots_cles_obs");
$this->unifierUtilisateurTag("cel_arbre_mots_cles_images");
}
private function unifierUtilisateurTag($table) {
echo "séparation des identifiants en ce_utilisateur et courriel";
$requete = "ALTER TABLE ".$this->bd_cel.".".$table." ADD courriel varchar(255);";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".".$table." SET courriel = id_utilisateur,
id_utilisateur = NULL WHERE id_utilisateur like '%@%';";
$this->bdd->requeter($requete);
echo "recherche des identifiants pour les tags ayant que des courriels dans users";
$requete = "UPDATE ".$this->bd_cel.".".$table." join ".$this->bd_cel.".`users` ON `user_email` = courriel SET `id_utilisateur` = `ID`
WHERE courriel like '%@%';";
$this->bdd->requeter($requete);
echo "recherche des identifiants pour les tags ayant que des courriels dans obs";
$requete = "UPDATE ".$this->bd_cel.".".$table." t join ".$this->bd_cel.".`cel_obs` o ON
`courriel` = courriel_utilisateur SET t.`id_utilisateur` = o.`ce_utilisateur`
WHERE courriel_utilisateur like '%@%';";
$this->bdd->requeter($requete);
echo "suppression des tags sans identifiant";
$requete_anonyme = "DELETE FROM ".$this->bd_cel.".".$table." WHERE
(id_utilisateur IS NULL OR trim(id_utilisateur) = '') OR char_length(id_utilisateur) > 6";
$this->bdd->requeter($requete_anonyme);
if ($table == "cel_arbre_mots_cles_obs") {
$requete_anonyme = "DELETE FROM ".$this->bd_cel.".`cel_mots_cles_obs_liaison`
WHERE `id_element_lie` not in (SELECT `id_observation` FROM ".$this->bd_cel.".`cel_obs`)
OR `id_mot_cle` NOT IN (SELECT `id_mot_cle` FROM ".$this->bd_cel.".`cel_arbre_mots_cles_obs`);";
$this->bdd->requeter($requete_anonyme);
} else {
$requete_anonyme = "DELETE FROM ".$this->bd_cel.".`cel_mots_cles_images_liaison`
WHERE `id_element_lie` not in (SELECT `id_image` FROM ".$this->bd_cel.".`cel_images`)
OR `id_mot_cle` NOT IN (SELECT `id_mot_cle` FROM ".$this->bd_cel.".`cel_arbre_mots_cles_images`);";
$this->bdd->requeter($requete_anonyme);
}
}
private function unifierInfosEspeces() {
echo "maj infos espèces \n";
/*$requete = "ALTER TABLE ".$this->bd_cel.".`cel_obs` ADD infosnn varchar(2),
ADD bd_nom_sci varchar(250), ADD bd_num_nom int(11), ADD bd_nom_sci_retenu varchar(250),
ADD bd_num_nom_retenu int(11) ;";
$this->bdd->requeter($requete);
*/
$liste_referentiels = array("bdtfx" => "bdtfx_v6_00", "bdtre" => "bdtre_v1_00",
"isfan" => "isfan_v2013", "apd" => "apd_v3_4_0", "bdtxa" => "bdtxa_v1_01",
"aublet" => "aublet_v2016_09", "florical" => "florical_v2016_04_22", "lbf" => "lbf_v1_00");
$this->unifierInfosEspecesBDTFX();
foreach ($liste_referentiels as $ref => $version) {
//Num nom et nom sci sont les mêmes
// chercher les versions
$requete = "UPDATE ".$this->bd_cel.".`cel_obs`
join (SELECT `num_nom`, `num_nom_retenu`, `nom_sci`,
case when annee = '' THEN concat(`nom_sci`, ' ', auteur) ELSE concat(`nom_sci`, ' ', auteur, ' [',annee,']') END as nom_sci_complet,
nom_sci_complet_ret FROM ".$this->bd_flore.".".$version.
'left join (select `num_nom` as nn, `nom_sci` as nom_sci_ret,
case when annee = "" THEN concat(`nom_sci`, " ", auteur) ELSE concat(`nom_sci`, " ", auteur, " [",annee,"]") END as nom_sci_complet_ret
from ".$this->bd_flore.".".$version." where `num_nom` = `num_nom_retenu`) ret
on `num_nom_retenu` = nn) bdtfx
on `nom_sel_nn` = num_nom and `nom_sel` like concat(nom_sci,"%")
SET `nom_sel` = nom_sci_complet, `nom_sel_nn` = num_nom , `nom_ret` = nom_sci_complet_ret, `nom_ret_nn` = num_nom_retenu,
infosnn = 1
WHERE nom_referentiel = "'.$ref.'"';
$this->bdd->requeter($requete);
//Num nom id, nom sci !=
$requete = "UPDATE ".$this->bd_cel.".`cel_obs`
join (SELECT `num_nom`, `num_nom_retenu`, `nom_sci`,
case when annee = '' THEN concat(`nom_sci`, ' ', auteur) ELSE concat(`nom_sci`, ' ', auteur, ' [',annee,']') END as nom_sci_complet,
nom_sci_complet_ret FROM ".$this->bd_flore.".".$version.
'left join (select `num_nom` as nn, `nom_sci` as nom_sci_ret,
case when annee = "" THEN concat(`nom_sci`, " ", auteur) ELSE concat(`nom_sci`, " ", auteur, " [",annee,"]") END as nom_sci_complet_ret
from ".$this->bd_flore.".".$version." where `num_nom` = `num_nom_retenu`) ret
on `num_nom_retenu` = nn) bdtfx
on `nom_sel_nn` = num_nom and and (nom_sel like concat(nom_sci,"%") and nom_ret like concat(nom_sci,"%"))
and (nom_sel like concat(nom_sci_ret,"%") and nom_ret like concat(nom_sci_ret,"%"))
SET `nom_sel` = nom_sci_complet, `nom_sel_nn` = num_nom , `nom_ret` = nom_sci_complet_ret, `nom_ret_nn` = num_nom_retenu,
infosnn = 2
WHERE nom_referentiel = "'.$ref.'" and infosnn != 1';
$this->bdd->requeter($requete);
//
}
}
private function unifierInfosEspecesBDTFX() {
echo "maj infos espèces \n";
/*$requete = "ALTER TABLE ".$this->bd_cel.".`cel_obs` ADD infosnn varchar(2),
ADD bd_nom_sci varchar(250), ADD bd_num_nom int(11), ADD bd_nom_sci_retenu varchar(250),
ADD bd_num_nom_retenu int(11) ;";
$this->bdd->requeter($requete);
*/
//Num nom et nom sci sont les mêmes
// chercher les versions
$requete = "UPDATE ".$this->bd_cel.".`cel_obs`"
.' join bdtfx on `nom_sel_nn` = num_nom and `nom_sel` like concat(nom_sci, "%")
SET `nom_sel` = nom_sci_complet, `nom_sel_nn` = num_nom ,
`nom_ret` = nom_ret_complet, `nom_ret_nn` = num_nom_retenu,
infosnn = 1
where `nom_referentiel` = "bdtfx" ';
$this->bdd->requeter($requete);
//Num nom id, nom sci +-=
$requete = "UPDATE ".$this->bd_cel.".`cel_obs`"
.' join bdtfx on `nom_sel_nn` = num_nom and and (nom_sel like concat(nom_sci,"%") and nom_ret like concat(nom_sci,"%"))
and (nom_sel like concat(nom_sci_ret,"%") and nom_ret like concat(nom_sci_ret,"%"))
SET `nom_sel` = nom_sci_complet, `nom_sel_nn` = num_nom ,
`nom_ret` = nom_ret_complet, `nom_ret_nn` = num_nom_retenu,
infosnn = 2
where `nom_referentiel` = "bdtfx" and infosnn != "1"';
$this->bdd->requeter($requete);
//Num nom id, nom sci +-=
$requete = "UPDATE ".$this->bd_cel.".`cel_obs`"
.' join bdtfx on `nom_sel_nn` = num_nom and and (nom_sel not like concat(nom_sci,"%") and nom_ret not like concat(nom_sci,"%"))
and (nom_sel not like concat(nom_sci_ret,"%") and nom_ret not like concat(nom_sci_ret,"%"))
SET `bd_nom_sci` = nom_sci_complet, `bd_num_nom` = num_nom ,
`bd_nom_sci_retenu` = nom_ret_complet, `bd_num_nom_retenu` = num_nom_retenu,
infosnn = 3
where `nom_referentiel` = "bdtfx" and infosnn not in ("1", "2")';
$this->bdd->requeter($requete);
}
private function supprimerImagesetTagAnonymes() {
echo "vérification de la présence de l'annuaire \n";
$requete = "SELECT * FROM ".$this->bd_cel.".`users`;";
$result = $this->bdd->requeter($requete);
if ($result === NULL) {
echo $requete;
echo "Il manque la table annuaire (à recopier de telaorg users\n";
exit;
}
echo "suppression de le colonne ordre \n";
$requete = "ALTER TABLE ".$this->bd_cel.".cel_images DROP INDEX id_img;";
$this->bdd->requeter($requete);
$requete = "ALTER TABLE ".$this->bd_cel.".`cel_images` DROP IF EXISTS `ordre`;";
$this->bdd->requeter($requete);
$requete = "ALTER TABLE ".$this->bd_cel.".`cel_images` ADD IF NOT EXISTS pseudo varchar(250);";
$this->bdd->requeter($requete);
echo "modification des images ayant une adresse mail en identifiant";
$requete_annu_mail = "UPDATE ".$this->bd_cel.".`cel_images` right join ".$this->bd_cel.".`users` ON `user_email` = ce_utilisateur SET `ce_utilisateur` = `ID`, pseudo = user_nicename,
`courriel_utilisateur` = `user_email` WHERE ce_utilisateur like '%@%'";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "modification des images ayant une adresse mail mais pas d'identifiant";
$requete_annu_mail = "UPDATE ".$this->bd_cel.".`cel_images` join ".$this->bd_cel.".`users` ON `user_email` = courriel_utilisateur SET `ce_utilisateur` = `ID`, pseudo = user_nicename,
`courriel_utilisateur` = `user_email` WHERE (ce_utilisateur IS NULL OR char_length(ce_utilisateur) > 6
OR ce_utilisateur = 0) and courriel_utilisateur like '%@%'";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "modification des images ayant un identifiant";
$requete_annu_mail = "UPDATE ".$this->bd_cel.".`cel_images` join ".$this->bd_cel.".`users` ON ID = ce_utilisateur SET pseudo = user_nicename,
`courriel_utilisateur` = `user_email` WHERE (ce_utilisateur IS NULL OR char_length(ce_utilisateur) > 6) and (courriel_utilisateur is null or courriel_utilisateur='')";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "suppression des autres valeurs ce_utilisateur";
$requete_annu_mail = "UPDATE ".$this->bd_cel.".`cel_images` SET ce_utilisateur = NULL, courriel_utilisateur = if (ce_utilisateur like '%@%'and (courriel_utilisateur is null or courriel_utilisateur='') , ce_utilisateur, courriel_utilisateur)
WHERE ce_utilisateur IS NOT NULL AND (LENGTH(ce_utilisateur) > 6 OR trim(ce_utilisateur) = '')";
$utilisateur_mail = $this->bdd->recupererTous($requete_annu_mail);
echo "suppression des images\n";
$requete_anonyme = "DELETE FROM ".$this->bd_cel.".`cel_images` WHERE (ce_utilisateur IS NULL OR char_length(ce_utilisateur) > 6
OR ce_utilisateur = 0) and (`courriel_utilisateur` is null or `courriel_utilisateur` not like '%@%')";
$this->bdd->requeter($requete_anonyme);
 
/* echo "suppression des tags obs anonymes";
$requete_create = "CREATE TABLE ".$this->bd_cel.".user_mot_cle_absent AS SELECT distinct id_utilisateur FROM ".$this->bd_cel.".cel_arbre_mots_cles_obs WHERE id_utilisateur not in
(SELECT distinct id_utilisateur FROM ".$this->bd_cel.".cel_arbre_mots_cles_obs WHERE id_utilisateur in
(select distinct ce_utilisateur from ".$this->bd_cel.".cel_obs) or
id_utilisateur in (SELECT distinct courriel_utilisateur FROM ".$this->bd_cel.".cel_obs))";
$this->bdd->requeter($requete_create);
$requete_index = "ALTER TABLE ".$this->bd_cel.".`user_mot_cle_absent` ADD PRIMARY KEY(`id_utilisateur`);";
$this->bdd->requeter($requete_index);
$requete_anonyme = "DELETE FROM ".$this->bd_cel.".`cel_arbre_mots_cles_obs` WHERE `id_utilisateur` in (SELECT * FROM ".$this->bd_cel.".`user_mot_cle_absent`);";
$this->bdd->requeter($requete_anonyme);
$requete_anonyme = "DROP TABLE ".$this->bd_cel.".user_mot_cle_absent;";
$this->bdd->requeter($requete_anonyme);
$requete_anonyme = "UPDATE ".$this->bd_cel.".`cel_arbre_mots_cles_obs` a join ".$this->bd_cel.".cel_obs b on a.`id_utilisateur` = b.courriel_utilisateur SET a.`id_utilisateur` = b.ce_utilisateur
WHERE b.ce_utilisateur IS NOT NULL AND b.ce_utilisateur != ''";
$this->bdd->requeter($requete_anonyme);*/
}
private function unifierNomReferentiel() {
echo "Uniformisation du nom de référentiel";
$referentiels = array("bdtfx", "bdtre", "bdtxa", "apd", "lbf", "isfan");
foreach ($referentiels as $referentiel) {
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET nom_referentiel = '".$referentiel."' WHERE nom_referentiel like '".$referentiel."%'";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET nom_referentiel = 'Autre/inconnu' WHERE nom_sel_nn IS NULL or nom_sel_nn = '0'";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET nom_referentiel = 'apd' WHERE nom_referentiel like 'bdtao%'";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET nom_referentiel = 'bdtfx' WHERE nom_referentiel like 'bdnff%'";
$this->bdd->requeter($requete);
echo "effectuée \n";
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET nom_referentiel = 'Autre/inconnu' WHERE nom_referentiel IS NULL or nom_referentiel = ''";
$this->bdd->requeter($requete);
echo "effectuée \n";
}
$requete_verif = "SELECT nom_referentiel FROM ".$this->bd_cel.".cel_obs WHERE nom_referentiel NOT IN ('".implode("', '", $referentiels)."', 'Autre/inconnu')";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
}
private function supprimerInfosLiesObsInexistante() {
echo "Supprimer infos liés à obs inexistante";
$requete = "DELETE FROM ".$this->bd_cel.".`cel_obs_etendues` WHERE `id_observation` not in (select `id_observation` from ".$this->bd_cel.".cel_obs);";
$this->bdd->requeter($requete);
$requete = "DELETE FROM ".$this->bd_cel.".`cel_mots_cles_obs_liaison` WHERE `id_element_lie` not in (select `id_observation` from ".$this->bd_cel.".cel_obs);";
$this->bdd->requeter($requete);
$requete = "DELETE FROM ".$this->bd_cel.".`cel_mots_cles_obs_liaison` WHERE `id_mot_cle` not in (SELECT `id_mot_cle` FROM ".$this->bd_cel.".`cel_arbre_mots_cles_obs`);";
$this->bdd->requeter($requete);
$requete = "DELETE FROM ".$this->bd_cel.".`cel_images` WHERE `ce_observation` is not null and `ce_observation` not in (select id_observation from ".$this->bd_cel.".cel_obs)";
$this->bdd->requeter($requete);
$requete = "DELETE FROM ".$this->bd_cel.".`cel_mots_cles_images_liaison` WHERE `id_element_lie` not in (select `id_image` from ".$this->bd_cel.".cel_images);";
$this->bdd->requeter($requete);
$requete = "DELETE FROM ".$this->bd_cel.".`cel_mots_cles_images_liaison` WHERE `id_mot_cle` not in (SELECT `id_mot_cle` FROM ".$this->bd_cel.".`cel_arbre_mots_cles_images`);";
$this->bdd->requeter($requete);
echo "effectuée \n";
}
private function verifierGeodatum() {
echo "Uniformisation du geodatum";
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET geodatum = 'WGS84' WHERE (latitude IS NOT NULL or latitude != '0.00000') AND geodatum IS NULL";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET geodatum = NULL WHERE (latitude IS NULL or latitude = '0.00000')";
$this->bdd->requeter($requete);
echo "effectuée \n";
echo "Suppression des coordonnées fausses : ";
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET latitude = NULL, longitude = NULL WHERE latitude < -90 OR latitude > 90 OR longitude < -180 OR longitude > 180";
$this->bdd->requeter($requete);
echo "effectuée \n";
}
private function verifierCodeInsee() {
echo "Mise à jour des valeurs code_insee";
$requete = 'UPDATE `cel_obs` SET `ce_zone_geo` = NULL,
commentaire = concat(if(commentaire is null, "", concat(commentaire, ", ")), if(ce_zone_geo is null, "", concat("Zone geo : ",ce_zone_geo))) where `ce_zone_geo` not like "insee-c%"';
$this->bdd->requeter($requete);
$requete = 'UPDATE `cel_obs` SET `ce_zone_geo` = substr(`ce_zone_geo`, 9, 5) where `ce_zone_geo` like "insee-c:%"';
$this->bdd->requeter($requete);
$requete = 'UPDATE `cel_obs` SET `ce_zone_geo` = NULL where trim(`ce_zone_geo`) = ""';
$this->bdd->requeter($requete);
echo "effectuée \n";
echo "Vérification du code insee";
$requete = "ALTER TABLE ".$this->bd_cel.".`cel_obs` ADD IF NOT EXISTS `locality_consistency` INT(1) ;";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET locality_consistency = '0' WHERE
((ce_zone_geo != 'INSEE-C:' and ce_zone_geo like 'INSEE-C:%') and code_insee_calcule != '') and
replace(`ce_zone_geo`, 'INSEE-C:', '') != `code_insee_calcule`";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET locality_consistency = '1' WHERE
((ce_zone_geo != 'INSEE-C:' and ce_zone_geo like 'INSEE-C:%') and code_insee_calcule != '') and
replace(`ce_zone_geo`, 'INSEE-C:', '') = `code_insee_calcule`";
$this->bdd->requeter($requete);
$requete_verif = "SELECT `ce_zone_geo`, `code_insee_calcule`, `locality_consistency` FROM `cel_obs` WHERE `locality_consistency` IS NOT NULL";
$verif = $this->bdd->recupererTous($requete_verif);
if ($verif != array()) print_r($verif);
echo "effectuée \n";
}
private function analyserMotsCles(){
echo "Input source \n";
$requete = "ALTER TABLE ".$this->bd_cel.".`cel_obs` ADD IF NOT EXISTS `input_source` VARCHAR(15)";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET input_source = 'PlantNet' WHERE `mots_cles_texte` like '%plantnet%'";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET input_source = 'autre' WHERE `mots_cles_texte` like '%MobileSauvages%'";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET input_source = 'widget' WHERE `mots_cles_texte` like '%Projets coopératifs%' and (input_source = '' OR input_source IS NULL)";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET input_source = 'widget' WHERE `mots_cles_texte` like '%widget%' and (input_source = '' OR input_source IS NULL)";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET input_source = 'CEL' WHERE input_source = '' OR input_source IS NULL";
$this->bdd->requeter($requete);
echo "Suppression motcle du chemin \n";
$requete = "UPDATE ".$this->bd_cel.".`cel_arbre_mots_cles_obs` SET chemin =
if(CHAR_LENGTH(chemin)-CHAR_LENGTH(`mot_cle`) = 2, '\/', substr(`chemin`, 1, CHAR_LENGTH(chemin)-CHAR_LENGTH(`mot_cle`)-2))";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".`cel_arbre_mots_cles_images` SET chemin =
substr(`chemin`, 1, CHAR_LENGTH(chemin)-CHAR_LENGTH(`mot_cle`)-1)";
$this->bdd->requeter($requete);
echo "Certitude à certaine quand obs validée sur ip \n";
$requete = "UPDATE ".$this->bd_cel.".`cel_obs` c left join
(SELECT distinct `ce_observation`, `nom_sel_nn`
FROM ".$this->bd_del.".`del_commentaire` WHERE `proposition_retenue` = 1) d on
`ce_observation` = `id_observation` SET `certitude` = 'certain'
WHERE (c.`mots_cles_texte` LIKE '%adeterminer%'
or c.`certitude` = 'à déterminer') and c.`nom_sel_nn` = d.`nom_sel_nn`";
$this->bdd->requeter($requete);
echo "Certitude à douteux quand obs validée sur ip mais num_nom diff entre ip et cel \n";
$requete = "UPDATE ".$this->bd_cel.".`cel_obs` c left join
(SELECT distinct `ce_observation`, `nom_sel_nn`
FROM ".$this->bd_del.".`del_commentaire` WHERE `proposition_retenue` = 1 ) d on
`ce_observation` = `id_observation` SET `certitude` = 'douteux'
WHERE (c.`mots_cles_texte` LIKE '%adeterminer%'
or c.`certitude` = 'à déterminer') and c.`nom_sel_nn` != d.`nom_sel_nn`";
$this->bdd->requeter($requete);
echo "Certitude à aDeterminer quand obs non validée sur ip \n";
$requete = "UPDATE ".$this->bd_cel.".`cel_obs` c SET `certitude` = 'à déterminer'
WHERE c.`mots_cles_texte` LIKE '%adeterminer%' AND
(c.`certitude` = '' or c.certitude IS NULL)";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".`cel_obs` SET
`mots_cles_texte` = REPLACE(`mots_cles_texte`, 'aDeterminer,', '')
WHERE `mots_cles_texte` LIKE '%adeterminer,%'";
$this->bdd->requeter($requete);
 
}
 
private function changerSensible(){
echo "Sensible \n";
$requete = "ALTER TABLE ".$this->bd_cel.".`cel_obs` ADD IF NOT EXISTS `published_location` varchar(50)";
$this->bdd->requeter($requete);
$requete = "UPDATE ".$this->bd_cel.".cel_obs SET published_location = 'localité' WHERE `mots_cles_texte` like '%sensible%'";
$this->bdd->requeter($requete);
}
}
/branches/v3.00-serfouette/scripts/modules/generation_images/GenerationImages.php
New file
0,0 → 1,76
<?php
// declare(encoding='UTF-8');
/**
* Génère des miniatures.
*
* Utilisation :
* - Pour ? : <code>/opt/lamp/bin/php cli.php generation_images -a genererMinaturesEnAttente</code>
* - Pour ? : <code>/opt/lamp/bin/php cli.php generation_images -a genererMinaturesEnAttente</code>
*
* @category CEL
* @package Scripts
* @subpackage Génération Images
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class GenerationImages extends Script {
 
protected $bdd;
protected $parametres_autorises = array(
'-id' => array(false, '1', 'Identifiants des images à traiter (séparés par des virgules')
);
 
public function __construct($script_nom, $parametres_cli) {
parent::__construct($script_nom, $parametres_cli);
$this->bdd = new Bdd();
}
 
public function executer() {
$cmd = $this->getParametre('a');
switch($cmd) {
case 'genererMinaturesEnAttente';
$this->genererMiniaturesEnAttente();
break;
case 'genererMinaturesPourId';
$this->genererMinaturesPourId();
break;
default :
$msg = "Erreur : la commande '$cmd' n'existe pas!\n";
throw new Exception($msg);
}
}
 
private function genererMinaturesPourId() {
$id = $this->getParametre('id');
$ids = explode(',',$id);
if ($id == null) {
echo "le paramètre id doit être un ensemble de nombres séparés par des virgules";
} else {
include_once dirname(__FILE__).'/bibliotheque/ImageRecreation.php';
$createur_images = new ImageRecreation();
foreach ($ids as $id_image) {
$createur_images->regenererMiniaturesPourId(array($id_image));
}
}
}
 
private function genererMiniaturesEnAttente() {
$requete = 'SELECT id_image '.
'FROM cel_images '.
'WHERE date_creation >= DATE_SUB(NOW(), INTERVAL 15 MINUTE)';
$images_attente = $this->bdd->recupererTous($requete);
 
if (!empty($images_attente)) {
// iterer sur config pour formats
include_once dirname(__FILE__).'/bibliotheque/ImageRecreation.php';
$createur_images = new ImageRecreation();
foreach ($images_attente as $image) {
$createur_images->regenererMiniaturesPourId(array($image['id_image']));
}
}
}
}
/branches/v3.00-serfouette/scripts/modules/generation_images/bibliotheque/ImageRecreation.php
New file
0,0 → 1,669
<?php
// declare(encoding='UTF-8');
/**
* Cette classe est un quasi copier-coller de la classe éponyme dans
* le dossier lib de jrest mais pas de mécanisme commun pour les classes
*
* @category CEL
* @package Scripts
* @subpackage Génération Images
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
// TODO: utiliser la même classe pour jrest ainsi que les scripts => créer un projet cel-commun (même principe que del-commun)
Class ImageRecreation {
 
private $droits = 0755;
private $formats = array('CRX2S','CRXS','CXS','CS','CRS','XS','S','M','L','XL','X2L','X3L');
const MODE_GD = 'gd';
const MODE_IMAGEMAGICK = 'imagemagick';
private $mode;
 
private $verbose = true;
 
public function __construct() {
if (extension_loaded('imagick')) {
$this->mode = self::MODE_IMAGEMAGICK;
} else {
$this->mode = self::MODE_GD;
}
}
 
public function recreerMiniaturesRecursivement() {
$this->itererRecursivement(Config::get('dossierImages'));
}
 
public function regenererMiniaturesIntervalle($params) {
$id_debut = $params[0];
$id_fin = $params[1];
 
if (is_numeric($id_debut) && is_numeric($id_fin)) {
for ($i = $id_debut; $i <= $id_fin; $i++) {;
$tab_param = array($i);
$this->regenererMiniaturesPourId($tab_param);
}
}
}
 
public function regenererMiniaturesPourId($params) {
$id = $params[0];
 
if (!is_numeric($id)) {
return;
}
 
$dossier_fichier = $this->obtenirDossierPourFormat($id, 'O');
$nom_fichier = $this->convertirIdBddVersNomFichier($id, 'O');
 
$chemin_fichier = $dossier_fichier.'/'.$nom_fichier;
 
if (file_exists($chemin_fichier)) {
$infos_image_originale = $this->obtenirImageEtInfosPourChemin($chemin_fichier);
// obtention d'un verrou sur le fichier original pour empecher d'autres scripts
// d'effectuer la création des miniatures
$fp = fopen($chemin_fichier, "r");
$verrou = flock($fp, LOCK_EX);
// creation de miniatures pour chacuns des formats définis
foreach ($this->formats as $format) {
$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale, $format);
};
$verrou = flock($fp, LOCK_UN);
fclose($fp);
}
}
 
public function itererRecursivement($dossier) {
// on ne parse que le dossier des images originales
$dossiers_a_exclure = $this->getFormats();
 
foreach (new DirectoryIterator($dossier) as $fichier_ou_dossier) {
if ($fichier_ou_dossier->isDot()) {
continue;
}
 
if (in_array($fichier_ou_dossier->getBasename(), $dossiers_a_exclure)) {
continue;
}
 
if ($fichier_ou_dossier->isDir()) {
$this->itererRecursivement($fichier_ou_dossier->getPathname());
} else {
$nom_fichier = $fichier_ou_dossier->getFilename();
 
$infos_image_originale = $this->obtenirImageEtInfosPourChemin($fichier_ou_dossier->getPathname());
$id = $this->convertirBaseNomFichierVersIdBdd($nom_fichier, $this->formats);
 
// creation de miniatures pour chacuns des formats définis
foreach ($this->formats as $format) {
$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale, $format);
}
}
}
}
 
public function creerOuRenvoyerImage($id, $format) {
$dossier = $this->obtenirDossierPourFormat($id, $format);
$nom_fichier = $this->convertirIdBddVersNomFichier($id, $format);
$chemin_image = $dossier.'/'.$nom_fichier;
 
$image = false;
if(!file_exists($chemin_image)) {
$infos_image_originale = $this->obtenirImageEtInfosPourChemin($this->obtenirCheminImageOriginale($id));
if($infos_image_originale) {
$debut = microtime();
$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale, $format);
 
$image = file_get_contents($chemin_image);
}
} else {
$image = file_get_contents($chemin_image);
}
 
return $image;
}
 
public function creerMiniatureImageSelonFormat($infos_image_originale, $format = 'O') {
if ($format == 'O') {
// format original : rien à faire
$image_redimensionnee = $infos_image_originale['image'];
 
} else {
if ($this->estUnFormatRogne($format)) {
if ($this->mode == self::MODE_IMAGEMAGICK) {
// si l'on dispose de la librairie imageMagick
// on applique l'algorithme d'auto détection de sujets
// qui centre la miniature sur le sujet de l'image
$image_redimensionnee = $this->opticrop($infos_image_originale, $format);
} else {
// si l'on ne dispose que de gd
// la minature est une image redimensionnée rognée au centre
$image_redimensionnee = $this->creerMiniatureCarreeRognee($infos_image_originale, $format);
}
} else if ($this->estUnFormatCarre($format)) {
// le format carre et une image redimensionnée en gardant son ratio, insérée dans un carré blanc
$image_redimensionnee = $this->creerMiniatureCarree($infos_image_originale, $format);
} else {
$image_redimensionnee = $this->creerMiniature($infos_image_originale, $format);
}
}
 
return $image_redimensionnee;
}
 
public function stockerFichierOriginal($fichier, $id) {
$chemin_fichier_origine = is_array($fichier) ? $fichier['tmp_name'] : $fichier;
 
$chemin_base_fichier = $this->creerSiNecessaireEtRenvoyerCheminStockageFichierPourIdEtFormat($id, 'O');
$nom_fichier = $this->convertirIdBddVersNomFichier($id, 'O');
 
$chemin_fichier = $chemin_base_fichier.'/'.$nom_fichier;
 
$deplacement_fichier = $this->stockerImageExterne($chemin_fichier_origine, $chemin_fichier);
 
if ($deplacement_fichier) {
$infos_image_originale = $this->obtenirImageEtInfosPourChemin($chemin_fichier);
$taux_compression = $this->renvoyerTauxCompressionPourPoids($infos_image_originale['poids_octets']);
 
if ($taux_compression < 100 && $this->mode == self::MODE_IMAGEMAGICK) {
$this->ecrireImageSurDisqueAvecMeta($chemin_fichier, $taux_compression);
}
 
return $infos_image_originale;
 
} else {
$erreur = 'ERROR : probleme durant le déplacement du fichier temporaire \n' ;
$this->logger('CEL_bugs',$erreur);
return false ;
}
}
 
public function stockerFichierEtCreerMiniatures($fichier, $id) {
 
$infos_image_originale_stockee = $this->stockerFichierOriginal($fichier, $id);
if($infos_image_originale_stockee) {
$formats = $this->getFormats();
 
// creation de miniatures pour chacuns des formats définis
foreach($formats as $format) {
$this->creerEtStockerMiniatureFichierImageSelonFormat($id, $infos_image_originale_stockee, $format);
}
} else {
$erreur = 'ERROR : impossible d\'obtenir les informations sur l\'image originale \n' ;
$this->logger('CEL_bugs',$erreur);
return false ;
}
 
return true ;
}
 
public function creerEtStockerMiniatureFichierImageSelonFormat($id ,$infos_image_originale, $format = 'O') {
$image_redimensionnee = $this->creerMiniatureImageSelonFormat($infos_image_originale, $format);
 
$taux_compression = $this->renvoyerTauxCompressionPourPoids($infos_image_originale['poids_octets']);
$this->ecrireImageSurDisque($image_redimensionnee, $id, $format, $taux_compression);
 
return true;
}
 
public function creerImageRedimensionnee($infos_image_originale, $hauteur_redimension, $largeur_redimension) {
$image_redimensionnee = imagecreatetruecolor($largeur_redimension, $hauteur_redimension);
 
imagecopyresampled($image_redimensionnee,
$infos_image_originale['image'],
0, 0,
0, 0,
$largeur_redimension,
$hauteur_redimension,
$infos_image_originale['largeur'],
$infos_image_originale['hauteur']
);
 
return $image_redimensionnee;
}
 
public function creerMiniature($informations_images, $format) {
$taille_reference_pour_format = $this->obtenirDimensionsPourFormat($format);
 
$taille_image_redimensionnee = $this->calculerTailleImage($informations_images, $taille_reference_pour_format['hauteur']);
$image_redimensionnee = $this->creerImageRedimensionnee($informations_images, $taille_image_redimensionnee['hauteur'], $taille_image_redimensionnee['largeur']);
 
return $image_redimensionnee;
}
 
public function creerMiniatureCarree($informations_image, $format) {
$taille_reference_pour_format = $this->obtenirDimensionsPourFormat($format);
$cote_carre = $taille_reference_pour_format['largeur'];
 
$image_redimensionnee_avec_rapport = $this->creerMiniature($informations_image, $format);
$taille_redimensionnee_avec_rapport = $this->calculerTailleImage($informations_image, $taille_reference_pour_format['hauteur']);
 
if ($this->estPaysage($informations_image)) {
$debut_largeur_a_copier = 0 ;
$debut_hauteur_a_copier = ($cote_carre - $taille_redimensionnee_avec_rapport['hauteur'])/2 ;
} else {
$debut_largeur_a_copier = ($cote_carre - $taille_redimensionnee_avec_rapport['largeur'])/2 ;
$debut_hauteur_a_copier = 0 ;
}
 
$image_carre_blanc_cible = $this->renvoyerEtCreerImageCarreeBlancheSelonFormat($cote_carre);
 
imagecopy($image_carre_blanc_cible, $image_redimensionnee_avec_rapport,
$debut_largeur_a_copier ,$debut_hauteur_a_copier, 0, 0,
$taille_redimensionnee_avec_rapport['largeur'], $taille_redimensionnee_avec_rapport['hauteur']
);
 
return $image_carre_blanc_cible;
}
 
public function creerMiniatureCarreeRognee($informations_image, $format) {
$taille_reference_pour_format = $this->obtenirDimensionsPourFormat($format);
$cote_carre = $taille_reference_pour_format['largeur'];
$cote_carre_non_redimensionne = 0;
 
if ($this->estPaysage($informations_image)) {
$cote_carre_non_redimensionne = $informations_image['hauteur'];
$debut_largeur_a_copier = ($informations_image['hauteur'] - $cote_carre)/2 ;
$debut_hauteur_a_copier = 0;
 
if($debut_largeur_a_copier <= 0) {
$debut_largeur_a_copier = 0;
}
 
$nb_pixels_largeur_a_copier = $cote_carre_non_redimensionne;
$nb_pixels_hauteur_a_copier = $cote_carre_non_redimensionne;
} else {
$cote_carre_non_redimensionne = $informations_image['largeur'];
$debut_largeur_a_copier = 0 ;
$debut_hauteur_a_copier = ($informations_image['largeur'] - $cote_carre)/2;
 
if ($debut_hauteur_a_copier <= 0) {
$debut_hauteur_a_copier = 0;
}
 
$nb_pixels_largeur_a_copier = $cote_carre_non_redimensionne;
$nb_pixels_hauteur_a_copier = $cote_carre_non_redimensionne;
}
 
$image_carre_temporaire = imagecreatetruecolor($cote_carre_non_redimensionne, $cote_carre_non_redimensionne);
 
imagecopyresampled($image_carre_temporaire,
$informations_image['image'],
0, 0,
$debut_largeur_a_copier,
$debut_hauteur_a_copier,
$cote_carre_non_redimensionne,
$cote_carre_non_redimensionne,
$nb_pixels_largeur_a_copier,
$nb_pixels_hauteur_a_copier
);
 
$image_redimensionnee = imagecreatetruecolor($cote_carre, $cote_carre);
 
imagecopyresampled($image_redimensionnee,
$image_carre_temporaire,
0, 0,
0, 0,
$cote_carre,
$cote_carre,
$cote_carre_non_redimensionne,
$cote_carre_non_redimensionne
);
 
return $image_redimensionnee;
}
 
public function stockerImageExterne($chemin_fichier_temp, $chemin_destination) {
if (is_uploaded_file($chemin_fichier_temp)) {
$deplacement = move_uploaded_file($chemin_fichier_temp, $chemin_destination);
} else {
$deplacement = rename($chemin_fichier_temp, $chemin_destination);
}
 
return $deplacement;
}
 
public function creerSiNecessaireEtRenvoyerCheminStockageFichierPourIdEtFormat($id, $format) {
$chemin_sur_serveur_final = $this->obtenirDossierPourFormat($id, $format);
 
if (!file_exists($chemin_sur_serveur_final)) {
umask(0);
if (!mkdir($chemin_sur_serveur_final, $this->droits, true)) {
$erreur = 'ERROR : probleme durant l\'écriture du dossier '.$format.' \n' ;
$this->logger('CEL_bugs', $erreur);
return false;
}
}
 
return $chemin_sur_serveur_final;
}
 
public function obtenirDossierPourFormat($id, $format) {
$chemin_base = Config::get('dossierImages');
 
$chemin_sur_serveur = $chemin_base;
 
$id = sprintf('%09s', $id);
$id = wordwrap($id, 3 , '_', true);
 
list($dossierNiveau1, $dossierNiveau2) = explode('_', $id);
 
$chemin_sur_serveur_final = $chemin_sur_serveur.'/'.$dossierNiveau1.'/'.$dossierNiveau2.'/'.$format;
 
return $chemin_sur_serveur_final;
}
 
public function obtenirCheminImageOriginale($id_image) {
$nom = $this->convertirIdBddVersNomFichier($id_image, 'O');
$dossier = $this->obtenirDossierPourFormat($id_image,'O');
 
return $dossier.'/'.$nom;
}
 
public function obtenirImageEtInfosPourId($id_image) {
$chemin_image_o = $this->obtenirCheminImageOriginale($id_image);
return $this->obtenirImageEtInfosPourChemin($chemin_image_o);
}
 
public function obtenirImageEtInfosPourChemin($chemin_fichier) {
$image_et_infos = false;
 
if (file_exists($chemin_fichier)) {
$image_et_infos = array();
list($image_et_infos['largeur'], $image_et_infos['hauteur']) = getimagesize($chemin_fichier);
$image_et_infos['poids_octets'] = filesize($chemin_fichier);
$image_et_infos['image'] = imagecreatefromjpeg($chemin_fichier);
$image_et_infos['chemin'] = $chemin_fichier;
}
 
return $image_et_infos;
}
 
public function obtenirDimensionsPourFormat($format) {
$dimensions = array('largeur' => 0, 'hauteur' => 0);
 
if (Config::get('format_'.$format) != null) {
list($dimensions['largeur'], $dimensions['hauteur']) = explode('_', Config::get('format_'.$format));
}
 
return $dimensions;
}
 
public function calculerTailleImage($informations_images, $taille_max) {
$HL_redimension = array();
 
if ($this->estPaysage($informations_images)) {
$rapport = $informations_images['hauteur']/$informations_images['largeur'] ;
$HL_redimension['largeur'] = round($taille_max) ;
$HL_redimension['hauteur'] = round($taille_max*$rapport) ;
} else {
$rapport = $informations_images['largeur']/$informations_images['hauteur'] ;
$HL_redimension['hauteur'] = round($taille_max) ;
$HL_redimension['largeur'] = round($taille_max*$rapport) ;
}
 
return $HL_redimension;
}
 
public function getFormats() {
return $this->formats;
}
 
public function estUnFormatCarre($format) {
return (strpos($format,'C') === 0);
}
 
public function estUnFormatRogne($format) {
return (strpos($format,'R') === 1);
}
 
public function estPaysage($informations_images) {
return $informations_images['largeur'] > $informations_images['hauteur'];
}
 
public function estPortait($informations_images) {
return $informations_images['largeur'] < $informations_images['hauteur'];
}
 
public function renvoyerTauxCompressionPourPoids($poids_octets) {
$poids_max_octets = Config::get('tailleMaxImages');
 
$ratio_compression = 100 ;
 
if ($poids_octets >= $poids_max_octets) {
$ratio_compression = 75 ;
}
 
return $ratio_compression;
}
 
public function convertirIdBddVersNomFichier($id, $format, $extension = 'jpg') {
// creation du format original
$id_avec_zeros = sprintf('%09s', $id) ;
$id_avec_zeros_underscores = wordwrap($id_avec_zeros, 3 , '_', true) ;
 
$nom_fichier = $id_avec_zeros_underscores.'_'.$format.'.'.$extension;
 
return $nom_fichier;
}
 
public function convertirBaseNomFichierVersIdBdd($nom_fichier, $formats) {
$nom_fichier_sans_extension = trim($nom_fichier, '.jpg');
 
foreach($formats as $format) {
$nom_fichier_sans_extension = trim($nom_fichier_sans_extension, '_'.$format);
}
 
$id_image = str_replace('_', '', $nom_fichier_sans_extension);
 
// suppression des 0 devant
$id_image += 0;
 
return $id_image;
}
 
public function ecrireImageSurDisque($image_binaire, $id, $format, $compression = 100) {
umask(0);
 
$chemin_sur_serveur_final = $this->creerSiNecessaireEtRenvoyerCheminStockageFichierPourIdEtFormat($id, $format);
$nom_fichier = $this->convertirIdBddVersNomFichier($id, $format);
 
if (file_exists($chemin_sur_serveur_final.'/'.$nom_fichier)) {
unlink($chemin_sur_serveur_final.'/'.$nom_fichier);
}
 
// attention, ceci ne preserve pas les metadonnées
imagejpeg($image_binaire, $chemin_sur_serveur_final.'/'.$nom_fichier, $compression);
chmod($chemin_sur_serveur_final.'/'.$nom_fichier,$this->droits);
}
 
public function ecrireImageSurDisqueAvecMeta($chemin_image_a_stocker, $compression = 100) {
$img = new Imagick($chemin_image_a_stocker);
 
// l'utilisation d'image magick préserve les métadonnées lors d'une recompression
$img->setformat("jpeg");
$img->setImageCompression(imagick::COMPRESSION_JPEG);
$img->setCompressionQuality($compression);
$img->writeImage($chemin_image_a_stocker);
$img->destroy();
 
chmod($chemin_image_a_stocker, $this->droits);
}
 
public function renvoyerEtCreerImageCarreeBlancheSelonFormat($cote) {
$image_blanche = imagecreatetruecolor($cote, $cote);
$blanc = imagecolorallocate($image_blanche, 255, 255, 255);
imagefilledrectangle($image_blanche, 0, 0, $cote, $cote, $blanc);
 
return $image_blanche;
}
 
public function detruireImageEnMemoire($image) {
imagedestroy($image);
}
 
public function detruireImageSurDisque($id) {
$formats = $this->getFormats();
 
// on detruit aussi l'image originale
$formats[] = 'O';
 
$destruction_formats_fichier = false;
 
// destructions de chacuns des formats définis
foreach($formats as $format) {
 
$dossier_format = $this->obtenirDossierPourFormat($id, $format);
$nom_fichier = $this->convertirIdBddVersNomFichier($id, $format);
 
if (file_exists($dossier_format.'/'.$nom_fichier)) {
$destruction_formats_fichier = unlink($dossier_format.'/'.$nom_fichier);
} else {
$destruction_formats_fichier = true;
}
}
 
return $destruction_formats_fichier;
}
 
/*
* edge-maximizing crop
* determines center-of-edginess, then tries different-sized crops around it.
* picks the crop with the highest normalized edginess.
* see documentation on how to tune the algorithm
*
* $informations_image - le tableau d'informations sur l'image tel que renvoyé par la fonction obtenirImageEtInfosPourChemin
* $format - le format (ex. : CS, XS, XL, CRS)
*/
public function opticrop($informations_image, $format) {
umask(0);
 
$nom_temp = md5(time());
$chemin_temp =
 
$out = Config::get('dossierImagesStockageTemp').'/'.$nom_temp;
 
$dimension_vignettes = $this->obtenirDimensionsPourFormat($format);
 
$largeur_vignette = $dimension_vignettes['largeur'];
$hauteur_vignette = $dimension_vignettes['hauteur'];
 
// source dimensions
$largeur_image_originale = $informations_image['largeur'];
$hauteur_image_originale = $informations_image['hauteur'];
 
$chemin_image = $informations_image['chemin'];
 
//if ($largeur_vignette > $largeur_image_originale || $hauteur_vignette > $hauteur_image_originale)
// die("Target dimensions must be smaller or equal to source dimensions.");
 
// parameters for the edge-maximizing crop algorithm
$r = 1; // radius of edge filter
$nk = 9; // scale count: number of crop sizes to try
$gamma = 0.2; // edge normalization parameter -- see documentation
$ar = $largeur_vignette/$hauteur_vignette; // target aspect ratio (AR)
$ar0 = $largeur_image_originale/$hauteur_image_originale; // original aspect ratio (AR)
 
$img = new Imagick($chemin_image);
$imgcp = clone $img;
 
// compute center of edginess
$img->edgeImage($r);
$img->modulateImage(100,0,100); // grayscale
$img->blackThresholdImage("#0f0f0f");
$img->writeImage($out);
// use gd for random pixel access
$im = ImageCreateFromJpeg($out);
$xcenter = 0;
$ycenter = 0;
$sum = 0;
$n = 100000;
for ($k=0; $k<$n; $k++) {
$i = mt_rand(0,$largeur_image_originale-1);
$j = mt_rand(0,$hauteur_image_originale-1);
$val = imagecolorat($im, $i, $j) & 0xFF;
$sum += $val;
$xcenter += ($i+1)*$val;
$ycenter += ($j+1)*$val;
}
$xcenter /= $sum;
$ycenter /= $sum;
 
// crop source img to target AR
if ($largeur_image_originale/$hauteur_image_originale > $ar) {
// source AR wider than target
// crop width to target AR
$wcrop0 = round($ar*$hauteur_image_originale);
$hcrop0 = $hauteur_image_originale;
} else {
// crop height to target AR
$wcrop0 = $largeur_image_originale;
$hcrop0 = round($largeur_image_originale/$ar);
}
 
// crop parameters for all scales and translations
$params = array();
 
// crop at different scales
$hgap = $hcrop0 - $hauteur_vignette;
$hinc = ($nk == 1) ? 0 : $hgap / ($nk - 1);
$wgap = $wcrop0 - $largeur_vignette;
$winc = ($nk == 1) ? 0 : $wgap / ($nk - 1);
 
// find window with highest normalized edginess
$n = 10000;
$maxbetanorm = 0;
$maxfile = '';
$maxparam = array('w'=>0, 'h'=>0, 'x'=>0, 'y'=>0);
 
for ($k = 0; $k < $nk; $k++) {
$hcrop = round($hcrop0 - $k*$hinc);
$wcrop = round($wcrop0 - $k*$winc);
$xcrop = $xcenter - $wcrop / 2;
$ycrop = $ycenter - $hcrop / 2;
//echo("crop: $wcrop, $hcrop, $xcrop, $ycrop");
 
if ($xcrop < 0) $xcrop = 0;
if ($xcrop+$wcrop > $largeur_image_originale) $xcrop = $largeur_image_originale-$wcrop;
if ($ycrop < 0) $ycrop = 0;
if ($ycrop+$hcrop > $hauteur_image_originale) $ycrop = $hauteur_image_originale-$hcrop;
 
$beta = 0;
for ($c=0; $c<$n; $c++) {
$i = mt_rand(0,$wcrop-1);
$j = mt_rand(0,$hcrop-1);
$beta += imagecolorat($im, $xcrop+$i, $ycrop+$j) & 0xFF;
}
$area = $wcrop * $hcrop;
$betanorm = $beta / ($n*pow($area, $gamma-1));
// echo("beta: $beta; betan: $betanorm");
// echo("image$k.jpg:<br/>\n<img src=\"$currfile\"/>");
// best image found, save it
 
if ($betanorm > $maxbetanorm) {
 
$maxbetanorm = $betanorm;
$maxparam['w'] = $wcrop;
$maxparam['h'] = $hcrop;
$maxparam['x'] = $xcrop;
$maxparam['y'] = $ycrop;
}
}
 
// return image
$imgcp->cropImage($maxparam['w'], $maxparam['h'], $maxparam['x'], $maxparam['y']);
$imgcp->scaleImage($largeur_vignette, $hauteur_vignette);
$imgcp->writeImage($out);
chmod($out, 0777);
$img->destroy();
$imgcp->destroy();
 
$image_sortie = ImageCreateFromJpeg($out);
unlink($out);
 
return $image_sortie;
}
}
/branches/v3.00-serfouette/scripts/configurations/config.defaut.ini
New file
0,0 → 1,73
; Encodage : UTF-8
; +------------------------------------------------------------------------------------------------------+
; Info sur l'application
info.nom = Scripts du CEL
; Abréviation de l'application
info.abr = CEL-SCRIPTS
; Version du Framework nécessaire au fonctionnement de cette application
info.framework.version = 0.4
; Encodage de l'application
encodage_appli = "UTF-8"
; Chemin de l'application (pour l'utiliser dans ce fichier)
chemin_scripts = "php:Framework::getCheminAppli()"
; +------------------------------------------------------------------------------------------------------+
; Débogage
; Indique si oui ou non on veut afficher le débogage.
debogage = true
; Indique si oui ou non on veut lancer le chronométrage
chronometrage = false
 
+------------------------------------------------------------------------------------------------------+
; Paramètrage de la base de données.
; bdd_abstraction : abstraction de la base de données.
; bdd_protocole : Protocole de la base de données.
; bdd_serveur : Nom du serveur de bases de données.
; bdd_utilisateur : Nom de l'utilisateur de la base de données.
; bdd_mot_de_passe : Mot de passe de l'utilisateur de la base de données.
; bdd_nom : Nom de la base de données principale.
; bdd_encodage : Encodage de la base de données principale. Normalement le même que l'application mais au format base de
; données : voir ici : http://dev.mysql.com/doc/refman/5.0/en/charset-charsets.html
; et là: http://www.postgresql.org/docs/8.1/static/multibyte.html pour les correspondances
 
bdd_abstraction = pdo
bdd_protocole = mysql
bdd_serveur = localhost
bdd_utilisateur = "root"
bdd_mot_de_passe = ""
bdd_nom = "tb_cel"
bdd_encodage = "utf8"
 
format_XS = 150_100
format_S = 400_300
format_CRS = 300_300
format_M = 600_450
format_L = 800_600
format_XL = 1024_768
format_X2L = 1280_960
format_X3L = 1600_1200
format_CRX2S = 63_63
format_CS = 300_300
format_CXS = 100_100
format_CRXS = 100_100
 
; Dossier de base contenant les données d'eFlore (Fichiers TSV et SQL)
dossierDonneesEflore = "/home/telabotap/www/eflore/donnees/"
 
; Dossier de base des images du cel (attention pas de / terminal nécessaire)
dossierImages = "/home/apitela/www/images";
; dossier de stockage temporaire des imagers
dossierImagesStockageTemp = "/home/apitela/www/tmp";
tailleMaxImages = 2097152;
 
+------------------------------------------------------------------------------------------------------+
; Url de base du service fournissant les zones geographiques
urlZoneGeoTpl = "http://api.tela-botanica.org/service:eflore:0.1/{projet}/nom-commune?lat={latitude}&lon={longitude}";
urlPaysTpl = "http://api.tela-botanica.org/service:eflore:0.1/osm/zone-admin?lat={latitude}&lon={longitude}";
 
+------------------------------------------------------------------------------------------------------+
[nettoyage]
cel_nettoye = "tb_nettoye_cel"
cel_new = "tb_new_cel"
chemin_photo = "/home/test/www/images/"
flore = "tb_eflore"
del = "tb_del"
/branches/v3.00-serfouette/scripts/configurations
New file
Property changes:
Added: svn:ignore
+config.ini
/branches/v3.00-serfouette/scripts/framework.defaut.php
New file
0,0 → 1,6
<?php
// Inclusion du Framework
// Renomer ce fichier en "framework.php"
// Indiquer ci-dessous le chemin absolu vers le fichier autoload.inc.php de la bonne version du Framework
require_once '/home/www/commun/framework/0.3/Framework.php';
?>
/branches/v3.00-serfouette/scripts/bibliotheque/SqlUtil.php
New file
0,0 → 1,37
<?php
// declare(encoding='UTF-8');
/**
* Contient des méthodes utiles pour manipuler le SQL.
*
* @category CEL
* @package Scripts
* @subpackage Bibliotheque
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class SqlUtil {
 
public static function extraireRequetes($contenuSql) {
$contenuSansCommentaire = self::supprimerCommentaires($contenuSql);
$requetesExtraites = preg_split("/;\e*\t*\r*\n/", $contenuSansCommentaire);
if (count($requetesExtraites) == 0){
throw new Exception("Aucune requête n'a été trouvée dans le contenu SQL.");
}
 
$requetes = array();
foreach ($requetesExtraites as $requete) {
if (trim($requete) != '') {
$requetes[] = rtrim(trim($requete), ';');
}
}
return $requetes;
}
 
private static function supprimerCommentaires($contenuSql) {
return preg_replace('/(## |--).*?\r*\n/', '', $contenuSql);
}
}
/branches/v3.00-serfouette/scripts/bibliotheque/Conteneur.php
New file
0,0 → 1,100
<?php
// declare(encoding='UTF-8');
/**
* Le conteneur encapsule les classes servant aux scripts.
* Il gère leur instanciation, ainsi que la récupération des paramètres depuis le fichier de configuration.
*
* @category CEL
* @package Scripts
* @subpackage Bibliotheque
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
//TODO : initialiser tous les objets dans le conteneur
class Conteneur {
 
protected $parametres = array();
protected $partages = array();
 
/**
* Constructeur de la classe
* @param Array $parametres (optionnel) les paramètres additionnels à ajouter à ceux des fichiers de config
* */
public function __construct(array $parametres = null) {
$this->parametres = is_null($parametres) ? array() : $parametres;
}
 
/**
* Obtenir un paramètre depuis le tableau de paramètres ou depuis le fichier de config
* @param String $cle le nom du paramètre
* @return la valeur du paramètre
*/
public function getParametre($cle) {
$valeur = isset($this->parametres[$cle]) ? $this->parametres[$cle] : Config::get($cle);
return $valeur;
}
 
/**
* Obtenir un paramètre depuis le tableau de paramètres ou depuis le fichier de config
* et le transformer en tableau s'il est de la forme : "cle=valeur,cle=valeur,..."
* @param String $cle le nom du paramètre
* @return la valeur du paramètre
*/
public function getParametreTableau($cle) {
$tableau = array();
$parametre = $this->getParametre($cle);
if (empty($parametre) === false) {
$tableauPartiel = explode(',', $parametre);
foreach ($tableauPartiel as $champ) {
if (strpos($champ, '=') === false) {
$tableau[] = trim($champ);
} else {
list($cle, $val) = explode('=', $champ);
$tableau[trim($cle)] = trim($val);
}
}
}
return $tableau;
}
 
/**
* Enregistrer la valeur d'un paramètre
* */
public function setParametre($cle, $valeur) {
$this->parametres[$cle] = $valeur;
}
 
/**
* Permet d'obtenir un objet GestionBdd.
*/
public function getBdd() {
if (!isset($this->partages['Bdd'])){
$this->partages['Bdd'] = new Bdd();
}
return $this->partages['Bdd'];
}
 
/**
* Permet d'obtenir un objet RestClient.
*/
public function getRestClient() {
if (!isset($this->partages['RestClient'])) {
$this->partages['RestClient'] = new RestClient();
}
return $this->partages['RestClient'];
}
 
/**
* Permet d'obtenir un objet SquelettePhp.
*/
public function getSquelettePhp() {
if (!isset($this->partages['SquelettePhp'])) {
$this->partages['SquelettePhp'] = new SquelettePhp();
}
return $this->partages['SquelettePhp'];
}
}
/branches/v3.00-serfouette/scripts/bibliotheque/FichierUtil.php
New file
0,0 → 1,24
<?php
// declare(encoding='UTF-8');
/**
* Contient des méthodes utiles pour manipuler les fichiers.
*
* @category CEL
* @package Scripts
* @subpackage Bibliotheque
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
class FichierUtil {
public static function recupererContenu($chemin) {
$contenu = file_get_contents($chemin);
if ($contenu === false){
throw new Exception("Impossible d'ouvrir le fichier SQL : $chemin");
}
return $contenu;
}
}
/branches/v3.00-serfouette/scripts/bibliotheque/CelScript.php
New file
0,0 → 1,27
<?php
// declare(encoding='UTF-8');
/**
* Classe mère des scripts CEL
*
* @category CEL
* @package Scripts
* @subpackage Bibliotheque
* @author Mathias CHOUET <mathias@tela-botanica.org>
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org>
* @author Aurelien 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>
* @copyright 1999-2014 Tela Botanica <accueil@tela-botanica.org>
*/
abstract class CelScript extends Script {
 
private $projetNom = null;
 
public function getProjetNom() {
return $this->projetNom;
}
 
protected function initialiserProjet($projetNom) {
$this->projetNom = $projetNom;
}
}
/branches/v3.00-serfouette/scripts/.
New file
Property changes:
Added: svn:ignore
+framework.php
Added: svn:mergeinfo
Merged /branches/topic-dbsingleton/scripts:r1720-1764
Merged /branches/v1.8-debroussailleuse/scripts:r1981,1987,1992,2014-2020
Merged /branches/v2.3-faux/scripts:r2228
Merged /branches/v1.7-croissant/scripts:r1855,1879-1880,1885-1886,1917,1923,1983