附加欄位

From Dolibarr ERP CRM Wiki
Jump to navigation Jump to search


附加欄位

附加欄位允許您向標準Dolibarr資料庫模式中添加更多數據。自版本3.2開始引入,附加欄位現在在大多數業務對象中得以實現:

  • 合作方 & 聯繫人
  • 用戶
  • 事件
  • 報價單
  • 客戶發票
  • 訂單
  • 供應商報價單
  • 供應商發票
  • 供應商訂單
  • 產品 & 服務
  • 會員 & 會員類型
  • 項目 & 項目任務 (自 3.4 起)
  • 類別
  • 費用報銷單

技術實現方式

每個對象在資料庫中都有一個表用於存儲ExtraFields的值。

數據表的附加欄位表的模板

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


用於在對象上實現 ExtraFields 的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;

加載ExtraFields類

要使用ExtraFields,所有頁面必須包括:

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

加載對象的ExtraField數組

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

$extralabels 將是一個包含擴展欄位的code和label的數組。此代碼必須放在類中,例如放在「write_file」函數中。

加載對象的ExtraField值

把ExtraFields加載到數組 $object->array_options 中。

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

此代碼應放在上述代碼之後。

以PDF或HTML格式顯示ExtraField值

加載ExtraFields後

HTML示例

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

此處 XXX 是extrafields代碼

PDF示例

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

此處 XXX 是extrafields代碼

以PDF或HTML格式顯示行的ExtraField值

加載ExtraFields後

HTML示例

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

此處 XXX 是extrafields代碼

PDF示例

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

此處 XXX 是extrafields代碼

如何在使用模板(propals等)時更改列的標籤

在模板的PHP代碼中,您可以通過修改名為「_tableau(...)」的函數來更改擴展欄位的標籤。

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

必須檢索表單發送的extrafields值。為此,請使用以下方法:

$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

恢復資料庫

搜索並查找$listofmodulesextra的定義添加新的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');

相關視頻

Extrafields: (法語配音,但有字幕,並以法語校閱)