附加字段

From Dolibarr ERP CRM Wiki
Jump to navigation Jump to search


附加字段

附加字段允许将其他数据添加到Dolibarr标准数据库模式中。在第3.2版中介绍了,在大多数业务对象中实现了附加字段:

  • Thirdparties & contacts
  • Users
  • Events
  • Proposal
  • Customer Invoices
  • Orders
  • Supplier Proposal
  • Supplier Invoices
  • Supplier Orders
  • Products & services
  • Member & member type
  • Projects & project tasks (since 3.4)
  • Categories
  • Expense Report

技术实现

每个对象在数据库中都有它的表来存储附加字段的值。

数据表附加字段表模块

 llx_BaseTableNAme_extrafields
 rowid                     integer AUTO_INCREMENT PRIMARY KEY,
 tms                       timestamp,
 fk_object                 integer NOT NULL,
 import_key                varchar(14)


创建一个MySQL表实例,用于实现对象上的附加字段:

 create 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;

加载附加字段类

使用附加字段需要包括

require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';

加载附加字段数组于对象

$extrafields = new ExtraFields($db);
$extralabels=$extrafields->fetch_name_optionals_label($object->table_element);

$extralabels 将是带代码和附加字段标签的数组。

这个代码必须被放置到类中,例如进入函数"write_file"。

对象加载附加字段

附加字段的加载,使用 $object->array_options 数组。

$object->fetch($rowid);
$object->fetch_optionals($rowid,$extralabels);

这个代码必须放在上面的后面。

显示附加字段于 PDF 或 HTML

加载附加字段后

HTML 示例

print $object->array_options ['options_XXX'];

此处 XXX 为附加字段代码

PDF 示例

$pdf->MultiCell (0,5, $outputlangs->convToOutputCharset($object->array_options ['options_XXX']),0,'L'); )

此处 XXX 为附加字段代码

显示附加字段列表于 PDF or HTML

加载附加字段后

HTML 示例

print $object->lines[$i]->array_options['options_XXX'];

此处 XXX 为附加字段代码

PDF 示例

$pdf->MultiCell (0,5, $outputlangs->convToOutputCharset($object->lines[$i]->array_options['options_XXX']),0,'L');

此处 XXX 为附加字段代码


调用 $object->create() 或 $object->update()之前

表单发送的附加字段的值需要取回。为此,使用此方法:

$ret = $extrafields->setOptionalsFromPost($extralabels,$object);

内部编辑页面显示附加字段

$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');
}

内部显示页面显示附加字段

$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);
}

对象类的 fetch 方法之后

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);
}

对象类的Update方法之后

// Actions on extra fields (by external module or standard code)
// 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++;

对象类的delete方法之后

// Removed 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);
      }
   }
}

管理页

$elementtype='facture'; //Must be the $table_element of the class that manage extrafield

修复数据库

Search and find definition of $listofmodulesextra add the new extrafield declaration

$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');

如何在使用模型时更改列的标签 (propals, etc.)

在该模型的PHP代码中,您可以通过"_tableau(...)"的函数来更改附加字段的标签。