[技術筆記] 學著用 Drupal API 找出 form_id

Jiajun Xu 發表於 三, 08/07/2019 - 02:08

最近的 Drupal 專案需要變動 UI,我原本非常排斥學習 module 開發,但現在不得不硬著頭皮上了。以下筆記:

什麼是 Drupal API

最近剛好看到討論 API 的好文,例如這篇。API 的定義就如同 Wikipedia 所說的:

其主要目的是讓應用程式開發人員得以呼叫一組常式功能,而無須考慮其底層的原始碼為何、或理解其內部工作機制的細節。API本身是抽象的,它僅定義了一個介面,而不涉及應用程式在實際實現過程中的具體操作。

Drupal 提供給開發者一大堆的、眼花撩亂的 API,靠著呼叫這些 API,讓開發者可以省力地寫出符合規範的程式。詳見 Drupal Documentation

找出form_id

要調整表單(form)的行為,我們會使用 Form API,但通常都需要知道form_id才有辦法運行 method 或 hook。而我們要怎麼找出form_id呢?

最簡單的方法是,直接看那個<form>元素的id屬性,例如內容類型為article的編輯表單,其idnode-article-form,它的form_id就是 node_article_form。這方法「通常」不會有錯,但如果遇到其他 modules 產生的表單時,也許命名方式會不一樣,所以網路上一般不會特別建議用這招。

比較常見的方法是:自製 module,並使用hook_form_alter。(是說自從有了 Drupal Console,自製 module 真的很簡單,可參考聖誕老人的教學

以下提供兩種作法:

※ 直接把form_id輸出成系統訊息:

  • Code:
/**
** Implements hook_form_alter().
**/
use Drupal\Core\Form\FormStateInterface;
function webform_chshb_form_alter(&$form, &$form_state, $form_id) {
        drupal_set_message($form_id);
}
  • 結果:

drupal


※ 啟用 Devel 模組底下的 Kint 子模組,再使用ksm()

DevelKint 是 Drupal 底下很知名的 debug 工具,不過就我極~粗淺的認識,kint()好像比較多是放在 themes 或 templates 裡面的,例如這篇,但沒辦法列出form_id

後來看到這篇,才知道可以用ksm()列出來。

  • Code:
/**
** Implements hook_form_alter().
**/
use Drupal\Core\Form\FormStateInterface;
function webform_chshb_form_alter(&$form, &$form_state, $form_id) {
        ksm($form_id);
}
  • 成果:

drupal

標籤 (Tags)