/trunk/bibliotheque/dao/RechercheDao.php |
---|
6,6 → 6,7 |
* @package Collection |
* @category php5 |
* @author aurelien <aurelien@tela-botanica.org> |
* @author mathias <mathias@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 |
15,23 → 16,27 |
class RechercheDao extends Dao { |
const SERVICE = 'CoelRecherche'; |
/** |
* Recherche une collection en fonction de paramêtres |
* @return array un tableau contenant des objets d'informations sur les collections |
*/ |
/** @deprecated retro-compatibilité */ |
public function chercherStructureNbre($parametres) { |
$url = $this->construireUrlRecherche('Nombre', $parametres, false); |
return $this->chercherCollectionsNbre($parametres); |
} |
/** @deprecated retro-compatibilité */ |
public function chercher($parametres) { |
return $this->chercherCollections($parametres); |
} |
// recherche du nombre de collections : nouveau |
public function chercherCollectionsNbre($parametres) { |
$url = $this->construireUrlRechercheCollections('NombreCollections', $parametres, false); |
$json = $this->envoyerRequeteConsultation($url); |
$donnees = json_decode($json); |
$donnees = json_decode($json, true); |
return $donnees; |
} |
/** |
* Recherche une collection en fonction de paramêtres |
* @return array un tableau contenant des objets d'informations sur les collections |
*/ |
public function chercher($parametres) { |
$url = $this->construireUrlRecherche('ParDefaut', $parametres); |
// recherche du nombre de personnes : nouveau |
public function chercherPersonnesNbre($parametres) { |
$url = $this->construireUrlRecherchePersonnes('NombrePersonnes', $parametres, false); |
$json = $this->envoyerRequeteConsultation($url); |
$donnees = json_decode($json, true); |
38,11 → 43,53 |
return $donnees; |
} |
private function construireUrlRecherche($type, $parametres, $limitation = true) { |
// recherche de collections : nouveau |
public function chercherCollections($parametres) { |
$url = $this->construireUrlRechercheCollections('Collections', $parametres); |
$json = $this->envoyerRequeteConsultation($url); |
$donnees = json_decode($json, true); |
return $donnees; |
} |
// recherche de personnes : nouveau |
public function chercherPersonnes($parametres) { |
$url = $this->construireUrlRecherchePersonnes('Personnes', $parametres); |
$json = $this->envoyerRequeteConsultation($url); |
$donnees = json_decode($json, true); |
return $donnees; |
} |
// construit l'URL du service CoelRecherche pour obtenir des collections |
// Attention au nombre et à l'ordre des paramètres ! |
private function construireUrlRechercheCollections($type, $parametres, $limitation = true) { |
return $this->construireUrlRecherche( |
$type, |
$parametres, |
$limitation, |
array('mots', 'sci', 'bot', 'lieu-stockage', 'zg', 'p', 'pr', 'str-d', 'veg', 'projets') |
); |
} |
// construit l'URL du service CoelRecherche pour obtenir des personnes |
// Attention au nombre et à l'ordre des paramètres ! |
private function construireUrlRecherchePersonnes($type, $parametres, $limitation = true) { |
return $this->construireUrlRecherche( |
$type, |
$parametres, |
$limitation, |
array('nom-famille', 'adresse', 'date-vivant') |
); |
} |
// fabrique une URL pour le service CoelRecherche en collant les paramètres fournis (sinon "*") |
// dans l'ordre attendu par le service demandé ($type) |
private function construireUrlRecherche($type, $parametres, $limitation, $paramsAPasser) { |
$url = $this->url_jrest.self::SERVICE.'/'.$type; |
$params_a_passer = array('mots', 'sci', 'bot', 'zg', 'p', 'pr', 'str-d', 'veg', 'projets'); |
foreach ($params_a_passer as $param_cle) { |
foreach ($paramsAPasser as $param_cle) { |
if (isset($parametres[$param_cle]) && $parametres[$param_cle] != '') { |
$valeur = urlencode(trim($parametres[$param_cle])); |
$url .= '/'.$valeur; |
/trunk/controleurs/Recherche.php |
---|
13,7 → 13,8 |
*/ |
class Recherche extends aControleur { |
private $chaine_recherche = null; |
//private $chaine_recherche = null; |
private $masque = null; |
private static $url_exemple = null; |
//+----------------------------------------------------------------------------------------------------------------+ |
32,7 → 33,9 |
$donnees = array(); |
// Gestion des données de la requête |
$donnees['recherche'] = htmlspecialchars($this->obtenirChaineRecherche()); |
//$donnees['recherche'] = htmlspecialchars($this->obtenirChaineRecherche()); |
// masque multi-critères |
$donnees['masque'] = $this->obtenirMasqueRecherche(); |
// Gestion des urls |
$donnees['url_form'] = $this->obtenirUrlRecherche(); |
45,7 → 48,21 |
$this->setSortie(self::RENDU_TETE, $this->getVue('moteur', $donnees)); |
} |
private function obtenirChaineRecherche() { |
private function obtenirMasqueRecherche() { |
$masque = array(); |
if (!is_null($this->masque)) { |
$masque = $this->masque; |
} else if (isset($_GET['masque'])) { |
$masque = $_GET['masque']; |
$_SESSION['col']['masque'] = $masque; |
} else if (isset($_SESSION['col']['masque'])) { |
$masque = $_SESSION['col']['masque']; |
} |
$this->masque = $masque; |
return $masque; |
} |
/*private function obtenirChaineRecherche() { |
$chaine = ''; |
if (!is_null($this->chaine_recherche)) { |
$chaine = $this->chaine_recherche; |
62,11 → 79,11 |
$chaine = $_SESSION['col']['recherche']; |
} |
return $chaine; |
} |
}*/ |
private function memoriserChaineRecherche($chaine) { |
/*private function memoriserChaineRecherche($chaine) { |
$_SESSION['col']['recherche'] = $chaine; |
} |
}*/ |
public static function getUrlExemple($chaine) { |
$url = ''; |
81,25 → 98,43 |
return $url; |
} |
/** |
* Recherche des collections. |
* @return string la vue correspondante |
*/ |
// recherche des collections ou des personnes, dépendemment de la cible |
public function rechercher() { |
// un seul pour les collections ou les personnes, on ne cherche pas 2 choses à la fois ! |
$masque = $this->obtenirMasqueRecherche(); |
$donnees = array(); |
$donnees['cible'] = $masque['cible']; |
$rechercheDao = new RechercheDao(); |
$parametres = array('mots' => '*'); |
// Récupération des paramêtres de l'url |
$chaine_de_recherche = $this->obtenirChaineRecherche(); |
/*$chaine_de_recherche = $this->obtenirChaineRecherche(); |
echo "CH RECH: $chaine_de_recherche<br/>"; |
if (!empty($chaine_de_recherche)) { |
$this->url->setVariableRequete('recherche', $chaine_de_recherche); |
} |
$parametres = $this->parserChaineDeRecherche($chaine_de_recherche); |
$parametres = $this->parserChaineDeRecherche($chaine_de_recherche);*/ |
// Récupération des paramètres depuis le masque |
$parametres = $masque; |
$parametres = $this->limiterParProjets($parametres); |
$this->remplacerAbreviationParId($parametres); |
//echo "PARAM 2: <pre>" . print_r($parametres, true) . "</pre><br/>"; |
// Gestion du nombre de résultats |
$donnees_total = $rechercheDao->chercherStructureNbre($parametres); |
switch ($masque['cible']) { |
case 'collections': |
$donnees_total = $rechercheDao->chercherCollectionsNbre($parametres); |
break; |
case 'personnes': |
$donnees_total = $rechercheDao->chercherPersonnesNbre($parametres); |
break; |
default: |
// @TODO qu'est-ce qui se passe ? |
return null; |
} |
// Gestion du fragmenteur |
$options = array( |
116,9 → 151,22 |
// Gestion de l'accès aux données |
$rechercheDao->setLimitation(($de - 1), $fragmenteur->getDonneesParPage()); |
$rechercheDao->setDistinction(1); |
$resultats = $rechercheDao->chercher($parametres); |
// Post-traitement des résultats pour l'affichage |
// Récupération des résultats |
switch ($masque['cible']) { |
case 'collections': |
$resultats = $rechercheDao->chercherCollections($parametres); |
break; |
case 'personnes': |
$resultats = $rechercheDao->chercherPersonnes($parametres); |
break; |
default: |
return null; |
} |
// Affichage de la liste de résultats |
switch ($masque['cible']) { |
case 'collections': |
foreach ($resultats as $resultat) { |
// Ajout des données concernant la structure si ce n'est pas déjà fait |
$structure_id = $resultat['cs_id_structure']; |
126,17 → 174,42 |
$structure = array( |
'nom' => $resultat['cs_nom'], |
'ville' => $resultat['cs_ville'], |
'url' => $this->obtenirUrlFicheStructure($resultat['cs_id_structure'])); |
'url' => $this->obtenirUrlFicheStructure($resultat['cs_id_structure']) |
); |
$donnees['infos'][$structure_id]['structure'] = $structure; |
} |
// Si la strucutre possède des collections |
// Si la structure possède des collections |
if (!empty($resultat['cc_id_collection'])) { |
$collection = array('nom' => $resultat['cc_nom'], |
'url' => $this->obtenirUrlFicheCollection($resultat['cc_id_collection'])); |
$collection = array( |
'nom' => $resultat['cc_nom'], |
'url' => $this->obtenirUrlFicheCollection($resultat['cc_id_collection']) |
); |
$donnees['infos'][$structure_id]['collections'][] = $collection; |
} |
} |
break; |
case 'personnes': |
foreach ($resultats as $resultat) { |
//echo "<pre>".print_r($resultat,true)."</pre>"; |
if (!empty($resultat['cp_id_personne'])) { |
$personne = array( |
'nomcomplet' => $resultat['cp_fmt_nom_complet'], |
'nom' => $resultat['cp_nom'], |
'prenom' => $resultat['cp_prenom'], |
'url' => $this->obtenirUrlFichePersonne($resultat['cp_id_personne']) |
); |
$donnees['infos']['personnes'][] = $personne; |
} |
} |
break; |
default: |
return null; |
} |
// Post-traitement des résultats pour l'affichage |
$this->postraiterDonnees($donnees['infos']); |
// Gestion des squelettes |
146,7 → 219,7 |
$this->chargerPiedDePage(); |
} |
private function parserChaineDeRecherche($chaine) { |
/*private function parserChaineDeRecherche($chaine) { |
$mots = preg_split('/ /i', $chaine, -1, PREG_SPLIT_NO_EMPTY); |
$parametres = array('mots' => ''); |
$cle_precedente = null; |
169,7 → 242,7 |
$this->remplacerAbreviationParId($parametres); |
return $parametres; |
} |
}*/ |
private function remplacerAbreviationParId(&$parametres) { |
// liste 27 : Liste des relations entre une collection et une personne (id:1030) |
/trunk/squelettes/resultat.tpl.html |
---|
3,6 → 3,8 |
<?=$fragmenteur;?> |
<?php if (isset($infos)) : ?> |
<ul> |
<!-- recherche de collections --> |
<?php if ($cible == 'collections'): ?> |
<?php foreach ($infos as $info) : ?> |
<li><?=$info['structure']['ville']?> - <a href="<?=$info['structure']['url']?>"><?=$info['structure']['nom']?></a> |
<?php if (isset($info['collections'])) : ?> |
14,6 → 16,23 |
<?php endif; ?> |
</li> |
<?php endforeach; ?> |
<!-- recherche de personnes --> |
<?php elseif ($cible == 'personnes'): ?> |
<?php foreach ($infos['personnes'] as $personne) : ?> |
<li> |
<a href="<?=$personne['url']?>"> |
<?php if($personne['nomcomplet']): ?> |
<?=$personne['nomcomplet']?> |
<?php else: ?> |
<?=$personne['prenom']?> <?=$personne['nom']?> |
<?php endif; ?> |
</a> |
<?php if($personne['surnom']): ?> |
(<?=$personne['surnom']?>) |
<?php endif; ?> |
</li> |
<?php endforeach; ?> |
<?php endif; ?> |
</ul> |
<?php endif; ?> |
</div> |
/trunk/squelettes/css/collection/collection.css |
---|
88,6 → 88,40 |
background-color:#AEDC43; |
border:1px solid #86A736;} |
.frag_separateur{display:none;} |
/*--------- Masque de recherche avancée ---------*/ |
#col-rech-masque { |
width: 773px; |
/*padding: 10px;*/ |
border: solid #ddd 1px; |
} |
.champ-masque { |
display: inline-block; |
width: 370px; |
margin-top: 2px; |
} |
.champ-masque input { |
width: 250px; |
} |
.champ-masque select { |
max-width: 230px; |
} |
#col-rech-masque label { |
display: inline-block; |
} |
#col-rech-masque label.gauche { |
width: 100px; |
} |
#col-rech-masque label.droite { |
width: 130px; |
} |
/*--------------------------------------------------------------------------------------------------------------*/ |
/* Présentation Fiche */ |
.discretion{ |
/trunk/squelettes/moteur.tpl.html |
---|
2,8 → 2,8 |
<script type="text/javascript"> |
// Function pour cacher / afficher les options de recherche |
$(document).ready(function() { |
$("#col-rech-opt-toggle").html("Afficher la recherche avancée"); |
$("#col-rech-opt").hide(); |
$("#col-rech-opt-toggle").html("Afficher la recherche avancée"); |
$("#col-rech-opt-toggle").toggle( |
function() { |
$("#col-rech-opt-toggle").html("Cacher la recherche avancée"); |
14,41 → 14,139 |
$("#col-rech-opt").slideUp("fast"); |
} |
); |
// Rechargement des options sélectionnées dans les select |
$('#col-form select').each(function() { |
var optionSelectionnee = $(this).attr('data-option-selectionnee'); |
$(this).find('option[value="' + optionSelectionnee + '"]').attr('selected', 'selected'); |
}); |
// Sélection du texte de la zone de recherche sur le focus |
$("#recherche").focus(function(){ |
/*$("#recherche").focus(function(){ |
this.select(); |
});*/ |
}); |
}); |
</script> |
<h2>Rechercher une collection</h2> |
<form id="col-form" name="col-form" action="<?=$url_form;?>" method="get"> |
<p> |
<!-- <input id="recherche" name="recherche" type="text" value="<?=$recherche;?>" size="75" maxlength="250"/> --> |
<input name="module" type="hidden" value="<?=$url_module;?>" /> |
<input name="action" type="hidden" value="<?=$url_action;?>" /> |
<?php if (isset($url_contexte)) : ?> |
<input name="contexte" type="hidden" value="<?=$url_contexte;?>" /> |
<? endif; ?> |
<label id="col-rech" for="recherche">Rechercher</label> |
<input id="recherche" name="recherche" type="text" value="<?=$recherche;?>" size="75" maxlength="250"/> |
<input name="masque[cible]" type="hidden" value="collections" /> |
<!-- <pre><?php print_r($masque) ?></pre> --> |
<div id="col-rech-masque"> |
<div class="champ-masque"> |
<label class="gauche">Lieu de stockage</label> |
<input name="masque[lieu-stockage]" type="text" value="<?= $masque['lieu-stockage'] ?>" /> |
</div> |
<div class="champ-masque"> |
<label class="droite">Groupe taxonomique</label> |
<select name="masque[veg]" data-option-selectionnee="<?= $masque['veg'] ?>"> |
<option value=""></option> |
<option value="PH">Phanérogames</option> |
<option value="GY">Gymnospermes</option> |
<option value="AN">Angiospermes</option> |
<option value="CR">Cryptogames</option> |
<option value="AL">Algues</option> |
<option value="CH">Champignons</option> |
<option value="LI">Lichens</option> |
<option value="BR">Bryophytes</option> |
<option value="PT">Ptéridophytes</option> |
</select> |
</div> |
<div class="champ-masque"> |
<label class="gauche">Lieu de récolte</label> |
<input name="masque[zg]" type="text" value="<?= $masque['zg'] ?>" /> |
</div> |
<div class="champ-masque"> |
<label class="droite">Type de collection</label> |
<select name="masque[bot]" data-option-selectionnee="<?= $masque['bot'] ?>"> |
<option value=""></option> |
<option value="HE">Herbier</option> |
<option value="CE">Centurie</option> |
<option value="DR">Droguier</option> |
<option value="CA">Carpothèque</option> |
<option value="AL">Collection en alcool</option> |
<option value="XY">Xylothèque</option> |
<option value="PM">Préparations microscopiques</option> |
</select> |
</div> |
<div class="champ-masque"> |
<label class="gauche">Personne</label> |
<input name="masque[p]" type="text" value="<?= $masque['p'] ?>" /> |
</div> |
<div class="champ-masque"> |
<label class="droite">→ ayant le rôle</label> |
<select name="masque[pr]" data-option-selectionnee="<?= $masque['pr'] ?>"> |
<option value=""></option> |
<option value="CT">Contributeur</option> |
<option value="AU">Auteur</option> |
<option value="CO">Collecteur</option> |
<option value="DE">Déterminateur</option> |
<option value="HE">Hébergeur</option> |
</select> |
</div> |
</div> |
<input id="col-rech-ok" type="submit" value="OK" /> |
<a id="col-rech-opt-toggle" href="#col-rech-opt-txt" title="Précisions sur les options de recherche">Allez à la recherche avancée</a> |
</p> |
</form> |
<h2>Rechercher une personne</h2> |
<form id="pers-form" name="col-form" action="<?=$url_form;?>" method="get"> |
<input name="module" type="hidden" value="<?=$url_module;?>" /> |
<input name="action" type="hidden" value="<?=$url_action;?>" /> |
<?php if (isset($url_contexte)) : ?> |
<input name="contexte" type="hidden" value="<?=$url_contexte;?>" /> |
<? endif; ?> |
<input name="masque[cible]" type="hidden" value="personnes" /> |
<div id="col-rech-masque"> |
<div class="champ-masque"> |
<label class="gauche">Nom de famille</label> |
<input name="masque[nom-famille]" type="text" value="<?= $masque['nom-famille'] ?>" /> |
</div> |
<div class="champ-masque"> |
<label class="droite">Vivant en (année)</label> |
<input name="masque[date-vivant]" type="text" value="<?= $masque['date-vivant'] ?>" /> |
</div> |
<div class="champ-masque"> |
<label class="gauche">Adresse</label> |
<input name="masque[adresse]" type="text" value="<?= $masque['adresse'] ?>" /> |
</div> |
</div> |
<input id="col-rech-ok" type="submit" value="OK" /> |
</form> |
<br/> |
<a id="col-rech-opt-toggle" href="#col-rech-opt-txt" title="Précisions sur les options de recherche"></a> |
<div id="col-rech-opt"> |
<h2 id="col-rech-opt-titre">Options de recherche</h2> |
<div id="col-rech-opt-txt"> |
<p>Le moteur de recherche permet de faire une recherche libre sur un mot, une expression ou un acronyme.<br /> |
<!-- <p>Le moteur de recherche permet de faire une recherche libre sur un mot, une expression ou un acronyme.<br /> |
<em>Exemples :</em> |
<a href="<?=Recherche::getUrlExemple('mpu')?>">mpu</a>, |
<a href="<?=Recherche::getUrlExemple('Coste')?>">Coste</a>.</p> |
<a href="<?=Recherche::getUrlExemple('Coste')?>">Coste</a>.</p> --> |
<p> |
Par défaut, la recherche est insensible à la casse (majuscule / minuscule) et s'effectue |
en intercalant automatiquement le joker % avant et après la chaine recherchée et entre chaque mot |
de celle-ci. |
</p> |
<p> |
<!-- <p> |
Le moteur de recherche permet aussi d'utiliser des opérateurs dans le texte recherché pour préciser |
la requête. Vous les trouverez dans le tableau ci-dessous. Si vous souhaitez utiliser deux opérateurs |
à la suite, ou un opérateur et un mot clé de votre choix pour faire une recherche croisée, séparez-les |
131,7 → 229,7 |
<td><a href="<?=Recherche::getUrlExemple('pr:AU')?>">pr:AU</a></td> |
</tr> |
</tbody> |
</table> |
</table> --> |
<p>Pour les opérateurs dont la valeur est un <em>texte libre</em> ou une <em>liste</em>, |
il est possible d'utiliser des jokers. |
Ces "jokers" permettent de modifier la recherche.</p> |