跳到内容
必威体育论坛必威精装下载APPRedfin Solutions徽标必威体育论坛必威精装下载APPRedfin Solutions徽标 接触
白色乐高砖

迁移到布局建设者

今年在Drupalcon North America Redfin Sol必威体育论坛必威精装下载APPutions'CTO Chris Wells有幸首次在Drupalcon首次发言。他的演讲迁移到布局建设者的特权是成为会议最擅长的会议之一。

客户端

必威体育论坛必威精装下载APPRedfin Solutions与新英格兰大学(UNE) - 缅因州最大的私人大学的长期关系 - 他们是一个转折点,他们以前的尖端网站感到过时,特别是内容编辑体验。随着Drupal 7在地平线上的生活结束,我们与他们一起举起升级计划,以便我们可以更好地访问现代界面。

此前,他们的Drupal网站一直在实施响应基于组件的设计原则wysiwyg模板.更现代化的工具古腾堡核心布局建设者,我们知道我们有很好的选择和机会提供更好的内容编辑体验。

转换

我们知道我们必须找到一个策略来将旧的范例迁移到新的范例,为此我们选择了布局构建器。由于它的核心支持和块作为组件的逻辑应用,它是一个自然的选择。但是,我们如何将更大的HTML块放到一个所有新页面都使用新的页面范例(每个页面都是Layout Builder覆盖)的地方呢?

幸运的是,Drupal有这样一种方法来转换输入数据,这就是Migrate API。Migrate API遵循计算机科学中称为提取、转换、加载.在我们的时代(即Drupal)中,我们使用短语“源”(提取)、“过程”(转换)和“目的地”(加载)。每个阶段都由Migrate API的插件来表示。

我们的情况

在UNE的情况下,我们从(源)Drupal 7节点(页面)迁移到(目的地)“基本文本”块中。对于源,我们使用Live Drupal 7数据库万神殿.“基本文本”块是将Drupal 8中的框中出来的作为自定义块类型,并且具有标题和身体。

我们没有沿着regex的兔子洞掉出每一个组件,而是我们将旧的身体迁移到新的范例中,以便每个页面从一开始就使用相同的范例,而内容编辑器可以扩展到使用布局建造者随着时间的推移覆盖。我们只是在一些遗留式风格中迁移,最终我们将丢弃。我们拥有员工和资源,根据需要清理翻译中的任何令人惊讶的不准确性,所以这最终是最具时间和成本效益的解决方案。

但是,这种迁移的真正魔法实际上是过程部分,在那里我们将数据更改为布局构建器所需的格式。

布局构建器存储

首先,我们需要了解Layout Builder是如何在幕后存储东西的。就像实体引用字段一样,布局构建器实际上存储的是一个section列表。当您使用Layout Builder构建页面时,您将向其添加部分(例如,一个一col,接着一个二col,接着另一个一col)。与常规字段表非常相似,它存储实体ID、修订ID、delta(因此它知道正确的顺序!),然后是一些数据值。例如,对于分类法术语引用,它将存储所引用术语的“tid”。

使用Layout Builder,还有额外的复杂性。因为每个部分可能包含多个组件,所以还有一个额外的层,我们需要在这个层中按照正确的顺序存储每个部分的组件。

为此,Drupal的Layout Builder没有嵌套另一组实体引用。相反,它实际上存储了一个序列化的Section对象。Section对象的主要原则之一是一个SectionComponent对象数组,每个对象在Section中存储自己的位置和位置。

存储此信息的实际表是数据库中的[实体] __ layout_builder_layout表。根据您已启用的Playout Builder覆盖的实体覆盖,这可以是Node__Layout_Builder_Layout表,或者user__layout_builder_layout表。

大多数布局构建器SectionComponents只是传统Drupal意义上的“块”。尽管如此,我们还是应该引入一个新概念,即区块是否被认为是“可重用的”。可重用块是你通常从结构>块>自定义块库创建的块,然后你放置“重用”整个网站,例如在每个页面的侧边栏。

