Subversion Repositories eFlore/Applications.del

Rev

Blame | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Récupère des listes de mots clés associés aux images
 *
 * @category   DEL
 * @package    Services
 * @subpackage MotsCles
 * @version    0.1
 * @author     Mathias CHOUET <mathias@tela-botanica.org>
 * @author     Jean-Pascal MILCENT <jpm@tela-botanica.org>
 * @author     Aurelien 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>
 * @copyright  1999-2014 Tela Botanica <accueil@tela-botanica.org>
 */

class ListeMotsCles {

        private $conteneur;
        private $navigation;
        private $bdd;

        private $mapping = array();
        private $mappingInverse = array();

        public function __construct(Conteneur $conteneur = null) {
                $this->conteneur = $conteneur == null ? new Conteneur() : $conteneur;
                $this->navigation = $conteneur->getNavigation();
                $this->bdd = $this->conteneur->getBdd();

                $this->mapping = $this->conteneur->getParametreTableau('mots-cles.mapping');
                $this->mappingInverse = array_flip($this->mapping);
        }

        /**
         * Méthode principale de la classe.
         * Lance la récupération des images dans la base et les place dans un objet ResultatService
         * pour l'afficher.
         * @param array $ressources les ressources situées après l'url de base (ex : http://url/ressource1/ressource2)
         * @param array $parametres les paramètres situés après le ? dans l'url
         * */
        public function consulter($ressources, $parametres) {
                // Lancement du service
                $motsCles = $this->chargerMotsCles();
                $total = $this->compterMotsClesTotal();

                $motsClesSortie = $this->formaterMotsCles($motsCles);
                $this->navigation->setTotal($total);

                $resultat = new ResultatService();
                $resultat->corps = array('entete' => $this->navigation->getEntete(), 'resultats' => $motsClesSortie);
                return $resultat;
        }

        private function chargerMotsCles() {
                $requete = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS * '.
                        'FROM del_image_tag '.
                        'WHERE actif = 1 '.$this->creerClauseWhere().
                        'LIMIT '.$this->navigation->getDepart().','.$this->navigation->getLimite().' '.
                        ' -- '.__FILE__.' : '.__LINE__;
                $resultat = $this->bdd->recupererTous($requete);
                return is_array($resultat) ? $resultat : array();
        }

        private function creerClauseWhere() {
                $where = array();
                $filtres = $this->navigation->getFiltre();
                if (!empty($filtres)) {
                        foreach ($filtres as $cle => $valeur) {
                                $where[] = $this->mappingInverse[$cle].' = '.$this->bdd->proteger($valeur);
                        }
                }
                $clauseWhere =  (!empty($where)) ? ' AND '.implode(' AND ', $where).' ' : '';
                return $clauseWhere;
        }

        /**
         * Compter le nombre total de commentaires dans la base vis à vis des filtres de l'url.
         * Utilisation du mécanisme SQL_CALC_FOUND_ROW de Mysql pour éviter une deuxième requete avec un COUNT.
         */
        private function compterMotsClesTotal() {
                $requete = 'SELECT FOUND_ROWS() AS nbre ';
                $resultats = $this->bdd->recuperer($requete);
                return (int) $resultats['nbre'];
        }

        /**
         * Formater les mots clés pour la sortie.
         *
         * @param $mots_cles les mots clés à formater
         * @return $mots_cles les mots clés mis à jour au format de la sortie du web service
         */
        private function formaterMotsCles($mots_cles) {
                $retour = array();
                foreach ($mots_cles as $mot_cle) {
                        // Boucle sur le mapping pour respecter l'ordre des champs de sortie
                        foreach ($this->mapping as $nomChampBdd => $nomAttributSortie) {
                                if (isset($mot_cle[$nomChampBdd])) {
                                        $retour[$mot_cle['id_tag']][$nomAttributSortie] = $mot_cle[$nomChampBdd];
                                }
                        }
                }
                return $retour;
        }
}