logo

Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll
02/09/2025, by Ivan

使用 JSON:API 进行 CRUD 操作的身份验证

在与 JSON:API 交互时,可使用 Postman 或 cURL 等工具发送请求。默认情况下,这些请求会被视为来自“匿名用户”,因为这些工具本身并不处理身份认证。因此,根据你在 Drupal 站点中为匿名用户配置的权限,可能无法访问某些资源。

但如果你的目标是通过 JSON:API 执行创建、更新或删除(CRUD)操作,仅依赖匿名访问是远远不够的。这些操作需要经过身份验证的访问。Drupal 支持多种身份验证方式,可通过核心或贡献模块启用。

最常用的一种方式是 HTTP Basic Authentication,它包含在 Drupal 核心中。对于更高级的用例,也可以使用 Drupal REST & JSON API Authentication 模块,它提供了更强大的身份验证功能和自定义选项,便于你根据应用需求调整安全模型。

进行认证请求的步骤

02/09/2025, by Ivan

我们经常会遇到 500 错误页面,尤其当 Drupal、服务或其他站点不可用时。出现 500(或 501-504)错误页面时,Drupal 会通过异常(Exceptions)来处理关键代码错误。例如在向其他网站发起 HTTP 请求时发生错误,Drupal 会显示类似如下的错误信息:“网站遇到意外错误,请稍后再试”:

Drupal 默认 500 错误页面
Drupal 默认 500 错误页面

在你的网站上出现 WSOD(白屏死机)并不好,因此我们来优化这个页面,改为展示一个有样式的 HTML 页面。

02/09/2025, by Ivan

有时你需要在站点上设置固定的、永久性的分类(Categories),这些分类不应被意外修改。在这种情况下,你可以利用自定义代码和事件订阅器(Event Subscriber)来实现。

我们将在自定义模块中添加一个新的 Event Subscriber 类。

drupalbook_custom.services.yml

services:  
  drupalbook_custom.tag_redirect_subscriber:
    class: Drupal\drupalbook_custom\EventSubscriber\TagRedirectSubscriber
    arguments:
      - '@entity_type.manager'
      - '@current_user'
    tags:
      - { name: event_subscriber }

然后在 drupalbook_custom/src/EventSubscriber/TagRedirectSubscriber 中添加我们的事件订阅器类:

02/09/2025, by Ivan

PHP 8 引入了 构造函数属性提升(constructor property promotion)功能,它通过允许你在构造函数签名中声明和初始化属性,从而简化了类属性的定义与赋值过程。本教程演示了如何在 Drupal 自定义模块中使用构造函数属性提升(需要 PHP 8.0 及以上),特别是用于简化服务和控制器中的依赖注入。我们将对比传统的 Drupal 模式(用于 PHP 7 和早期的 Drupal 9)与现代的 PHP 8+ 方法,分别提供完整代码示例。最终,你将看到这种现代语法如何减少样板代码,使代码更清晰,并符合当前最佳实践。

Drupal 10(需要 PHP 8.1+)核心已经开始采用这些现代 PHP 特性,因此鼓励自定义模块开发者也这样做。我们先来回顾 Drupal 中传统的依赖注入模式,然后使用构造函数属性提升进行重构。

Drupal 中的传统依赖注入方式(PHP 8 之前)

在 Drupal 的服务和控制器中,传统依赖注入模式包括三个步骤:

02/09/2025, by Ivan

EPT 模块允许你在自定义主题中覆盖模板。

现在新增了带有 --custom 后缀的主题建议,因此你可以在自定义主题中覆盖模板:

block--block-content--ebt-accordion--custom.html.twig
block--block-content--ebt-accordion.html.twig
paragraph--ept-accordion--default--custom.html.twig
paragraph--ept-accordion--custom.html.twig
paragraph--ept-accordion--default.html.twig

只需从所需的 EPT 模板中复制现有模板代码,并将其以 --custom.html.twig 后缀命名放入你的自定义主题中即可。

02/09/2025, by Ivan

EPT 模块允许你在自定义主题中覆盖模板。

系统新增了带有 --custom 后缀的主题建议,因此你可以在自定义主题中覆盖模板:

block--block-content--ebt-accordion--custom.html.twig
block--block-content--ebt-accordion.html.twig
paragraph--ept-accordion--default--custom.html.twig
paragraph--ept-accordion--custom.html.twig
paragraph--ept-accordion--default.html.twig

只需将所需 EPT 模板中的现有模板代码复制到你的自定义主题中,并添加 --custom.html.twig 后缀即可。

02/09/2025, by Ivan

创建新的 EPT 设置表单类

我从许多程序员那里听到对 EPT 模块设置数量的担忧:DOM 盒(DOM Box)、背景、边框、类等。这些程序员认为内容编辑可能会被这些设置搞糊涂,或者在另一种情况下被“鼓励”去做出截然不同的段落、边距、背景。一些项目需要为内容编辑提供灵活性和更多设置,但也有一些项目拥有非常严格的组件式故事手册。针对这种情况,我们需要改变我们的 EPT Settings 字段小部件(field widget)。

另外,如果你创建了一个新的 EPT 模块并附带了带选项的 JavaScript 插件,你将需要使用你自己的 EPT 设置小部件,并为这些选项提供设置字段。

EPT Core 模块提供了用于 EPT Settings 字段小部件的 EptSettingsDefaultWidget 类。它包含 DOM 盒、背景和所有其他设置。现在让我们开始创建一个新的类 EptSettingsSimpleWidget(我会把它放在 EPT Core 模块中)。它将只包含三个设置:宽度(Width)、间距(Spacing,用于段落下方的外边距)。

创建新文件:
/src/Plugin/Field/FieldWidget/EptSettingsSimpleWidget.php