当您将块内容插入布局构建器布局时,不可重新使用的块是那些创建的块。这两个之间的差异实际上只是块上的布尔(和隐藏的)字段,它可以帮助使用UI过滤块。

而且,存储拼图的最后一块要注意的是“Inline_block_usage”表。这简单地存储block_content_id,layout_entity_type(ex.g.node“)和layout_entity_id(ex.g.node id”)。事实上,它是非可重用块的位置的记录。

好的,所以让我们这样做!

我们需要将Drupal 7节点体转换为块,然后将页面迁移到页面中,其中节点的“体”现在由Layout Builder覆盖。

要做到这一点,我们要:

  • 将机构迁移到非可用块中

  • 将节点迁移到节点中

  • 确保将之前迁移的块链接为Layout Builder Sections/SectionComponents

为了帮助演示这些概念,我创建了一个全功能网站回购在Drupal 9上使用一些CSV作为源。我将解剖其他一些主要部分。

步骤1:导入块

在许多方面,这是一个非常标准的块迁移,但特别需要注意的是“流程”部分中的“可重用”字段:

plugin: default_value default_value: 0

查看github上的代码

这指定传入的块是内联块。你可能想用,也可能不想用,但我们确实用了,这是你设置它的方法。

第2步:导入节点

在许多方面,您只是迁移您通常的节点字段,映射标题,UID等等字段。

这个特殊的地方是我们迁移到一个名为的领域layout_builder__layout.这是存储覆盖的字段。这样,字段就需要一个Section对象(或一个Section数组)。

#这是layout_builder__layout字段,它存储所有内容!layout_builder__layout: #我们从哪里得到它们?这个“组件”字段来自我们。我们使用prepareRow来设置它。我们需要一个自定义插件来正确地映射它。插件:layout_builder_sections_pages

获取“body”(我们的部分的块/截面组件)的源是这个“组件”字段。这不是我的CSV中的一个字段,它是我要查找的一个领域,以获取相对于此节点迁移的所有块。为此,我使用Migrate_Tools提供的Printicerow()方法添加新的源属性。

# basic about the source plugin - where to get the data, # what kind it is, describe the columns in the csv. #基本信息来源:插件:my_pages

查看github上的代码

在这个新的预编写方法中,我们可以查找迁移的块并以正确的顺序返回它们;每个都将成为一个部分组成部分:

源插件

现在,组件源字段是一个(不可重用的)块id数组。

现在,我们可以用我们的自定义使用插入这是一个迁移的API进程插件。

奇迹发生的地方

这个过程插件有一个transform()的主要入口点。这个方法负责返回一个以目标插件所期望的方式格式化的值。在我们的例子中,我们需要返回一个Section(或者是一个Section数组,如果你喜欢冒险的话)。记住SectionsComponents主要组成Sections,我们首先需要构建SectionComponents本身。

为此,我们需要访问Drupal中的UUID生成器服务,并为截面组件创建配置阵列。以下数组详细说明了配置。

  • ID:您正在使用的插件和衍生物,专门为我们“Inline_block”,然后是捆绑包,产生“inline_block:basic”(块的类型)。

  • 标签:此块的标签是什么(块标题)。这是必填字段,所以将它设置为某种东西。

  • 提供者:layout_builder - 我们的案例中总是相同的。

  • Label_display:是否显示标签(boolean)

  • View_mode:显示该块时使用的视图模式

  • block_revision_id:要显示的块的修订版本

  • block_serialized:块的序列化版本(您可能会留下此NULL,稍后会为您序列化)

  • context_mapping:老实说,我不知道这是什么,也许有人能给我解释一下,但当它是一个空数组时,它是有效的。

在创建了你的SectionComponents数组之后,你可以通过指定你为那个Section使用的布局,任何Section的设置,以及要放入其中的SectionComponents数组来返回一个新的Section对象。

为自己试试!

如果你下载了例子回购,您可以还原包含的DDEV数据库快照(如果使用DDEV)或使用.sql文件导入数据库。您可能需要根据您的设置更改迁移中的路径。

如往常一样,请随意保持联系如果你想了解更多!

Baidu