Subversion Repositories eFlore/Applications.eflore-consultation

Rev

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

<?php
// declare(encoding='UTF-8');
/**
 * Classe gérant les images.
 *
 * @category    PHP 5.2
 * @package             eflore-consultation
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author              Delphine CAUQUIL <delphine@tela-botanica.org>
 * @copyright   2011 Tela-Botanica
 * @license             http://www.gnu.org/licenses/gpl.html Licence GNU-GPL-v3
 * @license             http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL-v2
 * @version             $Id$
 */
class Images extends Eflore {
        
        private $nntaxon;
        private $limite;
        private $depart;

        public function setNnTaxon($nntax) {
                $this->nntaxon = $nntax;
        }
        
        public function setLimite($limite) {
                $this->limite = $limite;
        }
        
        public function setDepart($depart) {
                $this->depart = $depart;
        }
        
        //TODO: créer des fonctions spécifiques cel et photoflora pour plus de clarté ?
        public function getUrlsImagesParIdsNoms(Array $idsNoms) {
                $infosImages = $this->getInfosImagesParIdsNoms($idsNoms);
                $urls = array();
                if (count($infosImages) > 0) {
                        foreach ($infosImages as $img) {
                                $id = $img['determination.nom_sci.code'];
                                $urls[$id][] = $img['binaire.href'];
                        }
                }
                return $urls;
        }

        // retourne les urls d'une série d'images tirées de del, avec en premier les
        // images d'organes les mieux votées, et ensuite toute les autres images disponibles
        public function getUrlsImagesOrganesParIdsNom($idNom) {
                $infosImages0 = $this->getInfosMeilleuresImagesParTag($idNom, array('fleur', 'feuille', 'fruit', 'ecorce', 'port', 'rameau'), Eflore::PROTOCOLE_CAPITALISATION, 6);
                $infosImages1 = $this->getInfosImagesParIdsNoms(array($idNom));
                $urls = array();
                foreach ($infosImages0 as $imgs) {
                        foreach ($imgs as $img) {
                                $id = $img['determination.nom_sci.code'];
                                $urls[$id][] = $img['binaire.href'];
                        }
                }
                foreach ($infosImages1 as $img) {
                        $id = $img['determination.nom_sci.code'];
                        if (! in_array($img['binaire.href'], $urls[$id])) {
                                $urls[$id][] = $img['binaire.href'];
                        }
                }
                return $urls;
        }

        public function getInfosImagesParIdsNoms(Array $idsNoms) {
                $pas = 800;
                if(count($idsNoms) >= $pas) {
                        $images = array();
                        $idsPartages = array_chunk($idsNoms, $pas);
                        foreach ($idsPartages as $sousEnsembleIdsNoms) {
                                $url = $this->getUrlImagesParIdsNoms($sousEnsembleIdsNoms);
                                $donnees = $this->chargerDonnees($url);
                                $resultats = (isset($donnees['resultats'])) ? $donnees['resultats'] : array();
                                $images += $resultats;
                        }
                } else {
                        $url = $this->getUrlImagesParIdsNoms($idsNoms);
                        $donnees = $this->chargerDonnees($url);
                        $images = (isset($donnees['resultats'])) ? $donnees['resultats'] : array();
                }
                return $this->formaterResultatImages($images);
        }
        
        public function getInfosTrancheImagesParIdsNoms($idNom, $limite = 12) {
                // 12 fait 4 lignes de 3 images donc bien pour l'affichage
                $url = $this->getUrlImagesParIdsNoms($idNom, $limite);
                $donnees = $this->chargerDonnees($url);
                $images = (isset($donnees['resultats'])) ? $donnees['resultats'] : array();
                return $this->formaterResultatImages($images);
        }

        public function getInfosImageParIdImage($id_image) {
                $tpl = $this->obtenirSqueletteSelonApi('imagesPopup');
                $url = $this->formaterUrl($tpl, array('id' => $id_image, 'referentiel' => Registre::get('parametres.referentiel')));
                $image = $this->chargerDonnees($url);
                return $this->formaterResultatImages($image, true);
        }
        
        public function getInfosImages() {
                $url = $this->getUrlImages();
                $donnees = $this->chargerDonnees($url);
                $images = (empty($donnees['resultats']) == false) ? $donnees['resultats'] : array();
                return $this->formaterResultatImages($images);
        }
        
        public function getInfosImagesParFicheEtSentier($tagFiche, $sentier) {
                $tpl = Config::get('smartFloreIllustrationsParSentier');
                $url = $this->formaterUrl($tpl, array('tagFiche' => $tagFiche, 'sentier' => $sentier));
                $donnees = $this->chargerDonnees($url);
                return $donnees['illustrations'] ?? false;
        }

