雲客Drupal原始碼分析之欄位API(中)

2021-08-09 13:57:25 字數 3829 閱讀 5242

欄位api的核心為字段物件、字段控制項、字段格式化器,在上節中已經強調了字段物件中的字段含義不等於資料庫層面的字段(資料表中的列),她是更高一級的抽象,字段物件是乙個列表型的型別化資料物件,附屬到實體物件作為屬性,列表中的每乙個條目是乙個復合型別的型別化資料物件,可以叫做字段條目物件,字段物件是列表物件決定著字段可以是多值的,這也就是為什麼我們在管理後台字段管理中可以設定數量限制的原因,字段條目物件是乙個復合型別的型別化資料物件,那麼她可以有多個屬性,這些屬性被定義在字段條目物件的schema方法中(在其返回陣列的columns鍵中指定),這也就是為什麼有些字段物件可以儲存多個資料的原因,典型的是系統中的body欄位,她包括正文、摘要、格式三個屬性,這些屬性中有乙個做為字段物件的主屬性,對應的就是復合資料定義物件中的getmainpropertyname()方法返回的名字。通過以上的介紹在腦海中你需要記住兩個概念:多值字段、多屬性字段,在資料庫的儲存層面,可以多個字段物件共存於一張表中,這樣的表叫做共享表,也可以乙個字段一張表,這樣的表叫做字段專用表;在表中乙個字段物件可以占有多個列以分別儲存她的屬性資料,事實上我們在管理後台定義的字段都是儲存在專用表中,乙個字段一張資料表,關於如何儲存將在實體儲存處理器中詳細解釋。字段物件的基礎實現如下:

字段物件是型別化api資料結構中的列表資料物件,它的預設實現為:

drupal\core\field\fielditemlist

(介面:drupal\core\field\fielditemlistinte***ce)

其定義物件為:

drupal\core\field\basefielddefinition

(介面:drupal\core\field\fielddefinitioninte***ce)

列表中的元素是乙個復合資料物件,預設實現為:

drupal\core\field\fielditembase

(它是抽象基類,提供給各欄位外掛程式繼承,其介面:\drupal\core\field\fielditeminte***ce)

其定義物件為:

drupal\core\field\typeddata\fielditemdatadefinition

(介面:drupal\core\typeddata\complexdatadefinitioninte***ce,注意這裡直接實現了復合資料定義介面)

字段物件的核心內容就是圍繞以上幾個類展開,各型別字段物件以外掛程式方式提供,它們大多繼承自:

drupal\core\field\fielditembase

為了管理這些外掛程式系統提供了字段型別外掛程式管理器,見下:

字段型別外掛程式管理器:

容器服務id:plugin.manager.field.field_type

獲取方式:\drupal::service('plugin.manager.field.field_type')

外掛程式定義快取位置:快取表cache_discovery 的field_types_plugins條目

外掛程式儲存位置:plugin/field/fieldtype

修改鉤子名:field_info

字段型別類需要實現的介面:drupal\core\field\fielditeminte***ce

字段型別外掛程式用到了外掛程式分類功能,因此該外掛程式管理器實現了以下介面:

drupal\component\plugin\categorizingpluginmanagerinte***ce

系統提供以下特徵以實現該分類介面:

drupal\core\plugin\categorizingpluginmanagertrait;

關於外掛程式分類詳見本系列的外掛程式主題下節,內容比較簡單

字段型別外掛程式同時作為一種型別化資料外掛程式,因此在型別化外掛程式管理器中通過外掛程式派生(衍生)plugin derivatives機制將字段型別外掛程式對映到了型別化外掛程式,但需要注意在型別化外掛程式管理器中的外掛程式id為:

「field_item:」 + 字段型別外掛程式管理器中型別id

也就是"field_item:field_type"形式,不要搞混淆了,外掛程式派生詳見本系列的外掛程式主題中節。

字段型別自定義:

字段控制項field widget:

字段控制項用於處理字段資訊輸入時,表單中如何顯示這個字段,乙個欄位在表單中顯示時,往往可以有多於乙個的方法,比如儲存某選擇項的字段可以是下拉列表、單選框、核取方塊等等,參見管理後台某內容型別的「管理表單顯示」(如:/admin/structure/types/manage/article/form-display),為此系統提供字段控制項來處理該工作,字段控制項以外掛程式方式提供,並提供了字段控制項管理器。

字段控制項外掛程式管理器:

容器服務id:plugin.manager.field.widget

獲取方式:\drupal::service('plugin.manager.field.widget')

外掛程式定義快取位置:快取表cache_discovery 的field_widget_types_plugins條目

外掛程式儲存位置:plugin/field/fieldwidget

修改鉤子名:field_widget_info

字段輸入控制項類需要實現的介面:drupal\core\field\widgetinte***ce

字段格式化器field formatter:

在實體顯示時,附加在上面的每個字段往往可以有多於一種的方式進行顯示,參見管理後台某內容型別的「管理顯示」(如:/admin/structure/types/manage/article/display),字段格式化器就是用於處理字段如何顯示的,它和字段控制項類似,也是以外掛程式方式提供,並提供字段格式化器外掛程式管理器進行管理。

字段格式化器外掛程式管理器:

容器服務id:plugin.manager.field.formatter

獲取方式:\drupal::service('plugin.manager.field.formatter')

外掛程式定義快取位置:快取表cache_discovery 的field_formatter_types_plugins條目

外掛程式儲存位置:plugin/field/fieldformatter

修改鉤子名:field_formatter_info

字段輸入控制項類需要實現的介面:drupal\core\field\formatterinte***ce

字段配置物件:

不是有欄位定義物件麼?事實上字段配置物件介面就繼承了字段定義物件介面,新增了set、add方法,為了解決儲存問題同時還繼承了配置實體介面(見本系列的配置實體主題),其介面如下:

drupal\core\field\fieldconfiginte***ce

系統實現了可選繼承的基類:

drupal\core\field\fieldconfigbase

字段事件處理:

為響應字段定義的crud操作,需要建立偵聽器物件,其介面為:

drupal\core\field\fielddefinitionlistenerinte***ce

預設實現:drupal\core\field\fielddefinitionlistener

drupal\core\field\fieldstoragedefinitionlistenerinte***ce

預設實現:drupal\core\field\fieldstoragedefinitionlistener

此外系統提供了事件物件,事件處理機制請檢視本系列的事件派發器主題。

(中節完,下節將介紹餘下知識,並在相關模組中繼續介紹欄位api)

作者語:

原始碼分析之LayoutInflater

簡介 inflate填充的過程 viewstub,merge,include的載入過程 layoutinflater系統服務的註冊過程 systemserviceregistry類有個靜態 塊,完成了常用服務的註冊,如下 static 註冊am registerservice context.act...

原始碼分析之HashMap

首先hashmap繼承了abstractmap,並且實現了map cloneable和serializable三個介面。cloneable和serializable是比較常規的兩個介面,在這裡並不作為重點。重點將會放在abstractmap和map兩個規範上。其中abstractmap是乙個抽象類,...

原始碼分析之String

先看屬性 底層是char陣列,一目了然 可以看到,value是儲存string的內容的,即當使用string str abc 的時候,本質上,abc 是儲存在乙個char型別的陣列中的。string底層的儲存結構是乙個字元型別的陣列,同樣也是被final修飾,因此一旦這個字元陣列被建立後,value...