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 :
SearchResultsViewPreparer: Classe principale qui prépare les résultats de rechercheListItemStyleResolver: Interface définissant les resolvers de styleAbstractSearchResultListItemStyleResolver: 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é
- Lorsqu'un utilisateur effectue une recherche,
SearchResultsViewPreparerest appelé pour préparer les résultats. - Pour chaque résultat, un sous-contexte est créé dans
createSubcontext. - La méthode
getStyleResolvers()récupère tous les beans de typeListItemStyleResolverdéclarés dans le contexte Spring. - Le système parcourt ces resolvers pour trouver le premier qui accepte le contexte (méthode
accept). - Le resolver sélectionné détermine le style à utiliser (méthode
resolve). - Le style est stocké dans le sous-contexte avec la clé
ContentListTagProcessor.STYLE. - 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 :
- Créer un resolver de style qui implémente
ListItemStyleResolver - Déclarer ce resolver comme bean Spring
- 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.