雲客Drupal源碼分析之實體表單entity form

以下內容僅是一個預覽,完整內容請見文尾:

實體表單用於提供實體的用戶交互,如:創建、編輯、刪除等,她建立在表單組件基礎之上,提供了對實體的特定支持,在閱讀本篇前,請務必先閱讀本系列表單相關主題。

實體表單操作的是實體,一切圍繞實體對象,當刪除、編輯實體時,會使用實體儲存處理器加載實體,在新建操作時會新建一個實體,實體本身具備CURD方法,在表單中重點處理內容是各階段如何得到實體對象,派發鉤子、調用驗證、表單控件、如何傳遞值等等

實體表單設置:
在實體定義中,表單被視爲一種實體處理器,因此要運用表單的實體,需要在實體定義時進行處理器設置(或者通過實體定義修改鉤子設置),在釋文的handlers根鍵下指定form子鍵,其下一級鍵名是實體的表單操作名,提供對實體某一方面或某一顯示模式下的操作,常用的如:add、edit、delete、cancel,操作名不強制爲特定字符,但通常按照最佳實踐命名,默認或多合一功能的表單可以使用名字:default,還可以指定有特殊功能的表單,如:register,操作名也作爲表單顯示模式名(詳見本系列顯示模式主題),她對應的鍵值是完全限定名字空間類名或容器服務id,在內部該值傳遞給類解析服務(id:class_resolver)的getInstanceFromDefinition方法去實例化成一個對象,該對象將被當做表單對象使用。

實體表單路由:
爲普通的表單定義路由時可以使用“_form”來代替“_controller”以指定一個表單類或服務id,類似,實體表單可以使用“_entity_form”來指定一個實體表單,不過其值不是一個表單類或服務id,而是如下格式:
“實體類型ID.表單操作名”,如“block.delete”
可以僅指定“實體類型ID”,此時相當於指定爲:“實體類型ID .default” ,表單操作名和表單模式名的區別與聯繫請見本系列表單顯示,注意這裏並沒有涉及bundle,因爲bundle信息可以在實體對象上獲取,不管是創建表單還是其他操作的表單,都必有一個實體對象,其必保存着bundle信息,如節點實體的創建表單建立過程如下:

  public function add(NodeTypeInterface $node_type) {
    $node = $this->entityManager()->getStorage('node')->create([
      'type' => $node_type->id(),
    ]);
    $form = $this->entityFormBuilder()->getForm($node);
    return $form;
  }

關於指定實體對象的bundle信息也見下文的實體表單對象的getEntityFromRouteMatch方法
以“_entity_form”方式指定的路由會在實體路由增強器(服務id:route_enhancer.entity)中被處理,補充設置控制器爲:
'controller.entity_form:getContentResult'
也就是方法:\Drupal\Core\Entity\HtmlEntityFormController:: getContentResult
在該控制器內部由實體類型管理器的getFormObject 方法來實例化實體表單對象(見下),然後通過實體表單對象的getEntityFromRouteMatch方法來取得實體對象並注入到實體表單對象中,然後初始化一個表單狀態對象,再調用表單構建器的構建表單方法($formBuilder->buildForm ($form_object, $form_state);)開始執行,這意味着實體表單的處理和普通表單處理在邏輯上無異,都使用表單構建器,返回的結果作爲頁面主內容。

實體表單構建器:
在控制器中針對普通表單的使用,系統提供了表單構建器作爲表單系統的入口以統一使用,類似,針對實體表單,系統提供了實體表單構建器作爲實體表單系...

完整目錄如下:
實體表單設置
實體表單路由
實體表單構建器
被實體表單操作的實體對象來源
實體表單對象
實體表單基類
實體表單基類使用示例
內容實體表單基類
內容實體表單基類使用示例
確認表單
實體刪除表單
補充

 

各位《雲客drupal源碼分析》系列的讀者:
本系列分享希望幫助大家理解drupal底層原理,並縮短學習時間,但部分重點內容在博客僅發佈前言和目錄,這是因爲:drupal在國外如此流行但在國內卻很小衆,一個重要原因應該是中文資料的缺乏,我們是否能夠找到一種方式來激發高質量的中文資料出產?此時同是積極推動者的晴空提出能否用付費閱讀的方式來鼓勵更多教程作者?並建立了一個付費閱讀drupal資料的網站,學習者僅需支付很少費用即可查詢到最用心的知識註解,避免大量查找資料,可以節省大量學習時間是划算的,作者也能分配精力去開發高質量內容而得到回報,drupal是精品中的精品,超過一半的世界五百強用她做網站,難能可貴,國內普及初期需要一個良好的土壤,普及開後免費內容會越來越多,爲了支持國內發展,雲客決定將重點內容放在晴空的這個網站上收費閱讀,讀者只需要微信支付很少費用即可,雲客在這裏承諾該系列得到的所有訂閱費用全部捐獻給drupal深圳社區,用以組織活動等等,發展社區需要大家貢獻力量,該網站於2017年3月29日上線,請移步:http://nowicode.com/ 閱讀本篇完整版

我是雲客,【雲遊天下,做客四方】,聯繫方式見主頁,歡迎轉載,但須註明出處

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章