Joomla Builder

C'est un outil de génération de composants pour Joomla développé par Llewellyn van der Merwe.

Il permet sans quasiment écrire une ligne de code de générer l'arborescence de fichiers et le code du composant pour l'administration et le site.

L'outil est téléchargeable sur le JED Joomla ou directement sur son site github   pkg-component-builder/releases

Une belle présentation est disponible sur le magazine Jooma tools-to-build-a-component-7-joomla-component-builder

 

Le sujet

Il s'agit de créer un composant qui permettra de calculer ses impôts en fonction du revenu et de son nombre de parts.

 Le calcul est fait en fonction des tranches d'impôts de l'année considérée et d'un coefficient à appliquer pour chaque tranche.

On se contentera d'un calcul simple en déduisant les dons aux associations et les placements du type "PER".

La modélisation

Pour commencer à utiliser "Component Builder", il faut faire une modélisation des données utilisées pour le composants.

Dans notre cas il s'agira des données de calcul , à savoir les tranches d'impôts et coefficients à appliquer pour une année fiscale.

Concernant les données du revenu on utilisera le revenu net fiscal, le mode de déductions de frais (10% ou réel) le nombre de parts, les dons aux associations et le placement sur le PEL.


   Baptisons notre composant com_jtax

Pour faire la modélisation, j'utilise l'outil   PlantUML

 

 

 Les 2 "classes" vont être mappées sur 2 tables de la base de données Joomla

`#__jtax_impot`

et `#__jtax_annee`

On créera un lien entre chaque ligne de la table "impot" et une ligne de la table de donnée "annee"

 

 

 

La création du composant dans component builder

 Aller dans l'interface administrateur sous Components/Component Builder/Joomla Components

Cliquer sur Nouveau

Pour ma part j'ai juste rempli les champs pour "System Name" et "Short Description" et "Company Name" "Author" "Author Email" "Author Website"

 

 

Création des champs associés au composant

On crée un champ ("Field") pour chaque ligne et chaque table reflétant la modélisation.

J'ai créé un type de champ ("Fieldtype") de nom "Revenu" pour indiquer les min et max de tous les champs de ce type

 

 Nom Type
 tranche1 à tranche4  Revenu
 coef1 à coef4  FLOAT
 revenu  Revenu
 deduction  Revenu
 nom  STRING
 nbparts  FLOAT
 PEL  Revenu

 

Exemple pour le champ PEL on lui donne pour type Revenu

 

 

On précise le format dans la base de données

 

Pour le champ nombre de parts j'ai mis un step à 0.5 pour avoir les demi parts

 

 

Création des vues administrateur associées au composant

Ce sont les vues (admin views) qui déterminent l'association entre les listes de champs et les tables de la base de données, et la création des contrôleurs/modèles associés

L'association est faite au travers des "Linked Fields", pris par rapport aux "Fields" créés précédemment.

 Pour ma part 2 vues:

  • la vue Année, (Year dans la configuration) associée aux 2 vues Years (pour la liste d'éléments) et Year pour chaque élément

Impôt - read/write

Edit View: impot
List View: impots

 

Linked Fields (Impot)

FieldAdmin BehaviourOrder in list viewsTabOrder in Edit
Name (Key - Required) [name - text] Show in All List Views 1 Details 1
Tranche 1 [tranche1 - revenu] Default 0 Details 2
Tranche 2 [tranche2 - revenu] Default 0 Details 3
Tranche 3 [tranche3 - revenu] Default 0 Details 4
Tranche 4 [tranche4 - revenu] Default 0 Details 5
Taux tranche 1 [taux1 - taux] Default 0 Details 6
Taux tranche 2 [taux2 - taux] Default 0 Details 7
Taux tranche 3 [taux3 - taux] Default 0 Details 8
Taux tranche 4 [taux4 - taux] Default 0 Details 9

 

  • la vue impots, associée aux 2 vues Impôts  (pour la liste d’éléments) et Impôt pour chaque élément

Year - read/write

Edit View: year
List View: years

 

Linked Fields (Annee)

FieldAdmin BehaviourOrder in list viewsTabOrder in Edit
Name (not-required) [name - text] Show in All List Views 1 Details 0
Year [year - sql] Show in All List Views 2 Details 1
Revenu [revenu - revenu] Show in All List Views 3 Details 2
Nombre de parts [nbparts - integer] Show in All List Views 4 Details 3
Déduction [deduction - radio] Show in All List Views 5 Details 4
PEL [pel - revenu] Default 0 Details 6
Dons [dons - revenu] Default 0 Details 7

 

Classes générées par Component Builder

 

Associer les vues au composant

C'est à faire dans l'edition du composant

J'ai coché les cases pour ajouter les liens au "dashboard" et au menu

 

Compiler le composant

 Cela permet de générer un package installable avec tous les sources associés

Aller dans le Menu Component Builder/Compile

 

Installer le composant

cliquer sur le bouton "Install com_jtax xxx"

 

Tester le dashboard

On obtient le "dashboard" suivant:

 

Et si on clique sur year add

 Et si on clique sur Impot add

 

 

Ajouter un bouton à la vue admin

Aller dans la vue admin/onglet Custom Buttons

Le code php sera rajouté au controleur associé.

 

 

Test du bouton Calculer

 

 

 

Gestion des vues pour le site

On doit d'abord créer les "Dynamic Get"

Ajout des Dynamic Get

Pour ma part j'en ai ajouté 2 un pour la liste des Impôts et un pour l'affichage de l'impôt

Pour la liste j'ai séléctionné le type getListQuery.la table Impôt

 

Le principal intérêt est de pouvoir filtrer les modèles non publiés (onglet "Tweak" )

 

Pour la liste j'ai ajouté une jointure pour récupérer le nom de l'année considérée ("year_name") au niveau du modèle

 

 Pour les items "Impôt" j'ai sélectionné le type getItem

 

 

 

Ajout de la vue Site pour les liste d'Impôts

 

 

Ajout d'un code spécifique pour la vue List du site

Le code ajouté est celui-ci (Add/edit Custom code)

<?php $edit = "index.php?option=com_jtax&amp;view=impots&amp;task=impot.edit";?>
<table class="table table-striped">
<?php foreach ($this->items as $i => $item): ?>
  <?php
   $canCheckin = $this->user->authorise(&#039;core.manage&#039;, &#039;com_checkin&#039;) || $item->checked_out == $this->user->id || $item->checked_out == 0;
    $userChkOut = Factory::getContainer()->
      get(\Joomla\CMS\User\UserFactoryInterface::class)->
        loadUserById($item->checked_out ?? 0);
    $canDo = JtaxHelper::getActions(&#039;impot&#039;,$item,&#039;impots&#039;);
  ?>
  <tr class="row<?php echo $i % 2; ?>">
         <td class="hidden-phone">
      <a href="<?php echo $edit; ?>&amp;id=<?php echo $item->id; ?>"><?php echo $this->escape($item->name); ?></a>
    </td>
    <td class="hidden-phone">
      <?php echo $this->escape($item->year_name); ?>
    </td>    
  </tr>
<?php endforeach; ?>
</table>
<div style="display:none;">
<?php echo LayoutHelper::render(&#039;input&#039;, []); ?>
</div>

 

 

Ajout de la vue Site associée à la vue admin

 

A déclarer dans la vue admin

 

Classes générées par la partie site