Subversion Repositories eFlore/Applications.coel

Rev

Rev 1882 | 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);
        }
}