(1)、在web/modules/
新建custom
目录,在目录中新建demo_form
文件夹,在文件夹中新建demo_form.info.yml
文件,内容如下:
name: My demo form
type: module
description: 'This is my first demo form.'
package: Custom
core_version_requirement: ^9||^10
name:模块名称
type:类型(module或theme)
description:模块简介
package:在Extend页面的归属分组( package: 项设置为 "Custom"。这样,在 Extend 页面上,这些模块就会被归类到 "Custom" 分类下。这样可以使模块的管理更加有序)
core_version_requirement:指定模块运行的drupal核心版本(^9||^10 是一个 composer 版本约束表达式,它的含义是这个模块、主题或配置文件可以在 Drupal 9 或 Drupal 10 的任何版本上运行。)
(2)、在web/modules/custom/demo_form
下新建src/Form/
目录,在该目录中新建DemoForm.php
文件,文件内容如下:
namespace Drupal\demo_form\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
class DemoForm extends FormBase{
/**
* {@inheritdoc }
*/
public function getFormId()
{
return 'demo_form_form';
}
/**
* {@inheritdoc }
*/
public function buildForm(array $form, FormStateInterface $form_state)
{
$form['title'] = [
'#type' => 'select',
'#title' => $this->t('称呼'),
'#options' => [
'mr' => $this->t('先生'),
'ms' => $this->t('女士'),
'dr' => $this->t('博士')
],
'#default_value' => 'mr'
];
$form['name'] = [
'#type' => 'textfield',
'#title' => $this->t('姓名')
];
$form['age'] = [
'#type' => 'textfield',
'#title' => $this->t('年龄')
];
$form['email'] = [
'#type' => 'email',
'#title' => $this->t('邮箱')
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('提交')
];
return $form;
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->messenger()->addStatus($this->t('你好,@name', ['@name' => $form_state->getValue('name')]));
}
}
getFormId()方法:
用于为特定的表单提供一个唯一的字符串标识符。这个 ID 在整个 Drupal 系统中必须是唯一的,因为它用于区分和跟踪不同的表单。当创建一个新的表单类时,你需要实现 getFormId() 方法并返回一个唯一的字符串作为表单 ID。这个 ID 将用于以下几个地方:
- 在表单构建、验证和提交过程中,Drupal 使用表单 ID 来确定应该调用哪些处理函数。
- 当用户提交表单时,Drupal 使用表单 ID 来检查表单是否已经过期,以及用户是否有权限提交表单。
- 在缓存和存储表单的状态时,Drupal 使用表单 ID 作为 key。
buildForm()方法:
用来定义和构建表单的。可以在这个方法中添加表单元素,定义它们的属性,以及设置默认值等。这个方法接收两个参数:
- $form:这是一个数组,包含了表单的结构和属性。你可以向这个数组中添加新的表单元素,或者修改已有元素的属性。
- $form_state:这是一个 FormStateInterface 对象,包含了表单的当前状态。你可以从这个对象中获取到用户输入的数据,或者设置表单的重定向目标等。
submitForm()方法:
submitForm(array &$form, FormStateInterface $form_state)这是函数的定义,它接受两个参数:$form 和 $form_state。$form 是一个包含表单结构的数组,$form_state 是一个对象,包含了表单的当前状态,包括用户的输入等信息。
$this->messenger()->addStatus(...): 这行代码调用了 Drupal 的消息系统,用于向用户显示一条状态消息。addStatus 函数接受一个参数,这个参数是你想要显示的消息。
$this->t('你好,@name', ['@name' => $form_state->getValue('name')]): 这是 addStatus 函数的参数。$this->t()是 Drupal 的翻译函数,用于翻译字符串。这个函数接受两个参数:要翻译的字符串和替换的参数。在这个例子中,'你好, @namer' 是要翻译的字符串,['@name' => $form_state->getValue('name')] 是替换的参数。@name 会被替换为用户输入的姓名。所以这段代码运行后显示一条状态消息:"你好, {用户输入的姓名}"
(3)、在web/modules/custom/demo_form
下新建demo_form.routing.yml
文件,文件内容如下:
demo_form.form:
path: '/demo_form'
defaults:
_title: 'Demo Form'
_form: '\Drupal\demo_form\Form\DemoForm'
requirements:
_permission: 'access content'
路由配置文件中的配置项说明:
- path: '/demo_form':定义了该路由的 URL 路径。在这个例子中,路径是 /demo_form。当用户访问你的网站的 /demo_form 路径时,Drupal 将使用这个路由的配置。
- defaults:这部分定义了当用户访问这个路径时的默认行为。
- _title:'Demo Form':这是当用户访问这个路径时页面的标题。在这个例子中,标题是 "Demo Form"。
- _form:'\Drupal\demo_form\Form\DemoForm':这是当用户访问这个路径时要加载的表单的类名。在这个例子中,表单类是 \Drupal\demo_form\Form\DemoForm。这个类应该实现了 Drupal 的 FormInterface,包括 getFormId() 和 buildForm() 等方法。
- requirements:这部分定义了用户访问这个路径所需要的权限。
- _permission:'access content':这是用户访问这个路径所需要的权限。在这个例子中,用户需要 "access content" 权限才能访问这个路径。如果用户没有这个权限,他们将看到一个 403 错误页面。
这个配置文件定义了一个新的 URL 路径 /demo_form,当用户访问这个路径时,他们将看到标题为 "Demo Form" 的页面,并加载 \Drupal\demo_form\Form\DemoForm 类作为表单。同时,用户需要 "access content" 权限才能访问这个路径。
(4)、安装模块

访问:xxx.com/demo_form

参照文档:https://www.drupal.org/docs/drupal-apis/form-api