        public function getInfosImageParId($imageId) {
                $tpl = Config::get('baseUrlServicesCelTpl');
                $urlTpl = sprintf($tpl, 'CelImage').'/image?imgId=%d';
                $url = sprintf($urlTpl, $imageId);
                return $this->chargerDonnees($url);
        }

        public function getInfosImagesTaxons() {
                $pas = 800;
                $idsTaxons = explode(',', $this->nntaxon);
                if(count($idsTaxons) >= $pas) {
                        $images = array();
                        $idsPartages = array_chunk($idsTaxons, $pas);
                        foreach ($idsPartages as $sousEnsembleIdsTaxons) {
                                $url = $this->getUrlImagesTaxons(implode(',',$sousEnsembleIdsTaxons));
                                $donnees = $this->chargerDonnees($url);
                                $resultats = (empty($donnees['resultats']) == false) ? $donnees['resultats'] : array();
                                $images += $resultats;
                        }
                } else {
                        $url = $this->getUrlImagesTaxons($idsTaxons);
                        $donnees = $this->chargerDonnees($url);
                        $images = (isset($donnees['resultats'])) ? $donnees['resultats'] : array();
                }
                return $this->formaterResultatImages($images);
        }

        public function getInfosPremiereImageParIdsNoms($idsNoms) {
                $url = $this->getUrlPremiereImageParIdsNoms($idsNoms);
                $donnees = $this->chargerDonnees($url);
                $images = (isset($donnees['resultats'])) ? $donnees['resultats'] : array();
                return $this->formaterResultatImages($images);
        }

        public function getInfosImagesGalerieMobile($nn) {
                $url = $this->getUrlImagesGalerieMobile($nn);
                $donnees = $this->chargerDonnees($url);
                $images = (isset($donnees['resultats'])) ? $donnees['resultats'] : array();
                return $images;
        }

        /**
         * Retourne les $limite images ayant le plus de votes pour CHAQUE tag de $tags pour le protocole $protocole
         */
        public function getInfosMeilleuresImagesParTag($nn, $tags, $protocole = Eflore::PROTOCOLE_CAPITALISATION, $limite = 10, $format = 'CRS') {
                if (! is_array($tags)) {
                        $tags = array($tags);
                }
                $images_tag = array();
                foreach ($tags as $tag) {
                        $url = $this->getUrlMeilleuresImagesParTag($nn, $tag, $protocole, $limite, $format);
                        $donnees = $this->chargerDonnees($url);
                        $images = (isset($donnees['resultats'])) ? $donnees['resultats'] : array();
                        $images_tag[$tag] = $this->formaterResultatImagesDel($images);
                }
                return $images_tag;
        }

        /**
         * Retourne l'image ayant le plus de votes pour le pour capitalisation d'images, pour le premier tags de $tags. S'il
         * n'y a aucune image pour le premier tag, parcourt les autres tags jusqu'à en trouver une.
         */
        public function getInfosMeilleureImageParPrioriteTags($nn, $tags, $format = 'CRS') {
                if (! is_array($tags)) {
                        $tags = array($tags);
                }
                $image = null;
                foreach ($tags as $tag) {
                        $url = $this->getUrlMeilleuresImagesParTag($nn, $tag, Eflore::PROTOCOLE_CAPITALISATION, 1, $format);
                        $donnees = $this->chargerDonnees($url);
                        $image = (isset($donnees['resultats'])) ? $donnees['resultats'] : array();
                        $image = $this->formaterResultatImagesDel($image);
                        if (empty($image) == false) {
                                break;
                        }
                }
                //echo "<pre>" . print_r($image, true) . "</pre>";
                if (is_array($image)) {
                        $image = array_pop($image);
                }
                return $image;
        }

        private function getUrlImagesParIdsNoms($idsNoms, $limite = 801) {
                $tpl = $this->obtenirSqueletteSelonApi('imagesResultatsDetermination');
                $params = array('idsNoms' => implode(',', $idsNoms), 'referentiel' => Registre::get('parametres.referentiel'), 'limite' => $limite);
                $url = $this->formaterUrl($tpl, $params);
                return $url;
        }

        public function getUrlPremiereImageParIdsNoms($idsNoms) {
                $tpl = $this->obtenirSqueletteSelonApi('imagesPremiere');
                $params = array('idsNoms' => implode(',', $idsNoms), 'referentiel' => Registre::get('parametres.referentiel'));
                $url = $this->formaterUrl($tpl, $params);
                return $url;
        }

