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;
}
}
即使这个问题是几个月前发布的,我也希望这个答案对其他人仍然有帮助,因为迁移确实有助于解决几乎所有类型的数据迁移问题。
我需要使用段落将一些自定义字段数据从 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;
}
}
即使这个问题是几个月前发布的,我也希望这个答案对其他人仍然有帮助,因为迁移确实有助于解决几乎所有类型的数据迁移问题。