Définir et utiliser un panier de fiches
Création d’un nouveau type de panier
Pour créer un nouveau type de panier, vous devez déclarer le bean correspondant, ainsi que les beans des services fichePanier et panier, dans un fichier XML situé à l’emplacement suivant :
classpath*:com/kosmos/panier/context/panier-definition-name.xml,
où name correspond au nom de votre type de panier.
Voici un exemple de déclaration pour un panier de type "Favoris" :
<bean id="favorisPanier" class="com.kosmos.panier.bean.PanierDefinitionBean">
<property name="type" value="FAVORIS"/>
<property name="taille" value="${panier.FAVORIS.taille:-1}"/>
<property name="actif" value="${panier.FAVORIS.actif:true}"/>
<property name="typeFicheAutorise" value="${panier.FAVORIS.type-fiche-autorise:0015}"/>
<property name="comportement" value="${panier.FAVORIS.comportement:BDD}"/>
<property name="quantifiable" value="${panier.FAVORIS.quantifiable:false}"/>
<property name="dragAndDrop" value="${panier.FAVORIS.drag-n-drop:true}"/>
<property name="modale" value="${panier.FAVORIS.modale:false}"/>
</bean>
<bean id="serviceFichePanierFavoris" class="com.kosmos.panier.service.impl.ServiceFichePanierBDDImpl">
<property name="panierDefinitionBean" ref="favorisPanier"/>
<property name="dao" ref="fichePanierDao"/>
</bean>
<bean id="servicePanierFavoris" class="com.kosmos.panier.service.impl.ServicePanierBDDImpl">
<property name="dao" ref="panierDao"/>
<property name="panierDefinitionBean" ref="favorisPanier"/>
<property name="serviceFichePanier" ref="serviceFichePanierFavoris"/>
<property name="serviceMetatag" ref="serviceMetatag"/>
</bean>
Les propriétés du panier Favoris seront surchargeable en projet.
Informations supplémentaires :
Création d’un bouton d’ajout au panier pour une fiche
Choix de l'intégration du bouton {#integration}
Un bouton d’ajout au panier peut être intégré à différents endroits et sous différentes formes. Il convient donc de déterminer en premier lieu où ce bouton doit apparaître.
-
Si le bouton doit être affiché dans une vue qui n’a pas connaissance de l’extension panier (comme c’est le cas par exemple sur les fiches articles), il faudra probablement recourir à un frontAddOn. → Voir la documentation sur les frontAddOn
-
Si le bouton doit apparaître aux côtés d’autres actions (comme les notifications, l’export PDF, etc.), et que ces actions peuvent être désactivées ou réorganisées, vous pouvez l’intégrer au sein d’un bandeau d’actions. → Voir la documentation sur les bandeauActions
Mise en place du bouton
Quel que soit l'intégration choisi pour le bouton, sa préparation reste identique.
La classe AbstractCartButtonViewPreparer permet de préparer les éléments du bouton, tels que le libellé pour l’ajout ou la suppression, l’icône, etc.
La première étape consiste à étendre cette classe et à surcharger la méthode getTypePanier.
Voici un exemple pour un panier de type "Favoris" :
public class FavoriteCartButtonViewPreparer<V extends ContentCartButtonViewModel> extends AbstractCartButtonViewPreparer<V> {
private static final String TYPE_PANIER = "FAVORIS";
@Override
public String getTypePanier(){
return TYPE_PANIER;
}
}
La définition du bean :
<bean id="favoriteCartButtonViewPreparer" class="com.kosmos.panier.FavoriteCartButtonViewPreparer">
<property name="type" value="#{T(com.kosmos.panier.actionsbandeau.preparer.FavorisActionFicheViewPreparer).FAVORITE_ACTION}" />
<property name="view" value="/extensions/panier/WEB-INF/jsp/buttonContentPanier.jsp"/>
</bean>
Ce bouton est de type favorite-action. Par conséquent, tout preparer chargé de générer ce contenu de bouton de panier doit inclure ce type dans sa liste de expectedViewTypes.
Il est donc nécessaire de créer un preparer dont le rôle est de préparer le cartButtonViewPreparer.
Dans le cas des favoris, on pourrait par exemple définir une classe FavorisActionFicheViewPreparer.
Cette classe doit étendre AbstractContentCartActionViewPreparer, et utiliser comme modèle ContentCartActionViewModel.
Il faudra alors surcharger la méthode prepareCardButton.
Ce preparer va être chargé de préparer un favorite-action, ici lefavoriteCartButtonViewPreparer.
Voici un exemple de résultat pour un panier de type "Favoris" :
public class FavorisActionFicheViewPreparer<V extends ContentCartActionViewModel> extends AbstractContentCartActionViewPreparer<V> {
public static final String FAVORITE_ACTION = "favorite-action"; // C'est le type que prépare notre favoriteCartButtonViewPreparer
@Override
public boolean accept(final FrontContext frontContext) {//Conditions dans laquelle notre bouton s'affichera
return frontContext.isLogged() && super.accept(frontContext);
}
@Override
public ContentCartButtonViewModel prepareCardButton(final FrontContext context, final Map<String, List<IViewPreparer>> preparers) {
return preparers.get(FAVORITE_ACTION)
.stream()
.filter(preparer -> preparer.accept(context))
.findFirst()
.map(preparer -> preparer.prepare(context, Collections.emptyMap()))
.map(ContentCartButtonViewModel.class::cast)
.orElse(null);
}
}
Proposition de déclaration du bean :
<bean id="favorisActionFicheViewPreparer" class="com.kosmos.panier.actionsbandeau.preparer.FavorisActionFicheViewPreparer">
<property name="view" value="/extensions/panier/WEB-INF/jsp/buttonContentPanier.jsp" />
<property name="actionActive" value="${front.actionbandeaufiche.favoris.active:true}" />
<property name="actionPosition" value="${front.actionbandeaufiche.favoris.order:3}" />
<property name="includedContents" value="${panier.FAVORIS.included.contents}"/>
<property name="excludedContents" value="${panier.FAVORIS.excluded.contents}"/>
</bean>
Une fois le bouton préparé, il suffit de l’inclure dans la vue souhaitée.
Inclusion du bouton dans la vue ciblée
L’inclusion du bouton de panier peut se faire de différentes façons, selon son contexte d’affichage : via un frontAddOn, dans un bandeau d’action, au sein d’une fiche, d’une card, ou encore à travers un preparer de frontAddOns.
Inclusion dans une fiche ou une card
Lorsque le bouton est affiché dans une fiche ou une card sans contrainte particulière de contexte (c’est-à-dire sans nécessité de passer par un frontAddOn pour une inclusion anonyme), il suffit d’ajouter un attribut et une méthode dans le preparer ou la card associé(e) à la vue souhaitant inclure ce bouton.
Par exemple, pour un panier de type Favoris :
protected FavorisActionFicheViewPreparer<ContentCartActionViewModel> ficheViewPreparer;
//Préparation d'un contexte personnalisé permettant d'etre utilisé depuis un preparer ou builder
private ContentCartActionViewModel buildActionFavoris(final FichePanierDto fiche) {
final ContentContext context = prepareContext(fiche);
final SiteTemplate template = SiteTemplateBeanManager.getInstance().getSiteTemplateByCode(context.getCtx().getInfosSite().getCodeTemplate());
final Map<String, List<IViewPreparer>> preparers = SiteTemplateBeanManager.getInstance().getViewPreparersByTemplateSiteCode(template.getCode());
return ficheViewPreparer.prepare(context, preparers);
}
/**
* Prépare un context permettant de construire un cart button.
* @param fiche la fiche à partir duquel préparer le cart sera créée
* @return le ContentContext préparé
*/
private ContentContext prepareContext(final FichePanierDto fiche) {
final ContexteUniv ctx = ContexteUtil.getContexteUniv();
ctx.setUrlPageCourante(fiche.getFicheViewModel().getUrl());
final ContentContext context = ContentContext.of(new DefaultContext());
context.setCtx(ctx);
context.setTitle(fiche.getTitre());
final MetatagBean metatagBean = new MetatagBean();
metatagBean.setId(fiche.getIdMeta());
context.setMetatag(metatagBean);
return context;
}
Inclusion via un frontAddOn
Lorsque la vue qui doit afficher le bouton ne doit pas dépendre directement de l’extension panier, ou si la zone d’affichage du bouton est susceptible de varier, il peut être préférable d’utiliser un frontAddOn. Voir la section choix integration.
Dans ce cas, il est possible de surcharger la méthode prepare dans votre FavorisActionFicheViewPreparer afin d’ajouter, via le frontAddOn, l' extensionPoint correspondant à la vue du bouton préparé.
@Override
public V prepare(final FrontContext frontContext, final Map<String, List<IViewPreparer>> preparers) {
final V model = super.prepare(frontContext, preparers);
FrontAddOnManager.getInstance().addAddOnElement(pointNameButtonPanier, model.getView());
return model;
}
Il est évidemment essentiel de déclarer le pointName dans la JSP où vous souhaitez permettre l'inclusion du bouton de panier.
Inclusion dans un bandeau d’action
Lorsque le bouton de panier s’insère dans un ensemble d’actions (par exemple aux côtés de boutons de notification, "J’aime", export PDF…),
et que ces actions peuvent être réorganisées ou désactivées par un contributeur, il convient d’utiliser un bandeau d’action.
Pour la création et la configuration d’un bandeau, reportez-vous à la documentation dédiée. Voir la section choix integration.
Afin d’inclure votre bouton dans un bandeau d’action, commencez par identifier le type d’actions que ce bandeau est conçu pour préparer.
<bean id="defaultActionsBandeauFicheViewPreparer" class="com.kosmos.actionsbandeau.bandeau.ActionsBandeauFicheViewPreparer">
<property name="type" value="bandeau-action-fiche" />
<property name="view" value="/WEB-INF/jsp/actionsbandeau/actionsBandeau.jsp" />
<property name="expectedViewTypes">
<list>
<value>action-fiche</value>
</list>
</property>
</bean>
Dans cet exemple, le bandeau prépare des actions de type action-fiche.
Il faut donc modifier notre FavorisActionFicheViewPreparer afin d’y déclarer le type d’action attendu par le bandeau dans lequel le bouton doit apparaître.
Cela permettra au bandeau d’invoquer automatiquement ce preparer.
Par exemple, pour un panier de type Favoris :
<bean id="favorisActionFicheViewPreparer" class="com.kosmos.panier.actionsbandeau.preparer.FavorisActionFicheViewPreparer">
<property name="type" value="action-fiche" />
. . .
</bean>