        private function getUrlImages($nn = false) {
                $tpl = $this->obtenirSqueletteSelonApi('images');
                if ($this->getApi() == Eflore::API_EFLORE) {
                        $params = array('projet' => $this->getProjet(), 'limite' => $this->limite, 'depart' => $this->depart, 'referentiel' => Registre::get('parametres.referentiel'));
                }
                $url = $this->formaterUrl($tpl, $params);
                return $url;
        }

        private function getUrlImagesTaxons($idsTaxons) {
                $tpl = $this->obtenirSqueletteSelonApi('imagesTaxons');
                $params = array('projet' => $this->getProjet(),'nntaxon'=> $idsTaxons, 'referentiel' => Registre::get('parametres.referentiel'));
                $url = $this->formaterUrl($tpl, $params);
                return $url;
        }

        private function getUrlImagesGalerieMobile($nn) {
                $tpl = Config::get('delGalerieMobileTpl');
                $params = array('nn' => $nn, 'referentiel' => Registre::get('parametres.referentiel'));
                $url = $this->formaterUrl($tpl, $params);
                return $url;
        }

        private function getUrlMeilleuresImagesParTag($nn, $tag, $protocole = Eflore::PROTOCOLE_CAPITALISATION, $limite = 10, $format = 'CRS') {
                $tpl = Config::get('delMeilleuresImagesParTagTpl');
                $params = array('nn'=> $nn,
                                                'tag'=> $tag,
                                                'protocole' => $protocole,
                                                'referentiel' => Registre::get('parametres.referentiel'),
                                                'limite' => $limite,
                                                'format' => $format);
                $url = $this->formaterUrl($tpl, $params);
                return $url;
        }

        /**
         * Transforme les résultats issus des Webservices autres que eflore/cel afin de conserver un format homogène
         * @param mixed $images
         */
        private function formaterResultatImages($images, $seulementUne = false) {
                switch ($this->getApi()) {
                        case Eflore::API_DEL:
                                return $this->formaterResultatImagesDel($images, $seulementUne);
                        break;
                        default:
                                return $images;
                }
        }

        private function formaterResultatImagesDel($images, $seulementUne = false) {
                if ($seulementUne) {
                        return $this->formaterUnResultatImagesDel($images);
                } else {
                        $retour = array();
                        foreach ($images as $idObsImage => $image) {
                                $retour[$image['id_image']] = array_merge($images[$idObsImage], $this->formaterUnResultatImagesDel($image));
                        }
                        return $retour;
                }
        }

        /**
         * Convertit un array venant d'un Webservice del vers le format retourné par eflore/cel
         * @param array $image
         * @return array
         */
        private function formaterUnResultatImagesDel(array $image) {
                $libelleAuteur = $image['observation']['auteur.prenom'].' '.$image['observation']['auteur.nom'];
                $codeReferentiel = $image['observation']['determination.referentiel'];
                if (strpos($codeReferentiel, ':') !== false) {
                        $codeReferentiel = substr($image['observation']['determination.referentiel'], 0, strpos($image['observation']['determination.referentiel'], ':'));
                }
                $localiteLibelle = array($image['observation']['zone_geo'],
                                $image['observation']['lieudit'],
                                $image['observation']['station'],
                                $image['observation']['milieu']);
                $retourImage = array(
                                'date' => $image['observation']['date_observation'],
                                'mime' => 'image/jpeg',
                                'auteur.libelle' => $libelleAuteur,
                                'auteur.id' => $image['observation']['auteur.id'],
                                'binaire.href' => $image['binaire.href'],
                                'observation.id' => $image['observation']['id_observation'],
                                'determination.libelle' => $image['observation']['determination.ns'].'[Dét. : '.$libelleAuteur.']',
                                'determination.nom_sci' => $image['observation']['determination.ns'],
                                'determination.nom_sci.code' => $codeReferentiel.'.'.$image['observation']['determination.nn'],
                                'station.commune' => $image['observation']['zone_geo'],
                                'station.lieudit' => $image['observation']['lieudit'],
                                'station.station' => $image['observation']['station'],
                                'station.milieu' => $image['observation']['milieu'],
                                'station.libelle' => $this->formaterLocalite($localiteLibelle)
                );
                return $retourImage;
        }
        
        private function formaterLocalite($infosLocalite) {
                $localiteFmt = array();
                foreach ($infosLocalite as $localite) {
                        if($localite != '') {
                                $localiteFmt[] = $localite;
                        }
                }
                if (empty($localiteFmt)) {
                        $localiteFmt[0] = 'localité inconnue';
                }
                return implode(" > ", $localiteFmt);
        }
}
?>