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.