滚动
在 Drupal 模块中以编程方式创建区块
在 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”。