Voilà, voilà... Fin de l'aventure...

 

Fermeture de kolossaldrupal.org dans...


Bonjour tout le monde,

Drupal évolue, les versions changent et Kolossaldrupal.org était essentiellement consacré à la version 6 de Drupal.

Autant dire que les infos présentées ici commencent à dater...

Faute de temps, je ne peux plus garder le site Kolossaldrupal à jour...

Je vous aurais bien proposé de reprendre le flambeau mais... c'est tellement simple de nos jours de se faire son propre site à soi...Pourquoi s'embêter alors ? :-)

Ce site restera donc en l'état, tel qu'il était en 2011...

Ah la la ! Cela ne nous rajeunit pas !

Manuel Vila - Avril 2016

Personnaliser la page « Résultat de recherche »

Date du document en anglais : 26 Août 2009 - 02h26 - http://drupal.org/node/175013  



Avez-vous besoin de modifier la présentation d'un résultat de recherche Drupal ? Vous devez impérativement le faire à la façon Drupal, et pour comprendre comment faire, il n'y a rien de mieux que de le faire (sauf que KolossalDrupal, traducteur, n'a pas poussé le dévouement jusqu'à installer un Drupal 5.x pour vérifier tout ça. NDT). L'exemple qui suit vous montrera non seulement l'aspect technique mais aussi la façon de penser pour y arriver. La même démarche pourra être appliquée quand vous aurez à modifier des composants de Drupal.

La première étape consiste à repérer ce qui pilote la recherche Drupal. Dans les dossier des modules vous trouverez le dossier search, ce qui laisse augurer que c'est dedans que se trouvent les scripts de recherche (quelle pertinence ! NDT). Ouvrez ce dossier pour voir ce qu'il contient et ce qu'il y a à personnaliser, tout en gardant à l'esprit que vous ne devez pas modifier quoi que ce soit aux fichiers du module de recherche eux-mêmes.

Dans le module search, vous trouverez les fichiers standards .info, .install, .module et un fichier .css. Dans ce cas précis vous regardez le module search lui-même. Ce que vous devez chercher c'est quelque chose que vous pourrez hameçonner (hook) ou styliser. Les fonctions que vous cherchez sont les fonctions de thème, dans le module search vous trouverez theme_search_form, theme_search_block_form, theme_search_item et theme_search_page. Vous pourrez personnaliser ces fonctions de façon à ne pas toucher au core Drupal. Génial !

Dans cet exemple vous allez modifier l'aspect et le comportement de la page de résultat de recherches (également nommé spr par les gourous SEO). Nous allons ôter la ligne de .info qui indique qui écrit le nœud, quand il a été écrit, commentaires, etc. A première vue, il semble correct que la fonction theme_search_page soit celle à personnaliser dans mon thème. Pour cette exemple nous utiliserons le thème Zen, qui doit être enregistré dans le dossier sites/all/themes/zen. Voici le code de theme-search_page, abondamment commenté, ce qui vous indiquera les paramètres et l'objet de cette fonction :

<?php
/**
* Formate la page résultat d'une requête de recherche.
*
* Les modules peuvent implémenter hook_search_page() pour surcharger cette fonction par défaut
* pour afficher les résultats de la recherche. Dans ce cas, il est attendu qu'ils fournissent leurs propres fonctions 
de personnalisation de thème.
*
* @param $results
*   Le résultat de la recherche retourné par hook_search().
* @param $type
*   Le type de donné trouvée, tel que "user" ou "node".
*
* @ingroup themeable
*/

function theme_search_page($results$type) {
  
$output '<dl class="search-results">';

foreach (
$results as $entry) {
    
$output .= theme('search_item'$entry$type);
  }
  
$output .= '</dl>';
  
$output .= theme('pager'NULL100);

return 
$output;
}
?> 

Après examen plus attentif, vous remarquerez que cette fonction appelle la fonction theme_search_items via theme('search_item', $entry, $type), ce qui indique que c'est cette fonction qui est à modifier. Cette fonction ressemble à ceci :

<?php
function theme_search_item($item$type) {
  
$output '<dt class="title"><a href="'check_url($item['link']) .'">'
    
check_plain($item['title']) .'</a></dt>';
  
$info = array();
  if (
$item['type']) {
    
$info[] = check_plain($item['type']);
  }
  if (
$item['user']) {
    
$info[] = $item['user'];
  }
  if (
$item['date']) {
    
$info[] = format_date($item['date'], 'small');
  }
  if (
is_array($item['extra'])) {
    
$info array_merge($info$item['extra']);
  }
  
$output .= ' <dd>'. ($item['snippet'] ? '<p>'$item['snippet'] .'</p>' '') .
    
'<p class="search-info">'implode(' - '$info) .'</p></dd>';
  return 
$output;

?>

Ce que vous devez faire c'est copier toutes les fonctions précédentes dans votre fichier template.php qui se trouve dans le dossier sites/all/themes/zen. C'est ce fichier template.php que vous devez utiliser pour manipuler, indirectement, le core Drupal. Pas seulement pour les recherches, mais aussi pour tous les modules du core. Modifiez le nom de la fonction theme_search_item($item, $type) en zen_search_item($item, $type). Après sauvegarde du fichier, Drupal n'appellera plus les fonctions du module de recherche mais celles nouvellement créées dans zen_search_item($item, $type). C'est tout simplement très chouette, et désormais, si vous effectuez une mise à jour du core Drupal, les modifications dans votre thème ne seront pas écrasées par la mise à jour du module search.

N'oubliez pas de changer le nom de votre fonction template.php pour éviter le message d'erreur : « Fatal error : Cannot redeclare theme_search_item() (previously declared in....)». Je dis ça en passant... Ça ne m'est pas arrivé ;-)

Maintenant voyons le truc vraiment sympa. Comme cette nouvelle fonction zen_search_item() se trouve dans votre thème, vous êtes libre d'en faire ce que vous voulez pour obtenir les résultats que vous voulez. Ainsi, les petits changements qui enlèveront les données citées précédemment peuvent être effectués en enlevant le code qui les contient.

Votre nouvelle fonction du fichier template.php devient :

<?php
function zen_search_item($item$type) {
  
$output ' <dt class="title"><a href="'check_url($item['link']) .'">'
    
check_plain($item['title']) .'</a></dt>';
  
$output .= ' <dd>'. ($item['snippet'] ? '<p>'$item['snippet'] .'</p>' '');
  return 
$output;

?>

Vous pouvez voir que vous avez enlevé pas mal d'infos, mais vous pouvez aussi faire l'inverse et ajouter du contenu, changer les éléments ou faire ce que vous voulez, sans toucher au core Drupal !