Affichage d'une fiche
Le controller
L'affichage d'une fiche à pour point d'entrée ContentController, celui-ci initialise un contexte de type ContentContexte et filtre sa liste d'AbstractContentHandler afin de récupérer le handler prenant en charge le contexte courant.
Le handler
Les handlers utilisés pour l'affichage des fiches doivent hérités de AbstractContentHandler, le handler par défaut est ContentHandler.
public class ContentHandler extends AbstractContentHandler {
...
}
La méthode supports du handler vérifie la présence d'un id métatag dans l'UrlBean du contexte.
@Override
public boolean supports(final HttpServletRequest request, final HttpServletResponse response, final FrontContext frontContext) {
final ContentContext contentContext = ContentContext.of(frontContext);
return contentContext.getUrlBean() != null && contentContext.getUrlBean().getIdMetatag() != null;
}
Le contexte
Le contexte de type ContentContext est initialisé par le ContentController à partir du contexte de type FrontContext.
private ContentContext initContext(final HttpServletRequest request) {
final ContexteUniv ctx = ContexteUtil.getContexteUniv();
final String uri = getURI(request.getRequestURI());
final InfosSite infosSite = serviceInfosSite.getActiveSiteByHost(request.getServerName());
final UrlBean urlBean = serviceUrl.getByUrlAndSite(uri, infosSite);
final ContentContext context = ContentContext.of(new DefaultContext());
context.setCtx(ctx);
context.setInfosSite(infosSite);
context.setUrlBean(urlBean);
return context;
}
Il est ensuite alimenté par le ContentHandler pour récupérer la fiche courante, le titre et le metatag de la fiche.
private ContentContext populateContext(final FrontContext context) throws ErreurApplicative {
final ContentContext contentContext = ContentContext.of(context);
final AbstractFicheBean ficheBean = new ContentKsupFetcher(contentContext.getUrlBean()).getAbstractFicheBean();
contentContext.getCtx().setFicheCourante(ReferentielObjets.initFiche(ficheBean));
contentContext.getCtx().setLocale(LangueUtil.getLocale(ficheBean.getLangue()));
contentContext.setContent(ficheBean);
final MetatagBean metatag = serviceMetatag.getById(contentContext.getUrlBean().getIdMetatag());
contentContext.setTitle(metatag.getMetaLibelleFiche());
contentContext.setMetatag(metatag);
return contentContext;
}
La vue
Des templates par défaut sont définis dans le produit, ils sont utilisés pour l'affichage des fiches.
Ils incluent les vues de type head, header, body, footer etc...
Il est possible de définir un template de fiche spécifique pour un type de contenu.
Pour cela, il faut créer un viewPreparer qui hérite de DefaultTemplateViewPreparer et surcharger la méthode supports pour que celui-ci prenne en charge le type de contenu souhaité.
Dans la plupart des cas, l'affichage spécifique d'une fiche ne concerne que le corps de la page (type body).
Un viewPreparer de type body est apporté par défaut dans le produit, il inclut le contenu de la fiche (type content) ainsi que les encadrés (type boxes).
Chaque fiche déclare un viewPreparer de type content qui inclut les données de la fiche dans le modèle.
<bean id="articleContentViewPreparer" class="com.kosmos.article.ArticleContentViewPreparer" parent="contentViewPreparer">
<property name="imagePreparer" ref="imageViewPreparer"/>
<property name="type" value="content"/>
<property name="view" value="/extensions/article/WEB-INF/jsp/article-content.jsp"/>
</bean>
Le viewPreparer étend AbstractContentViewPreparer, il surcharge la méthode accept pour définir quel type de fiche il prend en charge.
@Override
public boolean accept(final FrontContext context) {
return ContentContext.of(context).getContent() instanceof ArticleBean;
}
Puis alimente le modèle à partir des données de la fiche via la méthode prepare.