Drupal 8 问题导入段落

Drupal 8 Issue Importing Paragraphs

我需要使用段落将一些自定义字段数据从 Drupal 6 实例导入到 Drupal 8 实例。由于 D8 将所有翻译存储在单个节点中,而不是像 D6 这样的单独链接节点,因此我在尝试将翻译内容放入段落并插入节点(页面)时遇到问题。默认语言(英语)工作正常。这是我的代码(我从一个 JSON 文件导入,该文件是 D6 实例的转储):

... Code to read JSON file here and load into $data variable ...

// create paragraph ($fields is an array of fields from the JSON file)
$paragraph = Paragraph::create($fields);

// load existing node
$node = Node::load($nodeId);

// Get the translated node...according to the docs, this should 
// return a node that behaves just like the original node
$language = \Drupal::languageManager()->getLanguage($data['language'])->getId();
$node = $node->getTranslation($language);

$paragraphs = $node->field_paragraph_group;
$paragraphs[] = $paragraph;

$node->field_paragraph_group = $paragraphs;
$node->save();

它似乎保存正常,但一旦这是 运行,网站将停止使用

The website encountered an unexpected error. Please try again later.

所以它显然破坏了某些东西。

我不确定是否需要尝试从节点访问翻译或在段落对象中添加翻译,例如:

$paragraph->language = $data['language'];

任何指导将不胜感激!谢谢!

回复您的评论:

According to the lead dev the migrations won't work as it is for flexfields data converting to Paragraphs.

通过迁移,您可以完全自由地管理您的输入和输出数据,无论它们以何种格式存储在您的旧站点中。

您有很多选择来公开您的 D6 数据,但更简单、更灵活的方法是使用迁移源插件,因为 Drupal 8 附带了一些有用的插件,可以从旧的 Drupal 版本(如 6 和 7)中提取和管理数据。 看看 class 的例子:Drupal\node\Plugin\migrate\source\d6\Node

关于您的问题,我建议您按以下方式操作:

1) 创建一个 source 插件运行 SQL 查询来收集你的 D6 数据 (https://www.drupal.org/docs/8/api/migrate-api/migrate-source )

2) 创建一个 process 插件来处理传入的数据以反映 D8 段落结构 (https://www.drupal.org/docs/8/api/migrate-api/migrate-process-plugins)

3) 使用核心 destination 插件 entity:node 您可以利用包含有用方法的 class 来提取 D6 节点。

您可能需要一些自定义查询和行预处理,所以这里有一个 source 插件的简单示例 (yourmodule/src/Plugin/migrate/source/MyCustomMigration.php):

<?php

/**
 * @file
 * Contains \Drupal\custom_d6_migration\Plugin\migrate\source\MyCustomMigration.
 */

namespace Drupal\custom_d6_migration\Plugin\migrate\source;

use Drupal\migrate\Row;
use Drupal\node\Plugin\migrate\source\d6\Node;

/**
 * Source plugin for D6 content.
 *
 * @MigrateSource(
 *   id = "my_custom_migration"
 * )
 */
class MyCustomMigration extends Node {

  /**
   * {@inheritdoc}
   */
  public function query() {
    // .. your custom query $this->select('tablename'); ...
  }

  /**
   * {@inheritdoc}
   */
  public function prepareRow(Row $row) {
    // If you need to alter the current row (running further queries to gather additional data..)..

    return $row;
  }

}

即使这个问题是几个月前发布的,我也希望这个答案对其他人仍然有帮助,因为迁移确实有助于解决几乎所有类型的数据迁移问题。