
与 Drupal 7 不同,在 Drupal 8 中为你的网站创建多个区块实例是一个简单的任务。
在本教程中,你将学习如何以编程方式将区块添加到区块布局界面中。如何在区块中添加(管理)配置表单以及如何处理它。最后,你将了解如何为表单添加和显示默认配置值。
在开始这个分步教程之前,请按照 《准备模块骨架》 的说明准备好模块框架。




现在假设我们希望为站点构建者添加一个功能,使其可以为每个自定义区块实例输入部分配置。请始终记住,在 Drupal 8 中,所有站点构建配置都可以从开发站点导出并导入到生产站点(称为 配置管理)。作为模块开发者,您还可以为表单提供默认配置,以便在站点构建者创建新区块时自动填充。
在上一页已有的 HelloBlock 类中,添加这些 “use” 语句,它们应当紧随现有的 use 语句之后:
use Drupal\Core\Block\BlockPluginInterface; use Drupal\Core\Form\FormStateInterface;
更新类声明,加入新的 “实现 BlockPluginInterface”:
class HelloBlock extends BlockBase implements BlockPluginInterface {
然后将以下方法添加到类中。类似的完整文件在这里,但请注意表单名称和配置名称与本教程不完全一致。


在 HelloBlock 类中添加以下方法。在本例中,它位于文件 src/Plugin/Block/HelloBlock.php
中。但随着你逐渐以更面向对象 (OOP) 的方式思考,它在文件结构中的物理位置并不像命名空间那样重要。作为一个聪明的面向对象程序员,你会让这两者紧密对齐。不过请注意,命名空间通常与模块文件夹名以及我们之前讨论过的模块机器名非常相似,这一点稍后当你需要以编程方式与模块代码交互时会很重要。


为了在区块实例中使用配置,我们可以修改 HelloBlock 类的 build() 方法:
/** * {@inheritdoc} */ public function build() { $config = $this->getConfiguration(); if (!empty($config['hello_block_name'])) { $name = $config['hello_block_name']; } else { $name = $this->t('to no one'); } return [ '#markup' => $this->t('Hello @name!', [ '@name' => $name, ]), ]; }


本教程最初发布在 Web Wash。不过 Berdir 要求我在这里也发布,所以它就在这里了。
在 Drupal 7 中,该模块允许将代码示例/片段存储在一个字段中。它带有一个名为「代码片段字段」的自定义字段,并显示三个表单元素:描述、源代码和语法高亮模式(编程语言)。
但现在是时候将该模块升级到 Drupal 8 了。
在本教程中,我将向你展示如何在 Drupal 8 中创建一个「基础」的自定义字段。我不会深入讲解 PSR–4、注解 或 插件,否则本教程会变得非常庞大。
相反,我会附上其他网站的链接,它们更详细地解释了这些概念。
同时,如果你正在寻找关于 Drupal 8 中 Field API 的详细文档,可以参考以下系列:


在 Drupal 8 中,所有的字段类型、字段小部件和格式化器都是插件。
只要放在正确的目录结构中并使用正确的注解,它们就会被自动发现。
一个同时实现这三种插件的模块目录结构如下:
foo_bar_fields
- foo_bar_fields.info.yml
- src/
- Plugin/
- Field/
- FieldType/
- FooItem.php
- FieldFormatter/
- FooBarFormatter.php
- FieldWidget/
- FooBarWidget.php
- FieldType/
- Field/
- Plugin/
在本教程中,我们将创建一个自定义字段类型、字段格式化器和字段小部件,它会生成一个随机字符串并进行显示。


字段类型定义了字段的属性和行为。字段类型被定义为插件,因此在编写新的字段类型之前,建议先熟悉 插件 API。
在 Drupal 8 中创建字段类型,需要一个带有 FieldType 注解的类。
类的位置 应放在 MODULE_NAME/src/Plugin/Field/FieldType
例如:/modules/foo/src/Plugin/Field/FieldType/BazItem.php
类的命名空间 应该是 Drupal\MODULE_NAME\Plugin\Field\FieldType
<?php namespace Drupal\MODULE_NAME\Plugin\Field\FieldType;
类上的注解必须包含唯一的 ID、标签以及默认的格式化器和小部件。默认的格式化器 ID 应与字段格式化器类注解中定义的 ID 一致。
