/trunk/controleurs/Recherche.php |
---|
9,7 → 9,7 |
* @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$$ |
* @version SVN: $Id$ |
*/ |
class Recherche extends ColControleur { |
31,7 → 31,7 |
// Gestion des données de la requête |
$chaine = $this->obtenirChaineRecherche(); |
$this->memoriserChaineRecherche($chaine); |
$donnees['recherche'] = $chaine; |
$donnees['recherche'] = htmlspecialchars(stripslashes($chaine)); |
// Gestion de l'url |
$this->url->setVariableRequete('module', 'Recherche'); |
65,13 → 65,15 |
public function rechercher() { |
$donnees = array(); |
$rechercheDao = $this->getModele('RechercheDao'); |
$parametres = array('mots' => ''); |
$parametres = array('mots' => '*'); |
// Récupération des paramêtres de l'url |
$chaine_de_recherche = ''; |
if (isset($_GET['recherche'])) { |
$parametres['mots'] = $_GET['recherche']; |
$chaine_de_recherche = $_GET['recherche']; |
} |
$parametres = $this->parserChaineDeRecherche($chaine_de_recherche); |
// Gestion du nombre de résultats |
$donnees_total = $rechercheDao->chercherStructureNbre($parametres); |
85,8 → 87,9 |
// Gestion de l'accès aux données |
$rechercheDao->setLimitation(($de - 1), $fragmenteur->getDonneesParPage()); |
$rechercheDao->setDistinction(1); |
$resultats = $rechercheDao->chercher($parametres); |
Debug::printr($resultats); |
// Post-traitement des résultats pour l'affichage |
$this->url->setVariableRequete('module', 'Fiche'); |
foreach ($resultats as $resultat) { |
119,6 → 122,53 |
$this->chargerPiedDePage(); |
} |
private function parserChaineDeRecherche($chaine) { |
// Pré-traitement de la chaine de recherche |
// Suppression des slash ajouté automatiquement par PHP |
$chaine = stripslashes($chaine); |
$mots = preg_split('/ /i', $chaine, -1, PREG_SPLIT_NO_EMPTY); |
Debug::printr($mots); |
$parametres = array('mots' => ''); |
$cle_precedente = null; |
foreach ($mots as $mot) { |
if (preg_match('/^(sci|bot|zg|p|pr):(.*)$/', $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; |
} |
} |
} |
Debug::printr($parametres); |
$this->remplacerAbreviationParId($parametres); |
Debug::printr($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('bot' => 1083, 'pr' => 1030); |
foreach ($params_a_remplacer as $param => $id_liste) { |
if (isset($parametres[$param])) { |
$liste = Ontologie::getListeTrieeParAbreviation($id_liste); |
Debug::printr($liste); |
$cle = strtoupper($parametres[$param]); |
if (isset($liste[$cle])) { |
$parametres[$param] = $liste[$cle]['id']; |
} |
} |
} |
} |
/** |
* Recherche des collections. |
* @return string la vue correspondante |
/trunk/modeles/RechercheDao.php |
---|
20,8 → 20,8 |
* @return array un tableau contenant des objets d'informations sur les collections |
*/ |
public function chercherStructureNbre($parametres) { |
$mots = urlencode($parametres['mots']); |
$url = $this->url_jrest.self::SERVICE."/Nombre/$mots"; |
$url = $this->construireUrlRecherche('Nombre', $parametres, false); |
$json = file_get_contents($url); |
$donnees = json_decode($json); |
return $donnees; |
32,12 → 32,34 |
* @return array un tableau contenant des objets d'informations sur les collections |
*/ |
public function chercher($parametres) { |
$mots = urlencode($parametres['mots']); |
$url = $this->url_jrest.self::SERVICE."/ParDefaut/$mots"; |
$url .= ($this->avoirLimitation() ? "?start={$this->getLimiteDebut()}&limit={$this->getLimiteNbre()}" : ''); |
$url = $this->construireUrlRecherche('ParDefaut', $parametres); |
Debug::printr($url); |
$json = file_get_contents($url); |
$donnees = json_decode($json, true); |
return $donnees; |
} |
private function construireUrlRecherche($type, $parametres, $limitation = true) { |
$url = $this->url_jrest.self::SERVICE.'/'.$type; |
$params_a_passer = array('mots', 'sci', 'bot', 'zg', 'p', 'pr'); |
foreach ($params_a_passer as $param_cle) { |
if (isset($parametres[$param_cle]) && $parametres[$param_cle] != '') { |
$valeur = urlencode($parametres[$param_cle]); |
$url .= '/'.$valeur; |
} else { |
$url .= '/*'; |
} |
} |
if ($limitation) { |
$url .= ($this->avoirLimitation() ? "?start={$this->getLimiteDebut()}&limit={$this->getLimiteNbre()}" : ''); |
$url .= "&distinct={$this->getDistinction()}"; |
} else { |
$url .= "?distinct={$this->getDistinction()}"; |
} |
return $url; |
} |
} |
?> |
/trunk/modeles/CollectionDao.php |
---|
17,6 → 17,7 |
const SERVICE_COLLECTION_A_PERSONNE = 'CoelCollectionAPersonne'; |
const SERVICE_COLLECTION_A_PUBLICATION = 'CoelCollectionAPublication'; |
const SERVICE_COLLECTION_A_COMMENTAIRE = 'CoelCollectionACommentaire'; |
/** |
* Retourne l'ensemble des information sur une collection. |
* |
/trunk/modeles/Ontologie.php |
---|
53,7 → 53,22 |
$retour = $liste; |
} |
return $retour; |
} |
} |
public static function getListeTrieeParAbreviation($id_liste) { |
$retour = false; |
$liste = self::getListe($id_liste); |
if ($liste !== false) { |
$liste_par_abr = array(); |
foreach ($liste as $cle => $valeur) { |
$valeur_fromatee = self::formaterTableauValeur($valeur); |
$abreviation = $valeur_fromatee['abreviation']; |
$liste_par_abr[$abreviation] = $valeur_fromatee; |
} |
$retour = $liste_par_abr; |
} |
return $retour; |
} |
public static function chargerValeur($id_valeur) { |
$retour = true; |
103,7 → 118,8 |
$valeur_formatee = array(); |
if (is_array($valeur) && count($valeur) > 0) { |
$valeur_formatee = array( |
'parent' => $valeur['cmlv_id_valeur'], |
'id' => $valeur['cmlv_id_valeur'], |
'parent' => $valeur['cmlv_ce_parent'], |
'projet' => $valeur['cmlv_ce_projet'], |
'nom' => $valeur['cmlv_nom'], |
'abreviation' => $valeur['cmlv_abreviation'], |
/trunk/bibliotheque/noyau/ColModele.php |
---|
13,6 → 13,7 |
* @version SVN: $Id$ |
*/ |
abstract class ColModele extends Modele { |
protected $distinction = '0'; |
protected $limite_debut = null; |
protected $limite_nbre = null; |
protected $url_jrest = null; |
30,6 → 31,14 |
return $limitation; |
} |
public function setDistinction($distinct) { |
$this->distinction = $distinct; |
} |
public function getDistinction() { |
return $this->distinction; |
} |
public function setLimitation($limite_debut, $limite_nbre) { |
$this->limite_debut = $limite_debut; |
$this->limite_nbre = $limite_nbre; |
/trunk/squelettes/moteur.tpl.html |
---|
7,4 → 7,92 |
<input name="recherche" type="text" value="<?=$recherche;?>"/> |
<input type="submit" value="OK" /> |
</fieldset> |
</form> |
</form> |
<div> |
<h2>Options de recherche</h2> |
<p>Par défaut, la recherche est insensible à la casse (majuscule / minuscule) et s'effectue |
en intercalant automatiquement le joker % avant, après la chaine recherchée et entre chaque mot de celle-ci.</p> |
<p>Le moteur de recherche permet d'utiliser des opérateurs dans le texte recherché pour préciser la requête.</p> |
<p>Exemples : mpu, "herbier de Coste", bot:he, Coste bot:he, herbier zg:France, p:coste pr:au.</p> |
<table> |
<thead> |
<tr> |
<th>Mot-clé</th> |
<th>Valeurs possibles</th> |
<th>Signification</th> |
<th>Explication</th> |
<th>Exemples</th> |
</tr> |
</thead> |
<tbody> |
<tr> |
<td>sci:</td> |
<td>0,1</td> |
<td>Recherches scientifiques</td> |
<td>Limite les résultats aux institutions autorisant la consultation des collections <em>sans (=0)</em> ou |
<em>avec (=1)</em> des objectifs de recherches scientifiques.</td> |
</td> |
<td>sci:0</td> |
</tr> |
<tr> |
<td>bot:</td> |
<td>HE (Herbier), CE (Centurie - conservée en dehors d'un herbier), DR (Droguier), CA (Carpothèque), |
AL (Collection en alcool), XY (Xylothèque), PM (Collection de préparations microscopiques).</td> |
<td>Type de collection botanique</td> |
<td>Limite les résultats aux collections botaniques du type indiqué.</td> |
<td>bot:he</td> |
</tr> |
<tr> |
<td>zg:</td> |
<td>Texte libre</td> |
<td>Origine géographique du contenu de la collection</td> |
<td>Limite les résultats aux collections dont le contenu correspond à la zone géographique indiquée.</td> |
<td>zg:lozère</td> |
</tr> |
<tr> |
<td>p:</td> |
<td>Texte libre</td> |
<td>Nom ou partie du nom d'une personne.</td> |
<td>Limite les résultats aux institutions et collections liées a une personne dont le nom ou une partie du |
nom correspond à la valeur indiquée.</td> |
<td>p:coste</td> |
</tr> |
<tr> |
<td>pr:</td> |
<td>CT (Contributeur), AU (Auteur), CO (Collecteur), DE (Déterminateur), HE (Hébergeur - particulier possédant une collection chez lui). |
<td>Rôle d'une personne.</td> |
<td>Limite les résultats aux institutions et collections liées a une personne dont le rôle correspond à la valeur indiquée.</td> |
<td>pr:AU</td> |
</tr> |
</tbody> |
</table> |
<p>Pour les opérateurs dont la valeur possible est un <em>texte libre</em>, il est possible d'utiliser des jokers. |
Ces "jokers" permettent de modifier la recherche sur une chaine de caractères.</p> |
<p>Exemples : mpu, "herbier de Coste", "herbier % Montpellier", p:"Jo_l"</p> |
<table> |
<thead> |
<tr> |
<th>Joker</th> |
<th>Explication</th> |
<th>Exemples</th> |
</tr> |
</thead> |
<tbody> |
<tr> |
<td>""</td> |
<td>Permet de rechercher sur une expression exacte.</td> |
<td>"Archives de l'herbier Granger"</td> |
</tr> |
<tr> |
<td>%</td> |
<td>Remplace n'importe quel nombre de caractères, y compris aucun.</td> |
<td>"herbier %Abbé% Carondelet"</td> |
</tr> |
<tr> |
<td>_</td> |
<td>Remplace exactement un caractère</td> |
<td>p:"Jo_l"</td> |
</tr> |
</tbody> |
</table> |
</div> |