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é :

Mot-clé
Agrandir
Mot-clé

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']));
?>