Personnalisation d'une partie de la page
Description de la fonctionnalité
Quelle que soit la partie à personnaliser, il faut se rapprocher au maximum du fonctionnement produit et ne personnaliser qu'en cas d'absolu nécessité. Chaque partie de la page a un type. Il est possible de définir plusieurs affichages par type et de conditionner l'affichage au template de site, ou sur d'autres critères. Ici, on prend pour exemple la personnalisation du header par l'ajout d'une sous-vue.
Architecture générale
Le header suit le pattern MVC de Spring et s'intègre dans l'architecture K-Sup avec les composants suivants :
- ViewPreparer : hérite de
AbstractViewPreparer - ViewModel : hérite de
AbstractViewModel - Bean du ViewPreparer : déclaration du bean du ViewPreparer personnalisé
- Bean du Header : ajoute le ViewPreparer personnalisé
- Jsp du header : ajoute le ViewModel personnalisé
- Jsp personnalisée : l'affichage qu'on souhaite ajouter au header
Procédure
Créer le modèle de vue
Créer le modèle de vue contenant les données à afficher :
package fr.votreprojet.votrepackage;
/**
* Modèle de vue [description]
*/
public class ExempleViewModel extends AbstractViewModel {
private AttributExemple attributExemple;
@Override
public String getId() {
return "exempleViewModelId";
}
public AttributExemple getAttributExemple() {
return attributExemple;
}
public void setAttributExemple(final AttributExemple attributExemple) {
this.attributExemple = attributExemple;
}
}
Créer le préparer de vue
Créer le préparer de vue, indiquer les conditions d'utilisation dans la méthode ExempleViewPreparer#accept et préparer les données à afficher dans la méthode ExempleViewPreparer#prepare.
package fr.votreprojet.votrepackage;
/**
* Préparateur de la vue [description]
*/
public class ExempleViewPreparer extends AbstractViewPreparer<ExempleViewModel> {
/**
* Indique si le préparateur de contenu est habilité à traiter une requête en fonction du contexte.
* @param frontContext Le contexte.
* @return true si le préparateur est habilité, false sinon.
*/
@Override
public boolean accept(final FrontContext context) {
return ...; // Les conditions d'affichage, si besoin.
}
/**
* Prépare le modèle de la vue en fonction du contexte.
* @param frontContext Le contexte d'affichage
* @param preparers les preparers de la page courante
* @return Le modele T qui étend {@link AbstractViewModel}.
*/
@Override
public ExempleViewModel prepare(final FrontContext frontContext, final Map<String, List<IViewPreparer>> preparers) {
final ExempleViewModel viewModel = super.prepare(frontContext, preparers);
viewModel.setAttributExemple(attributExemple);
return viewModel;
}
}
Déclarer les beans
Déclaration du bean du ViewPreparer du nouvel élément et déclaration du header projet pour y ajouter le nouveau type dans la liste expectedViewTypes :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- ViewPreparer d'exemple -->
<bean id="exempleViewPreparer" class="fr.votreprojet.votrepackage.ExempleHeaderViewPreparer">
<property name="type" value="exemple"/>
<property name="view" value="/WEB-INF/jsp/votreChemin/exemple.jsp"/>
</bean>
<bean id="votreHeader" class="com.kosmos.core.header.HeaderViewPreparer">
<property name="type" value="header"/>
<property name="view" value="/WEB-INF/jsp/votreChemin/headerVotreProjet.jsp"/>
<property name="order">
<util:constant static-field="org.springframework.core.Ordered.HIGHEST_PRECEDENCE"/>
</property>
<property name="attributes">
<map>
<entry key="expectedViewTypes">
<list>
<value>mainMenu</value>
<value>quickaccess</value>
<value>langMenu</value>
<value>panel-search-bar</value>
<value>exemple</value>
</list>
</entry>
</map>
</property>
</bean>
</beans>
Le paramétrage est commun à tous les ViewPreparer, cf documentation Construction des vues en front office. Pour rappel, on peut spécifier les templates sur lesquels les préparers de vue sont utilisées avec les paramètres suivants :
includedSiteTemplate: liste des template sur lesquels le préparer de vue est acceptéexcludedSiteTemplate: liste des templates sur lesquels le préparer de vue est exclu
Attention, on ajoute un type de ViewModel dans la liste des view du header, pas directement un viewPreparer précis. Ce mécanisme permet de déclarer plusieurs ViewPreparer du même type, utilisés dans des cas différents. Par exemple, on pourrait avoir un seul header pour plusieurs template, mais vouloir spécifier notre ViewPreparer de type "exemple". C'est la méthode #accept des ViewPreparer qui permettra de déterminer quel ViewPreparer afficher. Si deux ViewPreparer sont acceptés, il est possible d'indiquer une priorité vie l'attribut
orderdans le bean.
Création de la jsp affichant les nouvelles données dans /WEB-INF/jsp/votreChemin/exemple.jsp :
...
<%@ page trimDirectiveWhitespaces="true" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="${not empty exempleViewModelId.attributExemple}">
<c:out value="${exempleViewModelId.attributExemple}"/>
</c:if>
...
Ajouter l'appel de la nouvelle vue dans /WEB-INF/jsp/votreChemin/headerVotreProjet.jsp :
...
<%--@elvariable id="exempleViewModelId" type="fr.votreprojet.votrepackage.ExempleViewModel"--%>
<c:if test="${not empty exempleViewModelId}">
<jsp:include page="${exempleViewModelId.view}"/>
</c:if>
...