Subversion Repositories eFlore/Applications.coel

Compare Revisions

Ignore whitespace Rev 1856 → Rev 1857

/trunk/jrest/services/CoelImport.php
New file
0,0 → 1,114
<?php
 
/**
* Service important des informations concernant COEL au format CSV.
* Encodage en entrée : utf8
* Encodage en sortie : utf8
*
* @author Aurélien PERONNET <aurelien@tela-botanica.org>
* @license GPL v3 <http://www.gnu.org/licenses/gpl.txt>
* @license CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
* @version $Id$
* @copyright 2014
*/
class CoelImport extends Coel {
 
private $chemin_script = null;
private $dossier_import_tmp = null;
 
/**
* Méthode appelée avec une requête de type GET.
*/
public function getElement($params = array()) {
if(!empty($_SESSION['coel']['import_stat'])) {
header('Content-type : application/json');
echo json_encode($_SESSION['coel']['import_stat']);
exit;
}
}
/**
* Méthode appelée pour ajouter un élément.
*/
public function createElement($params) {
$this->chemin_script = $this->config['coel']['chemin_script_import'];
$this->dossier_import_tmp = $this->config['coel']['dossier_import_tmp'];
$erreurs = $this->verifierConditionsImport();
if(!empty($erreurs)) {
header('Content-type : application/json');
echo json_encode($erreurs);
exit;
}
// Normalement si on arrive ici, c'est que le fichier contient quelque chose
$fichier = array_pop($_FILES);
$nom_fichier = $fichier['name'];
$type = $params['type'];
// on peut imaginer d'autres types d'import que les publications
switch($type) {
case 'publication':
$retour = $this->importerPublications($nom_fichier);
break;
default:
$retour = false;
}
// Suppression du fichier importé
unlink($this->dossier_import_tmp.$fichier['name']);
$retour_import = array("succes_import" => "1", "erreurs" => array());
 
// Les fonctions d'imports produisent le nombre de lignes importées
// ou bien une ou des erreurs
if(is_numeric($retour)) {
$retour_import['nb_elements_importes'] = $retour;
} else {
$retour_import['succes_import'] = "0";
$retour_import['erreurs'] = $retour;
}
// Mise en session des résultats d'import
// afin de pouvoir appeler le service en lecture pour obtenir les stats
$_SESSION['coel']['import_stat'] = $retour_import;
header('Content-type : application/json');
echo json_encode($retour_import);
exit;
}
private function verifierConditionsImport() {
$erreurs = false;
if(empty($_FILES)) {
$erreurs[] = "Ce service requiert un fichier à uploader";
}
$fichier = reset($_FILES);
if($fichier['error'] != UPLOAD_ERR_OK) {
$erreurs[] = "Des erreurs sont survenues durant l'upload du fichier";
}
if($fichier['size'] == 0) {
$erreurs[] = "Le fichier envoyé est vide";
}
$deplacement = move_uploaded_file($fichier['tmp_name'], $this->dossier_import_tmp.$fichier['name']);
if(!$deplacement) {
$erreurs[] = "Erreur du déplacement du fichier sur le serveur";
}
return $erreurs;
}
private function importerPublications($nom_fichier) {
$retour = false;
$script = sprintf($this->chemin_script, $nom_fichier);
exec($script, $retour);
return array_pop($retour);
}
}
/trunk/scripts/modules/import/Import.php
9,6 → 9,9
protected $parametres_autorises = array(
'-n' => array(true, false, 'Nom du fichier à importer.'));
protected $table_publication = null;
protected $table_auteur = null;
protected $colonnes_obligatoires = array();
protected $colonnes_acceptees = array();
26,8 → 29,7
$fichier = $this->getParametre('n');
switch ($cmd) {
case "import" :
//testerauteur
$this->charger($fichier); break;
$resultat = $this->charger($fichier); break;
default :
$this->traiterErreur('Erreur : la commande "%s" n\'existe pas!', array($cmd));
}
34,6 → 36,9
} catch (Exception $erreur) {
$this->traiterErreur($erreur->getMessage());
}
// renvoi du résultat vers la sortie php
echo $resultat;
}
private function initialiserScript() {
48,6 → 53,10
$this->colonnes_obligatoires= Config::get('champs_obligatoires');
$this->colonnes_acceptees = Config::get('champs');
$tables = Config::get('tables');
$this->table_publication = $tables['publication'];
$this->table_auteur = $tables['auteur'];
}
 
