跳转到主要内容

主页内容

Drupal Form API(第一篇:开发一个简单的表单)

由 webadmin 发布于 阅读 37 次

(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 将用于以下几个地方:

  1. 在表单构建、验证和提交过程中,Drupal 使用表单 ID 来确定应该调用哪些处理函数。
  2. 当用户提交表单时,Drupal 使用表单 ID 来检查表单是否已经过期,以及用户是否有权限提交表单。
  3. 在缓存和存储表单的状态时,Drupal 使用表单 ID 作为 key。

buildForm()方法:

    用来定义和构建表单的。可以在这个方法中添加表单元素,定义它们的属性,以及设置默认值等。这个方法接收两个参数:

  1. $form:这是一个数组,包含了表单的结构和属性。你可以向这个数组中添加新的表单元素,或者修改已有元素的属性。
  2. $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'

路由配置文件中的配置项说明:

  1. path: '/demo_form':定义了该路由的 URL 路径。在这个例子中,路径是 /demo_form。当用户访问你的网站的 /demo_form 路径时,Drupal 将使用这个路由的配置。
  2. defaults:这部分定义了当用户访问这个路径时的默认行为。
  3. _title:'Demo Form':这是当用户访问这个路径时页面的标题。在这个例子中,标题是 "Demo Form"。
  4. _form:'\Drupal\demo_form\Form\DemoForm':这是当用户访问这个路径时要加载的表单的类名。在这个例子中,表单类是 \Drupal\demo_form\Form\DemoForm。这个类应该实现了 Drupal 的 FormInterface,包括 getFormId() 和 buildForm() 等方法。
  5. requirements:这部分定义了用户访问这个路径所需要的权限。
  6. _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