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