Drupal社区团队 2016-04-01 09:23
Drupal 8 提供了一个 Config 对象 ,通过它可以与配置进行交互。
有些类已经通过依赖注入使它生效,例如 ConfigFormBase 就是通过依赖注入提供了一个 Config 对象。
看下上一节的 configform_example 代码,它使用了父类的 config() 方法返回了 Config 对象,并用 configform_example.settings 填充了配置内容。之后使用 Config 对象的 get() 方法取得 email 地址作为 email 表单元素的默认值。
改变 Config 对象
在这个方法里我们首先返回 Config 对象,然后使用它的 set() 方法把 email_address
改为用户提交的值。
接下来使用 save() 方法保存配置。
最后我们应用父类的提交处理方法,因为它包含把 Drupal 信息显示到屏幕的功能。
public function submitForm(array &$form, FormStateInterface $form_state) {
$config = $this->config('configform_example.settings');
$config->set('email_address', $form_state->getValue('email'));
$config->save();
return parent::submitForm($form, $form_state);
测试这个对象
把上节 ConfigFormExampleConfigForm.php
按以下代码修改,清空缓存测试。
<?php
/**
* @file
* Contains \Drupal\configform_example\Form\ConfigFormExampleConfigForm.
*/
namespace Drupal\configform_example\Form;
use Drupal\Core\Form\ConfigFormBase;
use Drupal\Core\Form\FormStateInterface;
class ConfigFormExampleConfigForm extends ConfigFormBase {
/**
* {@inheritdoc}.
*/
public function getFormId() {
return 'configform_example_form';
}
/**
* {@inheritdoc}.
*/
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;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
if (strpos($form_state->getValue('email'), '.com') === FALSE ) {
$form_state->setErrorByName('email', $this->t('This is not a .com email address.'));
}
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$config = $this->config('configform_example.settings');
$config->set('email_address', $form_state->getValue('email'));
$config->save();
return parent::submitForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
protected function getEditableConfigNames() {
return ['configform_example.settings'];
}
提交一个新的 email,存储在配置内。模块的 configform_example.settings.yml
文件不会变化,但你可以导出configform_example.settings
配置,之后把它导入到其他站点。
使用预先写好的代码
象之前描述的那样,一个实用的方法是使用之前写好的代码作为新工作的起点。可以在第 1 课创建的 page_example 模块基础上修改代码。
Examples project: configform_example.links.menu.yml
configform_example.form:
title: Config Form Example
route_name: configform_example_form
parent: system.admin_reports
为 configform_example 模块进行 YAML 配置
把以下两个配置文件放在 configform_example 模块目录根下。
configform_example.info.yml:
name: Config Form example
type: module
description: 'An example module showing how to define a configuration form to be displayed at a given URL.'
package: Example modules
core: 8.x
configform_example.routing.yml:
configform_example_form:
path: 'examples/configform_example/form'
defaults:
_form: '\Drupal\configform_example\Form\ConfigFormExampleConfigForm'
_title: 'Config Form'
requirements:
_permission: 'access simple page'
配置监测器
drupal.org 上写道“Configuration inspector for Drupal 8 使用了核心内置的配置和模式系统,使你能够监测配置值及模式的使用情况。使开发者能够集中查看所有配置值,并进行多种测试、核实任务。”
安装这个模块后,你会在我们的自定义配置项后面看到“raw data”这个链接,但“列表”、”TREE”、”表单”几项链接没有。为了解决这个你可以为设置增加下模式定义,./config/schema/configform_example.schema.yml
:
configform_example.settings:
type: mapping
label: 'Configform Example settings'
mapping:
email_address:
type: string
label: 'This is the example email address.'
重新安装下 configform_example 模块,再看下上面的几个链接。
译文地址:http://go-peak.net/blog/2016/01/06/d8-buildmodule-3-2/
原文地址:https://docs.acquia.com/articles/drupal-8-configuration-and-config-object