Modifier le fichier

Documentation : Ajouter un nouveau style de liste dans les résultats de recherche

Introduction

Cette documentation explique comment ajouter un nouveau style de liste dans les résultats de recherche en utilisant la classe SearchResultsViewPreparer. Ce mécanisme permet de personnaliser l'affichage des résultats de recherche selon différents types de contenu ou de contextes.

Architecture du système

Le système de recherche utilise le mécanisme de style resolver pour déterminer comment afficher chaque résultat. Voici les composants clés :

  1. SearchResultsViewPreparer : Classe principale qui prépare les résultats de recherche
  2. ListItemStyleResolver : Interface définissant les resolvers de style
  3. AbstractSearchResultListItemStyleResolver : Classe abstraite pour faciliter l'implémentation des resolvers

Fonctionnement général

La classe SearchResultsViewPreparer utilise la méthode createSubcontext pour créer un sous-contexte pour chaque résultat de recherche. Dans cette méthode, le style à utiliser est déterminé en interrogeant tous les ListItemStyleResolver disponibles dans l'application.

private FrontContext createSubcontext(final FrontContext context, final SearchResultDoc doc, AbstractFicheBean fiche) {
    // ...
    final String style = getStyleResolvers().stream()
        .filter(resolver -> resolver.accept(subcontext))
        .findFirst()
        .map(resolver -> resolver.resolve(subcontext))
        .orElse(null);
    subcontext.setValue(ContentListTagProcessor.STYLE, style);
    // ...
}

Comment ajouter un nouveau style de liste

Étape 1 : Créer une classe implémentant ListItemStyleResolver

Vous pouvez étendre AbstractSearchResultListItemStyleResolver pour simplifier l'implémentation :

public class MonNouveauStyleResolver extends AbstractSearchResultListItemStyleResolver {
    
    @Override
    protected String getCodeObjet() {
        return "MON_CODE_OBJET"; // Code de l'objet concerné
    }
    
    @Override
    public String resolve(FrontContext context) {
        return "mon-style"; // Nom du style à utiliser
    }
}

Étape 2 : Déclarer le bean dans le contexte Spring

Créez un bean Spring pour votre resolver :

<bean id="monNouveauStyleResolver" class="com.monpackage.MonNouveauStyleResolver" />

Étape 3 : Créer le template correspondant au style

Créez le template qui sera utilisé pour afficher les résultats avec ce style.

Exemple complet

Voici un exemple complet pour ajouter un style de liste pour les résultats de recherche d'événements :

1. Création du resolver de style

package com.kosmos.evenement.search;

import com.kosmos.context.front.FrontContext;
import com.kosmos.search.results.AbstractSearchResultListItemStyleResolver;

/**
 * Resolver de style pour les résultats de recherche d'événements.
 */
public class EvenementSearchResultListItemStyleResolver extends AbstractSearchResultListItemStyleResolver {
    
    @Override
    protected String getCodeObjet() {
        return "EVENEMENT"; // Code de l'objet événement
    }
    
    @Override
    public String resolve(FrontContext context) {
        return "evenement-card"; // Style à utiliser
    }
}

2. Déclaration du bean

<bean id="evenementSearchResultListItemStyleResolver" class="com.kosmos.evenement.search.EvenementSearchResultListItemStyleResolver" />

3. Création du préparateur de vue pour ce type de résultat

package com.kosmos.evenement.search;

import java.util.List;
import java.util.Map;

import com.kosmos.content.list.CommonContentListItemViewModel;
import com.kosmos.content.list.CommonContentListItemViewPreparer;
import com.kosmos.context.ContentContext;
import com.kosmos.context.front.FrontContext;
import com.kosmos.preparer.IViewPreparer;
import com.kosmos.search.SearchContext;
import com.kosmos.tags.KsupMedia;
import com.ksup.objetspartages.bean.EvenementBean;

/**
 * Préparateur pour les résultats de recherche d'événements.
 */
public class EvenementSearchResultListItemViewPreparer<V extends CommonContentListItemViewModel<KsupMedia>> 
        extends CommonContentListItemViewPreparer<V> {

    @Override
    public boolean accept(final FrontContext context) {
        return super.accept(context) && 
               context instanceof SearchContext && 
               ContentContext.of(context).getContent() instanceof EvenementBean;
    }

    @Override
    public V prepare(final FrontContext context, final Map<String, List<IViewPreparer>> preparers) {
        final V viewModel = super.prepare(context, preparers);
        final ContentContext contentContext = ContentContext.of(context);
        final EvenementBean evenement = (EvenementBean) contentContext.getContent();
        
        // Personnalisation du viewModel pour les événements
        viewModel.setTitle(evenement.getTitre());
        // Ajout d'autres informations spécifiques aux événements
        
        return viewModel;
    }
}

4. Déclaration du préparateur

<bean id="evenementSearchResultListItemViewPreparer" class="com.kosmos.evenement.search.EvenementSearchResultListItemViewPreparer">
    <!-- Définissez ici les dépendances nécessaires -->
</bean>

Fonctionnement détaillé

  1. Lorsqu'un utilisateur effectue une recherche, SearchResultsViewPreparer est appelé pour préparer les résultats.
  2. Pour chaque résultat, un sous-contexte est créé dans createSubcontext.
  3. La méthode getStyleResolvers() récupère tous les beans de type ListItemStyleResolver déclarés dans le contexte Spring.
  4. Le système parcourt ces resolvers pour trouver le premier qui accepte le contexte (méthode accept).
  5. Le resolver sélectionné détermine le style à utiliser (méthode resolve).
  6. Le style est stocké dans le sous-contexte avec la clé ContentListTagProcessor.STYLE.
  7. Ce style est ensuite utilisé pour sélectionner le template approprié pour afficher le résultat.

Cas particuliers et bonnes pratiques

Resolver avec conditions complexes

Si vous avez besoin de conditions plus complexes pour déterminer le style, vous pouvez surcharger la méthode accept :

@Override
public boolean accept(final FrontContext context) {
    if (!(context instanceof SearchContext)) {
        return false;
    }
    
    ContentContext contentContext = ContentContext.of(context);
    if (!(contentContext.getContent() instanceof MonTypeBean)) {
        return false;
    }
    
    // Conditions supplémentaires
    MonTypeBean bean = (MonTypeBean) contentContext.getContent();
    return bean.isSpecial() && bean.getCategory().equals("importante");
}

Styles dynamiques selon le contenu

Vous pouvez également déterminer le style dynamiquement selon le contenu :

@Override
public String resolve(FrontContext context) {
    ContentContext contentContext = ContentContext.of(context);
    MonTypeBean bean = (MonTypeBean) contentContext.getContent();
    
    if (bean.isHighlighted()) {
        return "mon-style-highlight";
    } else if (bean.isNew()) {
        return "mon-style-new";
    }
    
    return "mon-style-default";
}

Conclusion

L'ajout d'un nouveau style de liste dans les résultats de recherche se fait en trois étapes principales :

  1. Créer un resolver de style qui implémente ListItemStyleResolver
  2. Déclarer ce resolver comme bean Spring
  3. Créer les templates correspondants au style

Cette architecture permet une grande flexibilité dans l'affichage des résultats de recherche, en adaptant la présentation selon le type de contenu ou d'autres critères.