Heritage de classe

De Wiki.

Principes

L'héritage de classe DAO consiste à étendre une table de la BDD avec une autre.

Dans la pratique, cela permet de rajouter des champs à une table d'origine sans la modifier car les champs sont situés dans une autre table.

Généralement, la table d'origine (dite "table héritée") est une table du CMS ou d'un module greffé au CMS, et la table dite héritante est une table métier créée pour les besoins du projet.

Les avantages sont :

  • Pas de modifications du fonctionnement d'origine du module ou de la fonctionnalité du CMS.
  • L'héritage est transparent côté CMS comme côté métier, il suffit de continuer à travailler en instanciant la classe héritée.
  • Toutes les champs (hérités + héritants) sont disponibles dans une même fiche correspondant à l'enregistrement de la table héritée.


Fonctionnement

Techniquement, les enregistrements liés dans la table héritée et la table héritante auront la même valeur d'ID.

Une fois instanciée la classe héritée, celle-ci dispose des getters et setters permettant de manipuler les valeurs de la table héritante.

La table héritante n'a alors plus aucune raison d'être instanciée.


Mise en place

Pour mettre en place l'héritage, il suffit de déclarer dans le XML de la classe héritante qu'elle hérite d'une autre classe :

 <?xml version="1.0" encoding="ISO-8859-1" ?>
 <class name="ma_classe_heritante" prefix="mon_prefix" inherits_from="ma_classe_héritée">
 ...
 </class>

Les attributs libelle, display et abstract n'ont plus d'utilité dans une situation d'héritage.

Lors de la génération de la classe héritante, la classe héritée va être regénérée elle aussi, et sa version altérée sera stockée dans la zone des classes métier (/includes/bo/class). Dans le cadre du projet, la version altérée sera alors préférée à la version d'origine.

Un item décrivant un champ de la table héritante peut être placé précisément parmi les items du XML de la table héritée au moyen d'un attribut inherit_position déclarant le champ après lequel il s'insèrera :

 <item name="champ_héritant" ... inherit_position="champ_hérité" />

Le rendu de la fiche et du formulaire en back-office peut ainsi être optimisé.

Si l'attribut inherit_position n'est pas déclaré ou si le champ fourni est incorrect, l'item en question sera rangé en fin de liste dans le XML de la table héritée.