private function charger($fichier) {
92,26 → 101,64
}
}
// Ajout du nom complet formaté de la publication
$ligne_inseree[] = $this->formaterNomComplet($ligne, $index_colonnes_importees);
$ligne_inseree[] = $this->bdd->proteger($this->formaterNomComplet($ligne, $index_colonnes_importees));
$lignes[] = "(".implode(",", $ligne_inseree).")";
}
// Ajout de la colonne nom complet aux champs de la requête
$colonnes_importees[] = 'cpu_fmt_nom_complet';
$this->insererPublications($colonnes_importees, $lignes);
// le script renvoie le nombre de publications importées
return $this->insererPublications($colonnes_importees, $lignes);
}
protected function formaterNomComplet($ligne, $roles) {
// TODO: écrire la fonction
return 'aaaaa';
$roles = array_flip($roles);
// Intitulé de la publication complet : fmt_auteur, date_parution(année). titre. Editeur (nom), collection, fascicule, indication_nvt. pages.
// indication_nvt = serie_tome
$champs_nom_complet = array('auteur', 'annee', 'titre', 'editeur', 'intitule_revue', 'fascicule', 'serie_tome', 'pages');
$champs_fmt = array();
$fmt_nom_complet = "";
foreach($champs_nom_complet as $champ) {
$index = $roles[$champ];
if(!isset($ligne[$index])) {
$champs_fmt[$champ] = "";
} else {
$champs_fmt[$champ] = $ligne[$index];
}
}
$indication_nvt_pages = array($champs_fmt['serie_tome'], $champs_fmt['pages']);
$indication_nvt_pages = array_filter($indication_nvt_pages, 'strlen');
$indication_nvt_pages = trim(implode(". ", $indication_nvt_pages));
$indication_nvt_pages .= !empty($indication_nvt_pages) ? "." : "";
$annee_titre_editeur = array($champs_fmt['annee'], $champs_fmt['titre'], $champs_fmt['editeur']);
$annee_titre_editeur = array_filter($annee_titre_editeur, 'strlen');
$annee_titre_editeur = trim(implode(". ", $annee_titre_editeur));
$fmt_nom_complet = array($champs_fmt['auteur'],
$annee_titre_editeur,
$champs_fmt['intitule_revue'],
$champs_fmt['fascicule'],
$indication_nvt_pages);
$fmt_nom_complet = array_filter($fmt_nom_complet, 'strlen');
$fmt_nom_complet = implode(", ", $fmt_nom_complet);
return $fmt_nom_complet;
}
private function insererPublications(&$colonnes, &$publications) {
$requete = "INSERT INTO $table ".
$requete = "INSERT INTO ".$this->table_publication." ".
"(".implode(',', $colonnes).") ".
"VALUES ".implode(","."\n", $publications)."\n";
echo $requete;exit;
return $this->bdd->executer($requete);
}
private function traiterChamp($valeur, $role) {
127,22 → 174,25
return $this->bdd->proteger($valeur);
}
private function obtenirInfosAuteur($auteur) {
$retour = $auteur;
if(isset($cache_auteur[$auteur])) {
$retour = $cache_auteur[$auteur];
private function obtenirInfosAuteur($auteur_intitule) {
$retour = $auteur_intitule;
if(isset($this->cache_auteur[$auteur_intitule])) {
$retour = !empty($this->cache_auteur[$auteur_intitule]['cp_id_personne']) ?
$this->cache_auteur[$auteur_intitule]['cp_id_personne'] :
$this->cache_auteur[$auteur_intitule];
} else {
$auteur = $this->fabriquerCombinaisonsAuteur($auteur);
$auteur = $this->fabriquerCombinaisonsAuteur($auteur_intitule);
$auteur_req = "(".implode(', ', $auteur).")";
$requete = "SELECT cp_id_personne FROM coel_personne WHERE cp_fmt_nom_complet IN ".$auteur_req;
$requete = "SELECT cp_id_personne, cp_fmt_nom_complet FROM ".$this->table_auteur." WHERE cp_fmt_nom_complet IN ".$auteur_req;
$infos_auteur = $this->bdd->recupererTous($requete);
if(!empty($infos_auteur)) {
$retour = $infos_auteur[0]['cp_id_personne'];
$cache_auteur[$auteur] = $infos_auteur[0]['cp_id_personne'];
$this->cache_auteur[$auteur_intitule] = $infos_auteur[0];
} else {
$cache_auteur[$auteur] = $auteur;
$retour = $auteur_intitule;
$this->cache_auteur[$auteur_intitule] = $auteur_intitule;
}
}
192,8 → 242,6
$possibilites_auteurs = $this->cartesian(array($combinaisons[0], $combinaisons[1]));
$possibilites_auteurs = array_merge($possibilites_auteurs, $this->cartesian(array($combinaisons[1], $combinaisons[0])));
}
// Elimination d'éventuels doublons
array_unique($possibilites_auteurs);
$auteurs_formates = array();
foreach($possibilites_auteurs as &$possibilite) {