跳过内容
必威体育论坛必威精装下载APPRedfin Solutions徽标必威体育论坛必威精装下载APPRedfin Solutions徽标 接触
一系列连接的管道

迁移自定义源插件

2022年11月Drupal社区和Drupal Security团队将结束他们对Drupal 7的支持。到那时,所有Drupal网站都需要在Drupal 8上进行,才能继续接收社区的更新和安全修复。从Drupal 7到8的跳跃是一个棘手的迁移,通常需要复杂的数据转换以将旧内容拟合到Drupal的新范式中。如果您是Drupal迁移的新手,可以阅读官方Drupal迁移API,关注毛里西奥·迪纳特(Mauricio Dinarte)31天的Drupal迁移首发系列,或观看Redfin Solutions自必威体育论坛必威精装下载APP己的Chris Wells提供速成课程训练课程。该博客系列将涵盖更高级的主题,例如利基迁移工具,内容重组和各种自定义代码解决方案。查看该系列的第一个博客自定义迁移克朗工作

Drupal 8(D8)和Drupal 9(D9)中内置了许多工具,可帮助从Drupal 7(D7)网站迁移。整个源和目的地插件都可以使您从任何D7获取数据节点,,,,文件或者用户并将其迁移到您想要的任何D8或D9实体中。但是Drupal无法说明您可能拥有的每个数据源,因此在迁移的某个时刻,您可能会碰到障碍,需要编写自己的自定义迁移源插件。幸运的是,Drupal使这简单明了。

如果您还没有建造自定义迁移模块,则可以关注Mauricio Dinarte的教程。设置该设置后,转到自定义迁移模块,为您的自定义源插件创建以下嵌套文件夹结构:

your_custom_module/├─Src/ src/ plugin/ plugin/│├├i-迁移/││├├├-源/││├├├├├├-customsourceplugin.php

然后在源文件夹中创建一个新的PHP文件。

现在我们可以编写插件。如果您以前从未编写过源插件,则可以使用d7_node用于参考的源插件(这是用于从Drupal 7数据库迁移节点的Drupal Core源插件)。设置您的名称空间并在其下方添加使用drupal \ migrate_drupal \ plugin \ migrate \ source \ drupalsqlbase;。然后创建一个类,该类以@migratesource的定义在上面评论,以扩展drupalsqlbase,例如:

<?php namespAce drupal \ your_module \ plugin \ migrate \ source;使用drupal \ migrate_drupal \ plugin \ migrate \ source \ drupalsqlbase;/ ** * * @migratesource( * id =“ custom_source_plugin”, *) */类CustomSourceplugin扩展了drupalsqlbase {

请注意,您的班级名称应该像往常一样在骆驼中,但是ID应该在Snake_case中。ID是您将如何在迁移YAML文件中引用源插件的方式。

在您的自定义源插件中,您需要创建四个公共功能:公共功能查询(),,,,公共功能初始化器(),,,,公共功能字段(), 和公共功能getIDS()

公共功能查询()

使用它来查询您的源数据库(例如旧的D7网站或您从中获取数据的任何外部数据库)。您将使用Drupal构建查询动态查询API。在此示例中,我有一个D7网站,该网站使用一个名为field_footnote的无限文本字段将脚注添加到节点。但是在新的D8网站中,我希望每个脚注都是其自己的实体,同时确保他们每个人都在正确的页面上保持正确的顺序。这意味着即使一个节点可以有几个节点,我也需要一一处理脚注。我还需要每个脚注才能知道它来自哪个节点及其在页面上的顺序,因此脚注不会被扰乱。

为了处理此问题,查询正在使用Entity_ID,delta和field_footnote_value fields中的所有节点中的所有节点抓住“脚注”文本字段:

$ query = $ this-> select('field_data_field_footnote','f') - > fields('f',['entity_id','delta','field_footnote_value',]);$ QUERY->条件('entity_type','node','=');返回$查询;

这意味着我通过行处理我的旧drupal 7 field_data_field_field_field_footnote表,将每个脚注变成其自己的实体,同时跟踪其父(ENTITY_ID), 命令 (三角洲)和价值(field_footnote_value)。这可能是最棘手的步骤,因为整个源插件取决于此处查询数据的方式。

公共功能初始化器()
初始尺度运行查询并启动迭代器是必要的。所有你需要的是:

$结果= $ this-> query() - > execute();$结果 - > setFetchMode(\ pdo :: fetch_assoc);返回new \ iteratorAterator($ resucts);

如果您需要为迁移设置任何常数,也可以在这一点上执行此操作:请参阅d7_file

公共功能字段()
字段函数使您可以从源表陈述查询字段并提供标签:

返回['entity_id'=> $ this-> t('entity ID'),'delta'=> $ this-> t('delta'),'field_footnote_value'=> $ this-> this-> t('footNote'),];


公共功能getIDS()
在里面getids函数,您定义哪些数据字段或字段将用作唯一标识符。在我的脚注示例中,多个脚注可以在同一节点上,因此我不仅需要节点ID才能唯一地识别它们。我还需要添加三角洲(在节点上的脚注订单)。

返回['entity_id'=> ['type'=>'integer',],'delta'=> ['type'=>'integer',],],];

Entity_ID和Delta字段将分别在Migrate_map表中分别翻译为sourceID1和sourceID2。

这就是创建自定义源插件所需的全部。现在,您可以编写迁移来使用它。请记住,在迁移YAML文件中,您将使用在类上方的注释中设置的@migratesource ID,而不是类名。

如果您想要一些额外的信用,则可以添加第五个公共功能,Preparerow。这使您可以在将数据操作发送到其余迁移之前对数据进行进行。如果我想在脚注上设置角色限制,我可以使用Preparerow来修剪或标记任何太长的脚注。这也可以作为模块文件中的挂钩完成,hook_migrate_prepare_row

Baidu