logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动
04/10/2025, by Ivan

与 Drupal 7 不同,在 Drupal 8 中为你的网站创建多个区块实例是一个简单的任务。

在本教程中,你将学习如何以编程方式将区块添加到区块布局界面中。如何在区块中添加(管理)配置表单以及如何处理它。最后,你将了解如何为表单添加和显示默认配置值。

在开始这个分步教程之前,请按照 《准备模块骨架》 的说明准备好模块框架。

04/10/2025, by Ivan

在 Drupal 8 中,区块是区块插件的实例。
Drupal 的 区块管理器 会扫描你的模块,查找包含 注解 @Block 的类。

下面的示例代码使用了 @Block 注解,并包含 “id” 和 “admin_label” 属性,用于定义一个自定义区块。

在之前创建的模块骨架中,新建文件 src/Plugin/Block/HelloBlock.php,并添加以下代码。

要让你的 Drupal 网站识别这个新类,你需要清除缓存。

04/10/2025, by Ivan

现在假设我们希望为站点构建者添加一个功能,使其可以为每个自定义区块实例输入部分配置。请始终记住,在 Drupal 8 中,所有站点构建配置都可以从开发站点导出并导入到生产站点(称为 配置管理)。作为模块开发者,您还可以为表单提供默认配置,以便在站点构建者创建新区块时自动填充。

在上一页已有的 HelloBlock 类中,添加这些 “use” 语句,它们应当紧随现有的 use 语句之后:

use Drupal\Core\Block\BlockPluginInterface;
use Drupal\Core\Form\FormStateInterface;

更新类声明,加入新的 “实现 BlockPluginInterface”:

class HelloBlock extends BlockBase implements BlockPluginInterface {

然后将以下方法添加到类中。类似的完整文件在这里,但请注意表单名称和配置名称与本教程不完全一致。

04/10/2025, by Ivan

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

04/10/2025, by Ivan

为了在区块实例中使用配置,我们可以修改 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,
      ]),
    ];
  }
04/10/2025, by Ivan

本教程最初发布在 Web Wash。不过 Berdir 要求我在这里也发布,所以它就在这里了。

在 Drupal 7 中,该模块允许将代码示例/片段存储在一个字段中。它带有一个名为「代码片段字段」的自定义字段,并显示三个表单元素:描述、源代码和语法高亮模式(编程语言)。

但现在是时候将该模块升级到 Drupal 8 了。

在本教程中,我将向你展示如何在 Drupal 8 中创建一个「基础」的自定义字段。我不会深入讲解 PSR–4注解插件,否则本教程会变得非常庞大。

相反,我会附上其他网站的链接,它们更详细地解释了这些概念。

同时,如果你正在寻找关于 Drupal 8 中 Field API 的详细文档,可以参考以下系列:

04/10/2025, by Ivan

在 Drupal 8 中,所有的字段类型、字段小部件和格式化器都是插件。

只要放在正确的目录结构中并使用正确的注解,它们就会被自动发现。

一个同时实现这三种插件的模块目录结构如下:

foo_bar_fields

  • foo_bar_fields.info.yml
  • src/
    • Plugin/
      • Field/
        • FieldType/
          • FooItem.php
        • FieldFormatter/
          • FooBarFormatter.php
        • FieldWidget/
          • FooBarWidget.php

在本教程中,我们将创建一个自定义字段类型、字段格式化器和字段小部件,它会生成一个随机字符串并进行显示。

04/10/2025, by Ivan

字段类型定义了字段的属性和行为。字段类型被定义为插件,因此在编写新的字段类型之前,建议先熟悉 插件 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 一致。