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;
}