3.1 配置表单和管理

本课介绍”配置表单”和”配置管理(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() 方法应该象这样,代码见辅助内容区:

和 FormBase 不同,ConfigFormBase 实现了 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;
}

 

本书共39小节。


评论 (0)