跳过内容
必威体育论坛必威精装下载APPRedfin Solutions徽标必威体育论坛必威精装下载APPRedfin Solutions徽标 接触
聚会后的真空清洁五彩纸屑

将Drupal Wysiwyg迁移到段落

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

因此,Drupal 7网站您受任务升级到Drupal 8的任务是Wysiwyg字段,其中包含各种图像,视频,IFRAME和桌子,所有图像,均具有不一致的格式。您想通过切换到更结构化的内容编辑系统来利用此升级段落,因此所有这些特殊情况都将具有一致的编辑经验和显示。有太多的内容可以手动执行此操作,因此您需要自动迁移。但是,要强加所有这些结构,您需要将模棱两可的内容智能划分为特定的目的地段落。由于一些原因,这是一项艰巨的迁移任务。

  • 有多种段落类型,因此他们不能共享一个迁移。
  • 原始的Wysiwyg内容可以分为几个不同类型的几段,但是Drupal Migration API希望一个源实体成为一个目的地实体,如在这篇博客文章
  • 目标节点需要以确切顺序作为原始内容引用段落。

这些情况是棘手的情况,没有解决方案。有一些自定义迁移模块可以帮助您喜欢迁移html到段落。但是,它们可能不符合您的确切准则,尤其是当您的段落参考其他实体之类的实体时媒体或者埃克实体。那么您如何处理呢?

没有完美的解决方案。也就是说,成功的一种食谱是编写一个自定义过程插件,该插件分解Wysiwyg内容,即时创建正确的段落(以及任何文件/媒体/ECK实体),并以正确的顺序返回段落ID用于参考目标节点。但是要当心:这些段落无法通过迁移管道回滚或更新。这使得测试变得更加困难,因为运行迁移更新不再是愿意的,这意味着连续多次运行它会填充数据库中的孤立段落。这将整个问题简化为一个自定义插件。在这里,信用属于本吉·费舍尔(Benji Fisher)对于起点代码。请记住,此代码有两个缺点,我们以后将解决。

让我们将其全部分解。第一步是将Wysiwyg数据导入到domdocument为了编程分析HTML。domdocument是数据树每个HTML标签表示为一个domnode它引用了其中的任何标签。您想将此domdocument拆分,以便将每个内容整齐地映射到最佳的拟合段落类型中。由于大多数内容都是简单的文本,因此文本段落类型将是默认的。因此,您需要测试每个内容,以查看它是否匹配不同的段落类型,例如图像,视频或表格。如果它不匹配任何一个,那么您可以将其安全地放入默认文本段落中。您应该通过迭代所有顶级DOMNODE来开始此过程。例如:

当您从Wysiwyg-containerDIV,您会看到四个直接孩子顶层班级。从第一个孩子开始,测试每个特殊情况。使用DomDocument的优点之一是您可以使用getElementsbythytagname功能询问任何domnode是否有孩子标签IMG,,,,桌子, 或者iframe。在比赛中,将分支中的所有内容转到新段落。否则,将连续文本的每一部分放入新的文本段落中。这是Benji模板的第一个问题:混合内容的分支。

大多数时候,这不是问题。如果DIV内有一张桌子,您可能希望整个DIV用于表段。但是,如果锚固标签中有图像,则您的图像段落将抓住图像数据,但忽略链接,沿途丢失数据。

{#顶级标签#}
{#围绕图像#} {#image#}

这可能是可接受的损失,也可能是可以标记为手动干预的问题。否则,您将需要一种可以递归遍历整个分支的方法,将所需的HTML元素挑选出来,然后将其余部分放入默认存储桶中。

例如:

/** *递归导航dom树的特定标签 * * @param $ post *完整页domdocument * @param $ parent * parent dom node * @param $ tag *标签名称。* @param字符串$ content *要附加到 * * * @return [] *返回类型$ tag的dom节点的数组 */静态保护函数recursivetagfinder($ post,$ parts,$ parent,$ tag和$ current){$ tagchildren = [];//通过直接的孩子迭代。foreach($ parent-> childnodes作为$ child){// domtext对象表示dom树上的叶子//无法再处理。如果(get_class($ child)==“ domText”){$ current。= $ post-> savehtml($ child);继续;} //如果孩子有$标签的后代,请递归地找到它们。if(!is_null($ child-> childnodes)&& $ child--> getlementsbytagname($ tag) - > length!= 0){$ tagchildren += static :: recursivetagfinder($ post,$ post,$ child,$ tag,$ tag,$ tag,$ current));} //如果孩子是所需的标签,请抓住它。 else if ($child->tagName == $tag) { $tagChildren[] = $child; } // Otherwise, convert the child to HTML and add it to the running text. else { $current .= $post->saveHTML($child); } } return $tagChildren; }

如果最高级别的domnode表明它具有IMG标签,然后该方法将搜索所有domnode儿童以查找IMG标记并将其他所有内容推入默认文本段落,$当前多变的。将元素从嵌套的情况中拉出时可能会有一些脱节的效果:表可能会丢失特殊格式,或者不再可单击的图像作为链接。可以在插件中解决一些问题。在迁移中,我检查了任何IMG标签是否具有与标题上课并将其存储在段落的标题字段中。同样,可能需要手动调整其他人,例如重新排序段落或调整表。请记住,调整标记的迁移内容要比手动查找和修复丢失的数据要快得多。

在下一期中,让我们在Drupal 7中挖掘嵌入式媒体。这里的棘手方面是,嵌入的媒体不是作为图像标签存储在数据库中,而是作为HTML内的JSON对象。这需要一套全新的测试来解析它。要开始,请检查每个domnode的对象的开放括号[[{{和闭合括号}]]]。如果仅包含一个或另一个,则没有足够的信息可以做任何事情。如果两者都包含,则将子字符串从开放到关闭并运行JSON_DECODE。如果它不是有效的JSON,则将从JSON对象返回一系列数据。此数组中的数据应包含fid与嵌入式图像的文件ID相对应的键。然后,该文件ID可用于从迁移数据库的File_managed表中获取图像并创建图像段落。

这些是Benji Fisher自定义源插件中的主要差距。当然,每个实施都需要进行更多的调整和数据操作,以使确切的迁移正确工作。有些内容根本不会干净地转移,因此请记住要彻底测试并与客户保持紧密的沟通,以将Wysiwyg混乱变成整洁的段落。


如果您发现此迁移系列有用,请与您的朋友分享,不要忘记将我们标记为@redfinsolutions必威体育论坛Facebook,,,,LinkedIn, 和推特

Baidu