Résultat de la recherche avec les modes d'affichage (view modes)

Voir aussi le module custom_search.

Source (avril 2012) : http://drupal.the-aim.be/drupal-theme-search-view-modes

Par défaut, chaque item s'affiche selon search-result.tpl.php

  • Title (avec lien vers le contenu)
  • $snippet le texte avec le mot cherché en gras
  • $info information sur l'auteur, date et h, nb de commentaires

A admin/structure/types/manage/article/display vérifier qu'est coché "Search results" ou aller à admin/structure/types/manage/article/display/search_result

Cela ne fonctionne pas, tant que l'on ne surcharge pas (override) le .tpl. pour y ajouter les champs (du mode d'affichage que l'on vient de personnaliser).

Surcharger search-result.tpl.php

Copier du core search-result.tpl.php dans son dossier de thème, y coller le code suivant, puis vider le cache une ou deux fois.

Ex de code

<li class="<?php print $classes; ?>"<?php print $attributes; ?>>
  <?php print render($title_prefix); ?>
  <h3 class="title"<?php print $title_attributes; ?>>
    <a href="<?php print $url; ?>"><?php print $title; ?></a>
  </h3>
  <?php print render($title_suffix); ?>
  <div class="search-snippet-info">
    <?php print($variables['result']['node']->rendered); ?>
  </div>

  <div class="search-view-mode
search-snippet-info">
    <?php if ($snippet): ?>
      <p class="search-snippet"<?php print $content_attributes; ?>><?php print $snippet; ?></p>
    <?php endif; ?>
    <?php if ($info): ?>
      <p class="search-info"><?php print $info; ?></p>
    <?php endif; ?>
  </div>
</li>

Que fait ce code?

Les variables sont en gras, les classes CSS en rouge.

Utiliser le mode d'affichage dans le résultat de la recherche
le code notes
<h3 class="title"<?php print $title_attributes; ?>>
    <a href="<?php print $url; ?>"><?php print $title; ?></a>
</h3>
$title Titre (et lien) en h3
<?php print render($title_suffix); ?> $title_suffix Tableau avec infos d'autres modules, ici:
nb lecture + lien trad
<div class="search-view-mode">
    <?php print($variables['result']['node']->rendered); ?>
</div>
on récupère le mode d'affichage
<div class="search-snippet-info">
    <?php if ($snippet): ?>
      <p class="search-snippet"<?php print $content_attributes; ?>><?php print $snippet; ?></p>
    <?php endif; ?>
    <?php if ($info): ?>
      <p class="search-info"><?php print $info; ?></p>
    <?php endif; ?>
</div>
$snippet = Texte avec le mot recherché en <strong>

$info = Nom auteur (classe username) mais aussi RDF, xml:lang=""
- date - h
<li class="<?php print $classes; ?>"<?php print $attributes; ?>>
   ...
</li>
affiche
<li class="search-result">

...
</li>

Les autres variables

$module: nom machine node, user...

$title_prefix: Tableau qui contient des infos en provenance d'autres modules

Des tableaux de valeurs HTML: $title_attributes_array $content_attributes_array $content_attributes_array

$info ou $info_split

$info_split est un tableau similaire à $info.
Ces variables ne s'appliquent pas à la recherche sur les users - donc toujours tester l'existence avant l'affichage.
Voici quelques clefs par défaut de $info_split (d'autres modules en ajoutent):

  • $info_split['user']  dépend des perms
  • $info_split['date'] dernière maj du node, en format court
  • $info_split['comment'] nb de commentaires (module comment), qui sort en "% comments" où % est le cardinal)

Ex:

<?php print "test"; ?>
    <?php if (isset($info_split['type'])): ?>
      <span class="info-type">
        <?php print $result['type']; ?>
      </span>
    <?php endif; ?>

 

Pour thémer selon le type de contenu

Il nous faut utiliser un hook de theme (de facon à suggérer des fichiers de tempates), ici pour le type de contenu news (si type news et view_mode search-result). L'utilisation du hook peut se faire soit via son template, soit via un autre module.
Ajouter dans son template.php (s'il existe déja une fonction preprocess_node, ajouter le if):

function MYTHEME_preprocess_node(&$vars) {
    if($vars['type'] == 'news' && $vars['view_mode'] == 'search-result') {
        $vars['theme_hook_suggestions'][] = 'node__search_result';
        $vars['theme_hook_suggestions'][] = 'node__' . $vars['type'] . '__search_result';
    }
}

Ajouter à search-result.tpl.php

$view = node_view($result['node'], 'search-result');
print render($view);

// node_view ($node, $view_mode = 'full', $langcode = NULL)

Créer node--news--search-result.tpl.php avec <?php print($rendered); ?>

Vider le cache.

 

Regarder le contenu de la variable $content permet de voir la disponibilité (ou non) des champs du mode d'affichage par défaut (où l'on a pu y cacher des champs).
Dans node--search-result.tpl.php (ou node--news--search-result.tpl.php)

<?php node_build_content($node, 'search_result'); ?>
<?php print render($node->content); ?>