Bidji Template Directives - Référence Technique
Référence rapide de toutes les directives Bidji pour templates FreeMarker. Pour des explications détaillées et exemples, voir
BidjicDirectives.md
Version : 2026-02-06
Source : BidjicTask.freemarkerize() lignes 1003-1072
📋 Table des Matières
- Variables Globales
- Application & Modèle
- Entités - Propriétés
- Entités - Métadonnées
- Entités - UI
- Entités - Relations
- Entités - Métier
- Propriétés - Types
- Propriétés - Attributs
- Entités Nested
- Widgets
- Debug
- Ordre d’Exécution
Variables Globales
| Variable | Type | Description |
|---|---|---|
bidji |
Bidjim | Modèle racine |
entity |
Entity | Entité courante (bidji.entity) |
Model |
String | Nom du modèle (fichier .bidjim) |
Package |
String | Package extrait du chemin |
Module |
String | Module extrait du chemin |
Model?api |
ModelHelper | Helper pour métadonnées |
Application & Modèle
| Directive | Transformation | Type Retour | Priorité |
|---|---|---|---|
app?entities |
app.getEntities() |
List | 80 |
model?has_complex_types |
Model?api.has_complex_types() |
boolean | 10 |
Entités - Propriétés
| Directive | Transformation | Type Retour | Usage | Priorité |
|---|---|---|---|---|
entity?properties |
Model?api.get_entity_properties(entity) |
List | Toutes propriétés | 70 |
entity?native_properties |
Model?api.get_native_properties(entity) |
List | Propriétés primitives | 65 |
entity?dataform_properties |
Model?api.get_dataform_properties(entity) |
List | Props pour formulaires | 70 |
entity?datatable_properties |
Model?api.get_datatable_properties(entity) |
List | Props pour tables | 70 |
entity?data_properties |
Model?api.get_data_properties(entity) |
List | Props form + table | 70 |
Entités - Métadonnées
| Directive | Transformation | Type Retour | Priorité |
|---|---|---|---|
entity.@name |
Model?api.get_entity_name(entity) |
String | 45 |
entity.@package |
Model?api.get_entity_package(entity) |
String | 45 |
entity.@module |
Model?api.get_entity_module(entity) |
String | 45 |
entity.@icon |
Model?api.get_entity_icon(entity) |
String | 45 |
entity.@taggable |
Model?api.get_entity_taggable(entity) |
boolean | 45 |
entity.@delete |
Model?api.get_entity_delete(entity) |
boolean | 45 |
entity.@default_sort |
entity.getDefaultSort() |
String | 45 |
entity2.@name |
Model?api.get_entity_name(entity2) |
String | 50 |
entity2.@package |
Model?api.get_entity_package(entity2) |
String | 50 |
Entités - UI
| Directive | Transformation | Type Retour | Priorité |
|---|---|---|---|
entity?detail_tabs |
Model?api.get_detail_tabs(entity) |
List | 60 |
entity?has_detail_tabs |
Model?api.has_detail_tabs(entity) |
boolean | 60 |
entity?first_datatable_tab |
Model?api.first_datatable_tab(entity) |
Object | 60 |
entity?has_filter_by_month |
Model?api.has_filter_by_month(entity) |
boolean | 55 |
entity?is_monthly_table |
Model?api.is_monthly_table(entity) |
boolean | 55 |
entity?has_table_footer |
Model?api.has_table_footer(entity) |
boolean | 55 |
Entités - Relations
| Directive | Transformation | Type Retour | Priorité |
|---|---|---|---|
entity?one_to_many_properties |
Model?api.get_entity_one_to_many_properties(entity) |
List | 50 |
entity?many_to_many_properties |
Model?api.get_entity_many_to_many_properties(entity) |
List | 50 |
entity?is_created_in |
Model?api.is_created_in |
- | 50 |
entity?creates |
Model?api.creates |
- | 50 |
Entités - Métier
| Directive | Transformation | Type Retour | Priorité |
|---|---|---|---|
entity?dump |
Model?api.dump_entity(entity) |
String | 5 |
Propriétés - Types
| Directive | Transformation | Type Retour | Priorité |
|---|---|---|---|
property?type_or_string |
Model?api.get_property_type(property.@name, 'string', false) |
String | 35 |
property?nullable_type_or_string |
Model?api.get_property_type(property.@name, '?string', true) |
String | 35 |
property?dbtype |
Model?api.get_property_dbtype(property.@name) |
String | 35 |
property?default_value |
Model?api.get_property_default_value(property.@name) |
String | 35 |
column?type_or_string |
Model?api.get_property_type(column.@name, 'string', false) |
String | 35 |
column?nullable_type_or_string |
Model?api.get_property_type(column.@name, '?string', true) |
String | 35 |
column?dbtype |
Model?api.get_property_dbtype(column.@name) |
String | 35 |
column?default_value |
Model?api.get_property_default_value(column.@name) |
String | 35 |
column?is_property |
Model?api.has_property(column.@name) |
boolean | 30 |
Propriétés - Attributs
⚠️ DEPRECATED - Utiliser .@ directement
| Directive (Deprecated) | Remplacement | Priorité |
|---|---|---|
property?kind_of_string |
property.@kind_of_string |
20 |
property?kind_of_number |
property.@kind_of_number |
20 |
property?is_array |
property.@is_array |
20 |
property?editable |
property.@editable |
20 |
property?optionselect |
property.@optionselect |
20 |
property?optionfilter |
property.@optionfilter |
20 |
property?optioncomputed |
property.@optioncomputed |
20 |
Raison : Ces directives sont de simples aliases sans valeur ajoutée.
Entités Nested
| Directive | Transformation | Type Retour | Priorité |
|---|---|---|---|
nested?entity.@default_sort |
Model?api.get_entity(nested.@type).getDefaultSort() |
String | 110 ⚠️ |
nested?entity |
Model?api.get_entity(nested.@type) |
Entity | 100 |
nested?properties |
Model?api.get_entity_properties(nested.@type) |
List | 100 |
nested?native_properties |
Model?api.get_native_properties(nested.@type) |
List | 100 |
⚠️ Ordre critique : nested?entity.@default_sort DOIT être avant nested?entity !
Widgets
| Directive | Transformation | Type Retour | Priorité |
|---|---|---|---|
widget?property |
Model?api.get_entity_property(entity, widget.@property) |
Property | 40 |
Debug
| Directive | Transformation | Type Retour | Priorité |
|---|---|---|---|
entity?dump |
Model?api.dump_entity(entity) |
String | 5 |
property?dump |
Model?api.dump_property(property) |
String | 5 |
Ordre d’Exécution
Les directives sont appliquées par ordre de priorité décroissante (plus haute d’abord).
⚠️ Ordre Critique
110 → nested?entity.@default_sort [DOIT être AVANT nested?entity]
100 → nested?entity
100 → nested?properties
80 → app?entities
70 → entity?properties, entity?dataform_properties, etc.
65 → entity?native_properties
60 → entity?detail_tabs, entity?has_detail_tabs, etc.
55 → entity?has_filter_by_month, entity?is_monthly_table, etc.
50 → entity?one_to_many_properties, entity?many_to_many_properties
50 → entity2.@name, entity2.@package
45 → entity.@name, entity.@package, entity.@module, etc.
40 → widget?property
35 → property?type_or_string, property?dbtype, etc.
30 → column?is_property
20 → property?kind_of_* (DEPRECATED)
10 → model?has_complex_types
5 → entity?dump, property?dump
Règles Importantes
-
Plus spécifique = Priorité plus haute
nested?entity.@default_sort(110) avantnested?entity(100)entity2.@name(50) avantentity.@name(45)
-
Les queries complexes avant les simples
entity?properties(70) avantentity.@name(45)
-
Deprecated = Priorité basse
property?kind_of_*(20) exécutés en dernier
Catégories par Priorité
Priorité Haute (100+) - Entités Nested
nested?entity.@default_sort (110)
nested?entity (100)
nested?properties (100)
Priorité Moyenne-Haute (50-80) - Queries Entités
app?entities (80)
entity?properties (70)
entity?dataform_properties (70)
entity?one_to_many_properties(50)
Priorité Moyenne (40-49) - Métadonnées Entités
entity.@name (45)
entity.@package (45)
widget?property (40)
Priorité Moyenne-Basse (30-39) - Propriétés
property?type_or_string (35)
property?dbtype (35)
column?is_property (30)
Priorité Basse (20-) - Deprecated & Debug
property?kind_of_* (20) ← DEPRECATED
model?has_complex_types (10)
entity?dump (5)
Mapping Catégories → Namespace Futur
Correspondance avec la nouvelle syntaxe (Phase 3 du refactoring) :
| Catégorie Actuelle | Namespace Futur |
|---|---|
| Application | bidji.model.* |
| Entités - Propriétés | bidji.entity.properties(...) |
| Entités - Métadonnées | bidji.entity.name(...), bidji.entity.package(...) |
| Entités - UI | bidji.ui.form_properties(...), bidji.ui.table_properties(...) |
| Entités - Relations | bidji.relation.one_to_many(...) |
| Propriétés - Types | bidji.property.java_type(...), bidji.property.db_type(...) |
| Nested | bidji.entity.get(nested.@type) |
Extraction depuis le Code Source
// BidjicTask.java:1003-1072
private String freemarkerize(String templateContent) {
String res = templateContent;
// Les 60+ replaceAll() dans l'ordre du code source :
res = res.replaceAll("app\\?entities", "app.getEntities()");
res = res.replaceAll("nested\\?entity.@default_sort", "...");
res = res.replaceAll("nested\\?entity", "...");
// ... etc
res = res.replaceAll("entity\\?dump", "Model\\?api.dump_entity(entity)");
res = res.replaceAll("property\\?dump", "Model\\?api.dump_property(property)");
return res;
}
⚠️ Problème : Ordre d’exécution = ordre dans le code, pas documenté !
✅ Solution : Voir doc/Refactoring.md Phase 2 - BidjicPreprocessor avec priorités explicites
Statistiques
| Catégorie | Nombre de Directives | Status |
|---|---|---|
| Entités - Propriétés | 5 | ✅ Actives |
| Entités - Métadonnées | 9 | ✅ Actives |
| Entités - UI | 6 | ✅ Actives |
| Entités - Relations | 4 | ✅ Actives |
| Propriétés - Types | 9 | ✅ Actives |
| Propriétés - Attributs | 7 | 🔴 Deprecated |
| Entités Nested | 4 | ✅ Actives |
| Application & Modèle | 2 | ✅ Actives |
| Widgets | 1 | ✅ Active |
| Debug | 2 | 🔧 Debug uniquement |
| TOTAL | 49 | 42 actives, 7 deprecated |
Règles de Nommage
Pattern ? (Query/Fonction)
<objet>?<action>
<objet>?<action>_<contexte>
Exemples :
entity?properties- “donne-moi les propriétés”entity?dataform_properties- “donne-moi les propriétés pour un dataform”property?type_or_string- “donne-moi le type ou ‘string’”
Pattern .@ (Attribut)
<objet>.@<attribut>
Exemples :
entity.@name- attribut name de entityproperty.@type- attribut type de property
Pattern Composé (Nested)
<objet>?<relation>.<action>
<objet>?<relation>.@<attribut>
Exemples :
nested?entity- récupère l’entité référencéenested?entity.@default_sort- récupère le default_sort de l’entité référencée
Pièges Fréquents
1. Ordre des Nested ⚠️
[#-- ❌ INCORRECT --]
${nested?entity}
${nested?entity.@default_sort}
[#-- ✅ CORRECT --]
${nested?entity.@default_sort}
${nested?entity}
2. Confusion ? vs .@
[#-- ❌ INCORRECT --]
${property?name} [#-- n'existe pas --]
${entity?package} [#-- n'existe pas --]
[#-- ✅ CORRECT --]
${property.@name}
${entity.@package}
3. Utiliser Deprecated
[#-- ❌ DEPRECATED --]
[#if property?kind_of_string]
[#-- ✅ CORRECT --]
[#if property.@kind_of_string]
Références Croisées
- Guide détaillé :
BidjicDirectives.md - Plan de refactoring :
Refactoring.md - Code source :
src/main/java/org/bidji/taskdefs/BidjicTask.java:1003-1072 - Helper API :
src/main/java/org/bidji/util/ModelHelper.java
Génération Automatique
Ce document peut être généré automatiquement avec la classe BidjicPreprocessor (Phase 2 du refactoring) :
BidjicPreprocessor.printMarkdownReference();
Voir doc/Refactoring.md pour plus de détails.
Document généré le : 2026-02-06 Version : 1.0 Auteur : Analyse automatique du code source