Drupal 7 : Apache Solr, Création d’une recherche avancée « classique »

Sur internet, on peut trouver un certain nombre d'explications
concernant la création d'une facette. Par contre s'il on veut créer une
page de type recherche avancée sans utiliser l'avantage des facettes, ça
n'est pas documenté. Dans cet article, je vais supposer que vous avez
déjà installé Apache Solr et qu'il remplace le moteur de recherche par
défaut de Drupal.

Vous devrez installer le module Facet API afin que les filtres soient utilisés dans la requête de recherche.

L'exemple que je vais présenter ici va ajouter un champ "Posté entre
..." au moteur de recherche, ce champ permettra de restreindre les
résultats entre deux dates de modification. Il faut donc se rendre dans
la configuration de Solr, dans l'onglet "Settings" et enfin sur la page
permettant d'activer les "Facet".


Implémentation du seul hook_form_alter

Pour ajouter les champs au formulaire de recherche nous allons implémenter le hook_form_alter().

function search_example_form_search_form_alter(&$form, &$form_state, $form_id){
    $form['#submit'] = array_merge($form['#submit'],array('search_exemple_form_search_form_submit'));
    search_exemple_form_elements($form,$form_state);
}

On commence par ajouter une fonction de submit qui va se charger de traiter nos champs supplémentaires. Puis on appelle une seconde fonction qui modifie le formulaire pour ajouter les éléments.

Voici le code de modification du formulaire :

function search_exemple_form_elements(&$form,$form_state){
    $form['dates'] = array(
            '#title' => t('Dates'),
            '#type' => 'fieldset',
            '#tree' => true,
    );
    $form['dates']['debut'] = array(
            '#type'          => 'textfield',
            '#title'         => t('entre '),
            '#default_value' => '',
            '#size'          => 20,
            '#maxlength'     => 10,
    );
    $form['dates']['fin'] = array(
            '#type'          => 'textfield',
            '#title'         => t(' et '),
            '#default_value' => '',
            '#size'          => 20,
            '#maxlength'     => 10,
    );
}

Le code de la fonction est volontairement très simple afin que l'article reste clair. On pourrait bien sûr y ajouter un "date picker" et une fonction de validation pour que l'information obtenue soit cohérente. On peut utiliser toutes possibilités offertes par l'API des formulaires de Drupal.

Traitement du formulaire

Nous allons ensuite traiter le formulaire en ajoutant nos champs à la requête. Pour cela il faut créer la fonction correspondant au submit que l'on a ajouté au formulaire de recherche. Voici le code de la fonction :

function search_exemple_form_search_form_submit($form,&$form_state){
    //Add query to url
    $q = $_GET['q'].'/'.$form_state['values']['keys'];
    //prepare facets
    $query_get = array('f'=>array());
    $dateDebut  = trim($form_state['values']['dates']['debut']);
    $dateFin    = trim($form_state['values']['dates']['fin']);
    if(strlen($dateDebut) && strlen($dateFin)){
        list($jourDebut,$moisDebut,$anneeDebut) = explode("/",$dateDebut);
        list($jourFin,$moisFin,$anneeFin)       = explode("/",$dateFin);

        $stampDateDebut = mktime(0, 0, 0, $moisDebut, $jourDebut, $anneeDebut);
        $stampDateFin   = mktime(0, 0, 0, $moisFin, $jourFin, $anneeFin);

        $query_get['f'][] = 'ds_changed:['.date('Y-m-d\TH:i:s\Z',$stampDateDebut).' TO '.date('Y-m-d\TH:i:s\Z',$stampDateFin).']';

    }
    if(count($query_get)){
        $form_state['redirect'] = array($q, array('query' => $query_get));
    }
}

Au début de la fonction on stocke la valeur du champ texte présent par défaut afin de l'ajouter à la requête.

Ensuite on prépare un tableau qui est destiné à accueillir les différentes valeurs de nos Facettes. Le champ que nous utilisons pour la date de modification se nomme "ds_changed", il est de type date. Il faut donc ajouter une entrée au tableau contenant le nom du champ et les valeurs avec lesquelles filtrer la recherche. On peut retrouver la liste des champs et leur type sur la page : 'admin/reports/apachesolr'.
Le format de date utilisé est celui attendu par Solr : 'Y-m-d\TH:i:s\Z'

Enfin on renseigne l'entrée redirect du form_state d'être redirigé vers le résultat de la recherche.

Solr utilise un tableau avec autant d'entrées dans "f" qu'il y a de critères en plus. Ici nous imitons le traitement effectué afin de traiter tous nos champs comme un seul formulaire. Le résultat est le même que si nous utilisions les blocks fournis par l'API des Facets mais on ne clique qu'une seule fois, notre formulaire ressemble donc à une "Recherche avancée classique".

Cette technique est la plus simple à mettre en œuvre pour arriver à ce résultat. On peut aussi utiliser directement les fonctions du Solr.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.