Subversion Repositories eFlore/Applications.cel

Rev

Rev 2095 | Go to most recent revision | Blame | Last modification | View Log | RSS feed

<?php
class Maintenance extends Script {

        protected $bdd;

        public function __construct($script_nom, $parametres_cli) {
                parent::__construct($script_nom, $parametres_cli);
                $this->bdd = new Bdd();
        }

        public function executer() {
                $cmd = $this->getParametre('a');
                try {
                        switch ($cmd) {
                                case 'regenererMotsClesTexteObs' :
                                        $this->regenererMotsClesTexteObs();
                                        break;
                                case 'regenererMotsClesTexteImages' :
                                        $this->regenererMotsClesTexteImages();
                                        break;
                                case 'viderMotsClesTexteImagesSansMotsCles' :
                                        $this->viderMotsClesTexteImagesSansMotsCles();
                                        break;
                                case 'viderMotsClesTexteObsSansMotsCles' :
                                        $this->viderMotsClesTexteObsSansMotsCles();
                                        break;
                                case 'regenererChampsTailleImage' :
                                        $this->regenererChampsTailleImage();
                                        break;
                                default :
                                        $msg = "Erreur : la commande '$cmd' n'existe pas!\n".
                                                "Commandes existantes : regenererMotsClesTexteImages, regenererMotsClesTexteObs";
                                        throw new Exception($msg);
                        }
                } catch (Exception $e) {
                        $this->traiterErreur($e->getMessage());
                }
        }

        // Régénère le champ "mots_cles_texte" pour toutes les images ayant des mots clés mais ayant ce champ
        // vide, suite à une erreur
        protected function regenererMotsClesTexteImages() {
                $req = "SELECT id_image FROM cel_images WHERE (mots_cles_texte IS NULL OR mots_cles_texte='') "
                        . "AND id_image IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
                $res = $this->bdd->recupererTous($req);
                echo count($res) . " images trouvées\n";
                foreach ($res as $image) {
                        $req = "UPDATE cel_images SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_images cm "
                                . "INNER JOIN cel_mots_cles_images_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_image'] . "') "
                                . "WHERE id_image = '" . $image['id_image'] . "'";
                        $this->bdd->requeter($req); 
                }
        }

        // Régénère le champ "mots_cles_texte" pour toutes les observations ayant des mots clés mais ayant ce champ
        // vide, suite à une erreur
        protected function regenererMotsClesTexteObs() {
                $req = "SELECT id_observation FROM cel_obs WHERE (mots_cles_texte IS NULL OR mots_cles_texte='') "
                        . "AND id_observation IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
                $res = $this->bdd->recupererTous($req);
                echo count($res) . " observations trouvées\n";
                foreach ($res as $image) {
                        $req = "UPDATE cel_obs SET mots_cles_texte = (SELECT GROUP_CONCAT(mot_cle) FROM cel_arbre_mots_cles_obs cm "
                        . "INNER JOIN cel_mots_cles_obs_liaison cml ON cml.id_mot_cle = cm.id_mot_cle AND cml.id_element_lie = '" . $image['id_observation'] . "') "
                                . "WHERE id_observation = '" . $image['id_observation'] . "'";
                        $this->bdd->requeter($req); 
                }
        }

        // Vide le champ "mots_cles_texte" pour toutes les images n'ayant aucun mot clé
        protected function viderMotsClesTexteImagesSansMotsCles() {
                $req = "UPDATE cel_images SET mots_cles_texte = NULL WHERE id_image NOT IN (SELECT id_element_lie FROM cel_mots_cles_images_liaison)";
                $res = $this->bdd->requeter($req);
                echo "$res images mises à jour\n";
        }

        // Vide le champ "mots_cles_texte" pour toutes les obs n'ayant aucun mot clé
        protected function viderMotsClesTexteObsSansMotsCles() {
                $req = "UPDATE cel_obs SET mots_cles_texte = NULL WHERE id_observation NOT IN (SELECT id_element_lie FROM cel_mots_cles_obs_liaison)";
                $res = $this->bdd->requeter($req);
                echo "$res observations mises à jour\n";
        }
        
        protected function regenererChampsTailleImage() {
                $req = "SELECT id_image FROM cel_images WHERE hauteur = 0 OR largeur = 0";
                $res = $this->bdd->recupererTous($req);
                
                echo count($res)." images concernees \n";
                echo "Début du traitement \n";
                $images_maj = 0;
                $image_meta_ratees = 0;
                $images_inexistantes = 0;
                
                foreach($res as $image) {
                        $chemin = $this->getCheminImage($image['id_image']); 
                        if(file_exists($chemin)) {
                                list($largeur, $hauteur) = @getimagesize($chemin);
                                if(is_numeric($largeur) && is_numeric($hauteur)) {
                                        $req_maj = "UPDATE cel_images SET hauteur = '".$hauteur."', largeur = '".$largeur."' ".
                                                   "WHERE id_image = '".$image['id_image']."'";
                                        $maj_taille_image = $this->bdd->requeter($req_maj);
                                        if($maj_taille_image) {
                                                $images_maj++;
                                        }
                                } else {
                                        $image_meta_ratees++;
                                }
                        } else {
                                $images_inexistantes++;
                        }
                        $this->afficherAvancement("\tImages traitées : ", 1);
                }       
                echo "\n";
                echo "Fin de la régénération des tailles des images à partir des metadonnées \n";
                echo $images_maj." images ont vu leur infos de taille régénérées \n";
                echo $image_meta_ratees." images ont raté l'extraction de metadonnées \n";
                echo $images_inexistantes." images n'existent pas en tant que fichier \n";
        }
        
        private function getCheminImage($id) {
                $chemin_base = Config::get('dossierImages');
                                
                $id = sprintf('%09s', $id);
                $id = wordwrap($id, 3 , '_', true);
                
                list($dossierNiveau1, $dossierNiveau2) = explode('_', $id);
                
                $chemin = $chemin_base.$dossierNiveau1.'/'.$dossierNiveau2.'/O/'.$id.'_O.jpg';
                
                return $chemin;
        }
}
?>