Rev 1862 | Blame | Compare with Previous | Last modification | View Log | RSS feed
<?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(), "nb_elements_importes" => "0") ;
// 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) {
$utilisateur = array('id' => '', 'session' => session_id(), 'ip' => $_SERVER['REMOTE_ADDR']);
if(!empty($utilisateur_connecte = $this->getUtilisateur())) {
$utilisateur['id'] = $utilisateur_connecte['id'];
}
$retour = false;
$script = sprintf($this->chemin_script, $nom_fichier, "'".json_encode($utilisateur)."'");
exec($script, $retour);
return array_pop($retour);
}
}