原文地址:
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 系统,统一处理配置数据。
- variable_set()
- variable_get()
- variable_del()
- hook_update_N()
- drush features-update
- ctools_export_object()
- ctools_export_load_object()
- $conf[...];
配置表单
我们创建 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 方法,向表单数组内追加了一个提交按钮。
所以在我们追加新元素之前可以使用父类实现的内容。