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

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

  1. Plus spécifique = Priorité plus haute

    • nested?entity.@default_sort (110) avant nested?entity (100)
    • entity2.@name (50) avant entity.@name (45)
  2. Les queries complexes avant les simples

    • entity?properties (70) avant entity.@name (45)
  3. 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 entity
  • property.@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ée
  • nested?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