Subversion Repositories eFlore/Applications.coel-consultation

Compare Revisions

Ignore whitespace Rev 19 → Rev 20

/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&nbsp;: 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&nbsp;: 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>
/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