經過一番研究,我發現 #group 屬性可以用來替代傳統的嵌套方式,將子元素分配到父容器或字段集中。這個特性大約在 7 年前被引入到 Drupal 核心中(相關討論:Drupal Issue #1856178),但遺憾的是,它并未被官方文檔詳細記錄。
以下是一個使用 #group 屬性的示例代碼:
$form['fieldset_new'] = [
'#type' => 'fieldset',
'#title' => $this->t('fieldset'),
];
$form['message'] = [
'#type' => 'textarea',
'#title' => $this->t('message'),
'#required' => TRUE,
'#group' => "fieldset_new",
];
對于那些熟悉傳統嵌套方法的開發者來說,以下是經典的代碼實現方式:
$form['fieldset_classic'] = [
'#type' => 'fieldset',
'#title' => $this->t('fieldset'),
];
$form['fieldset_classic']['message'] = [
'#type' => 'textarea',
'#title' => $this->t('message Nested'),
'#required' => TRUE,
];
從功能上看,這兩段代碼生成的 HTML 標記幾乎完全相同。主要的區別在于開發者的使用體驗:#group 方法使代碼在長期項目中更具可維護性和可預測性。
使用 #group 屬性有以下幾個顯著優點:
form_alter 鉤子出現意外問題。如果某些 form_alter 鉤子依賴于特定的表單層次結構,那么對其進行修改可能會引發嚴重的兼容性問題。而采用扁平結構和 #group 方法可以有效避免這些問題。盡管 #group 方法有諸多優點,但它也存在一些缺點:
無論是傳統的嵌套方法還是 #group 方法,它們都可以滿足開發需求。然而,經過深入分析,我認為 #group 方法在長期項目中更具優勢,能夠幫助開發者編寫更加健壯的代碼。
希望通過這篇文章,能夠讓更多人了解 Drupal Form API 中的 #group 屬性,減少未被發現的功能盲區。
Drupal 8 表單 API 中的 #group 屬性詳解 | ZANZARRA
原文鏈接: https://zanzarra.com/blog/group-attribute-drupal-8-form-api-explained