Subversion Repositories eFlore/Applications.cel

Rev

Rev 2394 | Rev 2604 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

<?php
// declare(encoding='UTF-8');
/**
 * Fournit un référentiel relatif à l'utilisateur sur les noms ou les valeurs des champs étendus.
 *
 * @internal   Mininum PHP version : 5.2
 * @category   CEL
 * @package    Services
 * @subpackage Auto-complétions
 * @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 NomsChampsEtendus extends Cel {

        /**
         * Suivant le type de référentiel donné en paramètre, renvoie les liste de ses éléments
         *
         * uid[0] : "cle" ou "valeur"
         * $_GET["cle"] : restreint la recherche sur les valeurs d'une certaine clé
         * $_GET["recherche"] : cherche les noms qui commmencent selon la valeur
         */
        public function getElement($uid){
                if (!$this->paramObligatoiresSontPresents($uid)) {
                        return;
                }
                $_GET['recherche'] = str_replace('*', '%', $_GET['recherche']);
                $referentiel = array();

                if ($uid[0] == 'cle') {
                        $referentiel = $this->rechercherCles($_GET['recherche']);
                } else if($uid[0] == 'valeur') {
                        $referentiel = $this->rechercherValeurs($_GET['cle'], $_GET['recherche']);
                }

                $this->envoyerJson($referentiel);
                return true;
        }

        private function rechercherCles($recherche_cle) {
                // Recherche dans clé du catalogue et les clés déja saisies par les utilisateurs.
                // Si une clé est présente dans les deux tables, on privilégie celle du catalogue
                // qui contient un label bien formé
                $labelP = Cel::db()->proteger($recherche_cle);
                $requete = "(SELECT cle, label, 'catalogue' ".
                        'FROM cel_catalogue_champs_etendus '.
                        "WHERE label LIKE $labelP ".
                        'AND groupe = 0 )'.
                        'UNION '.
                        "(SELECT DISTINCT cle, cle AS label, 'utilisateur' ".
                        'FROM cel_obs_etendues '.
                        "WHERE cle LIKE $labelP ".
                        'AND cle NOT IN (SELECT cle FROM cel_catalogue_champs_etendus) '.
                        ') '.
                        ' -- '.__FILE__.':'.__LINE__;
                $resultat = Cel::db()->requeter($requete);

                $referentiel = array();
                foreach ($resultat as $valeur) {
                        $referentiel[$valeur['cle']] = $valeur['label'];
                }
                return $referentiel;
        }

        private function rechercherValeurs($cle, $recherche_valeur) {
                $cleP = Cel::db()->proteger($cle);
                $valeurP = Cel::db()->proteger($recherche_valeur.'%');
                $requete = 'SELECT DISTINCT valeur '.
                        'FROM cel_obs_etendues '.
                        "WHERE cle = $cleP ".
                        "AND valeur LIKE $valeurP ".
                        ' -- '.__FILE__.':'.__LINE__;
                $resultats = Cel::db()->requeter($requete);

                $referentiel = array();
                foreach ($resultats as $valeur) {
                        if (trim($valeur['valeur']) != '') {
                                $referentiel[] = $valeur['valeur'];
                        }
                }
                return $referentiel;
        }

        private function paramObligatoiresSontPresents($uid) {
                return (isset($uid[0]) && ($uid[0] == 'cle' || $uid[0] == 'valeur'));
        }
}