Exemple d'implémentation : Un formulaire de recherche
Un article de ReaxiaWiki.
Cet exemple montre comment faire un formulaire de recherche simple grâce à une librairie Reaxia spécialisée.
Sommaire |
Exemple de type Reaxia pour la recherche
Dans cet exemple, notre recherche va explorer un annuaire. Voici la structure du type Reaxia "people" :
| Information | Type de champ |
|---|---|
| Nom | Texte sur une ligne |
| Prénom | Texte sur une ligne |
| Adresse e-mail | Texte sur une ligne |
| Téléphone | Texte sur une ligne |
Mise en place du mot-clé
Une fois que le type "people" est créé et qu'un contenu de ce type a été ajouté au site, il faut ajouter le mot-clé [[MOTEUR_DE_RECHERCHE]] dans un champ paragraphe d'un contenu structuré :
Pour que le contributeur ait une description de ce mot-clé dans la liste des mots-clés, il faut ajouter une ligne dans le fichier reaxia_conf/Reaxia_Conf.php :
$GLOBALS['conf']['keywords']['MOTEUR_DE_RECHERCHE'] = "Affiche le formulaire de recherche dans l'annuaire";
Interprétation du mot-clé
Le code suivant est à ajouter dans la librairie traitant l'affichage des pages du site. Selon les données de $_GET, ce code remplace le mot-clé et effectue différentes actions :
- si l'internaute a envoyé une requête, il lance la recherche en appelant la librairie
'search_people'qui va afficher les résultats (voir paragraphe suivant), - sinon, il affiche le formulaire de recherche.
$textBefore = '';
$textAfter = '';
if (FindKeyword($Texte_de_la_page, '[[MOTEUR_DE_RECHERCHE]]', $textBefore, $textAfter))
{
$Texte_de_la_page = $textBefore;
if (isset($_GET['search']))
{
// search
$Texte_de_la_page .= display_thread('people', 'search_people', array(
'search' => stripslashes($_GET['search']),
'return' => true));
}
else
{
// form
$Texte_de_la_page .= GetFormSearchPeople();
}
$Texte_de_la_page .= $textAfter;
}
/**
* Get HTML for the search form
* @return string HTML code
*/
function GetFormSearchPeople()
{
$html = '';
$html .= '<form action="index.php" method="GET">' . "\n";
$html .= '<b>Recherche par nom : </b>';
$html .= '<input type="text" name="search"> ';
$html .= '<input type="submit" value="Rechercher">' . "\n";
$html .= '</form>' . "\n";
return $html;
}
Librairie de recherche
La librairie de recherche effectue la requête SQL dans le champ single_line_1 (le nom) puis affiche les résultats. Voici le code de cette librairie, à enregistrer dans le fichier reaxia_lib/search_people/search_people.php :
<?php
class search_people extends thread_displayer
{
/**
* @param array $thread array with threadname, display_name, categories, PublishedTime
* @param array $options
*/
function search_people($threadname, &$options)
{
// Call the parent's constructor, initializes the class members
$this->thread_displayer($threadname, $options);
// Override any of thread_displayer's class members here:
}
/**
* Specify the SQL query who returns blocs
* @return string the SQL statement that fetches the data
*/
function GetSQLQuery()
{
if ($this->UsePreviewData)
$rxp = '_rxp';
else
$rxp = '';
$where = array();
$search = trim($this->options['search']);
$sql = 'SELECT * FROM `' . $this->threadRef . $rxp . '`';
if (!empty($search))
$sql .= " WHERE single_line_1 LIKE '%".mysql_escape_string($search)."%'";
$sql .= ' ORDER BY single_line_1 ASC';
return $sql;
}
/**
* Does whatever needs to be done with the selected blocs
* @return string usually an HTML fragment, but it can be nothing.
*/
function process_thread_content()
{
$html = '';
if (!empty($this->Blocs))
{
$html .= '<table class="liste" border="1" cellpadding="2"'
.' cellspacing="0" width="100%" align="center">'."\n";
$html .= '<tr><td class="titreliste">Nom</td>';
$html .= '<td class="titreliste">E-mail</td>';
$html .= '<td class="titreliste">Tél.</td></tr>'."\n";
foreach ($this->Blocs as $aBloc)
{
$Nom = $aBloc['single_line_1'];
$Prenom = $aBloc['single_line_2'];
$Email = $aBloc['single_line_3'];
$Tel = $aBloc['single_line_4'];
// Output each bloc as HTML
$html .= '<tr>'."\n";
$html .= '<td>'.$Nom.' '.$Prenom.'</td>'."\n";
$html .= '<td>'.$Email.'</td>'."\n";
$html .= '<td>'.$Tel.'</td>'."\n";
$html .= '</tr>'."\n";
}
$html .= '</table>'."\n";
}
else
{
$html .= '<p>Personne ne correspond à votre recherche.</p>';
}
$html .= '<p><a href="javascript:history.go(-1)">Retour</a></p>';
return $html;
}
}
?>
Lors de l'appel à cette librairie, il faut fournir la requête de l'utilisateur en paramètre :
<?php
include_once('reaxia_lib/reaxia.php');
display_thread('people', 'search_people', array(
'search' => stripslashes($_GET['search']));
?>
