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

蒲公英 提交于 周四, 08/17/2017 - 15:25
Drupal8模块开发

原文地址:
https://docs.acquia.com/article/lesson-31-configuration-forms-and-management  

本课介绍"配置表单"和"配置管理(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 方法,向表单数组内追加了一个提交按钮。
所以在我们追加新元素之前可以使用父类实现的内容。