Drupal 8 模块开发 3.1 : 配置表单和管理

原文地址: https://docs.acquia.com/articles/drupal-8-configuration-forms-and-cm

 

本课介绍”配置表单”和”配置管理(CM)”。

Drupal 8 把 Drupal 7 中的配置信息和函数收集起来用一个独立的系统管理。

 

本课…

  • 学习 CM(配置管理)。
  • 组装 examples/configform_example 模块。
  • 学习配置表单。
  • 探讨构建配置表单。
  • 创建 *.settings.yml,介绍使用 CM 为模块存储配置。

 

配置管理

Drupal 8 配置管理(CM)配置 API 驱动,为模块存储配置数据提供了一个核心位置。

这可以简化类似站点名称等静态数据或者字段定义、图片样式等复杂对象的配置。

这意味着 Drupal 8 核心有了 Drupal 7  Features 模块的功能。

 

Drupal 8 为不同安装环境(例如开发、分期和生产)的配置变化提供了倒入、导出的用户界面。

这样就可以分开配置不同的环境。

 

使用 Configuration inspector  模块,你可以在 Drupal 管理界面直接查看各个配置,而无须在文件系统内查看 YAML 文件。

 

模块开发者可以提交 {module}/config/install 目录内的 YAML 文件,定义配置设定的构成,使用版本控制软件跨多个环境进行发布。

 

也有一个加载配置的上下文系统,使自定义多语言站点更加容易,这个可以通过 schema 文件实现。

 

被 CM 替代的 Drupal 7 函数
CM 替代了 Drupal 早期使用的几个函数。核心思想是这些函数被整合到 CM 系统,统一处理配置数据。

 

配置表单

我们创建 PageExampleForm 时继承了 FormBase,FormBase 是 FormInterface(提供了一个表单的接口) 的一个简单实现。

Drupal 8 提供了另一个核心类 ConfigFormBase,这个类的主要好处是改善了与配置系统的交互。

 

使用 ConfigFormBase 创建模块

现在我们拷贝之前的 page_example,创建一个新模块 configform_example

我们将使 PageExampleForm 类能够存储用户提供的 email 。为了实现这个你必须在 ConfigFormExampleConfigForm.php (位于 configform_example/src/Form/)把 FormBase 替换成 ConfigFormBase 。

use Drupal\Core\Form\ConfigFormBase;
 
class ConfigFormExampleConfigForm extends ConfigFormBase {

这个类需要一个额外的方法 getEditableConfigNames(ConfigFormBase 的抽象方法),我们现在创建。

/**
* {@inheritdoc}.
*/
public function getEditableConfigNames() {
  return ['configform_example.settings'];
}

 

使用 YAML 配置

Drupal 8 中使用配置 API 可以把例如变量或模块提供的配置信息存储在 YAML 文件内。
当模块被激活时,YAML 内的信息会立刻被导入数据库,导入的目的是为了改善性能。

一旦数据库被改变你可以很容易的导出为 YAML 文件,重新部署。

 

当为模块提供配置时,可以通过一个特定的 YAML 文件为配置设定默认值(YAML 文件放置在 config/install 目录内)。

 

我们使用以下代码为 email 地址设置默认值。

configform_example.settings.yml :

email_address: form@examples.com

 

 嵌套字段

如果必要,你可以使用嵌套字段设定复杂些的配置。

address:
  line_1: 123 fake st
  city: Boston
  state: MA
  zip: 55555

这种关联数组的嵌套结构所有 YAML 都类似。多数情况下使用点(.)访问这个嵌套值。

例如本例中会使用 address.line_1 访问 line_1 的值。

注意:
模块只有被安装时才会被导入到数据库,所以如果模块已经被安装了你必须卸载重新安装。

 

表单方法

现在 buildForm() 方法应该象这样:

public function buildForm(array $form, FormStateInterface $form_state) {
  $form = parent::buildForm($form, $form_state);
  $config = $this->config('configform_example.settings');
  $form['email'] = [
    '#type' => 'email',
    '#title' => $this->t('Your .com email address.'),
    '#default_value' => $config->get('email_address')
  ];
  return $form;
}

和 FormBase 不同,ConfigFormBase 实现了 buildForm 方法,向表单数组内追加了一个提交按钮。

所以在我们追加新元素之前可以使用父类实现的内容。

 

You may also like

Leave a Reply

Your email address will not be published. Required fields are marked *