drupal8模块开发(5)

2025-06-25

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


drupal8模块开发(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:公司股权转让后原债务由原股东负责案例

相关阅读
本类排行
× 游客快捷下载通道(下载后可以自由复制和排版)

下载本文档需要支付 7

支付方式:

开通VIP包月会员 特价:29元/月

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219