logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动
04/10/2025, by Ivan

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

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

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

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

<?php

namespace Drupal\hello_world\Plugin\Block;

use Drupal\Core\Block\BlockBase;

/**
 * 提供一个 “Hello” 区块.
 *
 * @Block(
 *   id = "hello_block",
 *   admin_label = @Translation("Hello block"),
 *   category = @Translation("Hello World"),
 * )
 */
class HelloBlock extends BlockBase {

  /**
   * {@inheritdoc}
   */
  public function build() {
    return [
      '#markup' => $this->t('Hello, World!'),
    ];
  }

}

要添加 “Hello block”,你可以进入 结构 -> 区块布局 (admin/structure/block),并点击与每个可用区域相关联的 “放置区块” 按钮。

当点击某个区域的 “放置区块” 按钮时,会出现一个 “放置区块” 弹出对话框,其中包含所有可用的区块。要快速找到你的区块,只需使用 “按区块名称过滤” 选项,或使用鼠标滚动查找 “Hello block”。这样,你就可以在站点的任意位置添加任意数量的自定义区块实例。

问题排查

  • 类名和文件名必须一致(类 HelloBlock 与 /src/Plugin/Block/HelloBlock.php)。如果类名不同,区块会出现在可用区块列表中,但你无法将其添加。
  • 请务必仔细检查所有路径和文件名。你的 .php 文件必须放置在正确标记的目录中 (/src/Plugin/Block/),否则 Drupal 无法检测到它。
  • 如果你的区块在放置到区域时出现屏幕错误或 watchdog 超时,请检查 PHP/Apache 错误日志。
  • 如果区块未出现在列表中,请务必重建 Drupal 缓存(例如 drush cr)。
  • 确保你的模块命名规范为小写。部分用户报告,如果模块命名使用 camelCase,区块不会显示。例如 myModule 永远不会显示定义的区块,而应命名为 my_module。这在 Drupal 8.8.1 中已被确认。

注意:在自定义区块中使用 Twig 模板

1. 在你的 .module 文件中添加 hook_theme
注意:不要将主题函数命名为 'block__...' - 这样不会向分支模板传递任何变量。相反,你可以使用模块名称作为前缀。

2. 在 build 方法的渲染数组中使用 “#theme”,并在与 “#theme” 同一级别传递变量,如 “#varname”。