Champs personnalises
Extrafields
Extrafields permet d’ajouter d’autres données au schéma de base de données standard Dolibarr. Introduits dans la version 3.2, les extrafields sont maintenant implémentés dans la plupart des objets métier:
- Tiers et contacts
- Utilisateurs
- Événements
- Proposition
- Factures Clients
- Ordres
- Proposition du fournisseur
- Factures fournisseurs
- Commandes de fournisseurs
- Produits
- Membre & type de membre
- Projets et tâches du projet (depuis 3.4)
- Les catégories
- Rapport de dépenses
Mise en œuvre technique
Chaque objet a sa table dans la base de données pour stocker les valeurs de extrafields.
Modèles de tables extrafield de Datatables
llx_BaseTableNAme_extrafields rowid integer AUTO_INCREMENT PRIMARY KEY, tms timestamp, fk_object integer NOT NULL, import_key varchar(14)
Un exemple de fichier de définition mysql pour l'implémentation extrafields sur un objet:
créer la table llx_place_room_extrafields ( rowid integer AUTO_INCREMENT PRIMARY KEY, tms timestamp, fk_object integer NOT NULL, import_key varchar(14) -- import key ) ENGINE=innodb;
Classe de chargement des extrafields
Pour utiliser extrafields, toutes les pages doivent inclure
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
Charger un tableau extrafield dans un objet
$extrafields = new ExtraFields($db);
$extralabels=$extrafields->fetch_name_optionals_label($object->table_element);
$ extralabels sera un tableau avec le code et l’étiquette des extrafields. Ce code doit être placé dans la classe par exemple dans la fonction "write_file".
Charger extrafield dans l'objet
Les extra-champs sont chargés dans le tableau $object->array_options.
$object->fetch($rowid);
$object->fetch_optionals($rowid,$extralabels);
Ce code doit être placé juste après ce qui précède.
Afficher la valeur extrafield en PDF ou HTML
Après chargement extrafields
Exemple HTML
print $object->array_options ['options_XXX'];
Où XXX est le code des extrafields
Exemple PDF
$pdf->MultiCell (0,5, $outputlangs->convToOutputCharset($object->array_options ['options_XXX']),0,'L'); )
Où XXX est le code des extrafields
Afficher la valeur supplémentaire des lignes en PDF ou HTML
Après chargement extrafields
Exemple HTML
print $object->lines[$i]->array_options['options_XXX'];
Où XXX est le code des extrafields
Exemple PDF
$pdf->MultiCell (0,5, $outputlangs->convToOutputCharset($object->lines[$i]->array_options['options_XXX']),0,'L');
Où XXX est le code des extrafields
Avant l'appel $object->create() ou $object->update()
Les valeurs des extrafields envoyées par formulaire doivent être récupérées. Pour ce faire, utilisez cette méthode:
$ret = $extrafields->setOptionalsFromPost($extralabels,$object);
Dans la page d'édition pour afficher des champs supplémentaires
$reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
if (empty($reshook) && ! empty($extrafields->attribute_label))
{
print $object->showOptionals($extrafields,'edit');
}
Dans une page pour afficher des champs supplémentaires
$reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
if (empty($reshook) && ! empty($extrafields->attribute_label))
{
print $object->showOptionals($extrafields);
}
Après la méthode de récupération de cette classe d'objet
require_once(DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php');
$extrafields=new ExtraFields($this->db);
$extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true);
if (count($extralabels)>0) {
$this->fetch_optionals($this->id,$extralabels);
}
Après la méthode Update de cette classe d'objet :
// Actions sur des champs supplémentaires (par module externe ou code standard)
// FIXME le hook fait double emploi avec le trigger !!
$hookmanager->initHooks(array('HookModuleNamedao'));
$parameters=array('socid'=>$this->id);
$reshook=$hookmanager->executeHooks('insertExtraFields',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks
if (empty($reshook))
{
if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used
{
$result=$this->insertExtraFields();
if ($result < 0)
{
$error++;
}
}
}
else if ($reshook < 0) $error++;
Après la méthode supprimer de cette classe d'objet
// Suppression d'extrafields
if (! $error)
{
if (empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) // For avoid conflicts if trigger used
{
$result=$this->deleteExtraFields();
if ($result < 0)
{
$error++;
dol_syslog(get_class($this)."::delete erreur ".$errorflag." ".$this->error, LOG_ERR);
}
}
}
Pages d'administration
$elementtype='facture'; // Doit être l'élément $table_element de la classe qui gère extrafield
Réparation de Base de données
Rechercher et trouver la définition de $listofmodulesextra ajouter la nouvelle déclaration extrafield
$listofmodulesextra=array('societe'=>'societe','adherent'=>'adherent','product'=>'product',
'socpeople'=>'socpeople', 'commande'=>'commande', 'facture'=>'facture',
'commande_fournisseur'=>'commande_fournisseur', 'actioncomm'=>'actioncomm',
'adherent_type'=>'adherent_type','user'=>'user','projet'=>'projet', 'projet_task'=>'projet_task');
Comment changer les étiquettes des colonnes lors de l'utilisation de modèles (propals, etc.)
Dans le code PHP du modèle, vous pouvez changer les étiquettes de votre extrafield en changeant la fonction "_tableau (...)"
Vidéos sur le sujet