Subversion Repositories eFlore/Projets.eflore-projets

Rev

Rev 880 | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
/**
 * 
 * regroupement de fonctions de vérification des fichiers de données .tsv qui créé des fichiers log
 * les classes qui vérifie des données pour des projets peuvent l'étendre
 * @author mathilde
 *
 */
abstract class VerificateurDonnees  {
        
        private $projet;
        private $Message;
        private $Conteneur;
        
        private $ligne_num; //numéro de la ligne parcourue
        private $log = ''; //texte du journal
        protected $colonne_valeur; //valeur d'une colonne
        protected $colonne_num; // numéro d'un colonne
        private $nb_erreurs = 0; // nombre total 
        private $erreurs_ligne; // consigne les erreurs d'une ligne :  $erreurs_ligne[$num_col] = $valeur_erronnee

        
        
        
        public function __construct(Conteneur $conteneur, $projet) {
                $this->Conteneur = $conteneur;
                $this->Message = $this->Conteneur->getMessages();
                $this->projet = $projet;
        }

        
        /**
         * 
         * fonction principale qui parcourt chaque ligne du fichier pour en vérifier la cohérence
         * et déclenche l'écriture du fichier log
         * @param chaine, nom du fichier de données à vérifier
         */
        public function verifierFichier($fichierDonnees){
                $lignes = file($fichierDonnees, FILE_IGNORE_NEW_LINES);
                if ($lignes != false) {
                        foreach ($lignes as $this->ligne_num => $ligne) {
                                $this->verifierErreursLigne($ligne);
                                $this->Message->afficherAvancement("Vérification des lignes");
                        }
                        echo "\n";
                } else {
                        $this->Message->traiterErreur("Le fichier $fichierDonnees ne peut pas être ouvert.");
                }
        
                if ($this->nb_erreurs == 0) {
                        $this->ajouterAuLog("Il n'y a pas d'erreurs.");
                }
                $this->Message->traiterInfo($this->nb_erreurs." erreurs");
        
                $this->ecrireFichierLog();
                
                return $this->nb_erreurs;
        }
        
        
        /**
         * 
         * découpe une ligne en colonnes pour en vérifier le contenu
         * @param chaine, une ligne du fichier
         */
        
        private function verifierErreursLigne($ligne){
                $this->erreurs_ligne = array();
                $colonnes = explode("\t", $ligne);
                if (isset($colonnes)) {
                        foreach ($colonnes as $this->colonne_num => $this->colonne_valeur) {
                                $this->definirTraitementsColonnes();
                        }
                } else {
                        $message = "Ligne {$this->ligne_num} : pas de tabulation";
                        $this->ajouterAuLog($message);
                }
        
                $this->consignerErreursLigne();
        }
        
        
        /**
        *
        * pour le traitement spécifique colonne par colonne
        * 
        */

        abstract protected function definirTraitementsColonnes();
        
        /**
        *
        * note dans le log s'il y a des erreurs dans une ligne
        */
        
        private function consignerErreursLigne() {
                $nbreErreursLigne = count($this->erreurs_ligne);
                $this->nb_erreurs += $nbreErreursLigne;
                if ($nbreErreursLigne != 0) {
                        $this->ajouterAuLog("Erreurs sur la ligne {$this->ligne_num}");
                        $ligneLog = '';
                        foreach ($this->erreurs_ligne as $cle => $v){
                                $ligneLog .= "colonne $cle : $v - ";
                        }
                        $this->ajouterAuLog($ligneLog);
                }
        }
        
        
        /**
         * garde la trace d'une erreur dans une ligne
         * 
         */
        
        protected function noterErreur() {
                $this->erreurs_ligne[$this->colonne_num] = $this->colonne_valeur;
        }
        
        
        
        
        //+------------------------------------------------------------------------------------------------------+
        // Gestion du Log
        
        private function ajouterAuLog($txt) {
                $this->log .= "$txt\n";
        }
        
        private function ecrireFichierLog() {
                $base = Config::get('chemin_scripts');
                $fichierLog = $base.'/modules/'.$this->projet.'/log/verification.log';
                file_put_contents($fichierLog, $this->log);
        }
}
?>