Drupal 8模块开发
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 的值。 注意:
模块只有被安装时才会被导入到数据库,所以如果模块已经被安装了你必须卸载重新安装。
21
Drupal 8模块开发
表单方法
现在 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 方法,向表单数组内追加了一个提交按钮。
所以在我们追加新元素之前可以使用父类实现的内容。
3.2 :配置和 Config 对象
Drupal 8 提供了一个 Config 对象 ,它可以和配置进行交互。
有些类已经通过依赖注入使它生效,例如 ConfigFormBase 就是通过依赖注入提供了一个 Config 对象。
看下上一节的 configform_example 代码,它使用了父类的 config() 方法返回了 Config 对象,并用 configform_example.settings 填充了配置内容。之后使用 Config 对象的 get() 方法取得 email 地址作为 email 表单元素的默认值。
改变 Config 对象
在这个方法里我们首先返回 Config 对象,然后使用它的 set() 方法把 email_address 改为用户提交的值。 接下来使用 save() 方法保存配置。
最后我们应用父类的提交处理方法,因为它包含把 Drupal 信息显示到屏幕的功能。
22
Drupal 8模块开发
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 按以下代码修改,清空缓存测试。 下载文件
* @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'] = [
23
Drupal 8模块开发
'#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 模块基础上修改代码。
24
Drupal 8模块开发
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 模块,再看下上面的几个链接。
25