Publié le : 23 octobre 2025
Tags :Les composants permettent de créer de "petites" fonctionnalités qui peuvent être réutilisée dans les templates.
Il s'agit simplement d'un fichier FreeMarker, avec 2 méthodes qui permettent de les identifier :
getComponnentInfoqui renvoie des informations sur le composantinitqui permet au composant de signaliser si besoin.
Dans la version 1 des composants la méthode getComponnentInfo doit renvoyer un JSON.
Les composants peuvent ajouter des fonctionnalités :
- de supports (logs, documentation)
- de structure (sous templates, listing)
- d'usage (carrousel, menu, multi-langue, fils d'ariane)
Composant Include
Publié le : 24 octobre 2025
Ce composant permet d'inclure d'autres composants dans les templates.
Il se configure via le fichier de configuration.
components={"data":[{"file":"components/logHelper/logHelper.ftl"}, {"file":"components/commonHelper/commonHelper.ftl"}, {"file":"components/propertiesHelper/propertiesHelper.ftl"}, {"file":"components/includes/includes.ftl"}, ....
file: emplacement du fichier contenant le composantnamespace: alias pour accéder au composant. Attention cela remplace l'alias recommandé par le composant. D'autres composants dépendants peuvent ne plus fonctionner !
Il a aussi à charge de gérer les composants (qui sont des éléments incluables dans les templates) notamment :
- les charger et les rendre disponibles, aux autres composants et au template via leur namespace. Les composants sont alors utilisable comme s'ils avaient été importés dans le modèle (template) ou dans les composants.
- Appeler leur fonction
init(). - Leur passer le contenu si le composant déclare
"contentChainBefore":truedans leurgetComponnentInfo.
Ce composant permet aussi d'afficher la documentation de chacun des composants :
- subTemplate
buildAllComponnentsInfos: affiche le détail de tous les composants définis dans le fichier de configuration avec le paramètrecomponents - subTemplate :
buildComponnentInfos: affiche le détail d'un seul composant. Utilise l'attribut d'entête de contenudocumentationComponentpour déterminer le composant à afficher.
commonInc
| Type | Valeur | Description |
|---|---|---|
| lib | propertiesHelper | |
| lib | common | |
| config | components | with *namespace* attributs |
| componentFunction | init() | |
| componentFunction | getComponnentInfo() |
| Type | Valeur | Description |
|---|---|---|
| lib | logHelper | |
| contentHeader | documentationComponent |
Composant hooks
Publié le : 24 octobre 2025
Ce composant permet de déclarer des hook : une zone dans le template qui contiendra du contenu déclaré par d'autres composants.
<#if hookHelper??>
<@hookHelper.hook "topMenuContainer" content/>
</#if>
Le composant hooks permet d'ajouter du contenu dans une hook via son identifiant. Soit de façon globale : via le fichier de configuration
webleger.hooks={"data":[{"position":"afterBody", "action":"langHelper.build"}, {"position":"afterBody", "action":"form.build"}, ...
soit dans un contenu spécifique via les attributs d'entête d'un contenu
hooks={"data":[{"position":"afterBody", "action":"commonInc.buildComponnentInfos"}]}
Il est possible de configurer un déclenchement du rendu d'une hook de façon unique (pour la page en cour). Cela est pratique dans le cas d'une hook qui serait présent plusieurs fois dans une page, mais pour lequel on ne souhaite la déclencher qu'une fois.
Par exemple avec le composant block si plusieurs blocks intégrés dans un même autre contenu enregistre une hook, alors cette hook sera présente 2 fois au deuxième block, 3 fois au troisième, ... Le paramètre "renderOnce":true permet d'éviter cette accumulation, car dès que la hook effectue le rendu, cette hook est supprimée. Les autres blocks peuvent alors à nouveau l'ajouter (en précisant à nouveau "renderOnce":true ce qui fait que la hook est en fait ajouté au début du traitement du contenu, puis rendue, puis supprimée).
hookHelper
| Type | Valeur | Description |
|---|---|---|
| lib | commonHelper | |
| lib | propertiesHelper | |
| config | hooks |
| Type | Valeur | Description |
|---|---|---|
| lib | logHelper |
Composant block
Publié le : 26 octobre 2025
Ce composant permet d'afficher sous forme d'un bloque (inclus dans une page) un contenu. Cela est particulièrement utile pour les site "onePage", ou la page d'accueil.
Chaque élément de la page est créé dans un contenu (fichier MarkDown). Les blocks sont ensuite ajoutés dans une page.
Pour n'afficher que certains bloques dans une page les blocks peuvent être filtré par catégorie.
Il est parfois utile de personnaliser l'affichage d'un bloque (position de l'image, ...), le composant block gère l'attribut d'entête de contenue subTemplate. La valeur de cet attribut est utilisée pour l'affichage du contenu. Le comportement est assez similaire à un modèle (template) mais uniquement pour une partie de la page. Un subTemplate est prévue pour être inclus à l'intérieur d'un modèle (en général le modèle org_openCiLife_post ou org_openCiLife_block).
Attributs
category: category pour filtrer les blocksdisplayTitle: (default : true) affichage du titre du blocktitleTag: (default : h2) tag à utiliser pour encapsuler le titre
Le composant block définie des hooks, permettant d'ajuster du contenu à une zone du block.
block
| Type | Valeur | Description |
|---|---|---|
| lib | sequenceHelper | |
| lib | hookHelper | |
| lib | common | |
| contentType | org_openCiLife_blocks |
| Type | Valeur | Description |
|---|---|---|
| lib | langHelper | |
| lib | logHelper | |
| contentHeader | subTemplate |
Composant subContent
Publié le : 26 octobre 2025
Ce composant permet d'inclure des contenus dans un autre contenu. Il est assez similaire au composant block mais *subContent sert à effectuer des listing.
Par exemple "dans la même catégorie" ou "vous pourriez aussi aimer".
Pour ajouter des sous contenu, il faut utiliser le paramètre d'entête de contenu includeContent. Voici un exemple d'utilisation :
includeContent={"type":"org_openCiLife_post", "category":"création", "specificClass":"documentation", "title":"Dans la même catégorie", "display":{"type":"card", "content":"link"}}
Choix des contenus :
type: le type de contenu à conserver.category: la catégorie de contenu à conserver.
Personnalisation :
specificClasspermet d'ajouter une classe spécifique pour permettre la personnalisation de l'affichage (via le CSS).title: permet de personnaliser le titre de la section.hooks: permet d'ajouter des contenus via les Hooks internes du composant, par exemple pour activer les formulaires et les block dans les sous-contenus :
"hooks":{"data":[{"position":"endItemSubContent", "action":"block.build", "renderOnce":true}, {"position":"endItemSubContent", "action":"form.build", "renderOnce":true}]}, "display":{"type":"card", "content":"visible"}
Le format d'affichage des éléments :
display.type: les formats supportés sont :- table : les sous-contenus sont affichés sous forme d'un tableau. Chaque ligne affiche : l'image du contenu, le titre puis le résumé du contenu. Des colonnes supplémentaires peuvent être affichées à partir des attributs d'entête de chacun des sous contenu via l'attribut columns.
- link : chaque contenu est un simple lien.
- collapse_block : les sous-contenus sont affichés sous forme d'un paragraphe avec un titre, le contenu s'affiche en dessous lorsque l'utilisateur clique sur le titre. (comme dans une FaQ)
- card : chaque contenu est affiché sous forme d'une petite carte.
display.content- modal : un bouton est affiché permettant d'afficher le détail du contenu dans une fenêtre modal (une sorte de "popup" interne au site) s'affiche avec le contenu.
- modalLink : lorsque l'utilisateur clique, une fenêtre modale apparaît avec le détail du contenu.
- link : lorsque l'utilisateur clique sur le contenu, une nouvelle page s'affiche.
- visible : le contenu est directement intégré.
display.subTemplate: le sous contenu sera généré par un "sous-template" personnalisé. Par exemple"display":{"type":"type", "subTemplate":"humaniPattes.partenairesCard"}
Des exemples des différentes combinaisons sont disponibles : subContent_exemples/735_composant_subContent_exemples.html
Les autres attributs :
includeContent.display.columns : liste des colonnes du tableau à afficher. Le format d'une colonne est le suivant : {"name":"titre_de_la_colnne", "attr":"nom_de_l'attribut", "order":1} par exemple : {"name":"logo", "attr":"contentImage", "order":1}. nom_de_l'attribut est un attribut d'entête du contenu.
includeContent.display.closeButton : texte du bouton permettant de fermer la fenêtre modal.
includeContent.display.beforeTitleImage : image à afficher avant le titre pour les bloque de textes rétractables.
subcontent
| Type | Valeur | Description |
|---|---|---|
| contentHeader | includeContent |
| Type | Valeur | Description |
|---|---|---|
| lib | langHelper | |
| lib | logHelper |
Composant bootstrap3
Publié le : 26 octobre 2025
Ce composant permet d'intégrer BootStrap (version3) ainsi que JQuery 1.11.1. Les fichiers CSS et JS du composant doivent être intégrés manuellement dans le fichier de configuration. Les fichiers sont automatiquement disponibles dans le dossier templates/components/bootstrap3/copyToAssests/noAgregation, mais ne sont pas automatiquement référencé dans le header/footer de la page.
- site.script.header : ajouter
"href":"templates/components/bootstrap3/copyToAssests/noAgregation/html5shiv.min.js", "rel":"stylesheet", "constraint":"if lt IE 9"} - webleger.site.script.footer : ajouter
{"tagType":"script", "src":"templates/components/bootstrap3/copyToAssests/noAgregation/jquery-1.11.1.min.js"}, {"tagType":"script", "src":"templates/components/bootstrap3/copyToAssests/noAgregation/bootstrap.min.js"}
Composant menu
Publié le : 03 novembre 2025
Ce composant permet de créer le menu du site de façon automatique à partir des contenus. Il se configure via le fichier de configuration.
site.menu.includeBlock=true: indique si les bloques de page d'accueil doivent être dans le menusite.menu.tags.include=global: indique les tags des contenus qui devront être présent dans le menusite.menu.includeCategories=homepage: indique les catégories des contenus qui devront être présent dans le menu
Il est possible de désactiver le menu sur une page (utile pour les Landing Page) via l'attribut d'entête de contenu displayMenu avec la valeur false.
menu
| Type | Valeur | Description |
|---|---|---|
| lib | common | |
| lib | bootstrap3 |
| Type | Valeur | Description |
|---|---|---|
| lib | langHelper | |
| lib | logHelper | |
| config | site.debug.enabled | |
| contentHeader | menu | |
| contentHeader | displayMenu |
Composant breadcrumb
Publié le : 03 novembre 2025
Ce composant permet d'afficher un fils d'ariane. Il se configure via le fichier de configuration.
site.breakcrumb.display=true: indique si le fils d'ariane doit être affiché par défautsite.breakcrumb.seprator=>>: indique le séparateur à utiliser entre les différents éléments.
Chaque contenu peut définir si le fils d'ariane doit être affiché ou non (remplace la valeur par défaut du fichier de configuration.) via l'attribut d'entête de contenu : displayBreadcrumb.
breadcrumb
| Type | Valeur | Description |
|---|---|---|
| lib | commonHelper | |
| config | site.breakcrumb.display | |
| config | site.breakcrumb.seprator |
| Type | Valeur | Description |
|---|---|---|
| lib | logHelper | |
| contentHeader | displayBreadcrumb |
Composant carousel
Publié le : 03 novembre 2025
Ce composant permet d'afficher un carrousel d'images.
Il se configure via les attributs d'entête du contenu.
carouselData={"id":"HomePageCarousel","control":{"previousLabel":"Précédent", "nextLabel":"Suivant"}, "displayIndicator":true, "style":"margin:auto" "slides":[{"type":"img", "data":"images/common/logo_left.png", "caption":"bobun texte", "captionStyle":"color:black", "alt":"Une image", "style":"margin:auto;height:60%"}, {"type":"text", "caption":"Juste un texte sans imagesEt un peu de texte en plus qui prend un maximum de place pour voire ce que ca donne avec un deuxième paragraphe", "captionStyle":"color:black"}]}
carouselData.id: id CSS du carousel.carouselData.control.previousLabel: texte du bouton permettant d'afficher la diapositive précédente.carouselData.control.nextLabel: texte du bouton permettant d'afficher la diapositive suivante.carouselData.control.displayIndicator: indique si les boutons de navigations sont affichés ou non.carouselData.slides.type: soit img soit textcarouselData.slides.data: contenu de la diapositive (soit l'URL de l'image, soit le texte)carouselData.slides.caption: titre de la diapositivecarouselData.slides.captionStyle: style CSS à appliquer au titre (caption)carouselData.slides.alt: texte alternatif si l'image ne s'affiche pascarouselData.slides.style: style CSS de la diapositive.
carousel
| Type | Valeur | Description |
|---|---|---|
| lib | common | |
| contentHeader | carouselData | |
| frontLib | bootstrap 3 |
Composant lang
Publié le : 03 novembre 2025
Ce composant permet d'afficher le site en plusieurs langues.
Ce composant se configure via le fichier de configuation
site.langs.default=fr_FR: langue par défaut pour les contenus ne précisant pas leur langagesite.langs={"data":[{"local":"fr_FR", "title":"FR", "icon":"org_openCiLife_ecoWeb/images/lang/ico_fr.png", "folder":""}, {"local":"en_EN", "title":"EN", "icon":"org_openCiLife_ecoWeb/images/lang/ico_uk.png", "folder":"en"}]}: configuration des langues et pour chacune : son code (local), son label, un icône et le sous-dossier du site contenant la page principal (index) de cette langue.
Chaque contenu précise la langue dans laquelle le contenu est rédigé via l'attribut d'entête : lang. Plusieurs langues peuvent être précisé, chacune séparée par une virgule.
Pou affiche le sélecteur de langue, il faut créer un contenu avec un attribut d'entête de document : languageSwitcher=true.
langHelper
| Type | Valeur | Description |
|---|---|---|
| lib | sequenceHelper | |
| lib | propertiesHelper | |
| contentHeader | lang | |
| contentHeader | languageSwitcher |
Composant action
Publié le : 03 novembre 2025
Ce composant permet d'afficher des actions à l'intérieur des contenus (par exemple des boutons : Call To Action).
Ce composant se configure via l'entête de contenu :
-
action={"disposition":"center", "specificClass":"cta", "data":[{"type":"button", "label":"Commencer gratuitement", "specificClass":"btn-primary", "operation":{"type":"anchor", "to":"lp_start"}}, {"type":"button", "label":"Découvrir les fonctionnalités", "operation":{"type":"anchor", "to":"lp_fonctionalities"}}]} -
action.disposition: indique comment les boutons sont répartis entre eux. Valeurs possibles : center. action.specificClass: permet de définir une (ou plusieurs) classe CSS à appliquer au groupe d'actions.action.data: liste des actions.action.data.type: type d'action. Valeurs possibles : button.action.data.label: texte affiché pour l'action.action.data.operation: définis l'opération à appliquer lorsque l'utilisateur inter-agit (clique) avec l'action.action.data.operation.type: type d'opération à effectuer. Valeurs possibles : anchor, link, mailto.action.data.operation.to: destination de l'action.action.data.operation.obfuscationMask: (optionnel) si défini le label sera décodé avec le masque présent.
Hook
Nécessite la configuration d'une hook pour s'afficher. La hooks précisera où le sticker devra s'afficher.
Voici un exemple pour un block, en affichant les stickers juste après le contenu du block (et avant les autres contenu par defaut dans cette hook).
hooks={"data":[{"position":"afterBlockBody", "action":"action.build", "renderOnce":true, "order":30}]}
action
| Type | Valeur | Description |
|---|---|---|
| lib | sequenceHelper | |
| lib | hookHelper | |
| lib | common | |
| action | subTemplate |
| Type | Valeur | Description |
|---|---|---|
| lib | langHelper | |
| lib | logHelper |
Composant sticker
Publié le : 03 novembre 2025
Ce composant permet d'afficher des petites infos dans les contenus.
Ce composant se configure via l'entête de contenu :
-
stickers={"disposition":"center", "data":[{"label":"CMS Open Source & Éco-conçu", "imageSpecificClass":"impact_img", "image":""}]} -
action.disposition: indique comment les stickers sont répartis entre eux. Valeurs possibles : center. action.specificClass: permet de définir une (ou plusieurs) classe CSS à appliquer au groupe de stickers.action.data: liste des stickers.action.data.label: texte affiché pour le sticker.action.data.image: (optionnel) image du sticker : soit une URL soit un SVG inline.action.data.imageSpecificClass: classe CSS à ajouter pour l'image.action.data.specificClass: classe CSS à ajouter pour le sticker (image + texte).
Hook
Nécéssite la configuration d'une hook pour s'afficher. La hooks précisera où le sticker devra s'afficher.
Voici un exemple pour un block, en affichant les stickers juste avant le contenu du block
hooks={"data":[{"position":"beforeBlockBody", "action":"sticker.build", "renderOnce":true}]}
sticker
| Type | Valeur | Description |
|---|---|---|
| contentHeader | includeContent |
| Type | Valeur | Description |
|---|---|---|
| lib | langHelper | |
| lib | logHelper |
Composant fairlytics
Publié le : 04 février 2026
Ce composant permet de collecter des statistiques d'utilisation du site (pages vues) de façon non intrusive et respectant les données privées des visiteurs.
Pour l'utiliser, il faut une clef (gratuite) que l'on peut obtenir ici : https://fairlytics.tech/.
Ce composant se configure via le fichier de configuration :
webleger.component.fairlytics.key=votre_clef
fairlytics
| Type | Valeur | Description |
|---|---|---|
| lib | propertiesHelper | |
| config | component.fairlytics.key |
Composant facebook
Publié le : 04 février 2026
Ce composant permet d'afficher des informations provenant d'un compte FaceBook.
Ce composant se configure via le fichier de configuration.
webleger.component.meta.dev.key=: votre clef facebook Developerwebleger.component.meta.dev.sdk.version=v2.7: version du SDK à utiliserwebleger.component.meta.facebook.container.url=https://www.facebook.com/{Your_company}/: URL de votre page FaceBookwebleger.component.meta.facebook.container.name={Your_company}: nom du containerwebleger.component.meta.facebook.container.width.mobile=300: largeur en version mobilewebleger.component.meta.facebook.container.height.mobile=400: longeur en version mobilewebleger.component.meta.facebook.container.width.desktop=500: largeur en version ordinateurwebleger.component.meta.facebook.container.height.desktop=500: longeur en version ordinateur
Pour activer le composant, il faut ajouter en attribut d'entête du contenu une hook par exemple :
- pour les actualités :
hooks={"data":[{"position":"afterBlockBody", "action":"facebook.buildNews", "renderOnce":true, "order":25}]} - pour les événements :
hooks={"data":[{"position":"afterBlockBody", "action":"facebook.buildEvent", "renderOnce":true, "order":25}]}
Composant legal
Publié le : 07 février 2026
Ce composant permet d'afficher des informations légales.
Ce composant se configure via le fichier de configuration et les attributs webleger.site.legal.*.
Pour activer le composant, il faut ajouter en attribut d'entête du contenu :
legalPage=true: pour afficher les mentions légalescategory=cgv: pour les Conditions Générales de Ventes. La valeur cgv peut être modifié via le fichier de configuration :webleger.site.legal.cgv.category
legal
| Type | Valeur | Description |
|---|---|---|
| lib | propertiesHelper | |
| lib | logHelper |
Composant table des matières
Publié le : 22 février 2026
Ce composant permet d'afficher une table des matières pour les block inclut dans la page.
Ce composant se configure via un attribut d'entête de contenu par exemple
toc={"title":"Table des matières : Les composants", "subTemplate":"blockTocSelectSubTemplate"}
title: (default "") : titre de la table des matièressubTemplate: (default "defaultTocSubTemplate" => "blockTocUlLiWithLinkSubTemplate") : macro affichant la Table des Matières (d'autre macros peuvent être ajoutées)- blockTocUlLiWithLinkSubTemplate : affichage sous forme de liste BulletPoint avec lien
- blockTocSelectSubTemplate : affichage sous forme d'un menu déroulant (avec lien)
toc
| Type | Valeur | Description |
|---|---|---|
| contentHeader | toc | |
| componnent | block |
| Type | Valeur | Description |
|---|---|---|
| lib | langHelper | |
| lib | logHelper |