Subversion Repositories eFlore/Applications.del

Rev

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

<?php
// declare(encoding='UTF-8');
/**
 * Retourne la liste commentaires correspondant aux filtres passés dans l'url :
 * http://localhost/del/services/0.1/commentaires => liste tous les commentaires
 * Filtres : voir le fichier de config : commentaires.masques_possibles
 *
 * @category   DEL
 * @package    Services
 * @subpackage Commentaires
 * @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 ListeCommentaires {

        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 = $this->conteneur->getNavigation();
                $this->bdd = $this->conteneur->getBdd();

                $this->mapping = $this->conteneur->getParametreTableau('commentaires.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) {
                // Lancement du service
                $commentaires = $this->chargerCommentaires();
                $total = $this->compterCommentairesTotal();

                $commentaires = $this->formaterCommentaires($commentaires);
                $this->navigation->setTotal($total);

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

        /**
        * Chargement depuis la bdd de tous les commentaires
        * */
        private function chargerCommentaires() {
                $requete = 'SELECT DISTINCT SQL_CALC_FOUND_ROWS * '.
                        'FROM del_commentaire '.
                        'WHERE '.$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)) ? ' '.implode(' AND ', $where).' ' : ' 1 ';
                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 compterCommentairesTotal() {
                $requete = 'SELECT FOUND_ROWS() AS nbre ';
                $resultats = $this->bdd->recuperer($requete);
                return (int) $resultats['nbre'];
        }

        /**
        *  Formater les commentaires
        *  @param $commentaires les commentaires à mettre à jour
        *  @return $commentaires les commentaires mis à jour
        * */
        private function formaterCommentaires($commentaires) {
                $retour = array();
                foreach ($commentaires as $idCommentaire => $infos) {
                        $idCommentaire = $infos['id_commentaire'];
                        foreach ($this->mapping as $nomChampBdd => $nomAttributSortie) {
                                $retour[$idCommentaire][$nomAttributSortie] = $infos[$nomChampBdd];
                        }
                }
                return $retour;
        }
}