New file |
0,0 → 1,186 |
<?php |
// declare(encoding='UTF-8'); |
/** |
* classe Controleur du module Recherche. |
* |
* @package Referentiel |
* @category Php5 |
* @author Jean-Pascal MILCENT <jpm@tela-botanica.org> |
* @copyright 2010 Tela-Botanica |
* @license http://www.cecill.info/licences/Licence_CeCILL_V2-fr.txt Licence CECILL |
* @license http://www.gnu.org/licenses/gpl.html Licence GNU-GPL |
* @version SVN: $Id: Recherche.php 147 2010-09-06 09:37:22Z jpm $ |
*/ |
class Recherche extends AppliControleur { |
|
private $chaine_recherche = null; |
private static $url_exemple = null; |
private $referentiel = null; |
|
//+----------------------------------------------------------------------------------------------------------------+ |
// Méthodes |
/** |
* Fonction d'affichage par défaut, elle appelle la liste des administrateurs |
*/ |
public function executerActionParDefaut() { |
return $this->rechercher(); |
} |
|
/** |
* Charge le moteur de recherche et l'envoie à la vue. |
*/ |
public function chargerMoteurRecherche($ref = null) { |
$donnees = array(); |
$this->referentiel = $ref; |
// Gestion des données de la requête |
$donnees['recherche'] = htmlspecialchars($this->obtenirChaineRecherche()); |
|
// Gestion des urls |
$donnees['url_form'] = $this->obtenirUrlRecherche($this->referentiel); |
$donnees['url_referentiel'] = $this->referentiel; |
$donnees['url_module'] = 'Recherche'; |
$donnees['url_action'] = 'rechercher'; |
self::$url_exemple = $this->obtenirUrlRecherche('BDNFM','%s'); |
|
// Gestion du squelette et de la sortie |
$this->setSortie(self::RENDU_TETE, $this->getVue('moteur', $donnees)); |
} |
|
private function obtenirChaineRecherche() { |
$chaine = ''; |
if (!is_null($this->chaine_recherche)) { |
$chaine = $this->chaine_recherche; |
} else if (isset($_GET['recherche'])) { |
// Pré-traitement de la chaine de recherche |
$chaine = $_GET['recherche']; |
// Suppression des slash ajouté automatiquement par PHP devant les guillemets |
$chaine = stripslashes($chaine); |
// Mémorisation de la chaine |
$this->memoriserChaineRecherche($chaine); |
// Stockage dans la classe pour éviter d'effectuer à nouveau le traitement ci-dessus |
$this->chaine_recherche = $chaine; |
} else if (isset($_SESSION['ref']['recherche'])) { |
$chaine = $_SESSION['ref']['recherche']; |
} |
return $chaine; |
} |
|
private function memoriserChaineRecherche($chaine) { |
$_SESSION['ref']['recherche'] = $chaine; |
} |
|
public static function getUrlExemple($chaine) { |
$url = ''; |
if (!is_null(self::$url_exemple)) { |
// L'utilisation d'urlencode nécessiate de pré-encodé la chaine dans le format de sortie si nécessaire |
if (Config::get('sortie_encodage') != Config::get('appli_encodage')) { |
$chaine = mb_convert_encoding($chaine, Config::get('sortie_encodage'), Config::get('appli_encodage')); |
} |
$chaine = urlencode($chaine); |
$url = sprintf(self::$url_exemple, $chaine); |
} |
return $url; |
} |
|
/** |
* Recherche sur référentiel. |
* @return string la vue correspondante |
*/ |
public function rechercher() { |
$donnees = array(); |
$rechercheDao = new RechercheDao(); |
$parametres = array('mots' => '*'); |
if (isset($_GET['ref'])) { // code du projet courrant |
$this->referentiel = strtolower($_GET['ref']); |
} |
$this->definirCommeModulePrincipal(get_class($this)); |
$this->construireMenu($this->referentiel); |
$this->construireFilAriane($this->referentiel); |
|
// Récupération des paramêtres de l'url |
$chaine_de_recherche = $this->obtenirChaineRecherche(); |
if (!empty($chaine_de_recherche)) { |
$this->url->setVariablesRequete(array('module' => 'Recherche', |
'action' => 'rechercher', |
'ref' => $this->referentiel, |
'recherche' => $chaine_de_recherche)); |
} |
$parametres = $this->parserChaineDeRecherche($chaine_de_recherche); |
$parametres['ref'] = $this->referentiel; |
// Gestion du nombre de résultats |
$donnees_total = $rechercheDao->chercherStructureNbre($parametres); |
|
// Gestion du fragmenteur |
$options = array( |
'url' => $this->url, |
'donnees_total' => $donnees_total, |
'donnees_par_page' => Config::get('resultat_par_page_defaut'), |
'donnees_par_page_choix' => Config::get('resultat_par_page_choix'), |
); |
$fragmenteur = Composant::fabrique('fragmenteur', $options); |
$donnees['fragmenteur'] = $fragmenteur->executer(); |
list($de, $a) = $fragmenteur->getDeplacementParPageId(); |
$this->url->unsetVariablesRequete(array('recherche', 'page')); |
|
// Gestion de l'accès aux données |
$rechercheDao->setLimitation(($de - 1), $fragmenteur->getDonneesParPage()); |
$rechercheDao->setDistinction(1); |
$donnees['resultats'] = $rechercheDao->chercher($parametres); |
|
|
// Gestion des squelettes |
$this->chargerMoteurRecherche($this->referentiel); |
$resultat = $this->getVue('resultat_recherche', $donnees); |
$this->setSortie(self::RENDU_CORPS, $resultat); |
} |
|
private function parserChaineDeRecherche($chaine) { |
$mots = preg_split('/ /i', $chaine, -1, PREG_SPLIT_NO_EMPTY); |
$parametres = array('mots' => ''); |
$cle_precedente = null; |
foreach ($mots as $mot) { |
if (preg_match('/^(sg|gen|sp|ssp|au|an|nn|bib|nr|tax):(.*)$/', $mot, $match)) { |
$cle = $match[1]; |
$cle_precedente = $cle; |
$valeur = $match[2]; |
$parametres[$cle] = $valeur; |
} else if (!is_null($cle_precedente)) { |
$parametres[$cle_precedente] .= ' '.$mot; |
} else if (is_null($cle_precedente)) { |
if (empty($parametres['mots'])) { |
$parametres['mots'] = $mot; |
} else { |
$parametres['mots'] .= ' '.$mot; |
} |
} |
} |
$this->remplacerAbreviationParId($parametres); |
|
return $parametres; |
} |
|
private function remplacerAbreviationParId(&$parametres) { |
// liste 27 : Liste des relations entre une collection et une personne (id:1030) |
// liste 80 : Liste des types de collection botanique (id:1083) |
$params_a_remplacer = array('veg' => 1043, 'bot' => 1083, 'pr' => 1030); |
foreach ($params_a_remplacer as $param => $id_liste) { |
if (isset($parametres[$param])) { |
// Si plusieurs valeurs séparées par des virgules |
$valeurs = explode(',', $parametres[$param]); |
$valeurs_nbre = count($valeurs); |
$liste = Ontologie::getListeTrieeParAbreviation($id_liste); |
foreach ($valeurs as $valeur) { |
$cle = strtoupper($valeur); |
if (isset($liste[$cle])) { |
if ($valeurs_nbre == 1) { |
$parametres[$param] = $liste[$cle]['id']; |
} else if ($valeurs_nbre > 1) { |
$valeur = preg_quote($valeur, '/'); |
$parametres[$param] = preg_replace("/$valeur/", $liste[$cle]['id'], $parametres[$param]); |
} |
} |
} |
} |
} |
} |
} |